ROS官网中级教程学习总结(1-6)
Posted NodYoung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS官网中级教程学习总结(1-6)相关的知识,希望对你有一定的参考价值。
教程网址:http://wiki.ros.org/cn/ROS/Tutorials。
本博客为1-6小节。
手动创建ROS package
- 添加xml文件。当你的package里已经包含配置文件(package.xml),ROS能够找到它。执行:
rospack find [包名称]
。应该注意到我们刚才所创建的package.xml依赖于 roscpp 和 std_msgs.而catkin恰恰是利用这些依赖项来配置所创建的package。 - 我们还需要一个 CMakeLists.txt 文件。这样 catkin_make才能够利用 CMake 强大的跨平台特性来编译所创建的package。
cmake_minimum_required(VERSION 2.8.3)
project(foobar)
find_package(catkin REQUIRED roscpp std_msgs)
catkin_package()
管理系统依赖项
System Dependencies
ROS packages有时会需要操作系统提供一些外部函数库,这些函数库就是所谓的“系统依赖项”。ROS提供了一个工具rosdep来下载并安装所需系统依赖项。ROS packages必须在配置文件中声明他们需要哪些系统依赖项。
rosdep
rosdep 是一个能够下载并安装ROS packages所需要的系统依赖项的小工具 使用方法:rosdep install [package]
Roslaunch在大型项目中的使用技巧
Introduction
我们希望launch文件能够尽可能的重用,这样在不同的机器人平台上就不需要修改这些launch文件就能使用。即使是从真实的环境转到模拟环境中也只要稍微修改即可。
高层级的结构
利用指令 “rospack find 2dnav_pr2/move_base/2dnav_pr2.launch”可以找到 一个高层级的launch文件。
<launch>
<group name="wg">
<include file="$(find pr2_alpha)/$(env ROBOT).machine" />
<include file="$(find 2dnav_pr2)/config/new_amcl_node.xml" />
<include file="$(find 2dnav_pr2)/config/base_odom_teleop.xml" />
<include file="$(find 2dnav_pr2)/config/lasers_and_filters.xml" />
<include file="$(find 2dnav_pr2)/config/map_server.xml" />
<include file="$(find 2dnav_pr2)/config/ground_plane.xml" />
<!-- The navigation stack and associated parameters -->
<include file="$(find 2dnav_pr2)/move_base/move_base.xml" />
</group>
</launch>
这个文件引用了其他的文件。在这些被引用的文件中都包含有与系统有关的node和parameter(甚至是嵌套引用),比如定位、传感器处理和路径规划。
编写技巧: 高层级的launch文件应该简短,利用include指令将系统的组成部分和ROS parameter引用过来即可。
Machine tags and Environment Variables
为了平衡负载和管理带宽,我们需要控制哪些节点在哪个机器上运行。同时,考虑到重用性,我们不希望把具体的机器名写入launch文件。roslaunch使用machine tags来解决这个问题。
第一个引用如下:
<include file="$(find pr2_alpha)/$(env ROBOT).machine" />
这个文件使用 env 置换符来使用ROBOT变量的值。例如,在roslaunch指令前执行:export ROBOT=pre
,将会使得pre.machine 被引用。
编写技巧: 使用 env 置换符可以使得launch文件的一部分依赖于环境变量的值。
Parameters, namespaces, and yaml files
看一下被引用的 move_base.xml文件:
<node pkg="move_base" type="move_base" name="move_base" machine="c2">
<remap from="odom" to="pr2_base_odometry/odom" />
<param name="controller_frequency" value="10.0" />
<param name="footprint_padding" value="0.015" />
<param name="controller_patience" value="15.0" />
<param name="clearing_radius" value="0.59" />
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find 2dnav_pr2)/move_base/local_costmap_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/global_costmap_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/navfn_params.yaml" command="load" />
<rosparam file="$(find 2dnav_pr2)/move_base/base_local_planner_params.yaml" command="load" />
</node>
这一小段代码负责启动move_base节点。 第一个引用元素是 remapping.
编写技巧: 当一个给定类型的信息在不同的情况下发布在不同的topic上,我们可以使用topic remapping
文件有好几个标签。这些参数是节点的内部元素(因为它们都写在之前),因此它们是节点的私有参数。
在元素之后,还有一些元素,它们将从yaml文件中读取参数。yaml是一种易于人类读取的文件格式,支持复杂数据的结构。
编写技巧: Yaml文件允许复杂的嵌套域名的参数,相同的参数值可以在多个地方重复使用。
launch文件的重用
参数重载
ROS在多机器人上的使用
概述
在多个机器人上使用ROS是一件很简单的事,你只需要记住一下几点:
- 你只需要一个master,只要在一个机器上运行它就可以了。
- 所有节点都必须通过配置 ROS_MASTER_URI连接到同一个master。
- 任意两台机器间任意两端口都必须要有完整的、双向连接的网络。
- 每台机器都必须向其他机器广播其能够解析的名字。
跨机器运行的 Talker / listener
启动 master
启动 listener
启动 talker
运行出错
译者注
自定义消息
自定义消息
不要忘记选择相应的编译构建系统。
引用和输出消息类型
消息类型都被归属到与package相对应的域名空间下,例如:
C++
#include <std_msgs/String.h>
std_msgs::String msg;
Python
from std_msgs.msg import String
msg = String()
依赖项
如果你要使用在其他package里定义的消息类型,不要忘记在 package.xml添加<build_depend>
和<run_depend>
。
在python中使用C++类
以上是关于ROS官网中级教程学习总结(1-6)的主要内容,如果未能解决你的问题,请参考以下文章