本帖最后由 小竹砸 于 2019-5-24 09:27 编辑
最近在论坛上看到王老师(论坛ID 冀·闲庭信步)分享的一种 巡线算法(点击跳转原帖),感觉非常精炼,但是初学者想要看懂还是比较难的,在征得其本人同意的前提下,针对他的程序做一些解读。 论坛的程序上面没有自动测光的程序,参考程序如下: 自定义模块AM程序解释: 以白底黑线的巡线环境为例,设定三个变量的初始值,其中light用来存反射光值,white用来存地面灰度值,black用来存黑线灰度值,time用来控制循环持续时间。 B、C电机是10的功率直行开启,测量反射光值存在变量light中,比较black和light中的值,如果实测灰度值light小于black的值,则把light的值存入black中;比较white和light中的值,如果实测灰度值light大于white的值,则把light的值存入white中,循环持续5秒结束,电机B、C停止,等待确认键按下。 这段程序可以把直行5秒过程中反射光的最大值存在变量white(初始为0)中,最小值存在变量black(初始为100)中,实现自动测光的效果,车体直行部分的参数可以自动修改,确保传感器越过一次黑线就可以。 总程序见下图: 循环内的程序涉及的运算关系为: a=(实测-black)/(white-black)-0.5 转向度=400*a*abs(a) 以black为0,whtie为100为例,我们看看a值和实测灰度值之间的关系。 利用这些数据生成的折线图为: 可以看到a值的范围是-0.5到0.5之间,其中实测为0、50、100,也就是光感完全在黑线上,临界位置,完全在地面上时,a的值为-0.5,0,0.5,可以看到a值的正负决定着转弯方向。 基础巡线(单光感、双光感巡线)的原理是,看到黑线或者地面时,采用固定的速度差(也就是转向度为固定值)应对;常用的P巡线(单光感比例,双光感比例)的原理是,根据灰度值的差值控制转向幅度的大小,并且差值和转向度之间是线性关系,这些巡线方式的参数比较好调整,但是针对不同曲率的轨迹需要分段使用不同的速度差或者系数进行应对,我们比较希望达到的效果是:用一条程序实现两种效果,差值大时,调整系数大,差值小时,调整系数小。 王老师分享的算法有这样的特点,验证给你看看吧。 实测灰度值、a值、转向度三组数据的对应关系如下: 根据a值和转向度的对应关系生成的折线图为: 可以看到a在0附近(此时光感基本处于一半地面一半黑线状态)时,转向度随a的变化比较平缓(斜率小),但是随着a值变得更大或者更小(对应着光感看到更多得地面或黑线),转向度的变化变快,意味着转向效果明显。所以这个算法是可以实现差值大时,调整系数大,差值小时,调整系数小的效果。 关于这张图我们还需要注意几个关键位置,当a为0.5或-0.5时,转向度为100,-100这是转向度的最大值,所以400也就是换算关系 【转向度=400*a*abs(a)】里系数的最大值,如果想要实现光感完全脱离黑线时,车体其中一个电机功率为0,对应的转向度为50,你可以设置系数为200。
这个算法中a值和转向度的图像形状接近y=x^3,所以如果把换算关系改成下面这样,应该也是可以的: a=(实测-black)/(white-black)-0.5 转向度=800*a^3 两种换算关系中的转向度和a值的对应关系是: 数据关系对应的折线图为: 可以看到立方关系对应的平缓范围更大,但是具体巡线效果未做测试,感兴趣的话可以自己试试。 王老师总结得到的a值是一个很好的参数,打开的一种新的巡线算法大门,在此表示敬佩。
最后打个小广告,有一定EV3基础的老师可以关注我的个人公众号“LCR乐工坊”,欢迎交流讨论。 |