实验五、机器人触觉导航内容:•安装并测试机器人的触须。•触须导航•逃离“死区”5.1.1元件清单及装配•元件清单:(1).须状金属丝(2).平头M4-40螺丝钉(3).½″圆形套管(4).尼龙垫圈(5).3-pin公-公接头(6).220Ω电阻(红-红-棕)(7).10kΩ电阻(棕-黑-橙)5.1安装并测试机器人的触须安装示意图触须电路#includeBoeBot.h#includeuart.hintP1_6state(void)//获取P1_6的状态{return(P1&0x40)?1:0;}intP2_3state(void)//获取P2_3的状态{return(P2&0x08)?1:0;}intmain(void){5.1.2例程:TestWhiskers.cuart_Init();printf(WHISKERSTARTES\n);while(1){printf(左边胡须的状态:%d,P1_5state());printf(右边胡须的状态:%d\n,P2_3state());delay_nms(150);}}//theendofthemain5.1.3实地测试•(假设)你以后不得不脱机测试胡须。由于调试终端利用不到,你怎么办?一种解决的办法是通过编程,让它发送一些和其接收到的输入信号相符合的输出信号。我们可以利用含有一对LED的电路和基于胡须的输入让LED亮或灭的程序来实现。LED指示电路•注意,在LED实验中,如果你测试过上图的连接方法,你会发现LED亮度不那么让人满意,你可以采用另一种电路。5.2触须导航•在前面的实验中,编程来检测胡须是否被触动。在本实验中,利用这些信息对宝贝车导航。在宝贝车行走过程中,如果有胡须被触动,那就意味着碰到了什么。导航程序需要接受这些输入信息,判断它的意义,调用一系列使宝贝车倒退、旋转并朝不同的方向行走的动作子函数。注意动作的先后顺序,比如,左侧触须碰到障碍物,相应的I/O检测到低电平,此时应先后退,然后右转根据实地的测试情况,可以灵活改变左转、右转、后退、前进的距离可能的情况•左右皆等于零(“=0”表示触墙);•左=0&&右≠0;•左≠0&&右=0;•其他例程:RoamingWithWhiskers.c•为了实现这些,宝贝车需要编程来做出选择。C语言中有个条件判断语句,其句法是:if(condition){…}elseif(condition){…}else{…}句中“…”的意思是,你可以在关键词之间放置一个代码段(由一条或多条语句组成)。下面的例程会基于胡须的输入做出选择,然后调用相关子程序使宝贝车采取行动。子程序同你在实验三中用到的类似。if((P1_5state()==0)&&(P2_3state()==0))//两个胡须同时检测到障碍物时,后退,再向左180度{Back_Up();Turn_Left();Turn_Left();}elseif(P1_5state()==0)//左边胡须检测到障碍物时,后退,再向右转90度{Back_Up();Turn_Right();}elseif(P2_3state()==0)//右边胡须检测到障碍物时,后退,再向左转90度{Back_Up();Turn_Left();}else//没有胡须检测到障碍物时,向前走Forward();5.3当小车卡住时的人工智能和判断•现在来预想这种情况:宝贝车进入墙角时会如何动作---假设左胡须触墙,于是它右转。当小车再向前行走,右胡须触墙,于是左转。然后它又前进又会碰到左墙,再次碰到右墙…等,你会发现这是一个死循环。小车在无人干预的情况下能够走出这个困境吗?•这种情况下,如果小车有“记忆”的能力,能够记住前面几次的探测情况,那么,就可以判断是否陷入死角了。•对于人来讲,这是很容易的,比如,不在同一个地方跌倒两次,不被同一块石头绊倒两次…等等,人能够记住以前发生的事情,并作为经验或资料,指导自己现在或将来的行为。•好了,小车可以做到吗?小车可以“存储”信息!•可以修改RoamingWithWhiskers.c来解决这个问题。技巧是计下胡须交替触动的总次数。•技巧的重要的一点是程序必须记住每个胡须在上次触动时处于什么状态。它必须和当前触动时的状态对比。如果状态相反,就在总数上加1。如果这个总数超过了程序中预先给定的阀值,那么就该做一个“U”型转弯,并且把胡须交替计数器复位。•下面这个例程依赖于if…else嵌套语句来实现。换句话说,程序检查一种条件,如果该条件成立(条件为真),则再检查包含于这个条件之内的另一个条件。这是一个伪码例程说明嵌套语句用法。IF(condition1){Commandsforcondition1;IF(condition2){Commandsforbothcondition2andcondition1;}ELSE{Commandsforcondition1butnotcondition2;}}ELSE{Commandsfornotcondition1;}if(P1_5state()!=P2_3state()){if((old2!=P1_5state())&&(old3!=P2_3state())){counter=counter+1;old2=P1_5state();old3=P2_3state();if(counter4){counter=1;Backward();//向后Left_Turn();//向左Left_Turn();//向左}}elsecounter=1;}•Patienceandimagination.