重要的话题

机器人有许多的功能,这些功能的实现是依靠着机器人各个模块之间的通信来完成。在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-h

翻译如下:

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

1.1 通过rostopic list列出活动话题

  1. 打开一个终端,开启机器人的驱动节点

     roslaunch handsfree_hw handsfree_hw.launch
    
  2. 打开一个新终端,将机器人驱动节点的活动话题列出来

     rostopic list
    

    下图为列出来的活动话题
    rostopic-list-hw

  3. 关掉这两个终端,(关掉机器人驱动节点的终端时,先Ctrl+C结束节点进程,再关掉该终端)

  4. 重新打开一个终端,开启键盘控制节点,输入下面这段话

     roslaunch handsfree_teleop keyboard_teleop.launch
    
  5. 打开一个新终端,将键盘控制节点的活动话题列出来

     rostopic list
    

    下图为列出来的活动话题
    rostopic-list-key

  6. 通过对比,我们可以看到机器人驱动节点和键盘节点的活动话题有 3 条是相同的,这就代表两个节点之间有通过这几个相同的topcis进行通讯。
    contrast-list

  7. 关掉这些终端,记得用Ctrl+C 将节点进程停止后,在关掉终端。

1.2 通过rostopic echo将消息打印到终端

我们通过 rostopic list看到了活动的话题,那么该如何看到话题接受到的消息

  1. 打开终端,启动机器人的驱动节点

     roslaunch handsfree_hw handsfree_hw.launch
    
  2. 打开第二个终端,启动键盘控制节点

     roslaunch handsfree_teleop keyboard_teleop.launch
    
  3. 打开第三个终端,将话题传递的消息打印到屏幕

     rostopic echo /mobile_base/mobile_base_controller/cmd_vel
    

    正常情况下, 您会看到有消息在打印
    echo-key-off

  4. 选中开启了键盘控制节点的终端,通过键入u、i、o、j、l、m、,、。来控制机器人移动,看看打印的消息是否发生了变化。如图,线速度和角速度的值发生了改变。
    echo-key-on

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说明

  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_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上详细了解

  6. 云台控制话题: 云台的两个自由度的话题分别是: /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

results matching ""

    No results matching ""