21届智能汽车竞赛智慧医疗思路分享
前言
第21届全国大学生智能车竞赛地瓜机器人-智慧医疗,全自主完成四个子任务,我们队在省赛的成绩是 18s 左右。
我们的总体思路:巡线 + 惯导坐标导航 + YOLO 避障 + 深度相机扫码。
这篇文章主要分享我们自己的思路。
一、改装部分
我们的车模是 X5 的小橙:
- 深度相机 Aurora930:这个非常重要。USB 相机拍二维码糊,深度相机的 RGB 画面清晰太多了。相机清晰度决定了扫码的距离,而半场可以直接左拐进入通道,不需要扫码后三段倒车,能节省很多时间。
- 车载屏幕:我们为了省事,直接给 X5 加了 7 寸的显示器,好处是更重,可以稍微减少点物理漂移;更省资源的做法应该是给 STM32 接入 LCD 或者 OLED,或者那种 TFT 的屏。
- 9 轴传感器:本次比赛放宽了传感器,这也是我们愿意用惯导的原因。本来的 6 轴偏移还是比较大的,但是 9 轴基本避免了这个问题。
- 网络:用无线网卡 + 手机热点,基本没遇到延迟问题。
二、底盘思路部分
底盘是有很大问题的,我们参考了贰贰玖的思路,具体链接是 https://blog.csdn.net/2301_80009912/article/details/150052806?spm=1001.2014.3001.5502 。简单说说:把很多无关的代码都删了,比如蓝牙控制、CAN,然后固定为阿克曼结构,OLED 屏显,删掉了 MPU6050 改成我们的 9 轴。这里有个坑:MPU6050 有一个检查,删了以后判断不到,好像不会启动底盘,我们这个找了半天才看见。
然后给 9 轴的路线是:原始 → 去零偏 (gz−bias)/131 → Yaw 角速度积分(dt=0.02s,回绕 ±π)→ 一阶低通 α=0.70(带回绕误差修正)→ ICM_Yaw_Cdeg(0.01°),经 USART3 (921600) 发给 X5 做转向闭环,然后改了转向的限制角度,具体还是在贰贰玖的思路里。另外车的左右拐转弯是不对称的,具体的值贰贰玖已经讲得很详细了。串口的波特率提高到了 921600,频率也提高到了 50Hz。其实感觉每辆车都是不一样的,具体要根据实际过程再做修改。
舵机复位:我们还加了每次上电先跑一个舵机复位动作,保证机械零位一致,不然每次装车角度都不一样。还有回正的增益,原因是我们发现车左拐后,下次直线就偏左,右拐就偏右,舵机一直无法回正到真正的中点,就加了增益,这都是为了提高坐标的精度。
三、二维码思路
深度相机是拉开时间的关键,因为足够清晰,可以很早地扫到码。
1. 扫码节点按需开关
- 扫码节点绝不一直开,特别耗 CPU。我们用
/qrcode_enable开关 + 里程计门控:任务一阶段且全局 x 坐标过中线后才允许扫,扫到一次立刻停(stop_after_first)。 - ROI 裁剪:把图像下半部分(地面)裁掉,只留上半部分,再放大、增强对比度,改了亮度,加了锐化,再丢给解码库,成功率明显提升,具体的参数还是要看图现调的。
由于我们架高了深度相机,目的是怕二维码前放锥桶影响我们半场扫码。如果有这个情况,车前的单目是看不到二维码的。除去这个情况,还有一个思路:单目识别到二维码后做好同步,因为深度最高是 15 帧,再做一个变换,这样单目很早看到的二维码交给深度来解码会有更好的准确度。如果用深度来推理也是可以的,主要是怕帧率不够影响到避障,还有就是怕资源不够,我们没有试,你们可以试一试。
2. 两种解码方案对比
我们写了两个节点做同图对比:ZBar、微信开源二维码库。
- ZBar:最轻量,CPU 占用最低,但对模糊、小二维码容易翻车。
- 微信开源库:带超分辨率模型(
use_super_resolution),对模糊二维码是降维打击,就是吃 CPU 多一点。
四、全程惯导的思路
1. 位姿来源
9 轴 IMU 提供 yaw,底盘速度(robotvel)积分提供位置,50Hz 融合:
- yaw 只用 IMU,不用电机里程计的姿态(漂移大);
- 位置用实际车体速度积分,加一个
wheel_vx_scale比例系数(我们标定到 1.053)修正轮径误差。
由于是用电机里程计,速度确定好了是不能改的。如果追求足够准确的话,确定好坐标,每次速度变换,坐标还是会有变动,不过也是可以解决的,但是时间不够了。
关于 IMU 数据源,官方有/imu/data_raw和/imu/data两个话题,官方很狗啊,默认是/imu/data_raw,但是/imu/data才是滤波过的。不过因为我们另外换了 9 轴,所以重新写了滤波,只是简单的滤波。具体路线(代码实现)是这样的:
9 轴 IMU(ICM20948)端的数据链路:原始 → 去零偏 (gz−bias)/131 → Yaw 角速度积分(dt=0.02s,回绕 ±π)→ 一阶低通 α=0.70(带回绕误差修正)→ ICM_Yaw_Cdeg(0.01°),经 USART3 (921600) 发给 X5 做转向闭环。
惯导融合节点(inertial_fusion_node)里又做了几层简单处理:
- 启动对齐:上电后静止约 1.5s,用 sin/cos 平均算出初始 yaw,把位姿对齐到 P 点 (0.55, 0.35),之后 yaw = 原始 yaw + 固定 offset;
- 跳变拒绝:单帧 yaw 跳变超过 35° 判为坏帧直接丢弃,用角速度积分兜底;
- 速度滤波:/robotvel 先乘
wheel_vx_scale=1.053修正轮径,再过死区(线速度 <0.015、角速度 <0.02 置零),最后做一阶低通 α=0.75,平滑速度突变; - 50Hz 积分:x += vx·cos(yaw)·dt,y += vx·sin(yaw)·dt,y 轴再乘
map_y_scale做整体校正。
如果用专门建模的卡尔曼精度可以更好,但是我们一圈下来基本上没有误差,就没有再折腾了。
2. 导航控制
坐标导航就是简单的 P 控制:距离比例给线速度、航向误差比例给角速度,弯道提前减速,到点附近才用目标航向,避免提前转向切进绿色区。顺/逆时针各一套路点,拐点都做了微调。我们的点比较少,就一个通道、四个拐角。
3. 避障
避障我就不说了,我们的思路不是很好,前面没啥问题,但是视觉在通道的拐角处是视野盲区,看不见锥桶就会撞,这个我们还没想到解决方法。