循线基本原理

上传人:hs****ma 文档编号:463954637 上传时间:2022-09-22 格式:DOCX 页数:6 大小:14.72KB
返回 下载 相关 举报
循线基本原理_第1页
第1页 / 共6页
循线基本原理_第2页
第2页 / 共6页
循线基本原理_第3页
第3页 / 共6页
循线基本原理_第4页
第4页 / 共6页
循线基本原理_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《循线基本原理》由会员分享,可在线阅读,更多相关《循线基本原理(6页珍藏版)》请在金锄头文库上搜索。

1、原创循线算法原理与实践说在前面的话看了很多机器人网站的文章,仍然停留在Show图片,Show代码,大家喊一下牛”的程度。真真做机器人的,却又像是做进度报告似的实在看不过,本人最爱显示小聪明,所以,斗胆,鲁班门前弄大斧,各位大虾面前抢先说说一一、循线算法原理与实践气还是那句老话:没时间的捧个人场哈!硬件基本构架对于机器人的循线,为了获得场地上白线(黑线)的信息,硬件结构一般有如下几种种类。1、红外对管阵列。采取这种方式的机器人比较多,尤其在各种机器人竞赛中,几乎是标准配置。但是这种 技术有一个致命的弱点,就是对于场地光线的干扰特别敏感,而且也很难把红色和白线区别开来,所以使 用受到一定的限制。一

2、般解决这类问题的方法是在红外光上加载一个调制波,通过检测这个调制波来消除场地光线的干扰,至于如何解决红色和白色的区别问题,那就几乎是五花八门了。2、光纤传感器阵列。采用这种传感器阵列的原因是,光纤非常细,在单位面积内可以安装更多的传感器,从而获得更精确地场地信息。当然,钱也也花得更多。3、线性CCD。这种硬件方法几乎是一种对场地信息分辨率的BT追求,如果说红外对管阵列还是离散信息 的话,那么线性CCD就是线性的连续数据。当然驱动它也不是一件容易的事情,对于单片机也有更高的速度要求。4、视觉。废话少说一一否则明天我都别想吃饭。基本原理所谓循线,就是通过一定的传感器探测地面色调迥异的两种色彩从而获

3、得引导线位置,修正机器人运动路径的一种技术。一一说的太拗口了。不说太多理论的东西,我们就从基于红外对管阵列的循线技术来说起。假设,我们使用的是黑底白线的场地。红外对管阵列由3个红外对管1字摆开组成。白线的宽度略小于 或等于红外对管阵列的宽度。1、数据的采集。对于机器人来说,通过传感器感知周围事物的信息,利用这些信息并不作太多智能上的计算而直接通过 一定的转换,指导机器人的运动一一这种形式在人工智能学上叫做机器人的反应范式”。所以,我们要想让 我们的机器人能够寻着我们给定的轨迹线运动,第一步就必须让他感知到轨迹线的存在。一般的做法就是 通过AD采样,获得红外对管(传感器)反馈回来的电压信息。然而

4、,这样获得的电压值信息是无法直接 指导运动的,必须把他们转化为二值的(也就是二进制信息,1表示线存在,0表示线不存在)信息,然后 通过处理每一个管子反馈回来的二值信息获得白线的位置信息。技术点A AD信号的阀值化。(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)所谓阀值化,就是通过一定的范围把握,从而把线性的数据转化为离散数据的一种变换。简单的说,就 是通过分段函数的方法,将数据分类。在我们这个应用中,就是想方设法使AD采集回来的电压值变化为 一个恰恰能够准确表示白线位置信息的二进制信息,1代表白线存在,0代表白线不存在。由于白色和黑色 在电压差异上非常之巨大,所以可以简单的通

5、过一个标志线来区分它们,当电压值高于这个标志线了,就把他标志为1,否则就标志为0,算法描述为:if (AdValuei MarkLing)(LineInfori = 1;)else(LineInfori = 0;)这样做非常简单,适合于比较标准的场地,然而对于那些模糊了的场地或者是非标准场地,虽然人的肉眼 能够看出来,但是对于机器人来说,可能看到的就是花白的一片或者是黑色的夜幕。当标志线值过高时, 机器人能看到的只是那些特别明显的白线,其他则是黑色的夜幕,很容易丢失轨迹线;当标志线值过低时, 机器人眼中就是白茫茫的一片毛刺。总而言之,对场地的适应性非常差。解决方法是,通过设定两个标志 线来标定

6、轨迹线信息,当AD值高于某一值时,标志1;当AD值低于另外某一值时,则标定0。算法描述为:if (AdValuei High_MarkLine)(LineInfori = 1;)else if (AdValuei 技术点B动态预值。(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)当然,这种算法在简单的机器人循线中不是很常用。比较常见,适应性强的方法是,首先从AD值中找到 一个中间值作为MarkLine,(或者可以从AD值中找那些比较接近最大值和最小值之差的0.618倍的数值), 然后再使用第一种方法标记,这样的算法叫做动态预值。如果把这种算法应用于第二种当然也不多啦。2、数据的

7、简单加工一一第一个循线程序。到目前为止,我们已经把AD的值的数组转变为了一个表示白线位置的二进制位的数组一一我们不妨直 接把他用一个字节表示哈。那么,这个字节的状态就表示了当前白线的位置信息。再假设,我们已经写好 了几个函数用来分别控制小车的左右运动。那么我们就可以通过以下的简单方式来实现循线了。用字节的高三位表示三个管子检测到的白线信息。switch (LineInforByte)(case 0b11100000:全部在白线上Motor_Left_GoFront(FullSpeed);Motor_Right_GoFront(FullSpeed);break;case 0b01100000:明

8、显车子向左偏了哈Motor_Left_GoFront(FullSpeed);Motor_Right_GoFront(NormalSpeed);break;case 0b00100000:Motor_Left_GoFront(FullSpeed);Motor_Right_GoFront(LowSpeed);break;其他情况仿照上面自己写了哈。default:Motor_Left_GoFront(StopNow);Motor_Right_GoFront(StopNow);break)呵呵,这样就完成了一个循线小车的程序了哈。简单吧。顺便说明一下下,Motor_Left_GoFront()函数是

9、一个控制电机PWM输出的函数。FullSpeed NormalSpeedLowSpeed StopNow StopFree是一些控制PWM的宏定义,你可以修改这些宏定义的值来实现以上的功 能。我想,你看了这个程序应该已经对循线的基本原理了然于胸了吧。哈哈哈哈哈哈哈哈。3、数据的高级加工一一复杂地面情况的模糊识别算法。以上的算法的确可以应付规范场地下的情况了,但是由于其类似查表式的数据处理方式,一旦出现真值 表中没有的情况一一哪怕是很明显的直线存在一一机器人都没有办法处理了。典型的就是在地上有大块的白色斑点,导致机器人对白线视而不见。解决以上问题的方法还要从人眼识别白线的原理上说起。在破坏严重的

10、场地上,人类的眼睛仍然可以识 别出原先的白线,这是为什么呢?通过重心。人类的眼睛通过捕捉白线的重心确立白线的大体轨迹,从而 辨认出白线的位置。从概率的角度上说,在破坏严重的场地上,出现在白线两边的浅色干扰的概率是一样 的,即使不同,由于白线本身的存在,其重心至少是不会偏离白线很远的,所以,只要简单的获得地面浅 色标志的重心,就可以大体确立白线的所在。我们可以利用物理学上质心的算法获得这一信息。忘了说一 点,要想机器人增强对环境的适应力,就需要增加传感器的数目。我们不妨用8个红外管作为传感器。这 样通过处理后获得的场地信息就整整1个字节了。假设1个光电管的1拥有1单位的重量,八个光电管的 坐标分

11、别为-7 -5 -3 -1 1 3 5 7,其间距都是2个单位,通过置信公式很容易计算出质心的坐标,通过这 个坐标和0的绝对值,就可以知道当前机器人偏离白线的多少,而这个偏离值则可以通过简单的比例直接指导运动函数。典型实例如下:*函数说明:电机动作调速函数*说明:该函数放在定时器或者主循环里面用于产生软PWM*void SpeedPWM(char PWMLine)(char PWMLine_L = PWMLine; char PWMLine_R = PWMLine; static char PWMCount_L = 0; static char PWMCount_R = 0;char Temp

12、 = 0;if (FollowLineEnable = True)(Temp = (char)fabs(float)CG_X);if (AdcValueFlag = 0)(Temp = 0;)else(if (CG_X 0)(if (Temp4) = PWMLine_R)(PWMLine_R -= (Temp5)+Temp2);)else(PWMLine_R = 0;)else(if (Temp4) = PWMLine_L)(PWMLine_L -= (Temp Fastest)(PWMCount_L = Stop;)if (PWMCount_R Fastest)(PWMCount_R = S

13、top;)if (PWMCount_L PWMLine_L)(switch (GoDirection)(case Front:Motor_Left_GoFront;break;case Back:Motor_Left_GoBack;break;case Left:Motor_Left_GoFront;break;case Right:Motor_Left_GoBack;break;case Stop:Motor_Left_Stop_Free;break;)else(Motor_Left_Stop_Free;)if (PWMCount_R PWMLine_R)(switch (GoDirecti

14、on)(case Front:Motor_Right_GoFront;break;case Back:Motor_Right_GoBack;break;case Left:Motor_Right_GoBack;break;case Right:Motor_Right_GoFront;break;case Stop:Motor_Right_Stop_Free;break;)else(Motor_Right_Stop_Free;)*函数说明:获取偏离轨迹线的数值*输入: 表明寻线状态的字节* 说明通过类质心算法获取当前机器人偏离轨迹线的量*-表示偏左+表示偏右*signed char GetCG_X(unsigned char AdcValues)(signed char a = 0;signed char Temp = 0;signed char Totals = 0;for (a = 0;a8;a+)(if (AdcValues 7)(Temp += (-7)+ (a1); Totals+;) )if (Totals =0)(retur

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号