
【背景】
在上一个帖子中,记录了四轮方向小车(3D打印版)的视觉巡线的初步尝试,收获超过了预期,二哈识图的巡线功能确实好用好玩。
这个帖子继续尝试和优化。
【目标任务】
黑色虚线路线视觉巡线的测试。

【器材】
四轮方向小车 1
二哈识图 1
电工胶带
【提示】
学习线条时,尽量把HuskyLens的位置调节到与线条平行。
当更换场景时,请重新学习线条,以保证二哈能准确识别。
光线暗时可以在常规设置中打开LED灯照明,这时光线改变,重新学习线条。
识别的线条可以是任何与背景有明显色差的单色线条,建议线条与背景色有足够的色差,以保证巡线的稳定。
HuskyLens可以根据线条的颜色不同,进行多个线条的学习与巡线,但是线条必须是与背景有明显色差的单色线条。大多数情况下,巡线用的线条,只有一种颜色。为了保证稳定性,建议只对一种颜色的线条进行巡线。
线条的颜色与环境光线有很大关系,建议巡线的时候,保持环境光线的稳定。
学习线条:
将HuskyLens屏幕上的“+”字对准目标线条。建议HuskyLens的视野范围内只有需要学习的线条,并且没有交叉线。尽量将HuskyLens与目标线条保持平行,然后HuskyLens会自动检测线条,并出现白色的箭头。然后短按“学习按键”即可,白色箭头变成了蓝色箭头。
巡线追踪:
当HuskyLens检测到学习过的线条时(即:同一种颜色的线条),HuskyLens的屏幕上会显示蓝色的箭头,箭头的指向表示路径预测的方向。

HUSKYLENS 巡线实现逻辑如何让麦昆 plus 在白底黑线的巡线地图上循着黑线运动呢?其实我们只需要知道麦昆 plus 相对黑线是什么位置,分下面三种情况:1、当麦昆 plus 在黑线的偏右位置时,控制麦昆 plus 向左转弯;2、当麦昆 plus 与黑线相对居中时,控制麦昆 plus 直行;3、当麦昆 plus 在黑线的偏左位置时,控制麦昆 plus 向右转弯。具体应该怎么实现呢?我们将 HuskyLens 在巡线过程中屏幕上显示的信息剥离出来,抽象成下图的几何数学模型。HuskyLens屏幕的分辨率是 320×240,屏幕左上角的O点为屏幕的坐标原点(0, 0),水平向右方向为 X 轴正方向,竖直向下方向为 Y 轴正方向,因此屏幕右下角的坐标为(320, 240)。上图中橙色虚线为屏幕的中轴线,这条线的横坐标值为160。上图屏幕中黑色的线,是 HuskyLens 摄像头“看到”的巡线地图线条,蓝色箭头为 HuskyLens 计算出来的线条方向,蓝色箭头的起点坐标为(x1, y1),终点坐标为(x2, y2)。

寻虚线的逻辑是,屏幕中有箭头时,沿箭头方向运动,看不到箭头时,按前面的方向和速度运动。
【程序设计】
mind+
主控:

用户库:

传感器:

执行器:

二哈用IIC与掌控板通信,请在二哈中设置协议为IIC。

方向舵四轮小车的转向是由舵机来控制的,直行、左转和右转都是通过舵机的角度调节来完成。
按照我的小车的舵机安装方式,80度为直行,小于80度右转,大于80度左转。
方向舵机的角度应该随二哈识别中测试出的转向预测箭头的终点坐标x2偏离中线x=160的大小动态调整,偏离中线x=160越大,舵机的转向角度也应该越大。


用x2坐标的取值范围0-320映射舵机转向角度140-20(80+-60),这里用更大的转向角度是为减少四轮小车的转弯半径(相比万向轮的三轮小车,四轮方向舵小车转弯半径大多了,所以DF的纸质地图用不了)。
为了减小转弯半径,减小了小车前后轮的轮距。
地上的寻线地图也是专门贴的,小于转弯半径的弯小车一定是会脱线的。

速度控制在两个TT电机驱动的后轮,直道时速度大些,弯道时速度小些,而且越弯速度越小,这样可减少脱线概率。
我用二哈识别寻线得到的箭头的终点的x坐标和中线x坐标160差的绝对值(范围0-160)的大小来确定电机速度,在四轮小车上测试后发现,比用起点坐标的X1更能准确预测方向,寻线更流畅。
电机的速度扩展库中李亮工程师用百分比来处理,所以用100-前述绝对值的1/4来实现弯度越大(绝对值大)速度越小。

完整程序如下:

停车函数放在否则中时脱线时会停车,这里没有放进去是为了虚线段路线测试。
【测试】
测试视频
https://www.bilibili.com/video/BV1GT41197uU
【程序设计2】
上面的程序在实线运行时效果挺好的,相当的顺滑,但是在虚线部分有脱线的情况出现。
在虚线时小车会有较大的摆动,仔细观察分析后发现:
1、在虚线部分,较短的黑胶带会有箭头方向的变化,有时得到是对角方向的箭头,同时空白处没有可以提供数据的箭头,下一个箭头出现后会有的较大的数据变化,导致方向改变。
2、较长的黑胶带比短的可以提供更多的箭头方向信息,较短的空白比长空白效果好。
3、同样的长度的线条,较窄的线条可以提更精准的箭头方向数据。
4、调整二哈合适的倾斜角度,让二哈能较早的看到虚线的下一段黑线条。
5、环境光线改变,二哈要重新学习线条,环境光较暗时背光处二哈自己的影子出会影响箭头识别,必要时请打开二哈的LED照明。
6、合适的转弯半径,不能超过小车的转弯能力,否则一定会脱线。
所以环境和场地显得相当重要,我的场地地面砖缝也会影响,后面的改进是综合进行的。
下面的程序稍稍优化,增加屏幕中看不到箭头时方向和速度的记忆。


【测试】
https://www.bilibili.com/video/BV1nG4y1T7kS
说明:在做上面视频中测试时,还没有对虚线寻线进行上面观察的那么多思考,二哈的倾角也没有调整。测试视频三中进行了调整,让二哈可以连绵不断的看到虚线中的黑胶带。(如果场地不是地面,而是整块白色背景不反光的板子,效果会好很多。)
【程序3】
针对前面测试表现出来的问题,程序再次进行优化。

如上图所示,同样的X2值偏离中心线的角度可能不同,所以用X2偏离中心线来定义转向角度还有不足,算法需要改进。
先复习一次函数。



在上图中可以看到,如果用绿色坐标系,就可以完美对接数学一次函数知识,我们要求出二哈屏幕中的箭头终点(x2,y2)和原点(0,0)两点连线所成直线的斜率。
再由斜率和反正切函数求出倾斜角,然后由倾斜角来定义小车转弯的角度和运行速度。

由正切函数特点,倾斜角为90时正切不存在,所以要数据再分段转化一下。
经过不断测试,分析数据变化规律,写出了下面的程序。

转换坐标系,求出倾斜角。

有箭头,按箭头方向,无箭头,按记忆方向运动。
当箭头终点进入中下区时记录倾斜角度备用。

转向角度和速度都由倾斜角来确定,角度偏离新坐标y轴越大,转向角度大,速度小。

如果屏幕中无箭头,按记忆角度定方向和速度。

完整程序:

【测试】
https://www.bilibili.com/video/BV1n84y1G7Rt
【小结】
经过不断分析与思考,算法优化和场地环境研讨,针对性解决问题,达到了比较满意的效果。
还有新的想法,等完成后发布。(开学了,时间紧,更新会慢点。)
点赞