ROS:Robot Operating System
ROS是面向机器人的开源的元操作系统(open-source, meta-operating system)
选择ROS的理由:
ROS的误解之一:
ROS不是一门编程语言,实际上,ROS的主要代码由C++编写。客户端库还可以使用Python,Jave和Lisp等其他多种语言编写。
发行版本:ROS的主要版本称为发行版(Distributions),以顺序字母作为版本名的首字母。
编译系统:
设置环境变量:
ROS依赖一些环境变量去定位一些必要的文件。
为了设置环境变量,需要使用下面的命令,去执行setup.bash脚本。(以indigo版为例,实际使用时替换为你所用的版本,例如 kinetic)
source /opt/ros/indigo/setup.bash
检查/确认环境变量是否正确设置,用如下命令,如果正确设置了,应该看到一组值(ROS_DISTRO和ROS_PACKAGE_PATH等环境变量的值)。如果setup.bash尚未运行,则此命令的输出通常为空:
export | grep ROS
如果想每启动一个新的shell时,都自动运行脚本setup.bash,可以如下操作:
打开home directory下的.bashrc文件,将上述source命令添加到.bashrc文件的最后。
Packages:软件包/功能包
所有的ROS软件都被组织为packages(软件包/功能包)的形式。
ROS软件包是一组用于实现特定功能的相关文件的集合,包括:可执行文件和支持文件。
一些软件包的命令:
rospack list
rospack find package-name : 例如 rospack find turtle
rosls package-name : 例如 rosls turtlesim
roscd package-name
The Master: 节点管理器
ROS中实现通信的关键部分就是ROS节点管理器。要启动节点管理器(The Master)使用如下命令:
roscore
节点管理器应该在使用ROS的全部时间内持续运行。
一个合理的工作流程是:在一个终端启动roscore,然后打开其他终端运行其他程序。当结束时,可以通过在roscore所在的终端键入Ctrl-C
停止节点管理器。
注意:如果roscore被终止,当前运行的其他节点将无法建立新的连接,即使稍后重启roscore也无济于事。
Nodes:节点
ROS程序的运行实例被称为节点(node)
A running instance of a ROS program is called a node.
启动节点:
rosrun package-name executable-name
一些node的命令:
rosnode list
rosnode info node-name
rosnode kill node-name
Topics and messages: 话题和消息
ROS节点之间进行通信所利用的最重要的机制就是消息传递。
在ROS中,消息有组织地存放在话题里。
消息传递的理念:
- 当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或多个话题。
- 当一个节点想要接收消息时,它就会订阅(subscribe)它所需要的一个或者多个话题。
- ROS节点管理器负责确保发布节点和订阅节点能够找到对方。
- 消息是直接从发布节点传递到订阅节点,中间并不经过节点管理器转交。
话题的一些命令:
rostopic list
rostopic echo topic-name : 例如 rostopic echo /turtle1/cmd_vel 打印消息内容
rostopic hz topic-name
rostopic bw topic-name
rostopic info topic-name 查看话题消息。输出中最重要的部分是第一行,它给出了该话题的消息类型。
查看消息类型:
rosmsg show message-type-name : 例如 rosmsg show geometry_msgs/Twist
用命令行发布消息:最后的message-content是为消息类型中的所有域按顺序提供参数
rostopic pub -r rate-in-hz topic-name message-type message-content 例如:
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist ‘[2,0,0]’ ‘[0,0,0]’
注意,上一条命令中-r用来指定话题发布消息的频率,即以一定的时间周期发布消息。
这条命令同样支持一次性发布的模式-1(短横线+数字1)。
这条命令也支持特别的锁存模式 -l(短横线+字母l):只发布一次消息,但是会确保该话题的新订阅者也会收到消息。锁存模式(latch mode)是默认的模式。