【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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对象在进行析构的时候,一定要让底盘停止,发送最后一次停止命令报文。这样整个工作环境才是安全的,这一点务必要牢记在心。做工业自动化、或者汽车自动驾驶的同学,这方面尤其要注意。
7、stm32开发板上的cmd_vel目标分解说明
前面我们说过,对于差速轮来说,它的线速度公式是这样的,vl和vr分别是左右轮的速度,
v = (vr + vl) /2
角速度公式是这样的,其中l是轮距,
w = (vr - vl) / l
假设这个时候,底盘从ros获取了vx、vy和w的要求,此时应该如何转变成vl和vr呢?处理过程其实是一样的。首先计算一下v,
v = sqrt(vx * vx + vy * vy)
接着就是利用数组计算,
vr + vl = 2 * v
vr - vl = w * l
所以简单计算一下,
vr = v + w*l/2
vl = v - w*l/2
进一步带入v和w,那么公式就变成,
vr = sqrt(vx*vx + vy*vy) + w*l/2
vl = sqrt(vx*vx + vy*vy) - w*l/2
所以说,大家最好能够灵活掌握vr/vl和v/w之间的转换过程。至于vr、vl怎么达到,比较简单的办法就是pid了。注意这里的vx、vy其实是有正有负的,算下来角度就是theta角。
8、其他
上面描述的都是正常情况。大家有没有想过,如果ros发送的cmd_vel,底盘做不了怎么办?比如,一些robot做不来原地旋转。那么这个时候改哪个程序呢?毫无疑问,就是publish cmd_vel的程序,local_planner。文章来源:https://www.toymoban.com/news/detail-727721.html
文章来源地址https://www.toymoban.com/news/detail-727721.html
到了这里,关于SLAM从入门到精通(ROS和底盘Stm32的关系)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!