1. 一个实例
打开三个终端,分别运行下面三条指令:
1 roscore
2 rosrun turtlesim turtlesim_node
3 rosrun turtlesim turtle_teleop_key
- 如果第2, 3条无法运行,则可能是环境变量未配置, 可以执行:
source /opt/ros/melodic/setup.bash
之后就可以在第三个终端中输入方向建控制由第二个终端打开程序的小乌龟运动
2.ROS主题
上面的程序是如何实现的呢?
其实啊,turtlesim_node和turtle_teleop_key节点通过ROS主题相互通信。 turtle_teleop_key正在发布某个主题的按键,而turtlesim订阅了同一主题以接收这些按键。为了便于理解, 让我们使用rqt_graph来显示当前正在运行的节点和主题。
- 打开一个终端:
rosrun rqt_graph rqt_graph
你将会看到如下结果:

图片
这就是ros基于主题通信的一个简单结构
- rostopic工具可让您获取有关ROS主题的信息。
rostopic -h
输出:
rostopic bw 显示主题使用的带宽
rostopic echo 将消息打印到屏幕
rostopic hz 显示主题的发布频率
rostopic list 打印有关活动主题的信息
rostopic pub 将数据发布到主题
rostopic type 打印主题类型
-
现在使用rostopic工具来查看turtlesim相关主题信息
-
看一下turtle_teleop_key节点发布的命令速度数据。
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: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---现在让我们再次看一下rqt_graph。按下左上角的刷新按钮以显示新节点。您可以看到rostopic echo(这里显示为红色)现在也已成为turtle1 / command_velocity主题。
图片 -
rostopic list返回当前已订阅和已发布的所有主题的列表。查看当前的主题:
rostopic list -v 输出: Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 2 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber * /rosout [rosgraph_msgs/Log] 1 subscriber
-
3.ROS消息
节点之间发送ROS消息来进行主题交流。为了使发布者(turtle_teleop_key)和订阅者(turtlesim_node)进行通信,发布者和订阅者必须发送和接收相同类型的消息。这意味着主题类型由发布在其上的消息类型定义。可以使用rostopic type确定在主题上发送的消息的类型。
- 查看主题的消息类型:
rostopic type /turtle1/cmd_vel
输出:
geometry_msgs/Twist
- 使用rosmsg查看消息类型的详细信息:
rosmsg show geometry_msgs/Twist
输出:
geometry_msgs/Vector3 线性
float64 x
float64 y
float64 z
geometry_msgs/Vector3 角度
float64 x
float64 y
float64 z
4.手动发布消息数据
- rostopic pub将数据发布到当前广播的主题上。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

图片
- 这是一个非常复杂的示例,因此让我们详细查看每个参数。
rostopic pub 此命令将消息发布到给定主题
-1 此选项(连字符1)使rostopic只发布一条消息,然后退出
/turtle1/cmd_vel 这是要发布到的主题的名称
geometry_msgs/Twist 这是发布到主题时要使用的消息类型
-- 此选项(双破折号)告诉选项解析器以下参数都不是选项。如果您的参数以破折号开头(例如负数),则需要这样做。
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' 如前所述,geometry_msgs / Twist msg具有两个三个浮点元素的矢量:线性和角度。在这种情况下,“ [2.0,0.0,0.0]”成为x = 2.0,y = 0.0和z = 0.0的线性值,而“ [[0.0,0.0,1.8]”是x = 0.0的角度值, y = 0.0,z = 1.8。这些参数实际上使用YAML语法,有关详细信息,请参见YAML命令行文档。
您可能已经注意到乌龟已经停止移动了;这是因为乌龟需要1 Hz的稳定命令流才能继续移动。我们可以将rostopic pub -1 替换为rostopic pub -r 1 命令发布稳定的命令流:
- 如您所见,乌龟连续运转。在新的终端中,我们可以使用rostopic echo来查看turtlesim发布的数据:
rostopic echo /turtle1/pose
5.topic的其他工具
- 让我们看看turtlesim_node发布/ turtle1 / pose的速度:
rostopic hz /turtle1/pose
输出:
subscribed to [/turtle1/pose]
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
average rate: 59.459
min: 0.005s max: 0.027s std dev: 0.00271s window: 118
average rate: 59.539
min: 0.004s max: 0.030s std dev: 0.00339s window: 177
average rate: 59.492
min: 0.004s max: 0.030s std dev: 0.00380s window: 237
average rate: 59.463
min: 0.004s max: 0.030s std dev: 0.00380s window: 290
- rqt_plot显示有关主题发布的数据的滚动时间图。在这里,我们将使用rqt_plot绘制在/ turtle1 / pose主题上发布的数据。输入以下命令启动rqt_plot
rosrun rqt_plot rqt_plot
