巡线是机器人竞赛常见的程序考核的路线解决方案,常见有4、5光电巡线、还有的品牌(例如🐳鲸鱼)会集成5光电模块硬件,写好了软件模块。
不是每一条路线都需要巡线

单色感摆动

单光电巡线,考虑两种情况,在黑线内和黑线外。黑线内右转,黑线外左转。那么小车就会左右左右的往前移动,而这里是有摆动幅度。
差值巡线
在机器人设计上,光电的位置要在黑线外,否则无法精准测量。

安装好机器后,那么就可以考虑光电的测量情况了。

(假设黑色:反射光为0,白色:反射光为100)
这里情况有三种:
- 色感1检测到,那么就需要左转
- 色感2检测到,那么需要右转
- 都没检测到,那么直行
单光电对比双光电的差异
单光电是按照运动状态去巡线的,值在黑色和白色两种情况确定下,去摇摆车体前进。
双光电是按照取值范围来完成巡线的

这里的取值范围,可以理解为两个光电之间,存在的差值不一样。差值小,那么转动的角度就小一点,差值大,那么转动的角度就大一些。而差值的意识,就是两个数相减得到的差。
如何应用?
明确一点,spike颜色传感器色感差值的范围在【-100,100之间】
而双电机的左转和右转,则是负数和正数去决定。
那么两者相减的差,首先得到是正数还是负数,自动决定左转还是右转
PID算法

PID,(比例(proportion)、积分(integral)、导数(derivative))。
pid算法巡线要求本质,是控制电机的的速度差。

proportion
P是指比例的意思,是输入和输出量之间的比例关系。有两个关键的元素,第一是目标量,第二是反馈量。差值(ERROR)是目标量-反馈量。得到我差了多少,及时补充多少。从而达到比例控制。而这个比例是正比的关系,你 每次主动输入的数量足够及时,那么输出的水量就足够的多。
例如我有一个工人,任务是维持水池里面的水在50L,通过水龙头每秒可以灌入的水是10L,而用户每秒8L。用户用户速度快于灌水的速度,那么控制就不是那么容易。

输入:是颜色采集到的反射光值
输出:是电机的转向值(不是功率值)
颜色传感器提供的光线反射值和由“移动转向”模块提供的可输入的转向值,它们两者的取值范围是不同的。当然,就需要用一个特殊的比例系数去控制啦。
上面有讲,差值巡线的时候,光电取值范围和电机转动方向是一样的。但是使用”移动转向”这个模块的时候,我们就需要✖️一个系数K来控制他的角度。
(最终的目的,我们是需要控制电机的左转和右转,来达到巡线的额效果。而pid是我们控制的工具)
k:是数学里面的一个变量,在数学里面例如y=kx+b
调节KP
我们使用P比例控制,去决定了是左转,还是右转。拿到了输出的角度后,我们如果把K值增大,那么他的KP响应速度也是更加的快。
用机器人移动的行为,举个例子,当你要左转解决一个角度误差,误差为60度,那么直接转60度,肯定比每次转30度转2次的响应速度快,是不是?当然,动作幅度也会加大
少儿编程教育网
integral
KI存在的原因?
还是以水池举例,用户在一直用水,假如是每秒1L,而KP值是1,那么永远存在一个“静差”,也就是稳定的误差。
解决
增加一个水龙头,去专门解决这个“静差”。也就是KI(积分)
例如我设定KI的值是0.1,那么我累加每次的误差值,在10次之后,就是1,刚好弥补了静差。
derivative
KD存在的原因?
KD是跟时间相关联,因为调整KI或者是KP的时候,可能永远调整不到目标状态。那么我们设定KD去减少时间差。
怎么去使用?
这一次的误差E减去上一次的误差LE(Last Error)得出两次累积的误差差值,用来在下一次误差出现的时候,使上一个“巧劲”,帮助机器更快的减小误差所需要的速度(时间、次数)。
对应到机器人
这一次误差减去上一次误差得到的值,提供给下一次的计算中。
这个值会在转向要求很大或者很小的时候,给到原来公式一个正或者负值来补充或者减少电机的转向误差,这样一来,达到平衡的状态就会加快。
PID的调整顺序
1、先把KI,KD设为0。调节KP,理论上,KP调节完就可以独立巡线。
2、调节KI,会加速摆动,值很小。也就是加快整个程序达到稳定状态(直线)的功能。
(原来要10秒摆动10次,现在5秒摆动10次完成)
3、最后调节KD,让整个程序的调节过程缩短,达到稳定状态。
(原来5秒摆动10次,现在5秒摆动5次完成)
参考来源:
【 EV3基础应用 】课题六:PID巡线的P,到底是什么? – 少儿编程