第二部分 单机以及编队控制实验—初级教程(5)
作者:互联网
2.6 重要的话题Topics
机器人有许多的功能,这些功能的实现是依靠着机器人各个模块之间的通信来完成。在ros中有两种通信方式,其中一种就是topic通信(异步通信),而另一种是service(同步通信)通信。本节只对rostopic做一些简单的讲解,详细的了解可以前往ros的wiki上的rostopic。如果您还想了解servicr,可以前往ros的wiki上的rosservice。
我们先来了解一下异步通信和同步通信:
- 异步通信:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
- 同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
topic是一种节点对节点的单向通信方式,这里的节点指的是ros中的node,单向就是这个节点要么只负责这个话题消息的接受,要么负责这个话题消息的发送,不会同时存在消息接受和发送。在ros中,负责发送消息给话题的叫发布者(Publisher),负责将话题传来的消息接受到的叫订阅者(Subscriber)。
例如:
我们通过键盘控制机器人的移动,就需要键盘和机器人的驱动来进行通信。我们会开启机器人驱动节点和键盘控制节点,其中键盘就是就是发布者,机器人的驱动就是订阅者。
2.6.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
2.6.1.1 通过rostopic list列出活动话题
1)打开一个终端,开启机器人的驱动节点
roslaunch handsfree_hw handsfree_hw.launch
2)打开一个新终端,将机器人驱动节点的活动话题列出来
rostopic list
下图为列出来的活动话题
3)关掉这两个终端,(关掉机器人驱动节点的终端时,先Ctrl+C结束节点进程,再关掉该终端)
4)重新打开一个终端,开启键盘控制节点,输入下面这段话
roslaunch handsfree_hw keyboard_teleop.launch
5)打开一个新终端,将键盘控制节点的活动话题列出来
rostopic list
下图为列出来的活动话题
6)通过对比,我们可以看到机器人驱动节点和键盘节点的活动话题有 3 条是相同的,这就代表两个节点之间有通过这几个相同的topcis进行通讯。
7)关掉这些终端,记得用Ctrl+C 将节点进程停止后,在关掉终端。
2.6.1.2 通过rostopic echo将消息打印到终端
我们通过 rostopic list
看到了活动的话题,那么该如何看到话题接受到的消息
1)打开终端,启动机器人的驱动节点
roslaunch handsfree_hw handsfree_hw.launch
2)打开第二个终端,启动键盘控制节点
roslaunch handsfree_hw keyboard_teleop.launch
3)打开第三个终端,将话题传递的消息打印到屏幕
rostopic echo /mobile_base/mobile_base_controller/cmd_vel
正常情况下, 您会看到有消息在打印
4)选中开启了键盘控制节点的终端,通过键入u
、i、o、j、l、m、,、。
来控制机器人移动,看看打印的消息是否发生了变化。如图,线速度和角速度的值发生了改变。
2.6.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值,可以让机器人完成前进、后退、旋转等。
2.6.2 重要的topic说明
1)获取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 是三轴加速度;
2)获取机器人底层硬件基本信息反馈
通过在终端输入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代表电池没有检测到。
3)获取机器人各个关节的位置、速度、力反馈信息
通过在终端输入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 是对应力关节的实时力矩反馈(一般的关机用不到力控制)
4)机器人里程计反馈
通过在终端输入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 代表底盘的速度控制数据。
5)底盘控制话题(切记:不是驱动的反馈,而是驱动节点收到的其它节点的控制数据)
运行键盘遥控终端:
roslaunch handsfree_hw 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上详细了解
6)云台控制话题: 云台的两个自由度的话题分别是:
/mobile_base/pitch_position_controller/command 和 /mobile_base/yaw_position_controller/command
float64 data
举例1:云台仰视45度:
rostopic pub -1 /mobile_base/pitch_position_controller/command std_msgs/Float64 -- 0.79
举例2:云台右转45度:
rostopic pub -1 /mobile_base/yaw_position_controller/command std_msgs/Float64 -- -0.79
标签:终端,单机,0.0,机器人,话题,初级教程,rostopic,节点,编队 来源: https://blog.csdn.net/qq_31530791/article/details/118672577