好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

机器人循线算法原理与实践成稿.pdf

7页
  • 卖家[上传人]:小了****8
  • 文档编号:277454933
  • 上传时间:2022-04-14
  • 文档格式:PDF
  • 文档大小:14.65KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 机器人循线算法原理与实践( 转收) 硬件基本构架 对于机器人的循线,为了获得场地上白线(黑线)的信息,硬件结构一般有如下几种种类1、红外对管阵列采取这种方式的机器人比较多,尤其在各种机器人竞赛中,几乎是标准配置 但是这种技术有一个致命的弱点,就是对于场地光线的干扰特别敏感,而且也很难把红色和白线区别开来,所以使用受到一定的限制 一般解决这类问题的方法是在红外光上加载一个调制波,通过检测这个调制波来消除场地光线的干扰,至于如何解决红色和白色的区别问题,那就几乎是五花八门了2、光纤传感器阵列采用这种传感器阵列的原因是,光纤非常细,在单位面积内可以安装更多的传感器, 从而获得更精确地场地信息 当然,钱也也花得更多3、线性 CCD 这种硬件方法几乎是一种对场地信息分辨率的BT追求,如果说红外对管阵列还是离散信息的话, 那么线性 CCD 就是线性的连续数据 当然驱动它也不是一件容易的事情,对于单片机也有更高的速度要求4、视觉废话少说否则明天我都别想吃饭 基本原理 所谓循线,就是通过一定的传感器探测地面色调迥异的两种色彩从而获得引导线位置, 修正机器人运动路径的一种技术说的太拗口了 不说太多理论的东西,我们就从基于红外对管阵列的循线技术来说起。

      假设,我们使用的是黑底白线的场地 红外对管阵列由 3 个红外对管 1 字摆开组成白线的宽度略小于或等于红外对管阵列的宽度1、数据的采集对于机器人来说, 通过传感器感知周围事物的信息,利用这些信息并不作太多智能上的计算而直接通过一定的转换,指导机器人的运动这种形式在人工智能学上叫做机器人的“反应范式”所以,我们要想让我们的机器人能够寻着我们给定的轨迹线运动, 第一步就必须让他感知到轨迹线的存在一般的做法就是通过 AD采样,获得红外对管(传感器)反馈回来的电压信息然而,这样获得的电压值信息是无法直接指导运动的,必须把他们转化为二值的 (也就是二进制信息, 1 表示线存在, 0 表示线不存在)信息,然后通过处理每一个管子反馈回来的二值信息获得白线的位置信息技术点 A AD 信号的阀值化你可以参考其它的算法, 获得比较详尽的技术,我这里只是举例一二)所谓阀值化, 就是通过一定的范围把握, 从而把线性的数据转化为离散数据的一种变换简单的说,就是通过分段函数的方法,将数据分类在我们这个应用中,就是想方设法使AD采集回来的电压值变化为一个恰恰能够准确表示白线位置信息的二进制信息,1 代表白线存在, 0 代表白线不存在。

      由于白色和黑色在电压差异上非常之巨大, 所以可以简单的通过一个标志线来区分它们,当电压值高于这个标志线了,就把他标志为1,否则就标志为0,算法描述为: if (AdValuei MarkLing) LineInfori = 1; else LineInfori = 0; 这样做非常简单, 适合于比较标准的场地, 然而对于那些模糊了的场地或者是非标准场地, 虽然人的肉眼能够看出来, 但是对于机器人来说, 可能看到的就是花白的一片或者是黑色的夜幕 当标志线值过高时, 机器人能看到的只是那些特别明显的白线,其他则是黑色的夜幕,很容易丢失轨迹线;当标志线值过低时,机器人眼中就是白茫茫的一片毛刺总而言之, 对场地的适应性非常差 解决方法是,通过设定两个标志线来标定轨迹线信息,当AD值高于某一值时,标志1;当 AD值低于另外某一值时,则标定0算法描述为: if (AdValuei High_MarkLine) LineInfori = 1; else if (AdValuei 技术点 B 动态预值你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)当然,这种算法在简单的机器人循线中不是很常用。

      比较常见, 适应性强的方法是,首先从 AD值中找到一个中间值作为MarkLine,(或者可以从 AD值中找那些比较接近最大值和最小值之差的0.618 倍的数值),然后再使用第一种方法标记,这样的算法叫做动态预值如果把这种算法应用于第二种当然也不多啦2、数据的简单加工第一个循线程序到目前为止,我们已经把AD的值的数组转变为了一个表示白线位置的二进制位的数组我们不妨直接把他用一个字节表示哈那么,这个字节的状态就表示了当前白线的位置信息 再假设,我们已经写好了几个函数用来分别控制小车的左右运动那么我们就可以通过以下的简单方式来实现循线了/ 用字节的高三位表示三个管子检测到的白线信息switch (LineInforByte) case 0b11100000: /全部在白线上 Motor_Left_GoFront(FullSpeed); Motor_Right_GoFront(FullSpeed); break; case 0b01100000: /明显车子向左偏了哈 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()函数是一个控制电机PWM 输出的函数FullSpeed NormalSpeed LowSpeed StopNow StopFree 是一些控制 PWM 的宏定义,你可以修改这些宏定义的值来实现以上的功能我想,你看了这个程序应该已经对循线的基本原理了然于胸了吧哈哈哈哈哈哈哈哈3、数据的高级加工复杂地面情况的模糊识别算法以上的算法的确可以应付规范场地下的情况了,但是由于其类似查表式的数据处理方式,一旦出现真值表中没有的情况哪怕是很明显的直线存在机器人都没有办法处理了 典型的就是在地上有大块的白色斑点,导致机器人对白线视而不见解决以上问题的方法还要从人眼识别白线的原理上说起在破坏严重的场地上,人类的眼睛仍然可以识别出原先的白线,这是为什么呢?通过重心 人类的眼睛通过捕捉白线的重心确立白线的大体轨迹,从而辨认出白线的位置 从概率的角度上说,在破坏严重的场地上, 出现在白线两边的浅色干扰的概率是一样的,即使不同,由于白线本身的存在,其重心至少是不会偏离白线很远的,所以,只要简单的获得地面浅色标志的重心,就可以大体确立白线的所在。

      我们可以利用物理学上质心的算法获得这一信息忘了说一点, 要想机器人增强对环境的适应力,就需要增加传感器的数目 我们不妨用 8 个红外管作为传感器 这样通过处理后获得的场地信息就整整1 个字节了假设 1 个光电管的 1拥有 1单位的重量,八个光电管的坐标分别为 -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 = 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 = Stop; 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 (GoDirection) 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) return 0; return (Temp / Totals); 函数调用 GetCG_X 函数,用来获取 CG_X ,CG_X 直接在 PWM 输出函数里面指导机器人的运动。

      以上方法的好处是,提供了一个比例调节循线动作的可能 支持多传感器的情况,尤其适合线性 CCD 类的线性数据的处理为机器人提供了一个相对完整的视觉,不可能出现无法识别的情况, 而且,这种情况可以使机器人在不加修改程序的情况下直接在在白线循线和黑线循线状态下切换。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.