依然是EV3巡线的相关问题,这次所发内容是本人这三天学习《乐高机器人:EV3程序设计艺术》里有关巡线的知识之后整理出来的,望各位大神指点。 巡线一直是一个热门话题,大家说的比较多的就是PID巡线,作为小白的我根本不知道啥意思。于是狂啃书本,从最基本的巡线开始。
切换
<ignore_js_op>
这种就是转左或者转右,没有直行的情况。于是又引入了直行的情况:
<ignore_js_op>
到这我相信各位看官也知道该如何去设置更多的运动状态,比如加入向左急转,向左稍微转弯,直行,向右稍微转弯,向右急转。这些都可以用切换模块来实现。然而这些远远满足不了千奇百怪的巡线路径。于是,我们继续优化我们的巡线程序。
比例巡线
这里我们就要引入误差值,增益值以及转向值。
比例巡线是根据目标值(机器人走直线时颜色传感器的值,计算公式:目标值=(最大值+最小值)/2)和输入值(颜色传感器实际测量的值)来改变控制变量(控制变量本人理解为移动转向模块里的转向值)的。
增益值决定了机器人对误差值变化的反应速度,是自己设置或者调试得到。
误差值=目标值-输入值
转向值=误差值*增益值
<ignore_js_op> 增益值需要反复的实验,找到最合适的增益值。用你自己的目标值和增益值测试这个程序,运行效果应该比切换程序更好。
PID巡线
那么接下来将写到我所学到的PID巡线(可能称不上是PID,自己觉得良好 )。之前看到唐伯虎大神写的PID巡线,觉得受益匪浅,结合《乐高机器人:EV3程序设计艺术》,浅谈一下学习PID巡线的感受。
PID控制器——比例-微分-积分控制器
和比例控制器一样,PID控制器也是用颜色传感器读数来调整起到控制作用的变量,也就是转向值。
首先我们要采集颜色传感器的最大值和最小值,这个部分可以通过挪动机器人来实现,也可以让机器人自己完成。如何让机器人自己完成呢?首先我们需要一个机器人,然后写入程序就可以了。怎样知道颜色传感器采集的数值呢?将采集到的数值显示出来就可以了,这里需要用到显示模块。
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op> <ignore_js_op> 下面是完整的机器人自己读取最大值和最小值的程序
<ignore_js_op> <ignore_js_op> <ignore_js_op>
附件传不了,只能截图了。后期能传了再传一下。
取得最大值和最小值之后又该怎么做呢?书上提到标准化传感器读数和目标值,公式是:标准化读数=100*(传感器读数-最小值)/(最大值-最小值) 它有什么好处呢?举个例子,不同的环境,不同的颜色,反射光值是不同的。以线路A最小值10和最大值80,线路B最小值30和最大值60为例,它们的目标值都是45,但是数值的范围不同,那么机器人对于这两种线路应该是不同的反应。线路A颜色传感器读数为60时,它还在线的边缘,而对于线路B它可能已经完全脱离线了。使用标准化读数之后,线路A的60,标准化为71,而线路B的60标准化为100。这个时候就反映出标准化读数的实用性,合理性。
之前我们提到过目标值和误差值,在这里我们都将它们标准化。以线路A为例
目标值45,标准化目标值为50 那么:误差值(Error)=目标值-测量值,标准化误差值=50-100*(测量值-10)/70
<ignore_js_op> 之前写到过 转向值=误差值*增益值。
这里我们将增益值记为Kp,这里就是PID里的P部分。
PID里的转向值,转向值=误差*Kp+微分*Kd+积分*Ki。
误差:Error,微分:Weifen,积分:Jifen。
Weifen=Error-上一个Error。新的Jifen=0.5*Jifen+Error。
微分项 <ignore_js_op>
积分项 <ignore_js_op>
转向值 <ignore_js_op> PID巡线虽然好用,可是调试过程非常困难,希望大家能耐住性子慢慢调试。
|