其他分享
首页 > 其他分享> > 第二部分 单机以及编队控制实验—初级教程(5)

第二部分 单机以及编队控制实验—初级教程(5)

作者:互联网

2.6 重要的话题Topics

机器人有许多的功能,这些功能的实现是依靠着机器人各个模块之间的通信来完成。在ros中有两种通信方式,其中一种就是topic通信(异步通信),而另一种是service(同步通信)通信。本节只对rostopic做一些简单的讲解,详细的了解可以前往ros的wiki上的rostopic。如果您还想了解servicr,可以前往ros的wiki上的rosservice

我们先来了解一下异步通信和同步通信:

  1. 异步通信:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
  2. 同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

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 listrostopic echorostopic 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]

说明:

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

说明:

  1. system_time 是嵌入式下位机系统时间,单位是(us)
  2. cpu_temperature 是嵌入式下位机上的cpu温度,单位是摄氏度(℃)
  3. cpu_usage 是嵌入式下位机上的cpu使用率百分比,取值范围: 0~1。
  4. battery_voltage 是嵌入式下位机的电池电压,单位是伏特(V)
  5. 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]

说明:

  1. name 是机器人上可运动的关节的名称,pitch代表云台俯仰关节,yaw代表云台偏航关节,wheel1~4代表底盘的1~4号电机(不同的车电机数量不一样)
  2. position 是对应位置关节的实时位置反馈(机械臂和云台的关节,一般是位置关节,单位是弧度)
  3. velocity 是对应速度关节的实时速度反馈(底盘的电机,一般是速度关节,单位是弧度/S)
  4. 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]

说明:

  1. pose 代表里程计反馈的位置和姿态数据。
  2. 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

说明:

  1. linear为线速度矢量,控制机器人走直线距离,其中的x、y、z为空间坐标系。由于机器人是小车,所以只有x会生效。
  2. 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