admin 管理员组

文章数量: 1086019


2023年12月21日发(作者:vuejs设计与实现电子版pdf)

Electronic Technology

电子技术•机器人如何准确定位文/黄庆辉方左右两端各放置两个传感器。机器人为前进本文以全自主下象棋机器人摘

为研究对象,重点研究寻迹机器

要人的准确定位的算法。使其实现沿着固定轨迹前进、后退,并将其放到指定位置。【关键词】机器人 寻迹 准确定位机器人的制作可涉及到多个学科,尤其是全自主机器人的制作,难度更大。但全自主机器人的最大难点就是行走的问题,以我的经验及对机器人的了解知道,大部分全自主机器人都是寻迹机器人,而寻迹的难点在于准确定位。1 准确定位1.1 准确定位的重要性机器人的性能,最重要的一个指标就是其完成任务的情况,是否能达到指定的要求。例如下象棋机器人所需要完成的任务为识别出棋子的颜色,根据不同棋子的颜色来确定是什么棋子,将其放置到相应位置,并确定将军的策略,最后把对方的将搬起,完成任务。那么在搬运棋子的过程中,大约需要机器人行走4个来回、定位,在每识别一个棋子及搬起一个棋子时都需要准确定位,如果定位不准,则不能搬起棋子,任务就会失败。所以,能否准确的定位,是完成任务的一个重要的硬性指标。1.2 准确定位的设计思路影响准确定位的,一个是所处的位置,另一个是移动的速度。我们知道棋盘都是由正方形的方格所组成,如果机器人能够清楚自己所处第几个方格,那么就能够清楚知道需要做的动作。这就需要实时记录格子的数量(计算横线数就可以)。知道自身所处位置后,再根据需要走到需要停下来的横线处(后面介绍了避免一条横线多计数的算法,我们就可以利用这种算法来计数横线数,即格子数,这样就使机器人非常清楚的知道自己所在位置了)。如果当时机器人的速度很快,马上刹车,会由于其自身的惯性使其向前滑行一段距离,严重影响定位的准确性,为避免这种由于机器人速度过快造成定位不准的现象发生,为此设计了这样一种结构:即在机器人的机械臂正下状态时,当前排传感器检测到要停的横线时,不是马上停下来,而是把速度减到很低,当机械臂下的左右两侧传感器同时检测到横线时,再完全停下来。但是,有时由于车身不正,会使机械臂下的一侧传感器先检测到横线,而另一侧没有检测到,遇到这种情况时,则先使车停下来,然后判断哪端传感器未检测到横线,然后让未检测到横线那端的驱动电机单独工作,调整位置,直到检测到横线,即两端传感器同时检测到横线为止。这样就可以有效地避免由于惯性而影响定位精度。程序的算法是:无论是机器人处于前进状态还是后退状态,当遇到要停下来执行任务的横线时,把速度降的非常的慢,直到机械臂下的两端传感器同时检测到横线时,机器人完全刹车,停止前进,执行任务。1.3 准确定位的实现基于以上的分析思路,设计准确定位的算法流程图如图1。图1:机器人准确定位算法流程图准确定位算法:switch (counter)select=;{ select>>=12; case 4:

geardown(); //调用低速程序降低速度select&=0x0007;flag4=0; //定位到指定 select|=eye;

位置标志 1代表已定位好

underarm=. switch(select)GPIOB9;

{

//检测右侧第一个

传感器的值

case 1:

underarm1=302(); //调用左转动30度的PWM波1;

程序

//检测左侧第一个传感器的值

break;

if(underarm!=1&&underarm1!=1)case 2:

{geardown();

flag2=1; //

flag2为机械臂动作标志 break; }

case 3:

while(flag2)//left52(); //调用左转动5度的PWM波程flag2为机械臂动作标志序{

eye=GpioDataRegs. break;11;

eye<<=3;case 4:

eye&=0x0008;right302(); //调用左转动30度的PWM波

break;Electronic Technology & Software Engineering

电子技术与软件工程• 105

电子技术

Electronic Technology

GPIOB1;

if(underarm1==1)

{

while(CpuTimer0. {

flag2=0; stop(); //调用刹车子程序armdown(); //放下机械臂catcho(); //抓物(棋子)

armrise(); //起臂

armstraight(); //正臂 flag=0;InterruptCount

break; }

}// end of while

图2:读取传感器值的算法流程图}// end of if

if(underarm!=1&&underarm1==1)case 6:

right52(); //调用左转动5度的PWM波{

程序

stop();break;

case

EvbRegs.T4CMPR = motor68;12:

// Timer4 比较器右轮单独驱动调整位right302(); //调用左转动30度的PWM波置

break;

13=1;

}

//右轮转

12=0;

underarm=GpioDataRegs. 9 ;InterruptCount=0;

underarm1=.

GPIOB1;

while(uptCount

{(underarm==1&&underarm1==1)

{

underarm=9;

flag4=1;

//已定位好if(underarm==1) }

else{ {

flag4=1;if(underarm==1&&underarm1!=1)

{ break;

stop(); //停车}EvbRegs.T3CMPR = motor68; } // // Timer3 比较器左轮单独驱动调整位置end of 15=1; }//

//左轮转 of if

GPIOB14=0;

} //end of uptCount=0;

if(flag4) {

106 •电子技术与软件工程

Electronic Technology & Software Engineering ︰ ︰2 寻迹算法如果想要机器人能够沿着指定路线行走,则需要让机器人能够自行判断自身所处的位置,这样才能够知道下一步如何行走。本设计的下象棋机器人要沿着黑色的线行走,图纸是在白色的底部贴上4cm宽的黑色的路径。机器人所要做的就是识别出自身处于黑线的位置。2.1 识别原理由物理光学可知,黑色的反射率几乎为零,而白色的为1,这正好符合计算机中的0、1规则。由光电传感器原理图可知,当传感器检测到黑线时其输出为高电平,即为1;检测到白线时其输出为低电平,即为0。通过传感器将这些信息传递给DSP(数字信号处理器),由DSP可判断机器人自身所处的位置,做出响应,执行相应的操作,如控制驱动电机的起停、前进或后退、机械臂的动作等等……2.2 识别方法最左端在同一水平线上共有四个光电传感器,最右面的那个传感器与其它三个传感器距离最远,其主要负责识别横线,当四个传感器同时检测为黑色时则表明是横线,这样设计的优点在于可以避免当车身不正时误把棋盘上竖线当成横线计数,出现错误。其余三个传感器是负责机器人寻迹转向的,根据其状态,来控制机器人的行走轨迹。例case 1中也就是select=1即传感器状态为0001,传感器排放顺序与读取的顺序相反,如果机器人是前进状态,则表示前排最左侧传感器在黑线上,说明机器人向右侧偏,应当使机器人调整位置即转向,应该向左转向:调用left30( )函数,当其读取传感器的值为case 2是就select=2是表明机器人位置正好在黑线正中间,不需要转向,保持正向前进或者后退。机器人读取传感器的流程图如图2。机器人在行走时需要实时读取传感器的状态,先判断其是前进状态还是后退状态,如果是前进状态则读取前排传感器,如果是后退则读取后排传感器,并把结果保存在select变

量中。读取传感器值的算法:while(1){

if (!flag) {eye=11; eye<<=3; eye&=0x0008;

select=; select>>=12;

select&=0x0007; select|=eye; }

//读取前排传感器的值 else{

select=; select>>=8; select&=0x000F;

}

//读取后排传感器的值机器人读取了传感器的状态后,从而可以准确地判断出自己所处的位置,就可以按照所设定的命令来完成特定的任务,如调整自己的方向,使自身沿着黑色线行走,或者执行一些其它的任务。2.3 避免一条横线多计数的算法2.3.1 产生一条横线多计数的原因由机器人所要完成任务可知,判断自身所处位置是根据所走的横线数目,能够准确识别出横线的数目是非常关键的,是影响机器人完成任务的一项重要指标。我们知道光在真空中传播速度为3*10^8m/s,我们使用DSP的频率为120M,时钟周期约为8.3ns,读取传感器一次大约需要20个时钟周期,即166ns,因为光速远远高于DSP读取速度,所以读取速度就以DSP的读取速度为准。传感器高度大约为2.5cm,棋盘上的横线宽度为4cm,机器人的驱动电机为200r/min,轮子的半径为3.5cm,当机器人穿过4cm横线时大约需要0.05s,若忽略电路响应时间,则光电传感器大约可读取6*10^6次,如果将此数值误记当作横线值来计数,这个数字是相当恐怖的。所以必须避免这种情况的发生,这就需要采用程序算法来避免。2.3.2 解决一条横线多计数的方法当4个传感器全部都检测到黑色线时,即检测到了横线,我们不妨设置一个标志变量flag1,当检测到横线时判断此变量是否为0,如果为0,将此变量赋值为1,然后将记录横Electronic Technology

电子技术线数目的变量加1,否则继续执行。当小车检测到非横线,且小车位置在黑线正中时或者检测全白时将flag1变量清0。这样就可有效地避免一线多记的错误,流程图如图3。避免一条横线多计数算法:Uint16 flag1=0; //是否出横线防止一条线记多次switch(select){case 0:

flag1=0;

//将标志变量设置为0if(flag) { goback(); } else {godown(); //前进,调用电机子程序 } break;case 1:

left30();

//调用左转动30度的PWM波程序图3:避免一条横线多计数算法流程图 break;中的例子,也仅仅是从寻迹定位的角度来分析case 2:

的,像能够识别车、马、炮等不同种类的棋子, flag1=0;

能够拐直角弯,能识别出米字交叉线,能搬起 //将标志变量设置为0棋子,搬起对方的老将,判断任务结束等一些 if(flag)问题,留待以后讨论。 {goback();3 结束语 }机器人在各行各业都有,要求做的事也 else越来越多,所以机器人的研究和发展还在继续, {让我们共同努力,使机器人功能越来越强大,godown(); //前进,调用电机子程以便为我们更好地服务。序 }参考文献 break;[1]程晓旭.C语言算法速查手册[M].北京: ︰人民邮电出版社,2009.︰

[2]扈宏杰.DSP控制系统的设计与实现[M].case 14:北京:机械工业出版社,2004.case 15:

[3]陈继荣.智能电子创新制作—机器人制作

入门[M].北京:科学出版社有限责任公

司,2012.if (flag1)[4]陶砂,蒋湘若.机器人制作与创新[M].{高等教育出版社,2009. break;

作者简介}黄庆辉,大学本科学历。职称:讲师。研究方flag1=1;

向为机器人定位。counter++; //count 为记录横线数的变量︰作者单位︰辽宁省阜蒙县职业教育中心 辽宁省阜蒙县

对机器人研究的知识面太庞杂,就本文123000Electronic Technology & Software Engineering

电子技术与软件工程• 107


本文标签: 机器人 横线 传感器