江毓光
● 研究问题
前不久,笔者带领学生参加了深圳市学生创客节中的“Arduino开源机器人现场挑战赛”,在此挑战赛中,巡线(让机器人小车沿规定黑色赛道行走)是其中一项最基本的内容,要实现巡线,一般采用四灰度传感器形式(如图1):传感器2和3用于夹线巡迹,传感器1和4用于判断路口。但在实际竞赛中,经常会巡线脱轨,这是受场地光线或喷绘工艺等因素的影响,灰度传感器常将比赛图上暗的白色区域误判为黑色区域,或将亮的黑色区域误判为白色区域所致。因此,如何提高巡线的成功率成为急需解决的一大难题。
● 改进策略
误判原因:程序中的灰度阈值通常都固定取为550,但当外部因素(场地光线或喷绘工艺等)影响比赛图上某个区域的灰度时,灰度阈值550不会随之变化,导致程序误判。
改进策略:在4灰度传感器的基础上增加一个灰度传感器5,专门用来读取黑线的灰度值(如图2),从而构造出一个取代550的动态灰度阈值:动态灰度阈值=M+0.2M =1.2M(其中M为传感器5实时读取的黑线灰度值,加上0.2M的目的是允许一定范围的误差)。
● 具体做法
将传感器1、2、3、4、5分别接在模拟口A1、A2、A3、A4、A5接口上,下文统一用A1代表模拟口A1获取的传感器1的灰度值,A5代表模拟口A5获取的传感器5的灰度值,以此类推。在ArduinoScratch软件中,笔者用如上页图3所示的程序来读取“动态灰度阈值”,并将程序定义为“读取标准数”模块,其中“hd”就是前面所说的“动态灰度阈值”,程序含义是:当灰度传感器5在黑线上时,动态灰度阈值等于传感器5实时读取的灰度值的1.2倍,当灰度传感器5脱离黑线时,动态灰度阈值等于灰度传感器5离开黑线最后那一刻灰度值的1.2倍。
动态灰度阈值构造出来后,就可以将它嵌入到巡线程序中,取代灰度阈值550。原四灰度传感器夹线巡线程序如图4所示,修改后的程序如图5所示:调用“读取标准数”模块来读取动态灰度阈值,然后把动态灰度阈值代替图4中的灰度阈值550即可。
同理,修改后的左转程序如图6所示。其中“读取模拟口A1量” “读取模拟口A2量”等的意义与“读取灰色传感器(模拟)A1”“读取灰色传感器(模拟)A2”等相同。程序重复调用“读取标准数”模块来读取动态灰度阈值以判断黑线。
右转等程序在此不再一一赘述。
● 实际成效
動态灰度阈值的构造,大大优化了Arduino小车的巡线程序,既解决了场地光线或喷绘工艺等因素影响而导致的比赛图上白色区域灰度值变低的问题,又解决了上述因素导致的黑色区域灰度值增高的问题,显著提高了巡线的准确性和成功率。笔者应用优化后的巡线程序在各种逆反射系数、分辨率、覆膜工艺不同的比赛图上进行多次测试,巡线成功率高达95%以上。