SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议

189
0
2020年8月28日 14时45分

摘要

运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件可以直接买到,很难买到通用的底盘。一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的;另一方面是因为底盘包含软硬件整套解决方案,是很多机器人公司的核心技术,一般不会随便公开。出于强烈的求知欲与学习热情,我想自己DIY一整套两轮差分底盘,并且将完整的设计过程公开出去供大家学习。说干就干,本章节主要内容:

1.stm32主控硬件设计

2.stm32主控软件设计

3.底盘通信协议

4.底盘ROS驱动开发

5.底盘PID控制参数整定

6.底盘里程计标


3.底盘通信协议

对于做纯SLAM算法、机器人导航避障、或者别的需要用到移动底盘的应用,其实不需要搞明白底盘的底层硬件原理和软件实现等繁琐的细节,只需要根据底盘通信协议,在上层应用程序中利用串口以收发数据的方式来完成对底盘的操作。也就是说底盘的底层操作细节被封装到基于串口通信的API中了。

先来说说ROS社区提供的rosserial库,rosserial库是为了解决单片机与机器人之间的通信问题,使用rosserial库可以实现单片机与机器人之间透明的ROS主题发布与订阅通信。原理其实很简单,如图30。

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图

(图30)ROS社区提供的rosserial协议

单片机中通过包含rosserial.h头文件来引用rosserial库中的数据封装与数据解析方法,这样在单片机上可以直接按照ROS中发布和订阅数据的语法来编写程序,rosserial库会自动完成封装和解析;被rosserial库封装成串口字节流后可以在串口数据线上传输;在机器人上同样通过包含rosserial.h头文件来引用rosserial库中的数据封装与数据解析方法,这样在机器人上直接按照ROS中发布和订阅数据的语法来编写程序,rosserial库会自动完成封装和解析。rosserial协议建立了单片机与机器人之间的透明ROS通信,这个ROS机器人开发这带来了很大的方便。

但是,rosserial协议虽然好,目前rosserial对很多单片机的支持还不是很好,只对少数型号的单片机(比如Arduino系列单片机)有支持,像应用广泛的stm32单片机就没有官方rosserial库的支持;另一个缺点,rosserial协议比较臃肿,这样对通信的资源消耗大并且影响数据实时性。

其实解决rosserial协议这几个缺点很简单,我们借鉴rosserial协议的思想,对rosserial协议中的冗余进行裁剪,我们miiboo机器人底盘自己的通信协议也就应运而生了。miiboo机器人底盘自己的通信协议,如图31。

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图(1)

(图31)miiboo机器人底盘自己的通信协议

其实很好理解,miiboo机器人底盘自己的通信协议包含两个部分:DEBUG-uart1和DATA-uart2。DEBUG-uart1用于stam32与机器人之间传输调试打印信息、调试命令;DATA-uart2用于stam32与机器人之间传输速度反馈、速度控制。并且DEBUG-uart1和DATA-uart2两个串口都采用波特率115200进行数据传输。下面就针对DEBUG-uart1和DATA-uart2这两部分的协议进行详细的讲解。

3.1.DEBUG-uart1协议内容

DEBUG-uart1协议内容分为:调试打印信息(stm32单片机==>机器人)、调试命令(stm32单片机<==机器人)。调试打印信息是stm32单片机向机器人发送数据,调试命令是机器人向stm32单片机发送数据。

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图(2)

(图32)调试打印信息(stm32单片机==>机器人)

 

在机器人端,对从串口获取的字符串数据流,直接用printf()函数就可以解析。

 

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图(3)

(图33)调试命令(stm32单片机<==机器人)

 

在机器人端,将要下发的调试命令(其实就是请求stm32单片机的版本信息与PID信息命令、请求将stm32中PID恢复为默认值命令、请求将stm32中PID设置为指定值命令)封装成对应的数据帧,然后让串口下发由这15个字节组成的数据帧就行了。

 

3.2.DATA-uart2协议内容

DATA-uart2协议内容分为:速度反馈(stm32单片机==>机器人)、速度控制(stm32单片机<==机器人)。速度反馈是stm32单片机向机器人发送数据,速度控制是机器人向stm32单片机发送数据。

 

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图(4)

(图34)速度反馈(stm32单片机==>机器人)

在机器人端,对从串口获取的字符串数据流,按照这个数据帧格式进行解析,就可以从这11字节组成的数据帧中解析出左轮速度、右轮速度。

SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议插图(5)

(图35)速度控制(stm32单片机<==机器人)

 

在机器人端,将要下发的目标速度控制值(左轮速度、右轮速度),按照这个数据帧格式进行封装,然后让串口下发由这11个字节组成的数据帧就行了。其实不难发现,速度反馈和速度控制遵循同样的数据帧格式,这也是很好理解的。

 

发表评论

后才能评论