【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
学过Ros的同学,一般对subscribe、publish、话题、服务这些内容都比较熟悉。如果再熟悉一点的话,还会知道slam、move_base、moveit这些框架。再了解多一点的呢,会对框架里面的算法,比如和hector slam、gmapping、amcl、迪杰斯特拉、a*算法比较熟悉。但是,对机器人底盘的知识,尤其是Ros和stm32怎么通信的,很多人却是不算太了解的。
1、Ros和Stm32的物理连接
一般来说,Ros和Stm32会通过串口进行通信。就算两者通信的是usb,也会在stm32开发板上面通过芯片把usb信号转换成串口信号。
2、操作系统不同
通常Ros都是运行在linux系统之上的,如果需要界面的话,还会搭载一个ubuntu系统。而stm32开发板上面一般不会安装操作系统,就算有操作系统,也会是一个简单的rtos,比如开源的freertos之类的。在这个板子上面,会根据不同的运动类型,实现不同的控制算法。简单的运动控制算法用pid实现就可以。
3、报文协议
既然Ros和Stm32之间需要进行通信,那么不管是Ros读数据,还是Ros写数据,都需要按照一定的报文格式进行。通常会采用0x55 0xaa这样的报文头,还会有报文长度、报文内容、校验码,这些都是常规的报文协议格式。
4、Ros从底盘获取的数据
Ros系统从底盘获取的数据主要有这么几种。第一,里程计数据。这个数据一般是底盘根据轮速和底盘模型计算出来的。第二,imu数据。imu这类传感器,一般也是直接由底盘负责处理的。好一点的底盘程序,会直接融合里程计和imu的数据。第三,避障、电量、电机转速这些原始数据。电量比较好理解,比如机器人没电了,就可以直接发命令让机器人去自动充电。电机转速这些很多情况不一定需要,但是如果机器人需要做功能安全的话,是需要的。
5、Ros发送给底盘的命令数据
Ros发送给底盘的数据其实就比较简洁了,主要就是cmd_vel数据。这里面包含了x/y/z的线速度,还有围绕x/y/z的角速度。
6、底盘厂家提供的Ros包
很多时候,底盘厂家会直接提供一个Ros包给Robot开发厂家。这样Robot开发企业就可以专注在算法领域和业务领域,不用关于底盘这些操作细节了。Ros包实现的内容就是上面提及的3、4、5中描述的工作。此外,Ros包还要把从底盘获得数据publish出去,当然对于需要发送给底盘的速度要求也要提前向roscore subscribe一下。
最后还有一个要注意的就是,如果Ros包退出,相关的class对象在进行析构的时候,一定要让底盘停止,发送最后一次停止命令报文。这样整个工作环境才是安全的,这一点务必要牢记在心。做工业自动化、或者汽车自动驾驶的同学,这方面尤其要注意。