12003| 11
|
[讨论] 两轮自平衡小车的线性CCD循迹总结 |
本帖最后由 开在边缘 于 2020-7-2 19:50 编辑 继之前的两轮自平衡小车的制作总结(https://mc.dfrobot.com.cn/thread-305939-1-1.html),这次新增了线性CCD循迹功能。选用的线性CCD是常用的TSL1401CL,配120度广角镜头,另外买了一根碳纤圆棒,外径6mm,内径4mm。 首先打印底座和支架 插个题外话,show一下自己的3D打印机。爷爷级的,2014年上市的家用级的3D打印机,三纬的da Vinci 1.0。 原厂的固件和软件简直就是烂成一坨屎,后来刷了Repetier 0.92的固件,再把主板上的SD卡引到机器外部。制图我一般都是用AutoCAD,切片软件是Simplify3D,保存gcode文件后copy到SD卡上就可以愉快的脱机打印了。 安装好的样子,CCD可以装在上端,也可以装在下端 后期调试的时候发现,在弱光环境下,CCD简直就是一个瞎子,就算是运放输出,也是一个白内障,所以又加了一个简单的照明 TSL1401CL的操作方式网上有很多介绍,这里就不再重复了。重点说说我的二值化算法,先看CCD的输出: 第一步要计算出二值化的阀值,最简单的就是找到最大值和最小值,然后取个平均值。但是原始数据有可能存在毛刺,就像上面第二张图,明显左侧有不正常的亮光,如果直接取平均值,那么阀值就会偏高。所以我先做了一次滤波,把毛刺去掉,然后像体育赛事打分一样,去掉几个最高分,再去掉几个最低分,尽量避免毛刺带来的影响,然后再取平均值,这样效果就明显好多了。 第二步,根据阀值进行二值化,最简单的就是高于阀值就是1,低于阀值就是0。这样做有一个明显的缺点,就是左右两侧的数值,会因为光照以及广角镜头畸变的原因,导致数值偏低,很有可能会低于阀值,被误认为是0。我根据阀值进行二值化后,多做了一个校验,就是看数值的曲线是不是平滑过渡的,如果是平滑过渡的,那就不认为是低于阀值,如果数值的曲线发生了突变,才认为是低于阀值。 第三步,对二值化后的数据,再做一次滤波,去除毛刺。 第四步,从上次的中值位置开始,往前往后同时寻找上升沿,找到上升沿后,再往后寻找下降沿,然后两者取平均值就是中值了。 第五步,如果没有寻找到上升沿和下降沿,那么判断之前一次的中值位置偏差是不是很大。如果很大,那么就表示因为弯道太急,速度太快,导致冲出弯道了,这时候就需要继续采用上一次的中值位置。 第六步,根据中值位置的偏差,进行PID计算。 先看看调试的过程,尽管我知道最好不要插着线调试,但是奈何串口输出数据简单明了啊。结果不出我所料,翻车了,又一次把开发板上的USB口给撅下来了,还好开发板便宜啊。 https://v.youku.com/v_show/id_XNDczNTUzNzQ4NA==.html 调试的差不多了,先试试简单的,黑线边界,当中白色区域做为道路 https://v.youku.com/v_show/id_XNDczNTUzOTE4OA==.html 都ok了,开始整点难度高的。一个是降低环境光线,直接关灯,使用小车自带的照明。另一个是道路收窄,直接把黑线做为道路,并且加上直角弯道和交叉路口 https://v.youku.com/v_show/id_XNDczNTUzOTU2MA==.html https://v.youku.com/v_show/id_XNDczNTUzOTkxNg==.html 源代码下载 平衡小车.zip libraries目录中的Kalman_Filter_Library是一个第三方库,用于MPU6050卡尔曼滤波计算的,你可以copy到Arduino的libraries目录中,或者直接在Arduino的库管理中下载。 程序里另外还用到的第三方库,就是u8g2和Adafruit的ST7735,都是用于驱动显示屏的,这个直接就可以在Arduino的库管理中下载。 |
材料在帖子里都有提到过 开发板:ESP32 devkit v1 姿态模块:MPU6050 电机驱动:TB6612 超声波测距:SR04 屏幕:普通的I2C或者SPI接口的OLED屏 电机:JGA25-370,减速比1:34,12线的霍尔编码器 电池:普通的航模电池,1500mAh-4S-35C 降压模块:MP1584,一个转3.3V,一个转12V CCD:TSL1401CL,配120度广角镜头 还有就是洞洞板、电线、铜柱、螺丝若干 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed