本项目是中国大学生工程实践与创新能力大赛中“智能+”赛道的智能物流搬运赛项。
Collaborators:CY
- 本项目使用的主控为STM32F407Vet6,使用CubeMX生成工程,使用Keil5进行编译和烧录。自己建立工程进行调试时相对应的时钟配置等可参考本工程
- 项目将各个模块分开管理,各自调试好驱动,实现功能,给出函数的调用接口或者封装好的功能函数,在主程序中直接调用,这样便于各自模块的调试和管理,最后的main函数里也调用的都是封装好的功能函数,这样代码逻辑也较为清晰。同时建议在各个文件夹中完善README.md文件,给出各个模块的使用方法和接口,说清楚各个函数的作用和参数,而不是就一个.c和.h文件。
- 各个模块最好能在模块文件中就实现了各种配置和初始化,而不是还要在cubeMX中进行配置(当然基本的一些外设也可以在cubemx中配置。
- keil编译工程时可能出现中文注释变成乱码的问题,建议自行上网查找解决方法(修改编译时的编码)或者干脆用英文注释,但是务必保证用英语能够清晰表达。
- 注意keil的main函数中代码要写在user code begin和user code end之间,不要写在其他地方,否则重新生成代码时会被覆盖。
- 添加了新的.c和.h文件后,需要在keil工程中添加相应的文件,否则编译时会报错(具体如何添加去网上找教程)
综述: 总体就是在main函数中执行各个动作,在定时器中断(my_timer.c
)和串口相关(my_usart.c
)中进行串口的通信与数据的传输等
比赛的决定性因素:
- 底盘位置移动的控制:主要是精度,无论是开环跑直线还是根据视觉进行微调,都对底盘的操纵性提出了很高的要求。
- 视觉识别的准确度和速度:在比赛环境下,可能会有不同的光照条件甚至阴影,对于颜色识别的干扰可能很大。同时,识别的速度也要越快越好,减少时间
1红 2绿 3蓝
- 展开:
- 出库:需要测试出库的角度、是否需要转向,是否需要陀螺仪辅助定位和初始化等
- 前往二维码:需要测试从完成出库的位置到二维码的位置的距离,前往二维码识别区域(此处无需精确定位)
- 二维码识别:需要发送开始识别的信号给树莓派,开始识别并返回识别的结果,测试识别的速度和准确度,在屏幕上显示顺序码
- 前往原料区:需要测试从二维码到原料区的距离,还需要整车转向,夹爪朝向原料盘(或者可以考虑出库时就转向)
- 原料盘精确定位:根据视觉识别,确定原料盘的中心,并调整车的位置
- 颜色识别与夹取:根据任务的顺序识别原料的颜色,当对应颜色到位时,树莓派发送信息,夹爪开始夹取,执行完毕后继续识别并夹取(此处需要考虑单次夹取和放置并归位的时间,尽量做到连续夹取)
- 前往粗加工区:三个物料夹取完后,前往粗加工区,一样需要测试时间和距离
- 粗加工区精确定位:到达大致位置时,借助视觉进行微调定位
- 放置原料:按照顺序放置(视底盘旋转的情况和电机移动的情况决定是原地一次性完成三个物料的放置还是移动分别完成,还要考虑是否需要视觉辅助闭环反馈校正)
- 夹取:把粗加工区的物料夹取,放置在载物盘上
- 前往暂存区:需要测试距离,还要考虑转向等问题
- 暂存区识别定位:到达大致位置后借助视觉进行微调
- 放置原料:按照顺序放置(要考虑的同上)
- 返回原料区:从暂存区返回原料区,需要测试移动的距离,还需要整车的旋转等
- 原料盘精确定位:根据视觉识别,确定原料盘的中心,并调整车的位置
- 颜色识别与夹取:根据任务的顺序识别原料的颜色,当对应颜色到位时,树莓派发送信息,夹爪开始夹取,执行完毕后继续识别并夹取(此处需要考虑单次夹取和放置并归位的时间,尽量做到连续夹取)
- 前往粗加工区:三个物料夹取完后,前往粗加工区,一样需要测试时间和距离
- 粗加工区精确定位:到达大致位置时,借助视觉进行微调定位
- 放置原料:按照顺序放置(要求同上)
- 夹取:把粗加工区的物料夹取,放置在载物盘上
- 前往暂存区:需要测试距离,还要考虑转向等问题
- 暂存区识别定位:到达大致位置后借助视觉进行微调
- 放置原料:按照顺序放置(码垛放置,颜色相同)
- 回到起停区:考虑是否需要旋转,如何入库(需要考虑总时间,需要在3分钟内完成)
主要参见各个模块下对应的README.md文件
2024.10.8
- 实现了串口屏、树莓派的通信和返回数据的初步处理
- 实现了电机的控制,但是底盘控制仍然有问题
- 实现了普通舵机的控制
2024.10.15
- 主控改回STM32F407vet6
- 实现了底盘的位置控制(移动给定距离、旋转给定角度),能达到毫米级别的控制
- 视觉的识别,能做到识别二维码、圆心等,但抗干扰情况和识别速度有待优化
2024.10.17
- 实现了树莓派和电机的联调,可以实现简单的视觉定位
2024.10.26
- 采用了新的PCB拓展板,加入了STM32的开关、精密舵机的接口等
- 实现了精密舵机的基本控制
2024.11.8
- 重装车后(采用玻纤板),重新调试了各个舵机的参数
2024.11.18
- 重新设计了PCB板
- 引入了z轴陀螺仪
2024.12.5
- 完成了比赛流程的可行性验证,实现了所有要求的功能,但性能指标还有没达到的
2024.12.13
- 能够完成比赛流程,用时6min左右
- 重新焊接了疑似烧毁的开关,并用热熔胶对主控板底部做了绝缘
- 完成基于陀螺仪修正的底盘运动控制(主要是借助陀螺仪完成精准转向,还可以在走直线时加入偏差校正,一旦走偏了就校正回来)
- 改善动作,加快放置和抓取的速度,还有微调移动的速度
- 加入各种特殊情况的处理函数:(比如开环跑到了圆环处,但是没看到完整的圆环,则可以根据视觉看到的圆环颜色来进行大致的移动)(还比如长时间没识别到圆环,或者识别不到位,则强制退出)(还有如果二维码没扫到,则将其赋默认值)
- 优化移动路径,比如曲线过弯等
- 跑一个简单的深度学习,加强颜色识别的效果和速度(在Edge impulse里训练并部署到树莓派上)
- 加入补光灯,提高识别的稳定性(最好能控制亮度等)
- 优化程序设计,保证识别速度、准确度(是否能快速识别,一次完成等)
- 优化直线的校正
- 优化底盘旋转的精准度(皮带轮更紧)
- 更换滑轨,避免生锈
- 尽量减小体积,保证承重情况
- 优化各种连接件的设计,避免松动、折断等情况(主要是485模块接线容易松动)
- 优化折叠的设计
- 加入陀螺仪,进行校正
- PCB完善设计,保证大功率长时间运行的安全性,保证各种供电的稳定性(更换开关,优化功率线设计,放置短路)
- 采用rtos进行任务调度或者自己设计一个简单的调度器
- 串口通信优化,改为使用DMA,降低CPU占用率
- 优化程序的框架(处理好通信、行为控制等的顺序和优先级)
- 程序的解耦合(把各个模块的参数等分开,避免混乱)
- 程序风格和语言的优化(如注释、变量命名等)
- 零件的替换和余量:比如联轴器、电机支架或者一些连接件等各种易损元件最好有备份的零件,直接可以换上的那种
- 设计和修改的余量:在国赛中物料可能会有各种花活,所以尽可能留足更改的可能与空间(比如物料盘尽量大一点)
- 别问为什么用keil和CubeMX而不用CubeIDE这种明显更现代的平台,问就是祖宗之法不可变。
- 改程序尽量注释而不是直接删掉,防止改完后忘了原来的情况
- 调车经验之谈:上电前务必三思,防止烧器件、忘了调参、忘了关电源等等;不要与一个问题或者故障死磕太久,防止陷入死胡同;最好不要一个人调。
- 大量的粗心错误,包括但不限于:忘记修改或者注释代码;忘记将测试代码改回正式代码;函数调用错误;命名错误
- 混乱的程序,包括但不限于:移动动作和机械臂动作的写在一起,无法分开调试;大量的语句复用而没有封装成函数;大量的全局变量;复杂的传参;缺少注释的代码;通讯混乱和随意
- 随意的代码管理,包括但不限于:没有及时备份代码;没有使用git进行版本管理导致不记得自己改了什么;代码没有交叉检查和review
- 硬件PCB设计的不合理:功率和非功率的5V没有分开导致烧板子;拨码开关无法耐受大电流导致的电火花;
- 接线的混乱:各种线都是垂在外面的
- 安全意识不强:缺少疯跑保护措施;缺少短路保护措施导致24V直接短路
- 画图和设计的方法不当:缺少实际的测量,有时数据不准
- 机械内部沟通不及时,导致零件打印错误、装配错误
- 队内比赛态度出现问题,造成误会和矛盾
- 有线调试器(stlink)实在不方便
- 出现过多次的忘记接线(舵机、串口、电源)