本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具。
首先运行roscore系列服务,这是使用ROS所必需的基础
roscore
这里还要用到turtlesim例子,先运行其节点:
rosrun turtlesim turtlesim_node
我们可以运行一个例程,然后通过键盘遥控操作turtle运行:
rosrun turtlesim_teleop_key
然后就可以通过方向键来驱动小海龟运行了。下面来探究一下屏幕背后发生了什么。
上面例程中节点turtlesim_node和节点turtle_teleop_key通过一个ROS topic来互相通信。turtle_teleop_key节点在topic上面发布关键进程,turtlesim_node节点则订阅相同的进程来接收这些关键进程。可以利用rqt_graph工具来显示正在运行的节点和主题之间的关系。
rqt_graph工具是rqt软件包的一部分,可以创建系统中正在运行的节点、主题之间的一个动态关系图。运行命令:
rosrun rqt_graph rqt_graph
然后就可以看到类似如下的关系图,可以看出节点turtle_teleop_key和节点turtlesim_node之间在turtle1/cmd_vel主题上进行通信。
rostopic工具允许我们获取ROS topics的相关信息。rostopic -h可以知道有如下命令:
Commands:
rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic type
rostopic echo显示发布在一个主题上的数据。
rostopic echo [topic]
在此可以利用此命令看一下由turtle_teleop_key发布的command_velocity数据。
rostopic echo /turtle1/cmd/vel
刚运行此命令,应该在屏幕上什么也不会出现,这是因为在这个主题上没有发布任何数据。通过按下方向键来使turtle_teleop_key节点在此topic上发布数据,此时在刚刚的窗口应该出现如下信息:
rostopic echo /turtle1/cmd_vel
linear:
x: -2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -2.0
回过头来再看一下rqt_graph中的关系图,发现又多了一个订阅节点,就是用来显示topic数据的节点。
通过命令列出节点:
rosnode list
/rosout
/rostopic_3763_1472092089570
/rqt_gui_py_node_3827
/teleop_turtle
/turtlesim
rostopic list命令显示了当前被订阅和被发布的主题列表。
rostopic list
/rosout
/rosout_agg
/statistics
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
通过在节点之间发送ROS Messages实现节点之间的通信,发布和订阅节点之间发送和接收的数据类型必须一致,这意味着一个主题的数据类型由发布在其上的信息类型所决定。发布在主题上的信息类型可以由rostopic type topic1
来显示。
rostopic type返回正在使用的主题上的信息的类型。
rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
利用命令rosmsg
可以查看信息的详细信息
rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
现在我们知道了turtlesim需要什么样的数据类型,所以我们可以发布命令给我们的小海龟。
学习完ROS Messages之后,下面来学习一下rostopic和messages。
rostopic pub直接发布数据到一个主题之上
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进行移动,默认的持续时间是3秒钟,如下图
通过加入选项-r则可以一直向topic发布数据
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0,0.0,0.0]' '[0.0,0.0,1]'
再次看一下rqt_graph中发生了什么,其中rostopic pub节点在一直与rostopic echo节点和turtlesim节点进行通信。
rostopic hz返回数据发布的速率。
rostopic hz [topic]
利用该命令查看turtlesim发布/turtle1/pose的速度
rostopic hz /turtle1/pose
subscribed to [/turtle1/pose]
average rate: 62.502
min: 0.016s max: 0.016s std dev: 0.00006s window: 60
average rate: 62.501
min: 0.016s max: 0.016s std dev: 0.00005s window: 123
average rate: 62.498
min: 0.016s max: 0.016s std dev: 0.00005s window: 185
rqt_plot是rqt软件包的一部分,可以动态绘制发布到某一个主题上的数据的图形
rosrun rqt_plot rqt_plot
这一节的内容较多,首先要理解ROS topics、ROS nodes、ROS Messages之间的关系。目前个人的理解是:ROS topics是ROS nodes之间进行通信的枢纽,ROS messages是ROS nodes订阅和发布数据的载体。两个ROS nodes欲实现通信,则其中一个节点向ROS topic发布ROS messages,另一节点则通过订阅此topic来接收messages,两者的message类型一定要相同,而message的类型由主题确定,通过rostopic type命令可以查看topic的数据类型。
然后就是辅助查看ROS中节点关系和数据的工具:rqt_graph和rqt_plot,两者都是针对ROS类型的,其中rqt_graph工具会自动搜寻系统中正在运行的节点和主题,并动态绘制出关系图,rqt_plot则是绘制发布到topic上的数据的图形,因此两者使用的前提是有ROS的进程在运行。
运行节点:roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
查看节点关系图:rosrun rqt_graph rqt_graph
显示topic1上所发布的数据:rostopic echo topic1
列出当前处于激活状态的topic列表:rostopic list -v
显示topic1的数据类型:rostopic type topic1
显示类型更加详细的信息:rosmsg show type1
直接向主题topic1发布数据:rostopic pub [topic1] [msg_type] [args]
显示主题topic1上数据的发布速率:rostopic hz [topic1]
祝枫
2016年8月25日于哈尔滨