解魔方的机器人攻略19 – 让魔方动起来
由 动力老男孩 发表于 2010/01/15 07:39:48一星期没更新,原因就不多说了,总之请见谅。从今天开始继续发攻略
我原来的代码又多又乱还没有注释,自己看着都眼晕,找点代码晕的跟坐过山车似的。现在正在把它们重新整理优化,再加上注释。我打算整理一部分就发一部分攻略,攻略发完了也就整理完了。另外,这几天有很多网友正帮忙翻译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
抢老大的沙发
占座继续等更新……
不错不错,那几个按钮可以用来测试机械结构用,哈哈。
呜呜,老婆不支持,说我不务正业。
友情支持
呵呵, 不錯.
站主,收下GMAIL邮件,给你去了一封信,希望你感兴趣。
把在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上操作成功,先小小激动下!!!
恭喜恭喜,这个魔方机器人的项目我都已经快淡忘了,好多问题都回答不上。
希望后来人看到你的这些代码能有所启发!