ROS是一个分布式框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构。 ROS官方中文教程。
ROS概念关系图
主要概念关系可以用下面的这张图展示。
节点(node):ROS是以节点的形式开发的,可执行程序的最小单位。
消息(message):节点之间通过传送消息进行通讯。
主题(topic):消息以一种发布(publication)/订阅(subscription) 的方式传递,一个或多个节点可以在一个给定的主题中发布消息,多个节点可以订阅同一个主题。
服务(service):一个同步的消息通信方式,是一种一对一的机制。
在前面介绍了通过键盘控制小乌龟,指令如下。
1. 打开ROS服务
roscore
2. 打开一个新终端,运行“turtlesim_node”节点,打开小乌龟
rosrun turtlesim turtlesim_node
3. 打开一个新终端,运行“turtle_teleop_key”节点,通过键盘控制小乌龟
rosrun turtlesim turtle_teleop_key
输入如下指令展现当前的节点。
rosnode list
“/teleop_turtle”是键盘控制的节点,“/turtlesim”是小乌龟仿真节点。
输入如下指令展现“/turtlesim”节点的信息。
rosnode info /turtlesim
“/turtlesim”节点有三个发布,一个订阅,中括号后面是信息类型。都是通过topic方式进行消息传输,同时还有多个服务。其中有很多“turtle1”字段,表示当前的这只小乌龟名字。
发布(Publication)介绍
发布可以通过topic获取节点信息,下面来实例介绍。
输入如下指令,查看“/turtle1/color_sensor”发布的消息,该消息为窗口的背景色。
rostopic echo /turtle1/color_sensor
会不断的显示如下(按下“Ctrl+C”可以退出)
---
r: 69
g: 86
b: 255
输入如下指令,查看“/turtle1/pose”发布的消息,该消息为小乌龟的位置和速度。
rostopic echo /turtle1/pose
会不断的显示如下。
---
x: 5.544444561004639
y: 5.544444561004639
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
订阅(subscription)介绍
订阅可以通过topic接收节点信息,下面来实例介绍。
“/turtlesim”节点只有一个订阅“/turtle1/cmd_vel”,先输入如下指令看出该订阅的数据类型。
rosmsg show geometry_msgs/Twist
该数据类型是两个三向量的数据,分别为线速度和角速度。三个向量分别表示x,y,z三个轴,不过由于小乌龟模拟器是一个二维平面,所以只有线速度的x,y轴和角速度的z轴有效。
用指定的话题名称发布消息的命令为。
rostopic pub [话题名称] [消息类型] [参数]
例如输入如下指令发布一次消息,让小乌龟以x轴(乌龟前行)2m/s线速度和z轴2rad/s角速度运动三秒。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- [2,0,0] [0,0,2]
服务(service)介绍
服务是节点间一对一的通信机制,“/turtlesim”节点有多个服务,这里介绍修改绝对位置和相对位置的服务。
输入如下指令,查看服务的参数。
rosservice args /turtle1/teleport_absolute
rosservice args /turtle1/teleport_relative
用输入的参数请求服务的命令格式如下。
rosservice call [服务名称] [参数] 用输入的参数请求服务
输入如下指令,修改小乌龟的绝对位置和相对位置。
rosservice call /turtle1/teleport_absolute 1 1 0
rosservice call /turtle1/teleport_relative 1 0
前面获取到小乌龟的坐标位置约为[5.5 5.5],上述两条指令修改小乌龟绝对位置到[1 1],然后在向x轴方向移动1。
rqt_publisher模拟数据发送
除了使用指令发送,ROS还提供rqt数据发送工具箱。
输入如下指令,启动rqt_publisher工具。
rosrun rqt_publisher rqt_publisher
Topic选择“/turtle1/cmd_vel”,Type选择“geometry_msgs/Twist”,修改参数,最后勾上复选框,就可以自动的控制小乌龟了。
问题
使用指令来控制小乌龟的移动还是太麻烦,有不有更简单方便的方法控制小乌龟呢?