LEGO机器人巡线控制的3种参考方法

      巡线在LEGO机器人比赛中经常见到,是一项非常基础实用的需要掌握的知识。在设计巡线机器人之前,首先要了解它的几种控制方法,这里提供3种基本常见的方法,仅供参考:

一、Z字型巡线方法(俗称二分法)

      最常见,也最简单,但是左右摇摆幅度大,程序较为简单,这里就不提供了,网上也有很多,这里说下单光感和双光感两者之间在巡线方面的一些区别(注意:这里的区别主要单指两者之间的区别,并没有同其他方法进行比较):

单光感:

      优点:成本低,只需要一个颜色传感器(光电传感器);机械机构简单;程序简单;

      缺点:左右摇摆幅度大,无法进行复杂路线的巡线,容易脱离黑线;

双光感:

      优点:左右摇摆幅度小;可以解决较为复杂的路线,比如“十字形”;

      缺点:成本高,需要两个颜色传感器(光电传感器);程序较为复杂,使用分叉切换结构。

作法:

      当机器人的颜色传感器(光电传感器)检测到白线部分的时候,则左转(右转);当机器人的颜色传感器(光电传感器)检测到黑线部分的时候,则右转(左转);下图中我们可以看到二分法就是很简单的if/else,机器人只有两个动作。

LEGO机器人巡线控制的3种参考方法
判断方法:

      1.通过颜色传感器(光电传感器)检测白线部分的反射光值为55,黑线部分为25,则两者的中间为40,可以假定当机器人在行走时,检测到反射光值大于40,则为白线部分,反之。

      2.机器人只有左转、右转两种动作,速度较慢,容易脱离黑线。

      3.行走过程中大幅度的摇摆,浪费时间电池电量。

      4.相对而言,双光感巡线比单光感的巡线准确度较高,并且能够适应一些复杂路线的循迹,但程序比单光感复杂。

      5.单双巡线适合初学者。

二、三段巡线法

      主要是指机器人在行走过程中,有左转、直行和右转三种不同的运动轨迹。和Z字型巡线有点类似,主要区别在颜色传感器(光电传感器)检测到黑白反射光值的中间值时,机器人执行直行状态。

      这种方法,速度比之前的要快,更为准确,摇摆幅度减小,程序也比之前复杂。

      到了中间的三阶段之后,我们设计一个区间(光值43-47),这时代表机器人略偏但是不算太偏,所以还是直走。直到光值小于43或是大于47代表篇很多了才进行修正。

LEGO机器人巡线控制的3种参考方法
三、比例控制(详细可以百度搜索,网上好多啦,真的好多技术大神)

      主要是指依照机器人检测到不同的反射光值,来决定转向的角度。这里设定的区间为30-50。

LEGO机器人巡线控制的3种参考方法
(当我把这个图做完的时候,感觉特别像膏药,开个玩笑)

      上图中,数字代表反射光值,红色圆圈为颜色传感器(光电传感器)的检测部分,黑色部分为黑线。黑线的反射光值为30,白线的反射光值为50。

      1.反射光值在30-35之间,机器人向右转向角度大一点;

      2.反射光值在35-40之间,机器人向右转向角度小一点;

      3.反射光值等于40,机器人直行;

      4.反射光值在40-45之间,机器人向左转向角度小一点;

      5.反射光值在45-50之间,机器人向左转向角度大一点;

      需要注意的是:上图中的数字仅为参考数字,具体数字以实际测量为准;同时机器人左转右转的角度大小,也由电机输出的功率控制。这种程序较为复杂,但是速度快准确率高。

      上图将区间分为5段,在之前是三段,有三阶段就有四阶段五阶段,最后这么多阶段就会变成一条直线,比例控制方法的比例事实上就是这条线的斜率。斜率愈大代表机器人对于误差愈敏感,修正幅度也愈大。这在程序中我们是用一个参数kp来调整。kp不是愈大愈好!kp过大会让机器人变得神经兮兮,一点点误差也一直在修正反而效果不好。这里都需要反复地调整,请加油吧!

LEGO机器人巡线控制的3种参考方法
      目前国内有许多人已经会这种比例巡线方法,主要还是参数值的测试和调整,这种PID(比例、积分和微分)巡线发方法,上图为P算法,关键在P的测量,后面两种积分微分我也不会。

      首先我们来看张图片,算比较经典的:

LEGO机器人巡线控制的3种参考方法

从这里我们可以看出许多理想性的假设:

      1. 每次修正都要能够回到白色场地,这就是为什么当轨迹曲率变化太大(例如许多左弯后接一个右弯、发夹弯(发夹弯是指弯的外形呈发夹状,弯的角度少于90度,出弯之后方向呈180度的改变,当以上种种因素都符合的话,那一个便是发夹弯)甚至直角湾时,都会在此飞出去的,从而死翘翘了…

      2. 机器人根本不会直走,因为我们的程序就是这样写的,左前方右前方一直重复移动。这样会造成明明是大直线,但是机器人还在那边左右左右修正,太慢了。

      3. 机器人不知道弯道的变化程度,每次修正的动作皆相同,传统的两分法是取黑色轨迹线与白色场地的光值之中间值作为判断边界(上面已经说过),例如(30+50)/2=40。小于40视为侦测到黑线,反之则代表在白色部分。如果光值是46或47,代表此时只有偏离一点点,应该进行小幅度修正就好。但是二分法就是无法作到(上面也已经讲过)。

      4. 黑就是均匀的黑,白就是均匀的白,怎么可能嘛!这要考虑到光照,桌面干净程度等等……实际上很难有均匀颜色这种事的。所以由此可以延伸出非常多东西可以深入去玩,你的机器人也会愈来愈聪明。导入比例控制方法,让机器人碰到剧烈弯道时可以修正得更快速,当误差为零时,机器人就是直走!以第三种方法的设定来说,光值会在30-50之间连续变化,误差产生时会影响机器人的马达转速。以发夹弯来说,机器人一定会瞬间切入黑色轨迹线较深,这时光值会下降比较多,机器人便是由这种方法来得知弯道的曲率,作出更适合的修正。

      5. 每次都重新更新判断边界值,机器人对于环境的适应力会更高。

      一个简单的EV3程序,仅供参考(点击查看大图):

LEGO机器人巡线控制的3种参考方法

附上NXC程序代码(可能手机显示会出现错行的情况,所以每隔行我都用红色字体来区分):

//我是p控制
task main()
{
SetSensorLight(S3);
int kp=2; //比例参数
int light_initial = Sensor(S3); //程序启动时先抓一次光值,这时请将光传感器所投射出的光圈摆在黑线左测一半处
int light_realtime;                     //即时光值
int vl,vr;                                        //左右轮速
while(true)
{
light_realtime = Sensor(S3);    //更新即时光值
vl = 40 + kp*(light_realtime-light_initial);    //计算左轮速,40 是基础速度,代表当误差为0时,机器人将以此速度直走
vr = 40 + kp*(light_realtime+light_initial); //计算右轮速, +/- 是代表进弯时的修正方向,可根据实际状况修改
OnFwd(OUT_B,vl);                     //出发!
OnFwd(OUT_C,vr);
}

}