ROS机器人底盘(40)-通讯协议的补充

前文ROS机器人底盘(3)-通讯协议说明了PIBOT机器人小车使用的通讯协议的定义,本文介绍下如何添加新的命令
协议通过一个字节的msg id区分消息类型,其中各个消息大概可以分为三类

  • 读取数据
    如读取版本,读取odom
  • 设置数据
    如设置参数
  • 执行动作
    如控制速度,控制电机等

下位机

1.读取数据命令

例如需要新增一条获取imu的命令,涉及到哪些修改呢?

  • dataframe.h新增命令id
//消息id定义
enum MESSAGE_ID
{
    ....
    ID_GET_IMU_DATA = 7,            // 获取imu值
    ID_MESSGAE_MAX
};
  • simple_dataframe_slave.cpp,新增对该命令的处理
    //更新接收到的id执行响应操作,一般分为读取,写入,和执行动作3个操作
    switch (id) {
    ...
case ID_GET_IMU_DATA://获取imu数据
        send_message(id, (unsigned char*)&dh->imu_data, sizeof(dh->imu_data));
        break;
    default:
        break;
    }

这里&dh->imu_data为数据存储的地址

只需步即可以完成一个数据的获取实现

2. 写入数据(设置)

写入跟读取类似,只是第二步有所区别

    case ID_SET_VELOCITY: //设置数据
        memcpy(&dh->velocity, active_rx_msg.data, sizeof(dh->velocity));
        send_message(id);
        break;

active_rx_msg.data就是发送来的数据,我们把他保存到我们希望存储的变量即可

3. 执行动作

  • 同上添加id
  • robot.cppinit_trans函数添加对该id的接收关注
    frame->register_notify(ID_CLEAR_ODOM, this);
  • robot.cppupdate回调函数处理
  ...
    case ID_CLEAR_ODOM:   // 清除里程计信息
        clear_odom();
        break;
  ...

推荐阅读更多精彩内容