Archive for the ‘解魔方机器人’ Category

解魔方的机器人攻略18 – 魔方快速算法

我们的快速魔方算法要隆重登场了,在此缺席感谢一下来自Netherlands的Jaap Scherphuis同学。看前面这个页面的第三名。

魔方表示法
咱们先看一串天书般的字母:UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR
这种表示法是由一个叫Mike Reid的兄弟首先使用的,它表示一个已经被解好的魔方。
先不要被这串字母吓倒,看算法就像追mm一样,要迎难而上。仔细观察,你会发现其中只有六种字母:
U: Up
F: Front
R: Right
L: Left
D: Down
B: Back
其实这就是代表了空间坐标系的六个方向,就是传说中的“眼观六路”的那六路。
表示法中包含了12组双字母的组合,分别代表了魔方的12个棱,第一组UF就表示Up和Front之间夹角的棱。
另外还包含了8组三字母的组合,分别代表了魔方的8个角,每个角由三块颜色组成。看下面的示意图:

魔方坐标系

魔方坐标系

等等,细心的朋友至少会想到两个问题:
1,为什么没有中心的数据?
因为魔方的六个心在任何旋转过程中,相对位置都是不会变的,这点拆过魔方的人应该比较容易理解。
2,如果是一个打乱的魔方,棱和边的颜色已经和中心不一样了,这时候怎么表示?
读取方法是:按照刚才那个天书字符串的顺序,先找到UF位置所对应的棱,假设现在U是红色,F是黄色;
那么对照图里的中心,红色的中心是R,黄色的中心是U,所以这时候的第一组棱字母是 RU
嗯,希望你看到这里还没有晕车的感觉。

输出表示法
这个程序的输出是这个样子:F- U+ F- D- L- D- F- U- L2 D-
FRL之类的字母依然表示六个面,F-表示前层逆时针转90度,U+表示上层顺时针转90度,L2表示左边层转180度。
如果你是魔友的话,会经常看到这样的字符串:F’UF’D'L’F'U’L2D’
这是魔方论坛上比较常见的“黑话”,其实就是默认顺时针不加符号,逆时针的加一个单引号,180度的加2。
请注意这里的顺时针和逆时针使用的是“观察者迎着某个面看”的参照系,例如B’是从下往上看的逆时针,如果你没有把脑袋钻到桌子下,你事实上看到的是顺时针旋转。

改写到C#
这段程序是用C写的,说实话它的原理还比较复杂,有兴趣的同学可以搜索“Thistlethwaite’s algorithm”
我直接依葫芦画瓢用C#把它重写了一遍,请点击这里下载源代码。请主要要安装VS2008或更高版本。

http://www.diy-robots.com/RubikSolver/RubikSolverSample.zip

补充:如何使用这个程序

鉴于很多朋友询问如何运行这个程序,下载这段代码,用C语言的编译器编译成Jaap.exe。然后在命令行输入:
Jaap.exe UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR

输出结果就是类似 F- U+ F- D- L- D- F- U- L2 D- 这样的步骤。
注意这段程序没有验证功能,如果你输入的颜色表达式错误,会导致程序死循环或者错误。以我的经验看,普通电脑都能在1秒以内算完,如果你一秒钟还没有看到结果,就检查检查输入吧。

解魔方的机器人攻略17 – 魔方CFOP算法

本来我想把这个攻略做成一个NXT开发的教程,把传感器,电机,发声等部分都介绍一遍。不过现在看来有些同学很心急,希望早点看到“核心代码”,所以我提前把解魔方的算法写出来。其实魔方的算法网上有很多,只要你耐心并且有效的使用搜索引擎,会发现上个世纪就已经有人公布算法或源代码了,例如
算法:http://www.zunny.com/RUBIK.HTM
代码:http://tomas.rokicki.com/cubecontest/

不过我做第一版的时候,还是决定自己动手写算法。原因很简单:我玩魔方很多年了,把玩法转成算法也是我的目标之一。在写程序之前,我画了以下的几张草图:

魔方算法的草稿

魔方算法的草稿

 话说曾经有位同事本打算和我一起做萝卜头的,看了这些草图以后,决定还是继续打游戏更靠谱。这不禁让我想起一首歌“1979年,那是一个春天,有一位老人在中国的南海边画了一个圈…” 这位老同志一定是资深软件架构师,改革开放这么宏伟的事情,画个圈就搞定了。
这样说来我这个草图是太复杂了,难怪把人吓跑了。今天特地又重画了些好看的图,以便大家理解。

魔方表示法
算法的第一个问题就是,怎么用数学方式描述一个魔方状态。我的做法是把魔方想象成一个纸盒子,沿边缝剪开铺平,就形成了六个面,我按照图里的顺序给它们编了号。
每个面又包含了9个颜色小方块,我也按照图中的顺序给它们编了号。

魔方的数组表示法

魔方的数组表示法

这样一来,立体的魔方就变成了一个 6*9 的数组。例如下面是一个普通的被打乱的魔方:

static String SideColors[] = {
  "orgorwwoo",
  "oyggbobrg",
  "yyrgowwbw",
  "yrybgybbo",
  "gwwyybror",
  "bgrwwrbgy"

魔方坐标系:
啥?怎么又有坐标系,刚才的表示法不就完全描述了一个魔方吗?没错,但是咱们的萝卜头每次只能旋转魔方的最下面一层,假设我们需要旋转最上面一层,就必须先把它翻到下面。
请注意在翻跟头的过程中,魔方本身并没有变化,只是坐标系变了。所以还需要一个坐标系来对应萝卜头的空间:

魔方坐标系

魔方坐标系

 

状态变化
正如刚才所说,魔方在萝卜头的数字世界里有两种变化形式:1,翻跟头;2,旋转某一面。
每次状态变化都会造成SideColors数组发生变化,这种转换用最简单的查表法就可以搞定:

坐标变化的大概示意图,坐标变化没啥难度,主要看耐心

坐标变化的大概示意图,坐标变化没啥难度,主要看耐心

例如,这是一段旋转底面后状态转换的代码:

public static void RotateBottomSide(boolean ClockWise) throws Exception
{
 int temp=0;
 int i;

 CopyMatrics(2,6,ClockWise?2:1); //Bottom ClockWise = Top Anti-ClockWise
 CopyMatrics(6,2,0);
 if(ClockWise)
 {
  for(i=0;i<3;i++)
  {
   temp=Sides[5][0][i];
   Sides[5][0][i]=Sides[3][2-i][0];
   Sides[3][2-i][0]=Sides[4][2][2-i];
   Sides[4][2][2-i]=Sides[1][i][2];
   Sides[1][i][2]=temp;
  }
 }
 else
 {
  for(i=0;i<3;i++)
  {
   temp=Sides[5][0][i];
   Sides[5][0][i]=Sides[1][i][2];
   Sides[1][i][2]=Sides[4][2][2-i];
   Sides[4][2][2-i]=Sides[3][2-i][0];
   Sides[3][2-i][0]=temp;
  }
 }
}

CFOP解法
这是由一位叫Jessica Fridrich女士发明的一种速解法,是目前世界上最流行的方块解法。
CROSS:字面上的意思为“十字”,是Fridrich Method中的第一步骤。
F2L:是“First 2 Layer”的缩写,意思为“一、二层”,是Fridrich Method中的第二步骤。
OLL:是“Orientation of Last Layer”的缩写,意思为“最后一层的角块排序”,这是Fridrich Method中的第三个步骤。
PLL:是“Permutation of Last Layer”的缩写,意思为“最后一层的排序”,这是Fridrich Method中的第四步骤。
CFOP:是Fridrich Method的的别称,就是四个步骤“Cross、F2L、OLL、PLL”原文的第一个字母合起来而成的。

上面这些文字比较费解,看下面的图就比较清楚了:

魔方的CFOP入门解法

魔方的CFOP入门解法

或者你可以去魔方小站或者魔方吧看更详细的教程。

CFOP解法的实现
这一部分比较繁琐,输入玩法公式的输入,按照上面的步骤实现以下函数:

TopCross();
TopCorner();
SecondLayer();
BottomCross();
BottomCorner();
ThirdLayerCorner();
ThirdLayerCornerSnap();
ThirdLayerBorderSnap();

CFOP算法的源代码可以点这里下载
通过这个CFOP算法,萝卜头完成了第一版:http://v.youku.com/v_show/id_XNDcwMDQ3NDQ=.html

这个算法的最大问题就是步骤太多,一般来说要120步左右,平均时间12分钟,大多数观众等不到转完就睡着了……
因为这个原因,我改用了一个更快的算法。写博客真是挺累啊,这个算法下次再介绍,心急的同学请看下面这个链接:
http://tomas.rokicki.com/cubecontest/ 点最上面的Winners,我用的是第二名的算法。

解魔方的机器人攻略16 – 如何调试

今天已经是2010年了,祝大家新年快乐,新的一年学习好,工作好,身体好,感情好。。。总之一切都好!新年的第一天继续发攻略,希望是一个好的开始 :)

兵法说“代码未动,调试先行”。对于刚接触嵌入式开发的同学来说,把代码写进NXT简直就是杯具,没有断点,不能跟踪,程序挂掉了都不知道是哪里的问题。难怪有些公司招聘程序员的时候,提的要求是“能摸黑写代码”。。。

下面是一个简单的例子,它实现的功能是:每按一次Enter按钮,就显示当前的距离读数,按Escape按钮时退出程序。通过这个例子,你可以知道如何用NXT的面板按钮或传感器来做断点工具,用LCD显示屏来跟踪数据。因为不舍得把萝卜头全拆了,所以用好拆的部分来做例子,先凑合看看:)

import lejos.nxt.*;
import lejos.nxt.comm.*;

/**
 * First Sample: Read distance by the control of buttons
 * @author ChenWu
 * @see LCD
 * @see UltrasonicSensor
 * @see Button
 */
public class DebugSample
{
 static UltrasonicSensor distance=new UltrasonicSensor(SensorPort.S1);

 public static void main (String[] aArg) throws Exception
 {
  while(!Button.ESCAPE.isPressed())
  {
   LCD.drawString("Distance=" + distance.getDistance()+"  ",0,3);

   //Remove this while condition if you want to get dynamic value
   while(!Button.ESCAPE.isPressed() && !Button.ENTER.isPressed())
   {
    Thread.sleep(100);
   }
  }
 }
}

把文件保存为 DebugSample.java,在命令提示符中运行下面的命令,把程序写入NXT:
nxjc DebugSample.java
nxj -r DebugSample

把程序写入NXT,这个步骤也可以在Eclipse中完成

把程序写入NXT,这个步骤也可以在Eclipse中完成

这段程序很短,有经验的老鸟们应该一目了然了。新同学请看下面的说明,没Java基础的请自己先补习一下吧 :)

1.  头两行import是导入Lejos的函数库,导入之后才能调用lejos的各种API。

2.  NXT的显示屏幕是一个分辨率为100×64的LCD屏幕,LCD屏幕一共可以显示8行16列ASCII字符,可以用内置的LCD对象来控制显示内容。例如显示一串字符的命令是:
LCD.drawString(“string”,x,y);
这个命令表示显示string的开始位置坐标是(x,y),下标从0开始。例如(0,3)表示从第4行的第1列开始显示。

显示的时候如果原来的位置有文字,会被覆盖掉,但是不会清除其他地方的文字。(我的程序里面distance后面加了两个空格,理由请自己思考一下)另外几个常用的方法是 drawInt 和 clear,更多的方法可以参考相应的API文档

如果你想显示非标准的字体,甚至是一副图片,可以使用Image类,通过二进制数组进行像素级别的控制

3.  UltrasonicSensor 也是Lejos的内置对象,封装了超声波测距传感器的各种方法和属性。用distance.getDistance()函数就可以返回一个整数,这个数表示眼睛到物体之间的厘米,理论上范围是1到255。如果我们把眼睛捂上,或者距离超过255cm,它的读数都是255。

4.  SensorPort.S1表示该传感器是接在1号接口上(看NXT主机下面1~4的编号)

5.  Button用来响应面板上各按键的交互事件,button的对应关系看下面这个图

Button的对应关系

Button的对应关系

Button.ESCAPE.isPressed() 用来判断按键是否被按下了。另外一个常用的方式是 Button.ESCAPE.waitForPress(); 程序运行到这句函数时会被挂起,直到按钮按下时才会继续执行后面的语句。

6. 如果你觉得每次都按一下Enter键很烦,可以把中间的那个while条件注释掉(当然对应的一对大括号也要去掉)。这样一来屏幕就会动态显示当前的实时距离,按下Escape键时退出。

7. Thread.sleep(100)表示程序运行到这里时,会暂停100毫秒然后继续执行后面的代码。它的作用是让你有读数的时间,否则屏幕上的读数会飞快的变换,根本看不清。

看看效果如何:

按下Enter时,刷新距离读数,按下Escape时,程序退出

按下Enter时,刷新距离读数,按下Escape时,程序退出

cnBeta有位网友认为这个距离传感器是冗余设计,正好我在这里介绍一下这个“眼睛”的作用:

1. 用来判断转台上有没有魔方,放了魔方的时候测量的距离是14~15,没有魔方的时候是18~20。通过这个值先变大,然后再变小,就可以知道是有人先把魔方拿走,然后再放回来,于是激活下一轮扫描颜色

2. 用来做断点调试使用。在搭建萝卜头的初期,它的胳膊经常骨折,颜色也经常读错。为了便于调试,我把眼睛设置成了一个中断开关。当我需要它暂停的时候,就用手捂住它的眼睛,它就会停下来,把手移开,它又可以继续工作。使用的代码如下:

public static void WaitForNextAction()throws Exception
{
 while(distance.getDistance()>150)
 {
  Thread.sleep(100);
 }
 return;
}

通过这个例子,你可以了解如何在制作乐高机器人的过程中进行单步调试。如果你有其他的好方法,请一定在这里留言,让大家一起分享,多谢多谢! :)

今天就先介绍这些,感谢新年第一天还来光临小站的热心朋友,祝大家新年好!

解魔方的机器人攻略15 – 安装 Eclipse

在远古时代,程序员们通常用写字板来编写Java程序,然后用Javac.exe和Java.exe来编译和执行。对于NXT来说,对应的命令是Nxjc和Nxj。写字板的好处是速度飞快,不用安装。据说直到现在还有一些固执的代码狂人会用写字板开发软件,顺便用CPU来爆玉米花。但是对于大多数开发人员来说,选一个好用的IDE(Integrated Development Environment)是非常重要的。

IDE就是传说中的开发环境,比如我们常用的VS2008,Eclipse等等。它可以帮助你记忆类名和函数名,减少代码的输入量,避免拼写错误,高亮显示不同的代码段,还可以中断和调试。
这里大力推荐的NXT开发环境是IBM的Eclipse:

Eclipse开发环境

Eclipse开发环境

安装Eclipse:
1,从www.eclipse.org下载最新版的Eclipse,我用的是3.4版本,可能有点老了
2,Eclipse是不需要安装的,直接把所有文件解压到一个目录。注意这个目录最好不要包含空格,而且安装之后最好不要随意移动
3,双击eclipse.exe就可以运行了,最好在桌面上创建一个快捷方式,比较方便
4,第一次运行Eclipse的时候,会有一些教程信息,有兴趣的可以看看

为Lejos配置Eclipse:
1,创建一个新的工程。选择File > New > Project打开下图所示的新工程选项窗口:

新建工程

新建工程

选择Java Project并单击Next

2,输入你的工程名称,注意这里只能是英文。Eclipse会用这个名字创建一个新的目录:

输入工程名字

输入工程名字

3,设置ClassPath
单击菜单中的 Project > Properties。在左侧选择“Java Build Path”,然后在右侧选择“Libraries”
这时候点击“Add External JARs…”,打开之前安装Lejos的目录,选中classes.jar文件。设置完成的结果如下图:

设置Class Path

设置Class Path

4,接下来我们在Eclipse里面加上几个按钮,帮助我们编译和下载代码
选择菜单中的“Run > External Tools > External Tools Configuations”
先点一下“Program”,然后单击左上角的“New Launch Configuration”创建新的外部工具

添加外部工具

添加外部工具

工具1:编译工具(NXJ compile tool)
location -> D:\lejos_nxj\bin\nxjc.bat (请换成自己的目录)
Working Directory -> ${project_loc}
Arguments-> ${java_type_name}.java

工具2:下载工具(Download To NXJ)
location -> D:\lejos_nxj\bin\nxj.bat
Working Directory -> ${project_loc}
Arguments-> ${java_type_name}

工具3:查看工具(NXT Explorer)
location -> D:\lejos_nxj\bin\nxjbrowse.bat
Working Directory -> D:\lejos_nxj\bin
Arguments-> 空的

5,现在把这三个工具添加到工具栏
点击工具栏中向下的箭头,选择“Organize Favorites”。在打开的窗口中,把刚才添加的三个工具全部加进来。

 

 

 

 

 

添加快捷操作按钮

添加快捷操作按钮

 

6. 验证Eclipse环境搭建是否成功:
在新建的工程中添加一个MyFirstNxtProject.java文件,然后输入以下代码:

import lejos.nxt.*;
public class MyFirstNxtProject {
    public static void main (String[] arg)
        throws InterruptedException
    {
        do
        {
            String s = "test string";
            LCD.clear();
            LCD.drawInt( (int)(Runtime.getRuntime().freeMemory()),0,0);
            LCD.refresh();
            Thread.sleep(10);
        } while (true);
    }
}

完成后单击工具中的NXJ Compile进行编译,正常情况下不会出现任何错误,表示编译成功。
这时候打开NXT的电源,用USB线连接到电脑,听到“嘟”的一声,表示USB设备已经就绪。
这时候单击工具中的NXJ Download,把编译好的代码下载到NXT内部。
现在在NXT上操作,用按钮选中MyFirstNxtProject并执行,该程序会显示目前NXT可用的内存数。

解魔方的机器人攻略14 – 安装Lejos(下)

第四步:安装Lejos

登陆 Lejos 主页点击 NXT 图片进入 Lejos 下载页面,点击 NXJ 的下载链接;

下载完成后将下载的压缩包解压到指定文件夹。这里注意你所指定的文件夹路径中不要包含空格;比如 C:\Program Files\legos 这个路径就不正确,因为文件夹“Program Files”中包含了一个空格。在使用 Java 开发的过程中空格总会引起这样或那样的问题,所以为了避免不必要的麻烦保存路径中一定不要包含任何空格。

接下来添加运行 Lejos 所需要的系统环境变量,变量添加的方法与添加 JDK 环境变量的方法相同,请参照第一步中的方法打开环境变量窗口进行设置。

添加环境变量: NXJ_HOME,变量值是 Lejos 的安装目录,即解压后 lejos_nxj 的全路径,完成后点击确定;

向环境变量 Path 的变量值后追加 ;%NXJ_HOME%\bin;

重新打开一个命令提示符窗口(原有的命令提示符窗口在设置环境变量以后必须重新打开才能生效)。输入nxj然后回车,用来验证Lejos是否已经安装成功。

验证Lejos安装是否成功

验证Lejos安装是否成功

第五步:安装Libusb

Lejos 需要使用 Libusb 与 NXT 进行通讯。它的安装文件在 Lejos 的安装目录下 lejos_nxj\3rdparty\lib。

运行 Libusb 的安装程序 libusb-win32-filter-bin-0.1.12.1.exe ,点击 Install 开始安装。

这个程序安装以后会自动执行测试程序。

注意!!这个驱动程序在Vista或者Windows7下很可能导致电脑的USB端口全部失效,这种情况下只能卸载。

且慢,现在的鼠标和键盘可能都是USB的,怎么卸载呢?我上次遇到这个问题的时候,被折磨了一个上午,不断的萌生着重装系统或者是砸烂电脑的念头,最后解决方法很简单,借一个古老的PS2鼠标卸载搞定。

正确的装法是在xp兼容模式下安装:在exe文件上鼠标右键单击,选择属性,然后参考下图。我的电脑是英文版的系统,大家凑合对照一下:

在XP兼容模式下安装USB连接驱动

在XP兼容模式下安装USB连接驱动

第六步:刷新NXT的Firmware注意:当你安装 Lejos 后 NXT 原来的标准系统将被覆盖,NXT 中所有的数据也将全部删除,所以开始安装前一定要备份好有用的数据。再注意:据也许可靠的小道消息说,NXT刷新Firmware的次数是有限的。有一个叫做LOCK BIT的数据位,每刷新一次Firmware这个值就会减一。最多刷新100次以后,这个位就会降到0,所以请不要没事刷着玩 ^_^如果想重新安装 NXT 默认的操作系统你可以使用 LEGO Mindstorms software 重新安装 LEGO 的标准系统(具体步骤请参照 Lego 玩具说明书)。 首先把NXT切换到固件上载模式(firmware upload mode),只有在这个模式下才能升级Firmware。切换方式是在开机状态下,用牙签或者曲别针持续按下 NXT 主机背面的重启按钮4秒钟以上。进入NXT的固件上载模式。

进入固件上载模式后,NXT的屏幕上什么也不显示,但是会连续发出微弱的滴答声;

这时候用 USB 线连接 NXT 和计算机,当计算机识别 NXT 的固件上载模式后(看USB图标提示),在“命令提示符”中输入 nxjflash 并回车;

跟刷手机完全不一样,NXT的升级固件非常神速,大概只需要几秒钟;

上载完成后 Lejos NXJ 会自动启动,出现欢迎界面与开始菜单;

在 Lejos 运行的过程中,包括正在运行程序时,同时按下桔色和灰色的按钮(Enter+Space)就可以立即将 NXT 关闭。如果要重新启动只要按下桔黄色的按钮。如果 NXT 突然死机的话,将电池全部取出后重新安上启动即可。

到此我们就完成了Lejos的安装!下面试着运行我们的第一个程序测试一下。

按下桔黄色按钮启动NXT电源,打开命令提示符窗口,切换目录到Lejos自带的样例目录并输入以下代码(请自行修改安装目录):

CD D:\lejos_nxj\samples\Tune (设置程序路径)

d: (切换到指定盘符)

nxjc Tune.java(在电脑上编译程序)

nxj –r Tune(把编译好的程序写入NXT)

几秒钟后NXT会发出一声悦耳的声音,表示程序已经上载成功,你可以在NXT上选择执行这个程序。

如果操作成功的话,你会听到一组声音,并看到“Hello World”的字样。

经历了这么多繁琐的步骤,你的第一个程序终于顺利在 NXT 上运行成功啦

解魔方的机器人攻略13 – 安装Lejos(上)

Firmware(固件)相当于是机器人的操作系统,乐高NXT出厂时已经内置了一套Firmware,并且配备了非常强大的LabVIEW开发平台。基于这种LabVIEW平台,即使是完全不懂编程的小盆友们,也可以成功的做出一些复杂的功能。

LabView软件

LabView软件

 对于萝卜头来说,因为解魔方需要用到一些算法和复杂的功能,很难仅用LabView实现。后来据西觅亚的朋友说,LabView也有开发接口,有兴趣的童鞋可以自己研究一下,我买回来直接就升级Firmware了,懒得再刷回去了。 :)

目前乐高的开发平台很多,本文提到的Lejos 是一个基于 Java 的小型操作系统,习惯windows开发的朋友也可以使用一款微软开发的Microsoft Robotics Studio。安装Lejos以后,我们就可以用常见的Java开发工具来编写机器人的控制程序了。以下是安装Lejos0.6 的步骤(现在已经有0.7的版本,安装方式差不多)

第一步:安装 Java 开发工具包 JDK(Java Development Kit)
首先登陆到 Sun 公司的官方网站下载 Java 开发工具包,这里要求你下载并安装 JDK1.5 或更高的版本,因为Lejos NXJ  0.6 需要在 JDK1.5 或更高版本上方可运行。而且在后续的攻略中,还会介绍如何借助 Eclipse3 平台开发 NXT 的 java 程序,运行 Eclipse 也需要 JDK1.5 或更高的版本的支持。
进入 JDK 下载页面,点击 Download;
选择 Windows 操作系统和默认的多国语言(Multi-Language),然后点击 Continue(下一步);
点击 jdk1.5 下载链接,将安装文件保存至本地;
下载完成后,运行刚刚下载的安装程序,开始安装 JDK;
安装过程中会提示安装 JDK 和 JRE ,我们默认安装全部功能,点击 下一步 继续运行安装程序;
安装成功后会提示安装完成,点击 完成 按钮结束 JDK 的安装。

第二步:设置环境变量
环境变量可以理解为缩写和快捷方式。例如我们把JDK安装在C:\Program Files\Java\jdk1.6.0_07,运行java代码的时候,每次都要输入这一长串路径。为了避免这种麻烦,我们可以定义一个环境变量 %Java_Home%等于这个路径,这样写命令时,只要写这个缩写就可以了。
首先在“我的电脑”上点击右键,选择属性;
在“系统属性”窗口中选择高级选项卡,点击下面的“环境变量”按钮,弹出环境变量窗口;
在环境变量窗口中点击“新建”按钮添加环境变量;
设置变量名为: JAVA_HOME,变量值为 JDK 的安装目录(默认安装是C:\Program Files\Java\jdk1.5.0_15);
填写完成后点击 确定 按钮,关闭对话框;
再选中环境变量 Path,然后点击“编辑”按钮,弹出“编辑系统变量”对话框;
在变量值后追加 JDK 的bin子目录 ;%JAVA_HOME%\bin (多个环境变量值要用 ; 号隔开)
编辑完成后点击确定,关闭对话框。
 
我们来验证一下刚刚设置的环境变量是否生效。
打开: 开始=>程序=>附件=>命令提示符 (或者用快捷键Windows+R,输入cmd然后回车)
在命令提示符里输入Javac并回车,如果能看到下图所示的信息,就表示JDK和环境变量都设置成功了。

验证JDK是否安装成功

验证JDK是否安装成功

第三步:安装乐高USB驱动程序
如果你的计算机上已经安装了 LEGO 随机附带的 LEGO MINDSTORMS NXT 软件,那么你可以直接进入下一步。因为 LEGO MINDSTORMS NXT 软件的安装过程中已经包含了下面所要安装的 USB 驱动程序。
登陆乐高官方网站下载最新的驱动程序;
下载完成后将压缩包解压,执行里面的 setup.exe 安装 USB 驱动程序;
驱动安装完成后会提示你重新启动计算机,点击 Restart 重新启动计算机;
 
下面验证驱动安装是否正确,计算机重新启动后用 USB 线将 NXT 与电脑连接,确认连接后启动 NXT。右键单击“我的电脑”选择“属性”。选择“硬件”选项卡,点击“设备管理器”,如果在硬件列表中查看到 Lego Devices => Lego Mindstorms NXT ,这说明 LEGO USB 驱动已经成功的安装在你的计算机上。

解魔方的机器人攻略12 – 安装传感器

这一节要介绍搭建结构的最后一个部分–安装各种传感器。之后我会继续发布软件部分的攻略。
正好今天有位小朋友留言问道,能不能分享源代码。我在这里统一回答一下:在这系列的攻略里,会讲到制作萝卜头所有需要的知识点和注意事项,也会逐步贴出所有源代码。但是在攻略写完之前暂时不会提供下载,因为我希望大家最终自己动手实现,这也正是DIY机器人的乐趣所在!在我制作的过程中,遇到了许多困难,你们已经不需要走太多弯路了(谁敢说我小气,我跟他急^_^)。

引用一段和菜头的话:上网以后,我们把信息当做了知识,把收藏当做了学习,把阅读当做了思考,把储存当做了掌握。像个花栗鼠在秋天收藏坚果一样,把自己的阅读器和硬盘塞满,却依旧觉得饥渴难耐。

言归正传了:

颜色传感器需要的颗粒

颜色传感器需要的颗粒

把颜色传感器安装到电机上

把颜色传感器安装到电机上

非常重要的一步!因为传感器的杆很长,需要一根橡皮筋来避免晃动。

非常重要的一步!因为传感器的杆很长,需要一根橡皮筋来避免晃动。知足吧,这一根皮筋是我被折磨了一星期之后才想到的...

 

超声波测距传感器

超声波测距传感器

安装在最高点,它的作用是判断转台上有没有魔方

安装在最高点,它的作用是判断转台上有没有魔方

亮度传感器

亮度传感器

组装成一个奇怪的样子

组装成一个奇怪的样子

安装的目标是这里

安装的目标是这里

安装之后的效果,注意看上面的底盘,贴了一圈白纸,原因在软件部分会介绍

安装之后的效果,注意看上面的底盘,贴了一圈白纸,原因在软件部分会介绍

距离上需要留一个2到3毫米的间隙

距离上需要留一个2到3毫米的间隙

固定NXT主体

固定NXT主体

从另一个角度看看怎么固定

从另一个角度看看怎么固定

最后的一些工作:接线,贴提示的彩条,把剩余的散件用来加固,还有就是化化妆

最后的一些工作:接线,贴提示的彩条,把剩余的散件用来加固,还有就是化化妆

接线方式说明:

电机A:爪子
电机B:魔方的旋转底盘
电机C:颜色传感器电机

传感器1:超声波测距传感器
传感器2:亮度传感器
传感器3:颜色传感器
传感器4:按钮(这个是我调试的时候用来中断的)

解魔方的机器人攻略11 – 爪子

这次不说废话了,直接上图,节约时间:

一大堆散件

一大堆散件

组装起来

组装起来

横杆加固,另外点缀些颜色

横杆加固,另外点缀些颜色

一组连杆,注意蓝色的那根需要磨得薄一点

一组连杆,注意蓝色的那根需要磨得薄一点

组装好的连杆

组装好的连杆

与悬臂的连接

与悬臂的连接

大体框架已经搭成了!

大体框架已经搭成了!

加个小人点缀一下

加个小人点缀一下

解魔方的机器人攻略10 – 爪子电机

今天刚刚听说lego有一个叫做LDD的软件,可以直接生成搭建图。三人行必有我师,在这里感谢一下程序猎人

真是应了一句老话“独学而无友,孤陋而寡闻”。从我决定开始做魔方机器人以来,基本上都是自己闭门造车。后来为了发攻略,又重头搭建了一遍,途中拍了无数照片。早知道就不费这个牛劲了,更郁闷的是搭完以后程序员的兽性大发,改了n多地方和无数代码。。。。

不过话说回来,牛劲既然已经费了,我还是坚持把这一系列照片发完,嘿嘿。大家先凑合看,如果有时间的朋友愿意帮我转成LDD的搭建图,本人将不胜感激。

下面是萝卜头小爪子的驱动电机搭建过程:

准备一个电机

准备一个电机

连接电机轴,引出动力

连接电机轴,引出动力

几个连接件

几个连接件

不知道该说啥,照葫芦画瓢吧

不知道该说啥,照葫芦画瓢吧

这是下面的支架

这是下面的支架

和大底盘的对接过程

和大底盘的对接过程

看!搭起来了,请注意这里的角度和距离都是计算过的,最好不要变化

看!搭起来了,请注意这里的角度和距离都是计算过的,最好不要变化

这是两个悬臂,其实一个就可以了,两个是为了结实点,也更好看

这是两个悬臂

连杆的安装位置

两个悬臂的安装位置

悬臂安装以后,为了更结实,又增加了一个

悬臂安装以后,为了更结实,又增加了一个

安装完成了

安装完成了

绕到后面看一眼

绕到后面看一眼

这个版本的爪子电机,可以看出是由电机直接连转轴驱动的。在很多次朋友参观的过程中,这个爪子由于力气不够大,被魔方卡住了,让我感到非常没有面子(算了,萝卜头表现欠佳,归根结底还是我没培养好)
下面就是兽性大发的部分了:改用了一对3:1的齿轮组,把萝卜头的臂力增强了3倍,所以现在彻底解决了爪子被卡住的问题。搭建过程没有再拍照了,只能看看结果照片,大家自由发挥吧:

添加了减速齿轮组的爪子电机

添加了减速齿轮组的爪子电机

换个角度来个特写

换个角度来个特写

解魔方的机器人攻略9 – 颜色传感器电机

接下来的任务是安装驱动颜色传感器的电机。为什么我们要把这这部分安装在斜面支架上呢?因为颜色传感器是用来读魔方颜色的,按照说明书的要求,读数时必须距离2~3厘米,并垂直于目标物体的表面。所以魔方是斜的,传感器也必须是斜的。

有人给我提意见,怎么每次都只更新这么一点,一次多发点吧。

其实帖子就像姑娘的裙子,太短了盖不住主题,太长了又没有吸引力,差不多就行啦:)

之前我试过发特别长的攻略,我家娘子打开页面的时候,被不断缩短的滚动条吓的手一哆嗦。。。。又关掉了。。。

下面进入正题:

准备一个延长杆和一个直角连杆

准备一个延长杆和一个直角连杆准备好电机和一些连接件

准备好电机和一些连接件

准备好电机和一些连接件

神奇吧,电机正好连上,不过还有点晃晃悠悠的

神奇吧,电机正好连上,不过还有点晃晃悠悠的真是两个加固的小件

这步有点费解,刚才的两个小件是加到了连杆的下面,另外因为件不够了,我把上面的普通横杆换成了疙里疙瘩的连杆

这步有点费解,刚才的两个小件是加到了连杆的下面,另外因为件不够了,我把上面的普通横杆换成了疙里疙瘩的连杆

准备延长底座,一直要延伸到爪子那边

准备延长底座,一直要延伸到爪子那边

延长后的底座,正好顺路看看刚才比较费解的电机连接部分

延长后的底座,正好顺路看看刚才比较费解的电机连接部分

这一部分拍的照片有点少,不过乐高积木就是有这点好处,你想怎么蹂躏它都可以,只要接在一起就可以了,不一定非要完全按照我的接法。下一篇我们将要连上驱动爪子的电机!