手动创建ROS package
转至catkin workspace,并确认已经刷新了setup文件。手动创建一个名为foobar的package:
mkdir -p src/foobar
cd src/foobar
在 foobar/package.xml文件里添加如下语句:
<package>
<name>foobar</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="foobar@foo.bar.willowgarage.com">PR-foobar</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>std_msgs</run_depend>
</package>
可以用rospack find foobar
命令找到它。
在 foobar/CMakeLists.txt文件里输入:
cmake_minimum_required(VERSION 2.8.3)
project(foobar)
find_package(catkin REQUIRED roscpp std_msgs)
catkin_package()
管理系统依赖项
ROS packages有时会需要操作系统提供一些外部函数库,这些函数库就是所谓的“系统依赖项”。
ROS packages必须在配置文件中声明他们需要哪些系统依赖项。查看turtlesim package的配置文件:roscd turtlesim
rosdep 是一个能够下载并安装ROS packages所需要的系统依赖项的小工具 使用方法:rosdep install [package]
。并在完成后退出。
ROS在多机器人上的使用
ROS设计是分布式计算。
它允许实时分配计算量以最大化的利用系统资源。(有一个特例——驱动节点必须运行在跟硬件设备有物理连接的机器上)。
- 只需要一个master,在一个机器上运行。所有节点都必须通过配置 ROS_MASTER_URI连接到同一个master。
- 任意两台机器间任意两端口都必须要有完整的、双向连接的网络。
- 每台机器都必须向其他机器广播其能够解析的名字。
跨机器运行的 Talker / listener
在两台机器上分别运行talker / listener, 主机名分别为 marvin 和 hal.登陆主机名为marvin的机器,需要用ssh marvin
同样也可以登陆hal.
- 启动 master
我们需要选择一台机器运行master,这里我们选hal. 启动master的第一步是:
ssh hal
roscore
- 启动 listener
机器hal上启动listener, 并配置ROS_MASTER_URI,就可以使用刚刚启动的master了:
ssh hal
export ROS_MASTER_URI=http://hal:11311
rosrun rospy_tutorials listener.py
- 启动 talker
在marvin 机器上启动talker,同样通过配置ROS_MASTER_URI来使用hal机器上的master
ssh marvin
export ROS_MASTER_URI=http://hal:11311
rosrun rospy_tutorials talker.py
可以看到机器hal上的listener正在接收来自marvin机器上talker发布的消息。
talker / listener启动的顺序是没有要求的, 唯一的要求就是master必须先于节点启动。
- 反向测试
终止talker和listener的运行,但仍然保留master在机器 hal上,然后让talker和listerner交换机器运行。
首先,在机器marvin启动listerner:
ssh marvin
export ROS_MASTER_URI=http://hal:11311
rosrun rospy_tutorials listener.py
然后在机器hal上启动talker:
ssh hal
export ROS_MASTER_URI=http://hal:11311
rosrun rospy_tutorials talker.py
自定义消息
将.msg文件放到一个程序包的msg文件夹下即可自定义一个消息类型。
消息类型都被归属到与package相对应的域名空间下。
例:
C++:
#include <std_msgs/String.h>
std_msgs::String msg;
python:
from std_msgs.msg import String
msg = String()
若在其他package中定义消息类型,应添加下列语句:
<build_depend>name_of_package_containing_custom_msg</build_depend>
<run_depend>name_of_package_containing_custom_msg</run_depend>