理解ROS Topic
运行 roscore
在新窗口打开小乌龟例子 rosrun turtlesim turtlesim_node
在新窗口中运行键盘支持 rosrun turtlesim turtle_teleop_key
使用键盘上的方向键来控制turtle运动
ROS Topic
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题Topic来相互通信的。
turtle_teleop_key在话题上发布publishing 键盘按下的消息,
turtlesim 订阅subscribes 该话题以接收消息。
使用rqt_graph可以显示当前运行的节点和话题的关系图。
rqt_graph
rqt_graph用动态图显示了系统中正在发生的事情
在新终端运行 rosrun rqt_graph rqt_graph
turtlesim_node和turtle_teleop_key节点node正通过一个名为**/turtle1/command_velocity**的话题Topic来相互通信
rostopic
rostopic 命令工具能获取ROS话题Topic的信息
$ rostopic -h
Commands:
rostopic bw display bandwidth used by topic 显示Topic带宽
rostopic delay display delay of topic from timestamp in header 从header的时间戳上显示Topic的延迟
rostopic echo print messages to screen 在屏幕上输出信息
rostopic find find topics by type 通过类型寻找Topic
rostopic hz display publishing rate of topic 显示Topic的发布率
rostopic info print information about active topic 显示当前活动的Topic信息
rostopic list list active topics 列出当前活动的Topic
rostopic pub publish data to topic 发布数据到Topic
rostopic type print topic or field type 打印Topic或字段类型
Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'
rostopic echo
$ rostopic echo [topic]
查看由turtle_teleop_key节点发布的“cmd_vel”数据
$ rostopic echo /turtle1/cmd_vel
移动 小乌龟后会实时打印角度和速度
rostopic list
$ rostopic list -h
Usage: rostopic list [/topic] 使用方式 +topic
Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file 列出 .bag 文件中的topic
-v, --verbose list full details about each topic 列出有关每个topic的完整详细信息
-p list only publishers 只列出发布者
-s list only subscribers 只列出订阅者
ROS Message
Topic的通信Communication 是通过节点nodes间发送ROS消息message实现的。
为了使发布者publisher (turtle_teleop_key)和订阅者subscriber (turtulesim_node)进行通信,
发布者和订阅者必须发送和接收相同类型type的消息。
这意味着topic的类型是由发布在它上面消息的类型决定的。
使用rostopic type命令可以查看发布在topic上的message的类型。
用法:
$ rostopic type [topic]
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ 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
说明了这些数据的类型 为float64
rostopic pub
把数据data发布publish到当前某个正在广播advertised的话题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.0大小的线速度和1.8大小的角速度移动
rostopic pub:将消息发布到指定的话题
-1:让rostopic只发布一条消息,然后退出
/turtle1/cmd_vel:要发布到的话题的名称
geometry_msgs/Twist:发布到话题时要使用的消息的类型
- -:告诉选项解析器,表明之后的参数都不是选项。如果参数前有符号(-),比如负数,那么- -是必需的
’[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’ :一个turtlesim/Velocity消息有两个浮点型元素:linear和angular。在本例中,’[2.0, 0.0, 0.0]'表示linear的值为x=2.0, y=0.0, z=0.0,而**’[0.0, 0.0, 1.8]'是说angular的值**为x=0.0, y=0.0, z=1.8。
这些参数实际上使用的是YAML语法
turtle已经停止移动。这是因为turtle需要一个稳定的频率为1Hz的指令流才能保持移动状态。我们可以使用rostopic pub -r命令来发布源源不断的命令:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
这将以1 Hz的速度发布velocity指令到velocity topic上
可以看到,小乌龟正沿着一个圆形轨迹持续运动。可以在新终端中通过rostopic echo命令来查看turtlesim所发布的数据:
rostopic echo /turtle1/pose
rostopic hz
报告数据发布的速率
用法
rostopic hz [topic]
$ rostopic hz /turtle1/pose
average rate: 62.496
min: 0.015s max: 0.017s std dev: 0.00036s window: 749
average rate: 62.501
min: 0.015s max: 0.017s std dev: 0.00036s window: 812
average rate: 62.499
min: 0.007s max: 0.024s std dev: 0.00056s window: 874
average rate: 62.498
min: 0.007s max: 0.024s std dev: 0.00055s window: 937
average rate: 62.499
min: 0.007s max: 0.024s std dev: 0.00054s window: 999
average rate: 62.497
min: 0.007s max: 0.024s std dev: 0.00053s window: 1062
average rate: 62.501
min: 0.007s max: 0.024s std dev: 0.00053s window: 1125
^Caverage rate: 62.498
min: 0.007s max: 0.024s std dev: 0.00053s window: 1156
turtlesim正以大约62Hz的频率发布有关乌龟的数据
也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次信息:
$ rostopic type /turtle1/cmd_vel | rosmsg show
rqt_plot
如果使用的是ROS electric或早期版本,那么rqt是不可用的,使用rxgraph代替
rqt_plot命令可以在滚动时间图上scrolling time plot 显示发布到某个话题上的数据。这里我们将使用rqt_plot命令来绘制正被发布到/turtle1/pose话题上的数据
$ rosrun rqt_plot rqt_plot
会弹出一个新窗口,可以在左上角的文本框里面添加任何想要绘制的话题
在左上角的文本框里输入/turtle1/pose/x后
按下变亮的加号按钮
{对/turtle1/pose/y重复}
出现线图,vx-t vy-t的速度曲线图
按下减号按钮会显示一组菜单可以在图中隐藏指定的话题
现在隐藏掉刚才添加的话题并添加/turtle1/pose/theta