机器人操作系统(ROS)浅析
学习笔记
至 2018-2-8 已将此教程过了一遍 此文档中为摘抄的笔记,若有不明白的地方,请查看原文档
2018-2-2
关于节点nodes 的操作
1、启动节点master $ roscore
这个定义中的“运行实例”(runninginstance)很重要。如果我们同时执行相同程序的多个副本——注意确保每个副本使用不同的节点名——则每个副本都被当做一个单独的节点。
2、启动节点$ rosrun
rosrun命令有两个参数,其中第一个参数是功能包的名称;第二个参数是该软件包中的可执行文件的名称。
ROS中要求每个节点有不同的名称
可以使用rosrun命令显式设置节点的名称,语法如下:
rosrun package-name executable-name__name:=node-name
rosrun是一个shell脚本,能够理解ROS的文件组织结构,知道到哪里能找到与给定包名称对应的可执行文件。
一旦它找到你要的程序,rosrun就会正常启动节点。
例如,如果你真的想要,你可以像执行任何其他程序一样直接执行turtlesim_node:
/opt/ros/indigo/lib/turtlesim/turtlesim_node
这里还要强调一点,通过节点管理器注册成为ROS节点发生在程序的内部,而不是通过rosrun命令。
3、查看节点要获得特定节点的信息,使用如下命令:
rosnode info node-name
4、终止节点要终止节点,使用如下命令:
rosnode kill node-name
topic
ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题topic里19。
消息传递的理念是:
当一个节点node想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;
当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。
ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。
查看节点构成的计算图
要查看节点之间的连接关系,恐怕将其表示为图形是最便于查看的。
在ROS系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:
rqt_graph
在这个命令中,r代表ROS,qt指的是用来实现这个可视化程序的Qt图形界面(GUI)工具包。输入该命令之后,你将会看到一个图形界面,其中大部分区域用于展示当前系统中的节点。通常情况下,你将会看到如图2.2类似的图形界面。在该图中,
椭圆形表示节点node ,有向边表示其两端节点间的发布-订阅关系。该计算图告诉我们,
/teleop_turtle节点向话题/turtle1/cmd_vel发布消息,而/turtlesim节点订阅了这些消息(“cmd_vel”是“commandvelocity”的缩写。)。
rostopic pub
rostopic pub可以把数据发布到当前某个正在广播的话题上。
http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingTopics
节点node 可以发布话题topic,其他的节点node 可以订阅某个topic,当节点订阅某个topic 的时候,可以不用关心整个topic 是由谁发出
turtlesim遥控系统的工作原理有了一定的理解。当你按下一个键时,/teleop_turtle节点会以消息的形式将这些运动控制命令发布到话题/turtle1/cmd_vel;与此同时,因为turtlesim_node订阅了该话题,因此它会接收到这个些消息,控制海龟按照该预定的速度移动。其中的关键点在于:
仿真海龟不关心(或者甚至不知道)哪个程序发布了这些cmd_vel消息。任何向这个话题发布了消息的程序都能控制这个海龟。
远程操作程序不关心(或者甚至不知道)哪个程序订阅了它发布的cmd_vel消息。任何订阅了相关话题的程序都能自主选择是否响应这些命令。
测量发布频率有两个命令可以用来测量消息发布的频率以及这些消息所占用的带宽:
rostopic hz topic-name
rostopic bw topic-name
查看消息类型
要想查看某种消息类型的详情,使用类似下面的命令21,22:
rosmsg show message-type-name
用命令行发布消息
大多数时候,发布消息的工作是由特定的程序完成的*。但是,你会发现有时候手动发布消息是很实用的。要实现该功能,利用rostopic命令行工具23:
rostopicpub –r rate-in-hz topic-name message-type message-content
这条命令重复地按照指定的频率给指定的话题发布指定的消息。
该命令最后的参数message-content应该按顺序提供消息类型中所有域的参数值。