📄 [原创]循线算法原理与实践.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0081)http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=530253&bbs_page_no=2&bbs_id=1024 -->
<HTML><HEAD><TITLE>[原创]循线算法原理与实践 ---“Our Robot 1 号”机器人研发网站</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2873" name=GENERATOR></HEAD>
<BODY text=#000000 bgProperties=fixed bgColor=#ffffff leftMargin=15
background="" topMargin=0><BR><LINK href="[原创]循线算法原理与实践.files/bbs.css"
type=text/css rel=STYLESHEET>
<TABLE height=20 cellSpacing=1 cellPadding=0 width="100%" bgColor=#eeeeee
border=0>
<TBODY>
<TR>
<TD width="26%"><SPAN class=f01><IMG height=1 src="" width=14>欢迎您,caolong
<IMG height=1 src="" width=7><SPAN class=f03><FONT
color=#444444>|登录</FONT></SPAN> <IMG height=1 src="" width=2><SPAN
class=f03><FONT color=#444444>|注册</FONT></SPAN> <IMG height=1 src=""
width=2><A class=tt4 title=退出登录,并回到首页
href="http://www.ouravr.com/bbs/logout.jsp?mother_form=bbs_content.jsp&bbs_sn=530253&bbs_id=1024&bbs_page_no=2">|退出</A>
</SPAN></TD>
<TD align=right width="74%"><IMG height=1 src="" width=5><A class=tt4
title=回到本站首页 href="http://www.ouravr.com/index.html">首页</A> <IMG height=1
src="" width=5><A class=tt11 title=会员邮购服务部
href="http://www.ouravr.com/shop">阿莫邮购部</A> <IMG height=1 src=""
width=5><A class=tt4 title=北方网通提速访问
href="http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=638925&bbs_page_no=1&bbs_id=1000"
target=_blank>网通提速</A> <IMG height=1 src="" width=5><A class=tt4
title=分类搜索
href="http://www.ouravr.com/bbs/search_interface.jsp?mother_form=bbs_content.jsp&bbs_sn=530253&bbs_id=1024&bbs_page_no=2"
target=_blank>搜索</A> <IMG height=1 src="" width=5><A class=tt4
title=修改个人资料及设置 href="http://www.ouravr.com/bbs/user_data.jsp"
target=_blank>设定</A> <IMG height=1 src="" width=5><A class=tt4
title=当前在线会员 href="http://www.ouravr.com/bbs/online_members_list.jsp"
target=_blank>在线</A> <IMG height=1 src="" width=5><A class=tt4 title=新手入门
href="http://www.ouravr.com/guide_index.html" target=_blank>新手入门</A> <IMG
height=1 src="" width=5><A class=tt4 title=应用范例
href="http://www.ouravr.com/application_index.html" target=_blank>应用范例</A>
<IMG height=1 src="" width=5><A class=tt4 title=下载
href="http://www.ouravr.com/download_page.html" target=_blank>下载</A> <IMG
height=1 src="" width=5> </TD></TR></TBODY></TABLE>
<TABLE height=60 cellSpacing=0 cellPadding=6 width="100%" bgColor=#ffffff
border=0>
<TBODY>
<TR>
<TD vAlign=top align=left><SPAN class=tt1><A class=tt4
href="http://www.ouravr.com/bbs/index.jsp">OurAVR.com 论坛 </A>-> <A
class=tt4
href="http://www.ouravr.com/bbs/bbs_list.jsp?bbs_id=1024&bbs_page_no=2">“Our
Robot 1 号”机器人研发网站</A> -> [原创]循线算法原理与实践 </SPAN></TD>
<TD vAlign=top align=middle><SPAN class=tt1>跳转至:</SPAN> <SELECT
onchange="window.location=('bbs_list.jsp?bbs_id='+this.options[this.selectedIndex].value)"
name=forumid> <OPTION value=1000>“我们的AVR”技术论坛(主坛)</OPTION><OPTION
value=2027>开发项目网上招标</OPTION><OPTION value=1020>悠闲休息区
(灌水坛)</OPTION><OPTION value=0020>招聘与自荐(找工作、招人专栏)</OPTION><OPTION
value=1005>邮购部服务论坛</OPTION><OPTION value=1032>atmel ARM 网站
(OurARM.com)筹建中</OPTION><OPTION value=1024 selected>“Our Robot 1
号”机器人研发网站</OPTION><OPTION value=1003>马潮老师专栏</OPTION><OPTION
value=1033>菜农hotpower的自留地</OPTION><OPTION
value=1038>--(旧)MP3示范板(M32+VS1011B+CH375)</OPTION><OPTION
value=1036>--(旧)小松的“AVR高压编程器范例”</OPTION><OPTION
value=1031>--(旧)mirrorok的“AVR的以太网应用板”</OPTION><OPTION
value=1026>--(旧)Protel/PCB 设计论坛</OPTION><OPTION
value=1027>--(旧)自制AVR芯片内核</OPTION><OPTION value=1040>--(旧)C++ Builder
上位机软件设计论坛</OPTION><OPTION value=1029>--(旧)USB应用活动</OPTION><OPTION
value=1030>--(旧)Delphi上位机软件设计论坛</OPTION><OPTION
value=1004>--(旧)智能充电器设计小组活动</OPTION><OPTION value=1006>--(旧)MP3
制作活动</OPTION><OPTION value=1009>--(旧)步进电机专题讨论</OPTION><OPTION
value=1008>--(旧)马老师AVR-51实验板使用论坛</OPTION><OPTION
value=1007>--(旧)开关电源项目</OPTION><OPTION
value=1002>--(旧)全国大学生电子设计大赛专用论坛</OPTION><OPTION
value=2034>非技术、非悠闲帖子回收站</OPTION></SELECT> </TD>
<TD vAlign=top align=right></TD></TR></TBODY></TABLE>
<TABLE height=30 cellSpacing=0 cellPadding=6 width="100%" border=0>
<TBODY>
<TR bgColor=#5d7790>
<TD align=left width="81%"><SPAN class=f06><FONT
color=#ffffff>贴子主题:[原创]循线算法原理与实践</FONT></SPAN> </TD>
<TD align=middle width="19%"><SPAN class=f06><FONT
color=#ffffff>回复数:</FONT><FONT color=#ffffff>11</FONT> (其中0条已删除)</FONT>
</SPAN></TD></TR></TBODY></TABLE>
<TABLE height=30 cellSpacing=0 cellPadding=0 width="100%" bgColor=#e8e8e8
border=0>
<TBODY>
<TR>
<TD><IMG height=2 src="" width=20> <SPAN class=f06><FONT
color=#444444>相关链接:</FONT> <FONT color=#444444>本贴没有相关链接</SPAN></FONT>
</TD></TR></TBODY></TABLE>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=0
cellPadding=6 width="100%" border=0>
<TBODY>
<TR>
<TD class=f03
style="BORDER-RIGHT: #ffffff 0.5pt solid; BORDER-TOP: #ffffff 0.5pt solid; BORDER-LEFT: #bbbbbb 0.5pt solid; BORDER-BOTTOM: #ffffff 0.5pt solid"
vAlign=top align=left width="19%" bgColor=#d1d9e2 rowSpan=2>【楼主位】 <FONT
color=#000000>Gorgon Meducer 傻孩子</FONT><BR><IMG height=90
src="[原创]循线算法原理与实践.files/armok0111022.jpg" width=120><BR>积分:<FONT
color=#000000>638</FONT><BR>派别:<FONT color=#000000></FONT><BR>等级:<FONT
color=#000000>------</FONT><BR>来自:<FONT color=#000000></FONT><BR></TD>
<TD class=f03
style="BORDER-RIGHT: #bbbbbb 0.5pt solid; BORDER-TOP: #ffffff 0.5pt solid; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"
vAlign=top width="81%" bgColor=#d1d9e2><FONT color=#000000>[说在前面的话]
<BR>看了OURAVR机器人板块的很多文章,仍然停留在Show图片,Show代码,大家“喊一下牛”的程度。真真做机器人的,却又像是做进度报告似的……实在看不过,本人最爱显示小聪明,所以,斗胆,鲁班门前弄大斧,各位大虾面前抢先说说——“循线算法原理与实践”。
<BR><BR>还是那句老话:没时间的捧个人场哈! <BR><BR><BR>[硬件基本构架]
<BR>对于机器人的循线,为了获得场地上白线(黑线)的信息,硬件结构一般有如下几种种类。
<BR>1、红外对管阵列。采取这种方式的机器人比较多,尤其在各种机器人竞赛中,几乎是标准配置。但是这种技术有一个致命的弱点,就是对于场地光线的干扰特别敏感,而且也很难把红色和白线区别开来,所以使用受到一定的限制。一般解决这类问题的方法是在红外光上加载一个调制波,通过检测这个调制波来消除场地光线的干扰,至于如何解决红色和白色的区别问题,那就几乎是五花八门了。
<BR>2、光纤传感器阵列。采用这种传感器阵列的原因是,光纤非常细,在单位面积内可以安装更多的传感器,从而获得更精确地场地信息。当然,钱也也花得更多。
<BR>3、线性CCD。这种硬件方法几乎是一种对场地信息分辨率的BT追求,如果说红外对管阵列还是离散信息的话,那么线性CCD就是线性的连续数据。当然驱动它也不是一件容易的事情,对于单片机也有更高的速度要求。
<BR>4、视觉。废话少说——否则明天我都别想吃饭。 <BR><BR>[基本原理]
<BR> 所谓循线,就是通过一定的传感器探测地面色调迥异的两种色彩从而获得引导线位置,修正机器人运动路径的一种技术。——说的太拗口了。不说太多理论的东西,我们就从基于红外对管阵列的循线技术来说起。
<BR> 假设,我们使用的是黑底白线的场地。红外对管阵列由3个红外对管1字摆开组成。白线的宽度略小于或等于红外对管阵列的宽度。
<BR>1、数据的采集。
<BR> 对于机器人来说,通过传感器感知周围事物的信息,利用这些信息并不作太多智能上的计算而直接通过一定的转换,指导机器人的运动——这种形式在人工智能学上叫做机器人的“反应范式”。所以,我们要想让我们的机器人能够寻着我们给定的轨迹线运动,第一步就必须让他感知到轨迹线的存在。一般的做法就是通过AD采样,获得红外对管(传感器)反馈回来的电压信息。然而,这样获得的电压值信息是无法直接指导运动的,必须把他们转化为二值的(也就是二进制信息,1表示线存在,0表示线不存在)信息,然后通过处理每一个管子反馈回来的二值信息获得白线的位置信息。
<BR>>>技术点A AD信号的阀值化。(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)
<BR> 所谓阀值化,就是通过一定的范围把握,从而把线性的数据转化为离散数据的一种变换。简单的说,就是通过分段函数的方法,将数据分类。在我们这个应用中,就是想方设法使AD采集回来的电压值变化为一个恰恰能够准确表示白线位置信息的二进制信息,1代表白线存在,0代表白线不存在。由于白色和黑色在电压差异上非常之巨大,所以可以简单的通过一个标志线来区分它们,当电压值高于这个标志线了,就把他标志为1,否则就标志为0,算法描述为:
<BR> if (AdValue[i] > MarkLing)
<BR> {
<BR> LineInfor[i] = 1;
<BR> } <BR> else
<BR> {
<BR> LineInfor[i] = 0;
<BR> }
<BR>这样做非常简单,适合于比较标准的场地,然而对于那些模糊了的场地或者是非标准场地,虽然人的肉眼能够看出来,但是对于机器人来说,可能看到的就是花白的一片或者是黑色的夜幕。当标志线值过高时,机器人能看到的只是那些特别明显的白线,其他则是黑色的夜幕,很容易丢失轨迹线;当标志线值过低时,机器人眼中就是白茫茫的一片毛刺。总而言之,对场地的适应性非常差。解决方法是,通过设定两个标志线来标定轨迹线信息,当AD值高于某一值时,标志1;当AD值低于另外某一值时,则标定0。算法描述为:
<BR> if (AdValue[i] > High_MarkLine)
<BR> {
<BR> LineInfor[i] = 1;
<BR> }
<BR> else if (AdValue[i] < Low_MarkLine)
<BR> {
<BR> LineInfor[i] = 0;
<BR> } <BR> else
<BR> {
<BR> LineInfor[i] = NoInfor;
<BR> }
<BR><BR>>>技术点 B 动态预值。(你可以参考其它的算法,获得比较详尽的技术,我这里只是举例一二)
<BR><BR>当然,这种算法在简单的机器人循线中不是很常用。比较常见,适应性强的方法是,首先从AD值中找到一个中间值作为MarkLine,(或者可以从AD值中找那些比较接近最大值和最小值之差的0.618倍的数值),然后再使用第一种方法标记,这样的算法叫做动态预值。如果把这种算法应用于第二种当然也不多啦。
<BR><BR>2、数据的简单加工——第一个循线程序。
<BR> 到目前为止,我们已经把AD的值的数组转变为了一个表示白线位置的二进制位的数组——我们不妨直接把他用一个字节表示哈。那么,这个字节的状态就表示了当前白线的位置信息。再假设,我们已经写好了几个函数用来分别控制小车的左右运动。那么我们就可以通过以下的简单方式来实现循线了。
<BR><BR>//用字节的高三位表示三个管子检测到的白线信息。 <BR>switch (LineInforByte) <BR>{
<BR> case 0b11100000: //全部在白线上
<BR> Motor_Left_GoFront(FullSpeed);
<BR> Motor_Right_GoFront(FullSpeed);
<BR> break;
<BR> case 0b01100000: //明显车子向左偏了哈
<BR> Motor_Left_GoFront(FullSpeed);
<BR> Motor_Right_GoFront(NormalSpeed);
<BR> break;
<BR> case 0b00100000:
<BR> Motor_Left_GoFront(FullSpeed);
<BR> Motor_Right_GoFront(LowSpeed);
<BR> break;
<BR> ……
<BR>
<BR> //其他情况仿照上面自己写了哈。
<BR> default:
<BR> Motor_Left_GoFront(StopNow);
<BR> Motor_Right_GoFront(StopNow);
<BR> break <BR>}
<BR><BR>呵呵,这样就完成了一个循线小车的程序了哈。简单吧。
<BR>顺便说明一下下,Motor_Left_GoFront()函数是一个控制电机PWM输出的函数。FullSpeed NormalSpeed LowSpeed StopNow StopFree 是一些控制PWM的宏定义,你可以修改这些宏定义的值来实现以上的功能。我想,你看了这个程序应该已经对循线的基本原理了然于胸了吧。哈哈哈哈哈哈哈哈。
<BR><BR>3、数据的高级加工——复杂地面情况的模糊识别算法。
<BR> (肚子饿了,吃饭后、约会完毕后、发现人气高后……再说,哈哈哈哈哈哈)<BR>-----<FONT
color=blue>此内容被Gorgon Meducer于2005-10-23,11:50:58编辑过</FONT><BR></FONT></TD></TR>
<TR>
<TD class=f03
style="BORDER-RIGHT: #bbbbbb 0.5pt solid; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: #ffffff 0.5pt solid"
vAlign=bottom bgColor=#d1d9e2>__________________________<BR><IMG
src="[原创]循线算法原理与实践.files/armok01129547.jpg"> </TD></TR>
<TR>
<TD class=f03
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -