计算图级是ROS处理数据的一种分布式网络,用来描述程序运行和数据通信,在程序运行时,所有进程及它们所处理的数据均可通过一种点对点的网络形式表现出来,该网络可以通过rqt_graph可视化工具进行查看
节点node
ROS将程序包中可执行文件的运行实例称为节点,节点本质上就是执行运算任务的进程。一个ROS系统在运行时可以有多个节点,节点通常分工明确,如一个节点控制激光传感器,另一个节点控制马达等,节点还可以分布在不同的物理设备上。
$rosrun [程序包名] [节点名]
$roslaunch [选项] [程序包名] <launch文件名> [可变参数]
话题topic
节点之间的通信可通过消息进行传递,而消息则封装在话题中,话题本质上是对套接字的一种封装。消息以发布/订阅的模式进行传递,一个节点可以向一个给定的话题发布消息,另一个节点可以订阅给定话题中特定消息类型的消息。发布者和订阅者可通过话题实现解耦。需要注意的是,在ROS中,话题必须是唯一的,否则消息路由就会产生错误。
话题可以利用可视化工具rqt_graph进行查看
rostopic的常见用法如下:
#显示话题数据的接收速度即带宽
$rostopic bw [话题名]
#显示话题的延迟
$rostopic delay [选项] [话题名]
#显示话题的消息内容
$rostopic echo [选项] [话题名]
#查看特定类型的话题
$rostopic find [话题类型]
#显示话题数据的发布速度
$rostopic hz [选项] [话题名]
#显示活动话题的信息
$rostopic info [话题名]
#列出活动话题
$rostopic list
#向话题发布数据
$rostopic pub [话题名] [消息类型] [参数]
#打印话题/域类型
$rostopic type [话题名/域类型]
#显示所有话题列表
$rostopic list -v
输出结果如下:
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 3 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
从输出结果中可以看到当前的话题类型和话题传递的消息类型,如/turtle1/color_sensor话题传递的消息类型为turtlesim/Color。如果希望查看某个话题的信息,则方法如下:
$rostopic info [话题名]
比如,如果希望了解小海龟中话题/turtle1/cmd_vel的信息,则方法如下:
$rostopic info /turtle1/cmd_vel
相应的输出结果如下:
Type: geometry_msgs/Twist
Publishers:
* /teleop_turtle (http://miaozl-ThinkPad-T470p:42883/)
Subscribers:
* /turtlesim (http://miaozl-ThinkPad-T470p:43015/)
该话题具有一个发布节点turtlesim和一个订阅节点teleop_turtle,如果想了解话题/turtle1/cmd_vel的消息类型,则方法如下:
$rostopic type /turtle1/cmd_vel
如果希望查看话题/turtle1/cmd_vel上发布的具体内容,则方法如下:
$rostopic echo /turtle1/cmd_vel
消息message
ROS节点之间进行通信的最重要机制是消息传递,为了在不同的开发语言实现的模块间进行消息通信,ROS利用了简单的、与开发语言无关的接口定义语言来描述模块间传递的消息。
在ROS中,消息本质上是一种节点间传递信息的数据类型,当节点想要分享信息时,节点可以发布消息到相应的话题中,当节点需要接收信息时,节点可以订阅相应的话题。
节点管理器会确保消息传递的互通性,但消息不需要经过节点管理器进行转发。ROS提供了很多预定义的消息类型,但开发者可以通过后缀名为msg的消息文件自定义消息类型,msg文件应放置在程序包的msg目录下。
1.消息类型
消息类型描述了每个消息携带的信息以及这些信息是如何组织的。每个消息类型都属于一个特定的程序包,消息类型的命名方式为:
程序包名/消息名
消息类型“rosgraph_msgs/Log”表示程序包rosgraph_msgs的Log日志消息,程序包名和消息名之间通过“/”进行分隔。这种命名方式可以避免消息类型名称冲突。
消息类型每行的声明必须包含两部分:域和变量;域定义了消息的数据类型,变量定义了域的名称。域可以是独立域也可以是复合域。
所谓复合域是指由简单的一个或者多个子域组合而成的域,其中的每一个子域都可以是另一个复合域或者独立域,独立域由基本数据类型组成。ROS支持的基本数据类型有整型(int8、int16、int32、int64)、浮点型(float32、float64)、字符串型(string)、时间型(time、duration)、其他消息类型、可变数组或固定数组等。
geometry_msgs/Twist就是一个典型的由复合域构成的消息类型,它定义了机器人在3D空间中的线速度和角速度信息,其内容具体如下:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
其中,线速度linear、角速度angular的域就是复合域geometry_msgs/Vector3,缩进格式表示x、y、z的域是上级域的成员。对于在平面上运动的机器人,linear的z和angular的z均为0,对于无人机等在3D空间中运动的机器人,linear的z和angular的z均不为0。
可变数组在ROS中的应用也相当普遍,可变数组通过在字段后加[]来表示,表示点云的消息类型sensor_msgs/PointCloud使用了可变数组,其内容如下
Header header
geometry_msgs/Point32[] points
ChannelFloat32[] channels
2.查看消息
利用rosmsg可以查看消息,常见用法如下:
#显示消息类型描述
$rosmsg show [消息类型]
#作用与rosmsg show相同
$rosmsg info [消息类型]
#列出所有的消息类型
$rosmsg list
#显示消息的MD5签名
$rosmsg md5
#列出显示程序包中的消息类型
$rosmsg package [消息类型]
#列出包含特定消息类型的程序包
$rosmsg packages
如果希望查看话题/turtle1/cmd_vel的消息类型geometry_msgs/Twist的详情,则方法如下:
$rosmsg show geometry_msgs/Twist
如果希望查看程序包turtlesim中的消息类型,则方法如下:
$rosmsg package turtlesim
相应的输出结果如下:
turtlesim/Color
turtlesim/Pose
3.发布消息
多数时候,发布消息主要在程序包中进行,但有时候也需要手动发布消息,速率模式的发布方法如下:
$rostopic pub –r rate-in-hz [话题名] [消息类型] [消息]
该命令按照指定的频率重复向话题发布消息。一个小海龟运动的示例代码如下:
$rostopic pub -r /turtle1/cmd_vel geometry_msgs/Twist 1--'[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
在该消息驱动下,小海龟将一直做圆圈运动,除非停止执行指令。