ROS机器人底盘(3)-通讯协议

说明

底盘驱动板Ardunio Mega2560/STM32F1/STMF32F4与树莓派通过串口通讯

硬件板卡通讯协议

板卡通讯协议使用串口进行通信,每条消息包含消息头和消息体校验码三部分,所有数字采用小端序传递

消息定义

每条消息都由 [消息头]+[消息体]+[校验码] 3部分组成,每条消息最大长度为3+255+1字节,消息体最大255字节

消息头

消息头C风格定义如下:

struct head
{
    unsigned char flag;// 头部标记,固定值:0X5A
    unsigned char msg_id;// 消息ID,表示消息具体作用,决定消息体具体格式
    unsigned char length;// 消息体长度
}

校验码

校验码固定占一个字节空间,为消息头+消息体 每个字节相加得到的结果取低8位的值

消息定义

主板

msg id name
0 请求:固件版本
1 请求:设置机器人配置参数
2 请求:获取机器人配置参数
3 请求:初始化里程
4 请求:设置机器人实时速度
5 请求:获取里程计信息
6 请求:获取PID调速数据
  • 请求:固件信息

    • 方向:MASTER->Board
    • 内容:
    • 回应:固件信息
      • 方向:Board->MASTER
      • 内容:
      {
          char version[16]; //固件版本
          char time[16];  //构建时间
      }
      
  • 请求:设置机器人配置参数(出厂配置)

    • 方向:MASTER->Board
    • 内容:
    {
        union
        {
            char buff[64];
            struct
            {   
                unsigned short wheel_diameter;   //轮子直径  mm
                unsigned short wheel_track;      //差分:轮距, 三全向轮:直径,四全向:前后轮距+左右轮距 mm
                unsigned short encoder_resolution;  //编码器分辨率
                unsigned char do_pid_interval;         //pid间隔 (ms)
                unsigned short kp;
                unsigned short ki;
                unsigned short kd;
                unsigned short ko;                  //pid参数比例
                unsigned short cmd_last_time;       //命令持久时间ms 超过该时间会自动停止运动
            }
        }
    }
    
    • 回应:设置机器人配置参数
      • 方向:Board->MASTER
      • 内容:无
  • 请求:获取机器人配置参数(出厂配置)

    • 方向:MASTER->Board
    • 内容:
      • 方向:MASTER->Board
      • 内容:同设置
  • 请求:初始化里程

    • 方向:MASTER->Board
    • 内容:
    • 回应:初始化里程结果
      • 方向:Board->MASTER
      • 内容:无
  • 请求:设置机器人实时速度

    • 方向:MASTER->Board
    • 内容:
    {
        short v_liner_x; //线速度 前>0 cm/s
        short v_liner_y; //差分轮 为0  cm/s
        short v_angular_z; //角速度 左>0 0.01rad/s  100 means 1 rad/s
    }
    
    • 回应:设置机器人实时速度结果
      • 方向:Board->MASTER
      • 内容:无
  • 请求:里程计信息

    • 方向:MASTER->Board
    • 内容:
  • 回应:里程计信息

    • 方向:Board->MASTER
    • 内容:
    {
        short v_liner_x;      //线速度 前>0 后<0  cm/s
        short v_liner_y;      //差分轮 为0        cm/s
        short v_angular_z;    //角速度 左>0 右<0  0.01rad/s   100 means 1 rad/s
        long x;              //里程计坐标x       cm (这里long为4字节,下同)
        long y;              //里程计坐标y       cm
        short yaw;            //里程计航角        0.01rad     100 means 1 rad
    }
    
  • 请求:获取PID调速数据

    • 方向:MASTER->Board
    • 内容:
    • 回应:PID调速数据
      • 方向:Board->MASTER
      • 内容:
      {
          long input[4];  //各轮子驱动输入值
          long output[4]; //个轮子输出值
      }