主要目的
本人平时研究slam算法,比如激光导航,动态路径规划,以及其它上层业务以及外围驱动相关的开发。其中会很多的理论和实际应用会用到ros系统中的一些开源的软件包,所以希望借助于ros平台能够快速的验证和实现一些实际应用需要的解决方法。苦于资金紧张,等了好久才下决心做一个ros小车用于学习和研究。下面我会详细介绍我从头开始一步一步小车底层的计划、思路等。
ros小车方案选型
要从头做一个小车底盘,首先要了解小车底盘结构、硬件、模块等等。小车底盘承载着机器人定位、导航、移动、避障等多种功能,是机器人必不可少的重要硬件。所以一个好的底盘对于上层算法定位、导航、控制精度至关重要!底盘主要包括如下:
1. 小车驱动模型
2. 小车负载要求(电池容量)
3. 底层驱动控制板
4. 电机编码器选型
5. 传感器配套等等
有了上面基本需求后,接下来是自己从头设计还是借助现成的平台,就看各位自身时间安排和目的了。像我这种几乎天天加班,没有太多业余时间,另外主要目的还是借助于这个平台学习和研究ros系统相关的知识,同时又想把底层控制相关的从头做一遍。思考再三,决定借助淘宝看看有无满足要求的小车底盘可用,淘了很久决定购买下面链接这款:
优点有如下几个方面:
1. 负载大,搭配22.2V/20Ah锂电池,可承载30~60Kg;
2. 麦克全向转向轮,前后启动时刻角度变化小;
3. MD36行星减速电机500线光电编码器,响应快、线性度好、精度高。
4. STM32F405RGT6 MCU控制板
缺点就是就是价格比较贵、设计不够人性化,资金充足和想学习的同学可以考虑,下面我购买订单,其中选用20Ah锂电池,补差价420元。
为了方便调试和接线处理,我做了如下改动:
1. 让厂家定做了一个电源开关,防止调试时控制不住开关使用;
2. 买了一个usb集线器,分别接STM32仿真器、两个USB转RS232;
3. 买了双面胶以及以及加高铝合金板,方便固定锂电池和工控机(笔记本电脑或者NUC、树莓派、RK3399都可以)
OK,小车底盘准备好了,接下来需要熟悉小车底盘的结构、硬件、以及学习STM32控制器编程。
小车底盘结构与硬件
小车驱动模型
前端一个全向从动轮,后端两个独立驱动轮,双轮差速驱动模式
小车硬件
从拿到的资料看了下硬件原理图,了解相关的原理,然后用表格把硬件要用到的接口列了出来,如下图所示:
STM32 编程
我买的MCU型号是STM32F405RGT6,由于STM32系列原理大同小异,所以不熟悉SMT32的同学可以上B站或其它网站学习,推荐正点原子、野火以及创客学院的视频教程。本人花了教程半个月学习完视频教程。
小车底盘、硬件和控制原理、SMT32使用熟悉后呢,下一步就要开始自己动手调试了,想想都鸡冻。不过正式动手之前,还是要列个学习或者实践计划表哈。
学习计划
下面是我用visio画的一个时间节点图,如下所示:
接口功能单元
主要用到串口、SPI接口、GPIO、I2C、ADC、定时器等等,所以需要熟悉STM32这些接口编程。可以参考厂家提供的源码,不过既然是学习,一定要熟悉其中原理,然后自己动手实践才是硬道理。其中在调试编码器输入脉冲以及电机输出脉冲时需要用到示波器查看输入输出波形图,串口的话配合串口调试助手即可。基本功能模块调试完成后,需要组合成一个完成的ros小车底层MCU工程。
MCU Keil工程
工程目录组织如下:
CORE: M3内核、SMT32中断、启动相关文件
FWLIB: hal库文件
HARDWARE: 板载外围硬件接口驱动
MPU6050: 陀螺仪驱动接口文件
SYSTEM: 系统时钟初始化、调试串口等
UCOSIII: uscos系统相关文件
USER: 上层应用相关文件
代码统一用c编写。为了便于调试,下面用QT写了一个简单的上位机软件。
QT上位机调试软件
刚开始想把界面做的炫一点,还特意用visio画了一个QT布局图(想做的同学可以参考下),如下所示,后来没时间就去实现。
整体布局
主界面
地图显示
驱动控制
PID参数整定
日志管理
实际效果图
最终由于时间关系,简单实现了功能,界面没时间去做(没人给钱呀呀),如下图所示:
小车蓝牙控制
手机上下载一个手机蓝牙app,把小车上的DT-06蓝牙模块接上,即可用手机蓝牙控制小车运动啦
核心代码讲解
任务线程
主要5个线程,分别为串口命令处理、运动模型解析、imu、里程计计算、Oled显示。
ros串口参数及里程计信息
串口协议
串口使用FIFO数据结构,在串口中断函数里面接收上位机下发的命令(状态机实现),以及上报底层状态信息
运动模型解算
视频演示
如有需要这款小车的同学请下方留言,价格可谈。提供所有资料,厂家提供资料以及我自己做的所有软件源码以及资料文档,可免费提供技术支持哈。
另外还有一块野火的F429-V2-带亚克力开发板,如下图所示,需要的同学给我留言: