简介
相信到目前为止,大家已经有接触过这几个名词了,那他们分别是什么,又有什么关系,这里帮大家梳理一下。
ros node
中文说法叫ros节点,实际上就是ros的应用程序,而不同ros节点之间通过rostopic和rosservice进行通信。我们以小乌龟教程举例,首先使用rosnode list查看当前的节点
比如这里的节点/turtlesim功能就是模拟小乌龟的应用程序
可以使用指令 rosrun <包名> <节点名> 运行ros节点,举例运行小乌龟教程
rosrun turtlesim turtlesim_node
rostopic
中文名叫ros话题,ros话题的操作方式有发布(pub)和订阅(subscribe),rostopic的主要用途是不同节点之间的通信,以小乌龟教程举例,/turtlesim节点会把小乌龟的速度,外观等数据通过topic发布出去,其他应用节点就可以订阅使用。
使用指令
rostopic list
可以列举出机器人当前发布的topic列表:
先使用指令发布一个topic让小乌龟动起来
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
常用指令如下
rostopic echo <topic name> # 查看topic实时数据
rostopic type <topic name> # 查看topic的数据类型,订阅topic的时候需要使用
rostopic hz <topic name> # 查看topic的发布频率
rostopic pub [topic] [msg_type] [args] # 发布rostopic
osmsg show <type> # 查看topic数据的具体格式
以/turtlesim节点发布的topic:/turtle1/cmd_vel举例指令使用结果如下:
sz-0203014018:~$ rostopic echo /turtle1/cmd_vel
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -1.8
---
这里最后的横线,是一次topic内容的结束分隔符,这个topic主要发布了小乌龟的线速度,角速度信息
@sz-0203014018:~$ rostopic hz /turtle1/cmd_vel
subscribed to [/turtle1/cmd_vel]
no new messages
average rate: 1.000
min: 1.000s max: 1.000s std dev: 0.00000s window: 2
average rate: 1.000
min: 1.000s max: 1.000s std dev: 0.00008s window: 3
average rate: 1.000
min: 1.000s max: 1.000s std dev: 0.00011s window: 4
average rate: 1.000
这里可以看出topic的发布平均频率是1hz,当然这里也包含了最小最大频率等其他信息
narwal@sz-0203014018:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
narwal@sz-0203014018:~$ 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
这里使用rostopic type获取到topic: /turtle1/cmd_vel的数据类型是 geometry_msgs/Twist
这里进一步使用了指令 rosmsg show geometry_msgs/Twist 查看了该数据类型的具体格式,上面最开始发布的指令就是依据这个格式来发布的
rosservice
中文名叫ros服务,是ros节点之间通信的另一种方式,ros服务的常用操作是请求(request)和响应(response),一些不需要频繁对其他节点广播的信息,或者一些控制指令,可以使用rosservice通信来实现,这是使用topic和service的主要区别。
使用指令
rosservice list
可以列举当前发布的service列表,service比较多,截图如下:
常用指令如下
rosservice call <service name> <param> # 请求service
rosservice type <service name> # 查看service 的数据类型,请求service 的时候需要使用
rossrv show <type> # 查看数据类型的具体格式
以 节点发布的service :/turtle1/set_pen 举例指令使用结果如下:
narwal@sz-0203014018:~$ rosservice type /turtle1/set_pen
turtlesim/SetPen
narwal@sz-0203014018:~$ rossrv show turtlesim/SetPen
uint8 r
uint8 g
uint8 b
uint8 width
uint8 off
---
narwal@sz-0203014018:~$ rosservice call /turtle1/set_pen -- 255 0 0 1 off
这里先用type指令获取了service的数据类型,再使用rossrv show指令获取了数据格式,最后给rosservice call指令传入数据,就改变了小乌龟的路径显示效果
结语
至此详细大家对rosnode,topic,service有了更清晰的认识,希望大家可以继续深入学习,共勉