本仓库所存放的是该项目的前后端软件代码
该项目所有仓库链接如下:
基于仿真系统的演示视频:该视频是疫情提前回家剪的,所以页面功能相对不完整
本项目来源于北京理工大学智能制造工程(新工科专业)的新型培养模式下的项目制课程。该课程基于实际工厂的移动作业,弹性生产与智能调度需求,要求学生以产品化思维进行面向需求的全产品生命周期设计与开发。
当需求下发过后,作品的场景定义、技术选型、物资采购与管理(BOM表等),项目规划与推进(甘特图等),工程架构与实现等实际工程或产品开发所涉及的环节学生皆亲身经历并定期答辩和交付
该项目需求场景较为宏大,我们定义并实现的核心模块包括:
- 基于
FreeRTOS
的STM32单片机开发与CAN总线电机驱动 - 基于Linux系统的ROS自主导航系统与资源调度算法开发
- 基于
FastAPI
与Vue2
的RESTful
前后端分离网页开发 - 基于
sqlite
的数据中心搭建与状态机管理 - 基于
Opencv
的工件表面缺陷检测与深度检测
本项目综合性较强:
-
基于制造背景的知识进行场景和功能模块的定义
-
基于电路知识与计算机组成原理的单片机开发
-
基于操作系统知识的多线程并发管理与实时操作系统FreeRTOS开发
-
基于计算机网络知识的远程开发,多模块通讯(websocket、http、串口、iic等)
-
基于数据库知识的关系型数据库与非关系型数据搭建及相关CRUD接口开发
-
基于机器视觉与信号与系统相关技术的摄像头标定及算法开发
-
基于管理知识的人员分工,成本控制,项目开发周期管理
-
工程化项目组织意识:
- 每个项目进行有意识的分文件管理,保证代码组织的有序,易于错误的排查
- 有效的项目结构划分使得我们可以很好的进行多人协作开发
本项目基于STM32F407VETX
- 基于看门狗的异常复位(基于FreeRTOS的事件组机制)
- 基于定时器的上位机指令查询,当超过一定时间没有接受到运动指令(时间可在上位机动态调整,默认8s)车子自动停车
- 基于ROS LOG机制的下位机运行日志记录(包括warning、fatal、error等)
- 基于FreeRTOS的线程抢占优先级机制,设置了高优先级指令处理线程,使得突发状况可以及时处理
- 基于ROS sever服务器机制可在上位机对下位机连接的传感器(编码器、电池等)工作状态进行配置,包括传感器的工作使能控制和采样周期控制(基于软件定时器),经测试编码器查询速度最快可到8ms一次
- 基于ROS param机制的初始参数配置,可在上位机编写yaml文件进行配置的保存
- 基于C++面向对象的思想对不同的外设进行了封装,提高了同类外设驱动的复用性
- 基于多线程的程序开发模式,可以通过创建新的线程快速集成新的外设模块
- 采用嵌入式实时操作系统保证系统响应调度实时性
- 采用CAN总线和基于DMA的串口通讯保证信息传输的实时性
该模块具体效果可以参见演示视频
对麦克纳姆进行正逆运动学转换,用以将编码器信息转化为欧式坐标系下的运动信息,从而构建小车的里程计信息
问题:麦轮的运动学分析首先需要计算出由编码器测量所得的轮子运动线速度,由于麦轮易于磨损且基于尺度工具的测量必然存在测量误差,所以基于物理模型的编码器——轮速转换无法满足精度要求,故我们采取基于统计回归模型的动态解算
解决方案:
- 数据采集:首先在下位机有PID调控的情况下,采集不同速度设置下的编码器数据
此处假设在空载悬浮条件下,PID控制下的速度为精确值,经过激光测速仪测量校准,该假设近似成立
- 异常值处理:在采集过程中发现编码会由于数值溢出会产生显著的离群值,故此处我们使用Z-score和DBSCAN算法进行异常检测,对于异常值我们进行ROS日志警告,并将其进行舍弃
由于编码器采集速度很快,小车的速度不会发生突变,所以舍弃一两个异常值并不会影响里程计的计算
- 统计回归:基于先前所采集的数据进行回归预测,由此计算出每个轮子的实际速度
基于ROS的导航栈构建的导航系统
功能模块 | 算法选择 | 备注 |
---|---|---|
地图构建 | gmapping | |
位置估计 | ekf扩展卡尔曼滤波 | 融合imu和odom数据,在odom节点中实现了ekf动态激活功能 |
导航定位 | amcl | |
全局路径规划 | Dijkstra算法 | |
局部路径规划 | DWA算法 | 避障和运动输出 |
基于ROS的dynamic parameter
进行大量调参后,实现:
- 较好的路径规划和运动输出
- 运动不卡顿,转弯不困难,转向很随意
- 极好的避障效果
- 只要没人故意撞他,基本不会撞人
- 长走廊位置不丢失
- 得益于较好的里程计
- 定位鲁棒性强
- 不会因为一群人围着而丢失位置
- 多点导航的实现
- 可以基于rviz进行多点导航的可视化设置
- 可以基于节点的多点导航设置
- 多点导航状态的检测缓存
- 可以在暂停当前任务后执行继续导航(任务恢复)和任务取消功能
由于小车的雷达为2D雷达,故无法对于矮于雷达的障碍或透明障碍进行检测,故需要借助于视觉进行深度检测,从而实现3D避障
此图可见对于塑料瓶等透明物体也能较好的进行识别
基于fastapi框架可以很方便的进行接口的测试与验证
基于数据库实现了多对象的状态机管理,在本项目中我们定义的软件调度如下:
其中,订单,任务,小车,客户皆有自己的状态:
通过vue-route实现同一登录界面,基于账号不同的客户端与管理者的界面分离
登录界面 | 客户端 | 管理端 |
---|---|---|
基于echarts和websocket实现实时大屏可视化推送
- 该页面通过websocket与后端进行实时通讯,页面包含以下功能:
- 移动小车实时工作三维可视化
- 全向键盘控制和差速键盘控制(可调速)
- 可配置图像显示,主要用来显示相机视图和相机处理后的视图
- 订单调度列表
- 车辆工作信息
- 设备工作状态
- 速度监测和负载监测
- 电量、网络、小车状态显示
- 配置与任务状态控制
- 可配置的ros话题可视化
-
该页面将商品分为:
- 客户定义商品
- 第三方定义商品
- 官方定义商品
这样可以实现不同用户间商品定义共享,扩大开源精神
-
每个商品可以定义其加工工序,这些工序定义可用于后续订单调度坐标提取
- 在该页面,客户可以基于商品定义订单,只要订单尚未被官方处理,客户都可以修改订单,直到客户提交了订单,后台才能看到用户的订单信息
- 客户和后台都能看到订单当前的状态,如果订单处理失败,可以看到失败的原因
客户端 | 管理端 |
---|---|