重要的话题
机器人有许多的功能,这些功能的实现是依靠着机器人各个模块之间的通信来完成。在ros中有两种通信方式,其中一种就是topic通信(异步通信),而另一种是service(同步通信)通信。本节只对rostopic做一些简单的讲解,详细的了解可以前往ros的wiki上的rostopic。如果您还想了解servicr,可以前往ros的wiki上的rosservice。
我们先来了解一下异步通信和同步通信:
- 异步通信:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
- 同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
topic是一种节点对节点的单向通信方式,这里的节点指的是ros中的node,单向就是这个节点要么只负责这个话题消息的接受,要么负责这个话题消息的发送,不会同时存在消息接受和发送。在ros中,负责发送消息给话题的叫发布者(Publisher),负责将话题传来的消息接受到的叫订阅者(Subscriber)。
例如:
我们通过键盘控制机器人的移动,就需要键盘和机器人的驱动来进行通信。
我们会开启机器人驱动节点和键盘控制节点,其中键盘就是就是发布者,机器人的驱动就是订阅者。
1 rostopic命令
ros有很多的命令行工具,rostopic就是其中的一个,通过对rostopic的学习,我们可以较直观的看到机器人各个节点是如何通过topic进行通信的。
我们可以通过终端来看看rostopic的用法,打开终端,输入下面指令
rostopic -h
会在终端显示一些关于rostopic的用法
翻译如下:
rostopic是一个命令行工具,用于打印有关ROS话题的信息。
命令:
rostopic bw 显示话题使用的带宽
rostopic delay 从标题中时间戳显示话题延迟
rostopic echo 将消息打印到屏幕
rostopic find 按类型查找话题
rostopic hz 显示话题发布率
rostopic info 打印有关活动主题的信息
rostopic list 列出活动话题
rostopic pub 将数据发布到话题
rostopic type 打印话题或字段类型
键入rostopic-h以了解更详细的用法,例如“rostopic echo -h”
我们主要讲解rostopic list
、 rostopic echo
和rostopic pub
1.1 通过rostopic list列出活动话题
打开一个终端,开启机器人的驱动节点
roslaunch handsfree_hw handsfree_hw.launch
打开一个新终端,将机器人驱动节点的活动话题列出来
rostopic list
下图为列出来的活动话题
关掉这两个终端,(关掉机器人驱动节点的终端时,先Ctrl+C结束节点进程,再关掉该终端)
重新打开一个终端,开启键盘控制节点,输入下面这段话
roslaunch handsfree_teleop keyboard_teleop.launch
打开一个新终端,将键盘控制节点的活动话题列出来
rostopic list
下图为列出来的活动话题
通过对比,我们可以看到机器人驱动节点和键盘节点的活动话题有 3 条是相同的,这就代表两个节点之间有通过这几个相同的topcis进行通讯。
关掉这些终端,记得用Ctrl+C 将节点进程停止后,在关掉终端。
1.2 通过rostopic echo将消息打印到终端
我们通过 rostopic list
看到了活动的话题,那么该如何看到话题接受到的消息
打开终端,启动机器人的驱动节点
roslaunch handsfree_hw handsfree_hw.launch
打开第二个终端,启动键盘控制节点
roslaunch handsfree_teleop keyboard_teleop.launch
打开第三个终端,将话题传递的消息打印到屏幕
rostopic echo /mobile_base/mobile_base_controller/cmd_vel
正常情况下, 您会看到有消息在打印
选中开启了键盘控制节点的终端,通过键入
u、i、o、j、l、m、,、。
来控制机器人移动,看看打印的消息是否发生了变化。如图,线速度和角速度的值发生了改变。
1.3 通过rostopic pub将数据发布到话题
我们在终端将话题的消息打印出来,同时也可以通过rostopic pub命令让终端成为发布者,发布一个话题的消息,让机器人驱动节点订阅这个消息,让机器人动起来。
打开一个新终端,复制粘贴输入下面的指令(这些是一整句指令哦):
rostopic pub /mobile_base/mobile_base_controller/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
按下回车键,就可以让机器人旋转一个小的角度。修改对应的linear和angular值,可以让机器人完成前进、后退、旋转等。
1.4 重要的topic说明
获取imu的数据反馈
通过在终端输入 rostopic echo /handsfree/imu,可以看到
header: seq: 8163 stamp: secs: 1600054727 nsecs: 591243289 frame_id: "base_link" orientation: x: -0.00797228142619 y: -0.0354238115251 z: -0.181618481874 w: 0.982698500156 orientation_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] angular_velocity: x: -0.00319267483428 y: 0.0 z: 0.0 angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] linear_acceleration: x: 0.659971177578 y: -0.0286944005638 z: 9.31850624084 linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
说明:
- orientation 是姿态四元数
- angular_velocity 是三轴角速度
- linear_acceleration 是三轴加速度
获取机器人底层硬件基本信息反馈
通过在终端输入rostopic echo /handsfree/robot_state,可以看到
header: seq: 1126 stamp: secs: 0 nsecs: 0 frame_id: '' system_time: 1258132864.0 cpu_temperature: 37.0329437256 cpu_usage: 0.0 battery_voltage: 4.31145191193 power_remain: -1.0
说明:
- system_time 是嵌入式下位机系统时间,单位是(us)
- cpu_temperature 是嵌入式下位机上的cpu温度,单位是摄氏度(℃)
- cpu_usage 是嵌入式下位机上的cpu使用率百分比,取值范围: 0~1。
- battery_voltage 是嵌入式下位机的电池电压,单位是伏特(V)
- power_remain 是嵌入式下位机上的电量剩余百分比,取值范围: 0~1。-1代表电池没有检测到。
获取机器人各个关节的位置、速度、力反馈信息
通过在终端输入rostopic echo /mobile_base/joint_states,可以看到
header: seq: 24122 stamp: secs: 1599730954 nsecs: 12885933 frame_id: '' name: [pitch_joint, wheel1_joint, wheel2_joint, wheel3_joint, wheel4_joint, yaw_joint] position: [2.3561785221099854, 0.0, 0.0, 0.0, 0.0, -2.3561785221099854] velocity: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] effort: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
说明:
- name 是机器人上可运动的关节的名称,pitch代表云台俯仰关节,yaw代表云台偏航关节,wheel1~4代表底盘的1~4号电机(不同的车电机数量不一样)
- position 是对应位置关节的实时位置反馈(机械臂和云台的关节,一般是位置关节,单位是弧度)
- velocity 是对应速度关节的实时速度反馈(底盘的电机,一般是速度关节,单位是弧度/S)
- effort 是对应力关节的实时力矩反馈(一般的关机用不到力控制)
机器人里程计反馈
通过在终端输入rostopic echo /mobile_base/mobile_base_controller/odom,可以看到
header: seq: 34004 stamp: secs: 1599731449 nsecs: 704565438 frame_id: "odom" child_frame_id: "base_link" pose: pose: position: x: 0.00883402861655 y: 0.006383263506 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.110907605137 w: 0.993830721563 covariance: [0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.001, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1000.0] twist: twist: linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
说明:
- pose 代表里程计反馈的位置和姿态数据。
- twist 代表底盘的速度控制数据。
底盘控制话题(切记:不是驱动的反馈,而是驱动节点收到的其它节点的控制数据)
运行键盘遥控终端:
roslaunch handsfree_teleop keyboard_teleop.launch
打开新终端输入rostopic echo /mobile_base/mobile_base_controller/cmd_vel
linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0
说明:
- linear为线速度矢量,控制机器人走直线距离,其中的x、y、z为空间坐标系。由于机器人是小车,所以只有x会生效。
augular为角速度矢量,控制机器人转向,其中的x、y、z为空间坐标系。由于机器人是小车,所以只有z会生效。
也可以在ros的wiki上详细了解
云台控制话题: 云台的两个自由度的话题分别是: /mobile_base/pitch_position_controller/command 和 /mobile_base/yaw_position_controller/command
float64 data
举例: 云台仰视45度:
rostopic pub -1 /mobile_base/pitch_position_controller/command std_msgs/Float64 -- 0.79
云台右转45度:
rostopic pub -1 /mobile_base/yaw_position_controller/command std_msgs/Float64 -- -0.79