ROS学习笔记五:理解ROS topics
2016-08-25 16:21
627 查看
ROS学习笔记五:理解ROS topics
本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具。例子展示
roscore
首先运行roscore系列服务,这是使用ROS所必需的基础roscore
turtlesim
这里还要用到turtlesim例子,先运行其节点:rosrun turtlesim turtlesim_node
turtle键盘遥控操作
我们可以运行一个例程,然后通过键盘遥控操作turtle运行:rosrun turtlesim_teleop_key
然后就可以通过方向键来驱动小海龟运行了。下面来探究一下屏幕背后发生了什么。
ROS topics
上面例程中节点turtlesim_node和节点turtle_teleop_key通过一个ROS topic来互相通信。turtle_teleop_key节点在topic上面发布关键进程,turtlesim_node节点则订阅相同的进程来接收这些关键进程。可以利用rqt_graph工具来显示正在运行的节点和主题之间的关系。使用rqt_graph
rqt_graph工具是rqt软件包的一部分,可以创建系统中正在运行的节点、主题之间的一个动态关系图。运行命令:rosrun rqt_graph rqt_graph
然后就可以看到类似如下的关系图,可以看出节点turtle_teleop_key和节点turtlesim_node之间在turtle1/cmd_vel主题上进行通信。
使用rostopic
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显示发布在一个主题上的数据。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命令显示了当前被订阅和被发布的主题列表。rostopic list /rosout /rosout_agg /statistics /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose
ROS Messages
通过在节点之间发送ROS Messages实现节点之间的通信,发布和订阅节点之间发送和接收的数据类型必须一致,这意味着一个主题的数据类型由发布在其上的信息类型所决定。发布在主题上的信息类型可以由rostopic type topic1来显示。
使用rostopic type
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需要什么样的数据类型,所以我们可以发布命令给我们的小海龟。
rostopic continued
学习完ROS Messages之后,下面来学习一下rostopic和messages。使用rostopic pub
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返回数据发布的速率。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_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日于哈尔滨
相关文章推荐
- ROS学习笔记四:理解ROS节点
- ROS学习笔记三(理解ROS节点)
- Spring学习笔记:1、概念理解
- Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)
- webservice学习笔记——理解篇
- Javascript学习笔记--理解prototype
- Spring学习笔记:1、概念理解
- SQL学习之 对GROUP BY 和 HAVING 的理解 学习笔记
- [学习笔记]Java代码构建一个线程池的自己学习写的实例,用这个你会更好的理解文章内容
- Spring学习笔记——概念理解
- mfc学习笔记二:vc中activex控件理解
- Spring学习笔记:1、概念理解
- UML 学习笔记------ 面向对象概念的理解
- webservice学习笔记——理解篇
- webservice学习笔记——理解篇
- 指针的理解(1)-学习笔记
- spring学习笔记(五)-----AOP的理解(2)(未完代续)
- Spring学习笔记:概念理解
- C#学习笔记二:用实例深入理解装箱、拆箱
- XML学习笔记(一):关于字符编码的理解