解魔方的机器人攻略19 – 让魔方动起来

一星期没更新,原因就不多说了,总之请见谅。从今天开始继续发攻略 :)

我原来的代码又多又乱还没有注释,自己看着都眼晕,找点代码晕的跟坐过山车似的。现在正在把它们重新整理优化,再加上注释。我打算整理一部分就发一部分攻略,攻略发完了也就整理完了。另外,这几天有很多网友正帮忙翻译lejos的中文教程,我在整理的过程中也学到了不少东西,有兴趣的同学还可以加入。

下面开始正题。假设现场的观众们按照前面的攻略,已经把萝卜头搭建好了。第一段程序先让魔方能动起来,实现的功能是:

  • 按Left键,魔方底座旋转90度
  • 按Right键,爪子抓住魔方,然后底座带动最下面的层旋转90度
  • 按Enter键,爪子把魔方翻转90度
  • 按Escape键,程序退出

下面介绍需要用到的一些知识点

1,创建传感器和电机的实例:

//Define Sensors
 static UltrasonicSensor distance=new UltrasonicSensor(SensorPort.S1);
 static LightSensor light = new LightSensor(SensorPort.S2);
 static ColorSensor color = new ColorSensor(SensorPort.S3);
 //Define Motors
 static Motor paw=Motor.A;
static Motor monitor=Motor.B;
 static Motor bottom=Motor.C;

这部分对应的是我们的接线方式:
传感器1口接超声波传感器,也就是眼睛
传感器2口接亮度传感器
传感器3口接颜色传感器
电机A口接爪子的电机
电机B口接颜色传感器的电机
电机C口接魔方底座的电机

2,创建一个Robot类,这个类用于控制机器人结构上的各种动作,下面三个方法分别对应上面说的三个功能:

public static class Robot
{
 public static void RotateBottomSide(int nQuarter)
 {   }

 public static void RotateBottom(int nQuarter)
 {   }

 public static void RotatePaw()throws Exception
 {   }
}

这里使用了关键字static,因为萝卜头只有一个实例,所以把它设置成静态类。静态类可以直接使用静态方法,不需要创建实例,还是看一段代码对比下:

//创建实例的用法
Robot instance = new Robot();
instance.rotate();
//静态类的用法
Robot.rotate();

3,设置了一些参数

//如果爪子部分改装了那个3:1的减速齿轮,设置成true,不明白的请看 http://www.diy-robots.com/?p=147 最后两张图
 static boolean HasReducer = true;
 //爪子抓住魔方时的电机角度
 static int PawHoldPosition = 56;
 //爪子翻动魔方时的电机角度
 static int PawTurnOverPosition = 110;
 //底座旋转90时,电机的旋转角度(因为齿轮组的原因)
 static int BaseOneQuarter = 315;
 //当底座旋转魔方底面时,因为魔方的阻力,需要先多转一个小角度,然后再转回来,这是用来修正误差的角度
 static int BaseRotateFix = 40;

4,控制电机(motor)的几个函数

paw.setSpeed(400); //设置转速
paw.rotateTo(nPawHoldPosition); //旋转到一个指定角度(绝对定位)
bottom.rotate(-nFixAngle);    //旋转一定角度(相对定位)

更多的电机相关函数,请点这里看刚刚翻译好的教程。

5,亮度传感器的一个函数,用于把它的灯打开或者关闭。这里是关闭它,省的晃眼睛,需要的时候再开 :)

light.setFloodlight(false);

好了,最终解魔方的动作,都是通过调用这几个函数来完成的。事实上如果你足够无聊的话,现在就可以通过NXT上的几个按键来控制萝卜头玩魔方了。
该吃早饭了,大家自己看看源代码吧。
http://www.diy-robots.com/RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100115.txt



对 “解魔方的机器人攻略19 – 让魔方动起来” 的 10 条 评论

  1. zhcq163 说:

    抢老大的沙发

  2. Tennie 说:

    占座继续等更新……

  3. bigapple 说:

    不错不错,那几个按钮可以用来测试机械结构用,哈哈。

  4. Sirit 说:

    呜呜,老婆不支持,说我不务正业。

  5. dot 说:

    友情支持

  6. dead_lee 说:

    呵呵, 不錯.

  7. 小许 说:

    站主,收下GMAIL邮件,给你去了一封信,希望你感兴趣。

  8. 风雪冲 说:

    把在NXT上代码用命令行编译时遇到好多问题
    1.api过时
    2.不兼容
    3.找不到符号
    将代码在eclipse上进行检查,有的改过来了,有的还是不会。
    郁闷。。。

    • 风雪冲 说:

      运行这部分代码时,按这几个键老是自动关机,于是重新改了一下:
      将 Button.waitForPress();
      int nButtonNum = Button.readButtons();
      // 1:Enter; 2:Left; 3:Right; 4:Escape
      switch(nButtonNum)
      {
      case 1:
      Robot.RotatePaw();
      break;
      case 2:
      Robot.RotateBottom(1);
      break;
      case 4:
      Robot.RotateBottomSide(-1);
      break;
      default:
      return;
      改成
      if (Button.ENTER.isPressed()) Robot.RotatePaw();
      if (Button.LEFT.isPressed()) Robot.RotateBottom(1);
      if (Button.RIGHT.isPressed()) Robot.RotateBottomSide(-1);
      在NXT上操作成功,先小小激动下!!!

      • 恭喜恭喜,这个魔方机器人的项目我都已经快淡忘了,好多问题都回答不上。
        希望后来人看到你的这些代码能有所启发! :)

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>