宜昌老张

乐高相扑眼小车迷宫探路

0
阅读(5012)

图1 乐高相扑眼小车全景图

    每当看到网络上那些机器人打擂台的视频,总是让人有些激动,试想着自己为啥不能做一个这样彪悍的机器人参加“战斗”。这样的机器人除了电机马力强劲,车身铜墙铁壁,还就是能机敏地观测到对方机器人位置,以便随时冲上去把对方赶下擂台。


乐高相扑机器人比赛视频:http://player.youku.com/player.php/sid/XNjIwMTY0MTcy/v.swf

    相扑小车一般找到对方物体,会把物体退出擂台以外,而这次设计的相扑车虽然使用了相扑眼传感器,但并不是攻击对方物体,而是躲避对方固定物体。我用黑色电工胶布在米色地板砖上“画”了个圈,小车在躲避前方物体时,不能离开黑圈之内。小车躲避物体用到的是美国Mindsensors公司出品的相扑眼传感器NXTSumoEyes,而限制它场内移动的是两个光线传感器。


相扑小车视频:http://player.youku.com/player.php/sid/XNjE5OTY5ODgw/v.swf

    这次制作的相扑小车,采用的相扑眼传感器安装在小车前端,用来定位对方机器人的位置, 如图2所示。

图2  Mindsensors公司的相扑眼安装

    相扑小车左右两车轮由两个乐高伺服电机来驱动,车后端设置了一个万向轮,左右两驱动轮和万向轮构成了对车体的三点支撑。车辆模型的这种支撑模式,在车体负载不重的情况下,其移动最为灵活机动。如图3所示。

图3 相扑小车的底部视图

    Mindsensors公司的乐高相扑眼传感器能够检测前左,前右,或正前方的障碍,支持两个距离范围,即:短量程和长量程,短量程区域是大约6英寸(15厘米),长量程区大约有12英寸(约30厘米),如图4所示。


图4  Mindsensors公司相扑眼传感器NXTSumoEyes的工作示意图

    相扑眼传感器能够检测其前方的长、短距离两个量程的左、中、右三个观察扇面区内是否存在物体。如果前面没有物体,则传感器反馈的标志值ob为0,如果物体在相扑眼的正前方,则标志值ob为1,如果物体在相扑眼的左前方,则标志值ob为2,如果物体在相扑眼的右前方,则标志值ob为3。长、短距离的标志值变量名分别为ob1和ob2,根据传感器反馈回来长、短距离的ob值,小车就知道对方物体的方位和距离范围。

   这次设计的小车用到了一个Mindsensors的相扑眼传感器和LEGO原厂的两个光线传感器,利用这些传感器的反馈信息,小车的运动策略如下。

    根据相扑眼工作原理,躲避物体的策略是:当场地里的障碍物远离小车相扑眼时,小车直行;当相扑眼的长量程或短量程里,障碍物在其左前方时,小车向右偏离躲避障碍物;当相扑眼的长量程或短量程里,障碍物在其右前方时,小车向左偏离躲避障碍物;当障碍物位于相扑眼的长、短量程里的正前方时,则随机向右或者向右急转,躲开障碍物。

    利用光线传感器的反馈,把小车限制在场内的策略是:当左右光线传感器同时都检测到场地边沿的黑圈时,小车停止、后退再旋转180度,面向场内;当一个光线传感器检测到场地边沿的黑圈而另一个光线传感器还位于场地内侧时,则先小车旋转一个角度,使车身垂直于黑线,然后小车停止、后退再旋转180度并朝向场内。

    根据上述相扑车的功能介绍,撰写的NXC程序如下:(注:该程序需要相扑眼专门库文件SE-lib.nxc支撑。)文章后面还有精彩视频!

#include "SE-lib.nxc"//申明引入智能眼库文件
#define Light 50    //设定光线传感器的黑线判断阀值
int Light_R;    //智能车右光线传感器的采样值变量
int Light_L;    //智能车左光线传感器的采样值变量
//子程序,任务为:智能车停止、后退再车身旋转180度,小车朝向场内
sub stop_back_turn()
{
  Off(OUT_AC); //小车电子煞车停止
  Wait(500);
  RotateMotor(OUT_AC,30,-300);  //小车后退一段距离
  Wait(500);
  RotateMotorEx(OUT_AC,30,400,100,true,true); //小车车身原地旋转180度
}
//主程序
task main()
{
  int ob1,ob2; //被测物体在相扑眼前方哪个位置的标志值变量
  //将右光线传感器连到NXT控制器的传感器端口1
  SetSensorLight(S1,IN_TYPE_LIGHT_ACTIVE);
  //将左光线传感器连到NXT控制器的传感器端口2
  SetSensorLight(S2,IN_TYPE_LIGHT_ACTIVE);
  //反复往复执行包含在while(true)函数里的程序段
  while (true)
 {
    /*相扑眼传感器能够检测其前方的长、短距离两个量程的
    左、中、右三个观察扇面区内是否存在物体。
    如果前面没有物体,则传感器反馈的标志值ob为0,
    如果物体在智能眼的正前方,则标志值ob为1,
    如果物体在智能眼的左前方,则标志值ob为2,
    如果物体在智能眼的右前方,则标志值ob为3。*/
    //把连在传感器端口3的相扑眼传感器长量程的标志值读取到ob2中
    SumoEyes_SetLongRange(S3);
    ob1 = SumoEyes_DetectObstacleZone(S3);
    //把连在传感器端口3的相扑眼传感器短量程的标志值读取到ob2中
    SumoEyes_SetShortRange(S3);
    ob2 = SumoEyes_DetectObstacleZone(S3);
    Light_R=SENSOR_1; //把右光线传感器的发射光线值从端口1采样到变量Light_R
    Light_L=SENSOR_2; //把左光线传感器的发射光线值从端口2采样到变量Light_L
    //当左右光线传感器没有检测到场地边沿的黑线,小车在场地内行驶时,
    if(Light_R>Light && Light_L>Light)
    {
      //当场地里的障碍物远离小车相扑眼时,
      if( (ob1==0 && ob2==0) || (ob1==1 && ob2==0 ))
        OnFwdSync(OUT_AC,30,0);  //小车以30%的功率,直行
      //当相扑眼的长量程里,障碍物在其左前方时
      if(ob1==2 )
        OnFwdSync(OUT_AC,30,20); //小车向右偏离躲避障碍物
      //当相扑眼的长量程里,障碍物在其右前方时
      if(ob1==3)
        OnFwdSync(OUT_AC,30, -20); //小车向左偏离躲避障碍物
      //当障碍物位于相扑眼的长、短量程里的正前方时,随机向右或者向右急转,
      //躲开障碍物。
      if( ob2==1 && ob1==1 )
      {
        if(Random(2)== 0)
          OnFwdSync(OUT_AC,30,50);
        if(Random(2)== 1)
          OnFwdSync(OUT_AC,30,-50);
      }
      //当智能眼的短量程里,障碍物在其左前方时
      if(ob2==2)
        OnFwdSync(OUT_AC,30,25); //小车向右偏离躲避障碍物
      //当智能眼的短量程里,障碍物在其右前方时
      if(ob2==3)
        OnFwdSync(OUT_AC,30,-25);//小车向左偏离躲避障碍物
    }
    //当左或右光线传感器检测到场地边沿的黑圈时,
    else if(Light_R <= Light || Light_L <=Light)
    {
      //当左右光线传感器同时都检测到场地边沿的黑圈时,
      if(Light_R <= Light && Light_L <=Light)
      {
        stop_back_turn();  //小车停止、后退再旋转180度,面向场内
      }
      //当左光线传感器检测到场地边沿的黑圈而右光线传感器还位于场地内时,
      if(Light_L <= Light && Light_R>Light)
      {
         //小车左轮不动,右轮转动,以使小车车身垂直于黑线
         while(Light_R > Light)
        {
          Light_R=SENSOR_1;
          Off(OUT_C);
          OnFwd(OUT_A,30);
        }
         stop_back_turn(); //小车停止、后退再旋转180度,小车朝向场内
      }
      //当右光线传感器检测到场地边沿的黑圈而左光线传感器还位于场地内时,
      if(Light_R <= Light && Light_L>Light)
      {
        //小车右轮不动,左轮转动,以使小车车身垂直于黑线
         while(Light_L > Light)
        {
           Light_L=SENSOR_2;
           Off(OUT_A);
           OnFwd(OUT_C,30);
         }
        stop_back_turn();//小车停止、后退再旋转180度,小车朝向场内
       }
     }
   }
}

    该项目程序请下载,网址:http://yunpan.cn/Q9uwnRvNtbExJ

   Mindsensors公司还有许多好用的乐高第三方周边,Mindsensors公司网页:http://www.mindsensors.com。其中他的无线通信产品中有一个Sony PS2无线手柄接收器接口板,我也试用了下。请看视频。


乐高遥控小车视频:http://player.youku.com/player.php/sid/XNjI3NDU5MDI4/v.swf

Baidu
map