SLAM从入门到精通(ROS和底盘Stm32的关系)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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。

相关推荐
lsz1525904 分钟前
嵌入式开发第一步:STM32 F1系列功能介绍与快速上手
stm32·单片机·嵌入式硬件·嵌入式开发·可扩展模块
橘色的喵7 分钟前
SD 卡在上电后的完整加载流程:从中断信号到文件系统挂载
单片机·嵌入式硬件·嵌入式·rt-thread·rtos
2CM_Embed9 小时前
Altium Designer 原理图与 PCB 快速相互定位:Cross Probe 交叉探针
嵌入式硬件·pcb·altium designer·c2000
恒锐丰-罗生10 小时前
宽压大电流同步降压优选|CN3906 DC-DC 电源芯片,车载 / 工控 / IoT 全能供电方案
嵌入式硬件·硬件工程
happygrilclh13 小时前
STM32,串口单字节中断接受,每次上电后,会收到一个0x00的解决办法。
单片机·嵌入式硬件
智闲电子设计14 小时前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
zcmodeltech16 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
程序员与背包客_CoderZ16 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
嵌入式阿蔡17 小时前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
天空'之城19 小时前
单片机基础核心知识点汇总(三)
单片机·嵌入式硬件