1.Setup
1.1 打开一个terminal,运行一个roscore
1.2 新开一个terminal运行turtlesim节点
rosrun turtlesim turtlesim_node
1.3 新开一个terminal,运行turtle keyboard 监听节点
rosrun turtlesim turtle_teleop_key
然后你就可以用键盘控制这个乌龟了,注意,鼠标要点击一下最后运行的terminal确保新运行的node是active状态,不然乌龟是不会动的。
2.ROS 话题(Topics)
现在节点’turtlesim_node’和节点’turtle_teleop_key’在通过一个共同的topic通信,节点’turtle_teleop_key’收集我们敲击的按键信息,并把按键信息发布给topic,而节点’turtlesim_node’则是订阅了这个topic接收相关信息根据节点代码作出对应动作。这是一个很简单的节点通信过程。
2.1 查看节点话题通信流程图
运行rqt_graph包里的 rqt_graph节点可以查看节点之间的通信流程图
要用这个节点的话,需要先下载这个rqt_graph包
sudo apt-get install ros-<distro>-rqt
sudo apt-get install ros-<distro>-rqt-common-plugins
< distro >代表你的ROS版本号
装好之后运行节点查看流程图
rosrun rqt_graph rqt_graph
输出下图(图像会有细微的差别,但都大同小异)
图像告诉我们有两个节点: /turtlesim 和 /teleop_turtle,它们在通过话题 /turtle1/command_velocity通信。
2.2 rostopic
rostopic工具方便我们得到话题的信息。通过rostopic -h
打开帮助信息
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic hz display publishing rate of topic
rostopic list print information about active topics
rostopic pub publish data to topic
rostopic type print topic type
2.3 介绍rostopic echo
rostopic echo可以用来查看topic所发布的数据,现在我使用这个命令看看。
运行rostopic echo /turtle1/cmd_vel
,这时候选定之前节点‘turtle_teleop_key’那个terminal,然后控制乌龟走几步。这时rostopic echo 那个terminal实时输出了一些信息。这些信息就是我们刚刚在控制乌龟时topic所处理的速度信息。
这时候去到之前那个流程图窗口,刷新一下,会发现多了一个节点。这是因为我们在查看速度的时候实际上运行了一个这个新的节点订阅这个topic接受速度信息。
2.4 使用rostopic list
rostopic list输出详细的topic信息,包括相应的订阅节点和发布节点。命令行运行rostopic list -v
后输出
这里大家可能会有一个问题,为啥刚刚的拓扑图只有一个topic,现在又多出了好几个topic,这是为什么?我的理解拓扑图可能只显示一部分可以自定义的简单的topic,那些系统底层的无法自定义的topic就没有显示出来,也没必要显示出来,简化输出。(但这只是本人猜测,需要查一下package的节点说明)
通过观察也可以发现’cmd_vel’这个topic在published topics和subscribed topic各出现了一次,而有的topic只出现了一次。因此可以发现topic可以同时被订阅或者发布,也可以只订阅或者发布(讲了个废话)。
3.ROS Messages
上面刚刚看到的 topic 发布的具体信息,其实也就是我们所说的ROS message。对于发布者(turtle_teleop_key) 和订阅者 (turtlesim_node)之间的通信,发布和订阅的信息格式必须是一致的。
3.1 rostopic type
可以使用rostopic type查看topic处理的信息的格式。rostopic type /turtle1/cmd_vel
和rosmsg show geometry_msgs/Twist
分别从不同层次查看了信息格式。我们先运行rostopic type /turtle1/cmd_vel
查看topic的类型(即该topic发布的message type是在哪个文件里定义的),得到输出:
geometry_msgs/Twist
然后运行rosmsg show geometry_msgs/Twist
查看message的具体定义,得到输出:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
4 rostopic 一些用法
现在我们知道了话题发布的具体数据是消息,如何确定消息的类型以及定义,现在我们学习如何发布特定的消息
4.1 使用rostopic pub
我们可以用rostopic pub直接发送数据去topic,用法如下。
rostopic pub [topic] [msg_type] [args]
举个栗子,运行
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
发现小乌龟以2的线速度,1.8的角速度运动了一点。
这里面的-1
代表只发送一条数据。
--
的意思没怎么懂,原文直接copy过来(This option (double-dash) tells the option parser that none of the following arguments is an option. This is required in cases where your arguments have a leading dash -, like negative numbers.
–)
打印话题信息
rostopic echi [topic]
4.2 rostopic hz
输出topic发布数据的速率
rostopic hz [topic]
5.使用rqt_plot
rosrun rqt_plot rqt_plot
启动画图工具 ,在画图工具中选择对应的话题in信息可以把数据画出来,这里不再赘述。