ROS机器人底盘(40)-通讯协议的补充
2020-03-11 本文已影响0人
PIBOT导航机器人
前文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.cpp
的init_trans
函数添加对该id的接收关注
frame->register_notify(ID_CLEAR_ODOM, this);
-
robot.cpp
的update
回调函数处理
...
case ID_CLEAR_ODOM: // 清除里程计信息
clear_odom();
break;
...