<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
<channel>
<title>技术-机器人智能网</title>
<link>http://www.robotain.com/tech/</link>
<description>机器人技术</description>
<language>en</language>
<generator><![CDATA[机器人智能网]]></generator>
<webmaster>robotain@gmail.com</webmaster>
<item>
    <title><![CDATA[乐高双足行走机器人]]></title>
    <link>http://www.robotain.com/tech/show/201003/11460.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;乐高行走机器人&quot; src=&quot;/uploads/allimg/100311/105I92619-0.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;乐高的双足机器人很多，但这是第一个能像人一样行走的机器人。外形很酷吧。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;embed width=&quot;400&quot; height=&quot;267&quot; src=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot; bgcolor=&quot;#000000&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;intl_lang=en-us&amp;amp;photo_secret=17a71d745a&amp;amp;photo_id=4418558628&quot; allowscriptaccess=&quot;never&quot; wmode=&quot;transparent&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;span title=&quot;点击打开新窗口&quot; class=&quot;link popout&quot;&gt;弹出&lt;/span&gt;&lt;/p&gt;</description>
    <pubDate>2010-03-11</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[智能轮式移动机器人嵌入式控制系统设计]]></title>
    <link>http://www.robotain.com/tech/articles/201003/08454.html</link>
    <description>&lt;p&gt;&lt;strong&gt;引言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;智能移动机器人集成了机械、电子、计算机、自动控制、人工智能等多学科的研究成果，在当前机器人研究领域具有突出地位。控制系统是机器人的核心部分，目前应用在机器人底层控制系统的微控制器主要有8／16位单片机和数字信号处理器(DSP)两种类型。但使用8／16位单片机处理数据能力低，且硬件电路庞大，系统稳定性弱，DSP的设计初衷是为了数字信号处理，相比而言，嵌入式微处理器ARM具有几乎相同的内部资源和运算速度，但在控制方面性能优于DSP，而且许多ARM器件支持TCP／IP协议，有利于将来机器人的网络控制。综合考虑以上因素，这里提出了一种基于ARM和复杂可编程逻辑器件(CPLD)的智能轮式移动机器人控制系统，实现移动机器人的底层控制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2&amp;nbsp; 系统组成及工作原理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该系统设计的轮式移动机器人机械导航结构采用四轮差速转向式的机械机构，前面两个轮是随动轮，起支撑作用，后面两个轮是驱动轮，由两台同步电机驱动，分别控制两个驱动轮的转速，可使机器人按照不同方向和速度移动，运动灵活，可控性好。&lt;/p&gt;
&lt;p&gt;移动机器人以PC机作为上位机，利用摄像头对机器人的自身位置和外部环境进行分析，建立环境地图，进行路径规划。上位机发送运动控制指令给移动机器人的底层控制系统，提供左右驱动电机的理论速度值。以ARM和CPLD为核心的机器人控制系统与上位机通过无线收发模块实现通讯，根据上位机的命令控制电机的运行和超声渡传感器组的发送与接收；并根据障碍物信息，做出避障决策。智能移动机器人的控制系统结构框图如图1所示。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100308/2046203536-0.jpg&quot; alt=&quot;智能移动机器人的控制系统结构框图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3&amp;nbsp; 控制系统硬件设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3.1 主控模块设计&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;该智能轮式移动机器人控制系统的核心控制器采用Samsung公司的S3C44B0X，它是基于ARM7TDMI核(适用于实时环境)的32位微处理器，具有高速运算能力、A／D转换器、丰富的I／O端口和中断，有利于实现移动机器人的电机控制、传感器信息处理、外部通讯以及复杂的控制算法。系统采用CPLD作为协处理器，提供可编程脉冲产生电路、光电编码器输入电路、超声波传感器输入电路，这里选择ALTERA公司的MAXⅡ系列EPM1270器件。该系统设计充分利用了CPLD的高速逻辑处理能力，主控制器ARM只需设定控制参数，这样就减轻主控制器的负担，提高系统的实时性，同时也减少了外围硬件电路，提高控制系统的稳定性和可重构性。&lt;/p&gt;
&lt;p&gt;ARM与CPLD通过并行总线连接，该并行总线包括ARM器件的地址、数据、控制和多路可编程I／O总线。ARM通过访问特定地址和I／O端口来控制CPLD，CPLD则通过可编程I／O端口向ARM发送中断请求。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3.2 电机控制和驱动模块的设计&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;轮式移动机器人的两个驱动轮速度分别由两台驱动电机控制，实现机器人不同方向和速度的运动。轮式移动机器人的性能要求电机转矩大，脉动小。在高、中、低速下驱动电机均有良好的性能，且控制方式简单，因此驱动电机选用方波驱动的交流永磁同步电机。这种电机根据转子位置反馈信息采用电子换相运行，电机转速与驱动信号的频率成正比，既具备交流电机结构简单，运行可靠，维护方便等优点，又具有直流电机动态特性好，调速性能优良的优点。&lt;/p&gt;
&lt;p&gt;系统通过CPLD和外部驱动器件构成控制电路，采用方波驱动和定位控制(通电状态控制)的方式，控制两台永磁同步电机，获得可调的精确速度和位置控制，结构紧凑。两路电机控制原理相同，这里只介绍一路。&lt;/p&gt;
&lt;p&gt;CPLD中的电机控制电路由分频电路、调速电路、相序分配电路组成。其中，分频电路由分频器构成；调速电路是利用MAX+PLUSⅡ的LPM宏单元库的算术运算模块lpm_counter构成可预置数的5位减计数器。根据所需的速度，设置预置数，计数器对分频电路输山的clk脉冲信号减计数至零时输出一个借位脉冲，并再次装入预置数进行减计数，将其借位脉冲cout作为调速电路的输出脉冲，cout借位脉冲的频率范围为fclk／1- fclk／31，即引入了步长为1的调速因子(预置数)。可通过改变调速因子对脉冲信号进行1～31倍的连续可调分频，从而调节电机的转速；而相序分配电路是以cout借位脉冲作为输入，利用两个D触发器和门电路输出4路相位相差90&amp;deg;的方波脉冲，作为两相同步电机的控制信号；stop信号控制电机的启停；dir信号控制电机的转向，正转时相电压uCD超前uAB 90&amp;deg;，反转时uAB超前uCD90&amp;deg;，各相信号的频率为cout脉冲频率的1／4。CPLD中输入的调速和相序分配电路原理见图2。仿真结果验证了设计逻辑的正确性，如图3所示。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100308/2046204636-1.jpg&quot; alt=&quot;CPLD中输入的调速和相序分配电路原理&quot; /&gt;&lt;/p&gt;
&lt;p&gt;仿真结果验证了设计逻辑的正确性&lt;/p&gt;
&lt;p&gt;外部驱动器采用L298双H桥高电压大电流功率集成电路，将脉冲发牛电路产生的4相方波信号经总线收发器74LS245输出至L298的输入端 IN1～IN4，控制H桥的通断，使电机正反转或停止。为防止电机在启停瞬间的反馈电压损坏L298，在L298输出端和电机之间加人8个二极管起断电续流的保护作用。&lt;/p&gt;
&lt;p&gt;为了改善电机的控制性能，实现对机器人更精确和稳定的运动控制，需要获得电机的速度信息作为电机控制的反馈环节，该系统采用增量式光电编码器作速度检测，两个光电编码器分别与两路电机同轴相连，由CPLD配合ARM器件实现变脉冲数／脉冲周期测速，即变M／T测速，定时对电机速度进行采样。采样速度和上位机的给定速度所得差值传人PID控制器。从而实现对电机速度的闭环控制。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3.3 超声传感模块&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;避障是智能移动机器人的基本功能，避障的首要任务是确定障碍物位置。PC机基于机器人视觉系统实现的路径规划易受视场光线强弱、背景色等因素干扰，针对这一问题，机器人在单片机控制系统中采用超声传感器测距实现机器人对障碍物的检测和定位。&lt;/p&gt;
&lt;p&gt;超声波测距采用时间渡越测距法，即根据从超声波发生器发射出超声波到超声波在传播过程中遇到障碍物后超声波接收器接收到反射波所用时间t，以及超声波在空气中的传播速度v(v=331.4(1+T／273)1/2m／s；T为摄氏温度)，得出机器人与障碍物之间的距离l=vt／2。该模块共采用 3对超声换能器，分布于机器人的正前方、左前方、右前方。ARM发出控制信号启动内部定时器进行定时。控制信号经功率放大后作为超声传感驱动电路的启动信号，由超声传感器产生遇到障碍物时返回的高频振荡信号放大后通过接收电路引起ARM外部中断，在中断程序中可以获得定时器的计数值，并计算出距离。超声传感模块框图见图4。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4&amp;nbsp; 控制系统软件设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;4.1 嵌入式操作系统&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;智能轮式移动机器人是一个典型的实时多任务系统，传统单任务顺序执行机制不能满足该系统设计的实时性要求，而且对于复杂系统来说可靠性不高，因此选用实时操作系统&amp;mu;C／OS-Ⅱ。它是一个源码公开，可移植，可固化，可裁剪的嵌入式操作系统，具有代码尺寸小，可占用实时内核，任务多，可确定执行时间，运行稳定可靠等特点。将&amp;mu;C／OS-Ⅱ移植到S3C44B0X上，并对操作系统进行裁剪，以节省存储空间。&lt;/p&gt;
&lt;p&gt;基于实时内核的多任务系统可划分为系统层和应用层。系统层由内核和驱动程序库组成；应用层包括用于达成机器人任务目标的全部代码。在该系统软件应用层程序设计中，将机器人的任务分解成通信、信息采集、电机控制等多个用户任务。嵌入式操作系统&amp;mu;C／OS-Ⅱ对任务模块进行管理调度，协调机器人各项任务运行，保证了系统的实时性和可靠性。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;4.2 运动控制算法&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;为了保证移动机器人运动的稳定性和准确性，使得系统在控制机器人前进、后退、转弯、刹车等动作时都能快速响应且超调量小，在控制电机的过程中，系统采用了积分分离的PID控制算法。算法的具体实现方法如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/uploads/allimg/100308/2046206136-2.jpg&quot; alt=&quot;公式&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5&amp;nbsp;  结语&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;提出了一种基于ARM和CPLD的智能轮式移动机器人控制系统，这一方案充分利用ARM和CPLD的内部资源，既具有ARM微控制器体积小，运算速度快等特点，又具有CPLD的高速逻辑处理能力，灵活的可扩展性和可重构性。软硬件的调试和运行实验证明，系统控制灵活，实时性好，可靠性高，能够满足智能轮式移动机器人的控制需求。这种智能轮式移动机器人的控制系统可用于不同场合的移动机器人控制系统，并具有一定的普遍适用性，且性价比高，具有很强的实用价值。&lt;/p&gt;</description>
    <pubDate>2010-03-08</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>EDNChina</comments>
</item>
<item>
    <title><![CDATA[Microsoft Robotics Studio学习笔记二(CCR)]]></title>
    <link>http://www.robotain.com/tech/diy/201003/03434.html</link>
    <description>&lt;p&gt;(注意：本文是参考英文文献加自己的理解所写，有的表述还完全是根据我的想法所写，所以有错的地方还请大家谅解！）&lt;/p&gt;
&lt;p&gt;本笔记继续上面的Arbiter类（&lt;a href=&quot;http://www.robotain.com/tech/diy/201002/27418.html&quot; target=&quot;_blank&quot;&gt;查看笔记一&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、Interleave类&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在编写服务中会遇到大量的消息，根据消息的不同需要对应的Receiver,Interleave类提供了三种不同类型的Receivers&lt;/p&gt;
&lt;p&gt;1、Tear Down：这种Receiver一旦用完就会马上销毁；&lt;/p&gt;
&lt;p&gt;2、Concurrent receiver:提供了一组可以并发执行的Receiver;&lt;/p&gt;
&lt;p&gt;3、Exclusive receiver:容许你同时创建一个或多个Receiver,它必须等Concurrent receiver执行完方可执行，如果有多个Exclusive receiver,他们是一个挨一个得执行，区别于并发执行。并且如果Exclusive receiver执行时Concurrent receiver不能执行；&lt;/p&gt;
&lt;p&gt;这里注明一下，Concurrent receiver应用的场景类似于要要读取一个对象的状态，可以同时读取它的大小、形状、颜色等；而Exclusive receiver应用的场景类似于要存储一个对象的状态，这种情况下是不能并发存储的，并发存储同样的状态就会引起混乱。&lt;/p&gt;
&lt;p&gt;下面来看一段代码：&lt;/p&gt;
&lt;p&gt;MainPortInterleave.CombineWith(Arbiter.Interleave(&lt;br /&gt;
new TeardownReceiverGroup(),&lt;br /&gt;
new ExclusiveReceiverGroup(&lt;br /&gt;
// Form handling&lt;br /&gt;
Arbiter.ReceiveWithIterator&amp;lt;OnLoad&amp;gt;(true, _eventsPort, OnDriveControlLoadHandler),&lt;br /&gt;
Arbiter.Receive&amp;lt;OnClosed&amp;gt;(true, _eventsPort, OnDriveControlClosedHandler),&lt;br /&gt;
new ConcurrentReceiverGroup(&lt;br /&gt;
//          Arbiter.ReceiveWithIterator&amp;lt;game.Replace&amp;gt;(true, _gameControllerNotify, JoystickReplaceHandler),&lt;br /&gt;
//           Arbiter.ReceiveWithIterator&amp;lt;game.UpdateAxes&amp;gt;(true, _gameControllerNotify, JoystickUpdateAxesHandler),  )));&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、Dispathers和Dispather Queues&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dispathers和dispather queues在整个CCR中起到了类似于线程和线程池的角色，利用他们可以写出具有优先级和多线程的服务。&lt;/p&gt;
&lt;p&gt;一个dispathers里可以处理多个dispather queues,每个dispather queues又是一个存放receiver的队列。当你创建一个DSS服务时，就会产生一个默认的dispather和dispather queue,所以在上面的代码里我们都没手动创建这两个对象。&lt;/p&gt;
&lt;p&gt;既然dispather queues跟线程一样具有优先级，那么就类似于ThreadPriority一样，优先级定义在一个叫做TaskExecutionPolicy的枚举里，总共5个。这个在以后的代码里再进行说明。&lt;/p&gt;
&lt;p&gt;CCR就先写到这里，学习的时候还要配合Robotics Studio自带的帮助文档，里面有好多CCR的事例代码！&lt;/p&gt;</description>
    <pubDate>2010-03-03</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>EvilYang博客</comments>
</item>
<item>
    <title><![CDATA[人与机器人]]></title>
    <link>http://www.robotain.com/tech/articles/201003/03432.html</link>
    <description>&lt;p&gt;大学的时候，我拼凑过一篇文章：&lt;a href=&quot;http://www.robotain.com/study/rmzt/20070119/150157.shtml&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;人与机器人的未来关系思考&lt;/strong&gt;&lt;/a&gt;。文章概括地叙述了机器人的发展及其在应用过程中出现的问题，列举了人与机器人的不同之处，系统地回答了人与机器人的关系问题，并对机器人的发展提出了展望。&lt;/p&gt;
&lt;p&gt;今天看到163博客上也有几篇关于人与机器人的文章，写得很有哲理，故转载如下。&lt;/p&gt;
&lt;p&gt;昨天，无意中看到报纸上刊登一篇《教育部再发征集令  寻找万个&amp;ldquo;科学难题&amp;rdquo;》的消息。无独有偶，CCTV10频道前几天刚好播出一个关于&amp;ldquo;人与机器人&amp;rdquo;的专题节目。&lt;/p&gt;
&lt;p&gt;节目中专家们分为正方与反方。正方的主要观点：未来发展，机器人完全可替代或与人类融合，希望将来人类与机器人和谐共处。反方：机器人不可能具有人的思维与情感，它只是机械的模仿，受控于人类，永远不可能与人类比肩。&lt;/p&gt;
&lt;p&gt;在场的各行专家、科普爱好者、科幻作家们辩论异常热烈。场内不时爆发掌声与笑声，结果是谁也没说服谁。&lt;/p&gt;
&lt;p&gt;看完节目后，我将其主要观点分歧归纳为三条，加上个人的粗浅认识与疑惑上传于此，目的在想与对此感兴趣的网友共同探讨。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、人类是否可与机器人实现融合？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正方：目前，人工心脏，人工智能臂等的运用，就是一种融合。未来发展，机器人完全可以更好地与人类融合或与人类比肩，成为另人类。&lt;/p&gt;
&lt;p&gt;反方：此融合不是本质上的。机器人的工作方式与大脑完全不同，机器人不可能像人脑一样有独立思维能力。人的其他部件可以替代，但大脑无法替代。&lt;/p&gt;
&lt;p&gt;这里有一个很有的趣的问题，那就是：人的思维是否仅限于在大脑中进行？最新研究成果表明，心脏等脏器也参与了思维。对这一点我深信不疑，因为从某种角度上讲，人本身也就是一台复杂的机器，万物都是有关联的。古人云：心想事成，心猿意马，怒从胆边生&amp;hellip;&amp;hellip;，谁敢说其他脏器就完全没有参与思维？如果是，人工心脏是否就可看作是&amp;ldquo;思维融合&amp;rdquo;的初始点？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、机器人能否超越人类？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正方：人类的所有动作都可以依靠对机器人的编程来完成。高智能的机器人可以集合更多人的共同智慧，而具有超出一般个人的能力。计算机就是一个简单例子。&lt;/p&gt;
&lt;p&gt;反方：这是件很可怕的事。据悉美国造出一种专门从沙漠中提取一种金属再用其复制成它本身的机器人。试想，当复制无限制下去而不受控，世界将会变成怎样？所以美国著名科幻作家阿西莫夫曾提出&amp;ldquo;机器人三定律&amp;rdquo;以制约机器人。&lt;/p&gt;
&lt;p&gt;对这一条，正反双方客观上都承认了机器人在行为上存在超越人类的可能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、情感是否是高等生物独有的？机器人是否可能具有情感？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正方：目前的一些机器人已经会对外界给出的信息做出相应的情感表示（表情），未来的机器人完全可以具有与人类一样的情感。&lt;/p&gt;
&lt;p&gt;反方：人类情感是复杂的生物化学反应过程。比如人愤怒时，甲肾上腺素会增多；人愉快时，体内多巴胺增多&amp;hellip;&amp;hellip;，而机器人只是模仿，没有这个复杂的反应过程，所以不能算是具有情感。&lt;/p&gt;
&lt;p&gt;这里又引申出一个有趣的问题。人类情感如果是一种生物化学反应，那么，有生物化学的，是否应该还有物理的？还有就是，生物化学反应是如何发生的呢？是不是通过物理反映起作用？比如，通过类似于&amp;ldquo;传感器&amp;rdquo;的眼晴、皮肤等，将外部信息&amp;ldquo;传导&amp;rdquo;到内部而引起？这些应（映）是否有规律可寻？如果有，那么能否可以将这些有规律的信息下载上传于机器人？如果能运用，机器人是不是就等于有情感？&lt;/p&gt;
&lt;p&gt;人类很好奇，&amp;ldquo;机器人&amp;rdquo;、&amp;ldquo;克隆人&amp;rdquo;等&amp;ldquo;科学难题&amp;rdquo;被列为人类要&amp;ldquo;攻克&amp;rdquo;的重要目标。上帝让人类为自己制造出一个个强大对手，这是人类的福音还是灾难？只有天知道。&lt;/p&gt;
&lt;p&gt;下面这一段是女儿的一封信。信中，她试图从从社会科学与宗教艺术的角度来阐述她对&amp;ldquo;人与机器人&amp;rdquo;的观点：悲观但不无道理。于是有了这个话题的第二篇。&lt;/p&gt;
&lt;p&gt;本人也深以为，研究机器人不能只局限于科学技术方面。社会科学研究如果跟不上科学技术发展的脚步，就是那句话：科学是把双刃剑。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;人工智能这个话题一直都很受关注的。理论上说都不需要实体机器人，靠编程产生幻觉就可以构成人类现在所能感知的全部世界。&lt;br /&gt;
的确越来越多的人倾向认为机器人能够取代人，但仍然没有绝对的答案。技术上的瓶颈之外，对生命的忌惮也是研究发展的阻力。退一万不说，就算技术各方面都到位了，有些事实，也是超出人类想像跟理解力的。有可能机器人就是只能&amp;ldquo;无限接近人类，但始终无法等同于人。&amp;rdquo;who knows?&lt;/p&gt;
&lt;p&gt;要说个人观点的话，我对极端研究人工智能持怀疑态度。是挺好玩的，也很神奇，人就是既有好奇心又贪心，但这个东西是蝴蝶效应，后果是人无法预知的。人工智能、克隆技术这些，最后结果都是为了造出比人更强大的东西，这些东西造出来干什么？脑袋锈豆了？目前不是还没发现外星人的嘛，人就算宇宙中唯一高智商生命体了。人要自己玩自己，稍微也悠着点。我是属于严重悲观者，赫赫。&lt;/p&gt;
&lt;p&gt;龙说研究机器人是人研究自身的手段。人的思维是怎么回事？情感是如何产生的？人来到这个世界，就是想知道这些&amp;ldquo;为什么&amp;rdquo;，否则跟猪猪狗狗有什么区别呢？有点&amp;ldquo;无知毋宁死&amp;rdquo;的感觉。不过龙也同意我的观点，人类总有一天就是会这么把自己玩完的。&lt;/p&gt;
&lt;p&gt;《圣经》里上帝跟人的对话，我们都觉得实际上是人脑袋里的自言自语。上帝说&amp;ldquo;你们不需要知道那么多为什么&amp;rdquo;，人说&amp;ldquo;我就是要吃那个苹果&amp;rdquo;。人思想斗争最后的结果，还是吃了那个智慧的苹果。不过&amp;ldquo;最后的审判日&amp;rdquo;会不会到来呢？其实人自己心里也害怕着呢，隔三岔五有人冒出来喊要世界末日了。总之我的结论是这些看看就好了，不要太投入。^______^&lt;/p&gt;
&lt;p&gt;什么是虚幻？什么是现实？机器人能否获得人类的情感？&amp;hellip;&amp;hellip;关于这些，要是感兴趣，推荐看《黑客帝国》。这个片子包含了目前人类所知道的、感兴趣的、以及想像中的，关于人工智能、人与机器世界关系的全部问题以及可以自圆其说的答案。&lt;/p&gt;
&lt;p&gt;电影本身可能有点让人眼花缭乱，因为是科幻片嘛。但是不要被那些装酷的外表迷惑了。这部片子是常看常新，每次都有不同理解，直到你能把当中的暗喻、双关、因果、逻辑、哲学道理&amp;hellip;&amp;hellip;统统看明白了，就会发现它可以说是颠覆以往思维方式的好片子。&lt;/p&gt;
&lt;p&gt;之间，你必须对一些概念能融会贯通的理解，比如圣经对于人类未来的预言，&amp;ldquo;三位一体&amp;rdquo;的概念，等等。片子里除了包括跟圣经有关的内容，还穿插的很多童话故事，爱丽丝梦游仙境、绿野仙踪等等的人物跟对话，在西方世界，这些早已经超出了儿童故事的意义，成为有寓意的典故。这些要看懂了，就发现看这部片子是其乐无穷了。&lt;/p&gt;
&lt;p&gt;当然这片子最后美化了人类的未来，虽然最后惨的只剩瓦片了，但毕竟推翻了&amp;ldquo;世界末日&amp;rdquo;的预言。太惨烈的结局作者也没有办法接受吧。&lt;/p&gt;
&lt;p&gt;下面这一段主要是女儿的先生（龙）对我第一篇中三个问题的回答。这应该是具权威性的回复。龙长期艰苦地在从事这方面的具体研究，是名至实归的专家。但即便是天才霍金，也只能推测至大爆炸一样，对人类而言，全面解读宇宙的未知是一项永远不可能完成的任务。&lt;/p&gt;
&lt;p&gt;以下是龙的答疑：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、人类是否可与机器人实现融合？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;融合不会是本质上的。身体除大脑之外的器官的确有一定感知能力，比如心脏跟皮肤有记忆跟辨别能力等。但人工心脏目前也只是模拟最简单的泵血功能。一涉及思维，就涉及复杂的运算。模拟整个人脑的思维过程则是个太复杂的计算问题。从一种思维能力到另一种思维能力，计算难度又是成几何倍数增长的。一个参数的改变，就完全是另一个结果，有无穷的可能性。按照目前的科学发展速度，人类灭亡前是没有能力完成这样的计算的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二，机器人已经在很多方面比人牛了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三，机器人是否会拥有人类的情感？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不会。这些东西不可能实现，本质上因为机器人不是生命体，基因进化跟突变现象都不会在机器人身上出现，机器人的一切发展演化，只能靠人类的数学运算。按照人类的发展速度，没有那么多时间来完成这样复杂的运算。太阳的寿命目前是50亿年，它只有一半的路可以走了。而地球的寿命应该是短于太阳寿命的。人类寿命还要更短。更不用说意外发生了。&lt;/p&gt;
&lt;p&gt;人是否具备创造生命的能力呢？象皮诺曹的爸爸一样造一个木头人（机器人）然后赋予生命？答案也是否定的。可以回看一下生命的产生。人类连最简单的生命体---草履虫都不可能凭空复制，不能从已经死亡的细胞制造出生命，更不可能把机器人这种完全非生命的东西赋予生命。。。。。&lt;/p&gt;
&lt;p&gt;所以最后的结论是：除非人自身发生了突变，有可能具备创造生命的能力。然而回顾历史，不太可能。人类自己的时间也不够了&amp;hellip;&amp;hellip;；另一种情况是一个机器人，只有大脑是人的大脑，或者某种动物的大脑，而身体其它部分都是机器 --- 这个倒是有可能实现。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;（下面是女儿再次阐述的她的民科观点）&lt;/p&gt;
&lt;p&gt;哦，呵呵。可能我说的不清楚。制造生命跟创造生命是不一样的。生育跟克隆都是利用生命体自身细胞来繁衍，在可以预见的将来，人都不能把没有生命的东西变的有生命。简单的说，人没办法让死了的人复活，或者利用已经死亡的细胞进行&amp;ldquo;克隆&amp;rdquo;。就更不可能把钢筋铁骨的机器人变成真正有&amp;ldquo;生命&amp;rdquo;的物种。而我们说的&amp;quot;情感&amp;quot;是只存在于生命体身上的特有的东西，象人一样的思维方式也只存在于人的大脑里。没有这个前提条件什么都免谈。龙的意思是机器人本质上没有办法突破这条界限，获得真正的生命。&lt;/p&gt;
&lt;p&gt;至于生命的形成，简单的说的确是无机物在特定的环境下发生变化产生遗传物质，出现生命。而这个产生的过程，是个概率事件。人类在宇宙中找了这么多年，已经能够观测到距离地球200亿光年的星球，有找到过跟地球上一样的生命形态吗？外星人只在科幻故事里存在。人真的是很孤独的。按照概率计算，&amp;ldquo;点石成金&amp;rdquo;一般形成新的物种这种突发事件的概率小到几乎不可能出现。人只能幻想自己能找到方法。这种&amp;ldquo;方法&amp;rdquo;，在小说里就是电闪雷鸣，科学怪人横空出世；现实的方法无非是计算计算，只是算不出来。&lt;/p&gt;
&lt;p&gt;人力所能及的，充其量是在已经存在生命体上进行改造嫁接，人没有办法把没生命的金属变成有生命的东西。机器人要成为另一种&amp;ldquo;人&amp;rdquo;，不是说一根金属管一个活细胞、按照1:1的比例排列组合起来就可以得到的。机器人可以模拟，但是模拟生命的很多特征的计算量太大，大到人有生之年都看不到了。最有可能的方式就是保持人的大脑，其余身体部件都是机器，但那种东西本质上不是&amp;ldquo;大脑保存器&amp;rdquo;吗？大脑一旦死亡，全部器械都得shut down。&lt;/p&gt;
&lt;p&gt;关于&amp;ldquo;复活&amp;rdquo;，倒是有平行空间理论。认为在宇宙的某个地方，有另外一个／好多个&amp;ldquo;我&amp;rdquo;的存在，在做着不一样的事情。将来技术发展的一天，人可以通过&amp;ldquo;虫洞 &amp;rdquo;到另一个空间，改变一些参数，从而影响当前。通俗的说就是有时空隧道，可以来回穿越。这么说来死去的就是可以复活的，或者死去的只是在这个空间里死去，在另一个空间里还活着。这个东西是从广义相对论里面引申出来的。理论上存在，实际上是怎么回事还未证实。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在对女儿与龙的回信中我这样写到：&lt;/p&gt;
&lt;p&gt;我同意你们的最终结论：概率小，能力不够，时间不够，人类不能&amp;ldquo;创造&amp;rdquo;出生命体。理论上虽然还可再深入探讨，不过认为对现实意义不大了，所以此篇为该话题最后一篇。&lt;/p&gt;
&lt;p&gt;无生命可以转换成有生命。最简单的就是无机物可以转换成有机物。植物的光合作用就是。最早的人工将无机物转化成有机物的反应就是将氰酸铵加热生成了尿素，尿素是由碳、氮、氧和氢组成的有机化合物，尿素是第一种以人工合成无机物质而得到的有机化合物。认为无机物与有机物有根本性差异，无机物所以无法变成有机物的活力论从此被推翻。有机物对生命有极重要的意义，地球上所有的生命体中都含有大量有机物。人体中各种有机物在不同环境条件剌激下进行的化学反应混合成人的种种情感。多巴胺增加表现为人情绪愉快，而甲肾上腺素增多让表现为人易怒&amp;hellip;&amp;hellip;，这是有机物与人体真正意义上的&amp;ldquo;融合&amp;rdquo;（实则是生命体的重要构成），是人本身具有的天然属性。人体中还含有各种无机物微量元素（铁，铜、锌等）也在不同程度上参与着生命的构成与融合。&lt;/p&gt;
&lt;p&gt;当然，人工将无机物合成成有机物，相对于&amp;ldquo;创造人&amp;rdquo;这项超巨无霸工程来说，甚至连亿万里长征的一小步都算不上。所以对&amp;ldquo;创造人&amp;rdquo;在你们观点的基础上，我总结为二点：一、自身局限。以人迄今为止的认知与实践能力无法认同及完成&amp;ldquo;造人&amp;rdquo;，只有大自然才有这种创造力；二、时间不够。通过无限演化，人类或能一直演化至成为承载并创造出等同自己&amp;ldquo;智力&amp;rdquo;与&amp;ldquo;能力&amp;rdquo;生命体，但更大的可能是，还未到演化成那样，自然法则就让人类消亡了。&lt;/p&gt;</description>
    <pubDate>2010-03-03</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>163博客</comments>
</item>
<item>
    <title><![CDATA[浅谈机器人教育对学生综合能力的培养]]></title>
    <link>http://www.robotain.com/tech/articles/201003/03431.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100303/1_100303184818_1.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100303/1_100303184818_1.jpg')&quot; /&gt;&lt;/p&gt;
&lt;p&gt;电脑机器人活动是20世纪初国际发达国家风靡的一项青少年科技活动，是在青少年电子、信息技术不断普及应用的基础上，逐步兴起的一项青少年科普教育活动。中国青少年电脑机器人活动是以弘扬科学技术，突显创造与创新，强化团队贡献，培养科学素质，关联当今世界面临的问题与机遇为宗旨。组织青少年在参加电脑机器人的活动中，将现实世界的事物与&amp;ldquo;动手做&amp;rdquo;活动相结合，放手让青少年通过活动，去发现解决问题的方法，并获得那些当今科学家和工程师们所面对的机会，培养青少年的科技创新精神和动手实践能力，让他们能够更好地适应21世纪的科学技术发展的趋势；鼓励更多的青少年电脑机器人爱好者在信息、自动控制等高新科技领域，激发他们对科学的兴趣，提高他们的科学素质，培养其信息素养。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、    树立正确的机器人教育理念&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;21世纪需要的是有创新意识、具有创新精神和创新能力的人才，然而创新意识和创新能力并不是先天就有的，它需要通过后天的有目的培养才能获得。为了培养具有创新意识的21世纪型人才，我区从04年以来大力开展中鸣教育机器人活动，利用&amp;ldquo;中鸣教育机器人&amp;rdquo;这一新的教学载体，在实施机器人教育、进行创新教育方面进行了一定的实践和尝试。在进行机器人教育教学和活动的过程中，我们注重开发学生的创造能力，培养学生的创造性思维，鼓励和启发学生主动思考，善于思考，学会独立思考，突出创新意识的培养，强调创新能力的提高。&lt;/p&gt;
&lt;p&gt;当今社会对人才的要求已不仅仅局限于对知识的复制，而是新颖的构想、创造力和新的思维方式。智力也不再是拥有知识的多少的问题，而是关系到你在面对困难时知道如何去应对的问题。引导学生突破传统思维，倡导并鼓励学生敢于质疑、敢于实践、敢于创新、敢于超越。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、    正确引导学生所提问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;爱因斯坦曾说过：&amp;ldquo;提出一个问题往往比解决问题更重要。因为解决问题也许仅仅是一个数学商或实验上的技能而已，而提出新的问题、新的可能性，从新的角度去看待旧的问题，却需要有创造性的想象力，而且标志科学的真正进步&amp;rdquo;。从爱因斯坦的话中，我们应该正确看待学生在学习机器人的过程中所提出的问题。其实&amp;ldquo;提出问题&amp;rdquo;本来就是机器人教育活动的前提，也是其关键所在。&lt;/p&gt;
&lt;p&gt;一个学生他喜欢提问、关于体委且乐于追根问底，那是因为他有很旺盛的好奇心和求知欲。我们应站在他们的角度，理解问题的提出，从而挖掘问题的&amp;ldquo;闪光点&amp;rdquo;。不能用粗暴的态度否定孩子们提出的问题，应该循循诱导、用发展的眼光、激励性较强的言语鼓励、看待问题的提出。要允许、鼓励&amp;ldquo;耍小聪明&amp;rdquo;的学生、&amp;ldquo;半桶水&amp;rdquo; 的学生、使用&amp;ldquo;雕虫小技&amp;rdquo;的学生、敢于&amp;ldquo;吃螃蟹&amp;rdquo;的学生提出的问题，保护学生强烈的求知欲望和创造欲望。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、    设置合理的情景，培养学生兴趣&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;培养兴趣这一环节是学生自己主动建构知识的前提，是开启学生心智、培养创新精神的重要途径之一。&lt;/p&gt;
&lt;p&gt;当一个人对事物产生兴趣时，他们的积极性会得到巨大的发挥，他们总是积极地、主动地、心情愉快地去观察、接触、探索。我们要敏锐地抓住学生对机器人所产生的兴趣，鼓励他们积极投入机器人活动中去。要帮助学生去解决问题，使学生的兴趣更加浓厚，让他们得到获得新知识和成功的体验而带来的满足。&lt;/p&gt;
&lt;p&gt;为实现这一目标，作为教师应适当地设置合理的情景和任务，给学生提供一个想象的空间，使其对原本枯燥乏味的理论知识产生浓厚兴趣，使之融入到想象的海洋中探寻各种有利于问题解决的思路和方法，能大胆、无所顾虑地表达自己的想法，能鼓足勇气和信心提出质疑。&lt;/p&gt;
&lt;p&gt;例如，06年的西部科技机器人夏令营中，通过一套系统化的教学方案对刚接触机器人活动的学生进行一周的封闭式训练。但要用抽象的概念、单调的理论知识来让学生们做任务实在一定的难度。我作为培训教师首先将要学习的所有知识点细化，按相近知识点分类做成任务，然后再用一根主线将所有的任务串联起来。而这条主线正是吸引学生的关键，用探险寻宝作为主题是用来满足爱玩游戏的学生再好不过的题材了。整个夏令营全都沉浸在所营造出的探险寻宝的氛围之中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四、    在动手动脑中，培养创新&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;实践是检验真理的唯一标准&amp;rdquo;，这句话同样适用于机器人的教学上。我们时常有这种感受，就是你用计算机所编出的程序，在理论上是正确的，也是能够通过编译的，但当传输到机器人身上想让它按照你的思路做出各种动作，至于是否能一次性成功那就是个未知数了。只有通过不断调试，观察机器人所作的反应修改程序，才能达到最终目的。&lt;/p&gt;
&lt;p&gt;在学生接触一个新的项目的时候，应当用已有的方案作为引导对学生进行教学。当学生完全熟练掌握后，则可以让学生对已有方案中不足之处自行修改，修改之后再来看成效，如有不足则要进行思考，之后再进行调整。通过实践，学生的认识从接受、研发到理性产生飞跃，把课本中学到的知识和自己领悟到的知识紧密结合。每个项目都是要经过&amp;ldquo;实践&amp;mdash;&amp;mdash;认识提高&amp;mdash;&amp;mdash;再实践&amp;mdash;&amp;mdash;再认识提高&amp;rdquo;的一个过程。在这个过程中，学生会在一次次的失败中吸取教训、克服困难、积累经验、提高认识。&lt;/p&gt;
&lt;p&gt;以07年科协比赛高中组常规赛为例，针对登月采矿这个项目我区采用了中鸣套装，首先是让学生熟悉掌握公司提供的方案，按照方案一步一步来完成任务。但是在完成任务的同时，学生就发现一些地方不尽如人意，采矿机器人的机械手臂夹起矿石模型后，在转弯处矿石很容易掉落；当登月机器人到达月球基地后采矿机器人与登月机器人由于红外线传输时常被干扰，所以效果不佳。通过学生一系列问题的思考，将采矿机器人的机械手臂进行了改进加工，用一个伺服电机来控制手臂的升降，再用两个伺服电机作机械手来夹住矿石，这样一来就相当牢靠了；解决登月机器人与采矿机器人之间通信的问题，是用无线模块取代了红外模块，将外界干扰的几率降到了零。最后，通过学生的改造达到了预期的目标。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;五、    指导学生用清醒的头脑及时总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在每个机器人项目教学基本告一段落时，及时总结经验教训十分必要。这是培养学生的创新能力的重要环节。 总结时要引导学生清醒地认识到自己在制作或编程过程中的发现、存在的问题，引导大家进行质疑、思考、讨论、提炼新的问题，然后再质疑......力求完善。及时总结经验教训，有利于开发学生的个性潜力，有利于学生知识拓展迁移，培养学生创新思维。这个过程在潜移默化中培养了学生的综合能力，虽然短期内效果不突出，容易被人忽略，但还是应该引起教育工作者的重视。&lt;/p&gt;
&lt;p&gt;科教兴国，是个大的方针，为了实现这一目标，教育部、中国科协、及各省市有关部门举办了科技创新大赛和机器人大赛等活动，这些活动给青少年提供了一个广阔的空间来施展才华，更重要的是，这些活动内容培养了学生的综合能力，教会了学生创新的方法，让学生在实践中懂得创新、学会创新，让学生在主动探索中感受机器人教育带来的无穷乐趣。&lt;/p&gt;
&lt;p&gt;（作者：熊文亮&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  单位：重庆市沙坪坝区教育管理信息中心）&lt;/p&gt;</description>
    <pubDate>2010-03-03</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>沙坪坝区科协</comments>
</item>
<item>
    <title><![CDATA[乐高机器人恐龙]]></title>
    <link>http://www.robotain.com/tech/show/201003/01427.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100301/1315524438-0.jpg&quot; alt=&quot;机器人恐龙&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是用乐高套件组装的一个机器人，外形像恐龙。&lt;a target=&quot;_blank&quot; href=&quot;http://www.youtube.com/watch?v=kzd1OiP27s0&amp;amp;feature=player_embedded&quot;&gt;视频&lt;/a&gt;在Youtube，可惜我们看不到。&lt;/p&gt;</description>
    <pubDate>2010-03-01</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[机器人也会人像素描]]></title>
    <link>http://www.robotain.com/tech/show/201003/01425.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100301/124Q14642-0.jpg&quot; alt=&quot;素描机器人&quot; /&gt;&lt;/p&gt;
&lt;p&gt;素描艺术家看到这个机器人可能会不高兴了。这是一个能够看着人脸，然后开始素描的机器人-Aikon 2。&lt;/p&gt;
&lt;p&gt;制作一个有艺术能力的机器人不是一件容易的事，所以开发者尝试理解和模仿艺术家做人像素描的过程，包括：对主体的视觉认知、素描绘画的姿势、推理、训练等。&lt;/p&gt;
&lt;p&gt;这个机器人的素描水平也许比我们大多数人都高。&lt;/p&gt;</description>
    <pubDate>2010-03-01</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[Microsoft Robotics Studio 学习笔记一（CCR）]]></title>
    <link>http://www.robotain.com/tech/diy/201002/27418.html</link>
    <description>&lt;p&gt;MRDS中的两大核心就是CCR（Coordination and Concurrecy Runtime)和Dss,其中CCR提供了并发操作的功能，因为对于机器人而言，往往很多指令都是瞬间并发操作的。有了CCR，我们不会再关心底层的thread,只需要用好CCR就可以写出多线程和并发代码！&lt;/p&gt;
&lt;p&gt;CCR主要提供了这么几个类：PortSet是一个传递消息的载体；Receiver是接收器；Arbiter类提供了各种并发功能；Dispatcher Queue是一个先进先出的队列，用来装载各种消息；Dispather类用来存放Dispather Queue，类似于一个线程池。他们相互之间的关系如下图：&lt;/p&gt;
&lt;p&gt;那么既然CCR可以提供并发和多线程操作，那么到底如何控制代码的线程数量呢?我们可以添加这样的属性(Attibute) [ActivationSettings(ShareDispatcher=false, ExecutionUnitsPerDispatcher=6)]，这行属性表明所写的服务用了6个线程，如果不添加这个属性，服务默认为2个线程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、关于Port和PortSet&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关于Port和PortSet根据我的理解就是用来传递消息的载体，他们可以有泛型的版本，大家根据以后的代码很容易就能理解这两个类所充当的职责。&lt;/p&gt;
&lt;p&gt;// Create a new integer port Port&amp;lt;int&amp;gt; intPort = new Port&amp;lt;int&amp;gt;(); // Post the answer to life the universe and everything intPort.Post(42);&lt;/p&gt;
&lt;p&gt;正如上例所示，Port只能存储一种类型，那么如果要存放多重类型的消息则需要用PortSet 下面的代码则可以看出通过继承PortSet&amp;lt;&amp;gt;,我们创建了一个具有丰富类型的CCRExamplesOperations ,用来在各种服务中传递信息。&lt;/p&gt;
&lt;p&gt;[ServicePort()] public class CCRExamplesOperations : PortSet&amp;lt;DsspDefaultLookup, DsspDefaultDrop, Get&amp;gt; { }&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、Arbiter类&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;1、Receive类&lt;/em&gt;：&lt;/p&gt;
&lt;p&gt;先来一段代码：&lt;/p&gt;
&lt;p&gt;Activate( Arbiter.Receive(false, intPort,delegate(int n){ Console.WriteLine(&amp;quot;Receiver 1: &amp;quot; + n.ToString()); }) ); intPort.Post(10);&lt;/p&gt;
&lt;p&gt;关于这段代码，有这么2处关键：&lt;/p&gt;
&lt;p&gt;a、Activate即Arbiter.Activate(DispacherQueue dq,params ITasks[] arbiter),我们上面那句是一个重载，省略了DispatherQueue类型，其实是用了系统默认的Environment.TaskQueue&lt;/p&gt;
&lt;p&gt;b、Arbiter.Receive()方法里有3个参数，第一个false表明这个Receive是持久的还是一次性的；第二个是一个Portset类型即这个Receive监听的PortSet类型；第三个是一个匿名方法，一旦Receive接收到PortSet发送的信息就会执行这个匿名方法！&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2、Choice类&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Choice类是一个逻辑或得操作，一个比较常用的地方就是对一个操作进行判断，看接受到得类型是操作执行成功的还是发生异常，当然Choice方法对应两个匿名方法!看下面的代码&lt;/p&gt;
&lt;p&gt;Activate(Arbiter.Choice&amp;lt;bool, int&amp;gt;(ps,  delegate(bool b) { Console.WriteLine(&amp;quot;Choice: &amp;quot; + b.ToString()); }, delegate(int n) { Console.WriteLine(&amp;quot;Choice: &amp;quot; + n.ToString()); })); //other code&lt;/p&gt;
&lt;p&gt;ps.Post(100);ps.Post(false);由于是ps先发送了100(int类型),那么Choice方法会选择执行delegate(int n){}这个匿名方法。 如果细心的话我们就可以看到Choice方法没有跟Recieve方法一样需要一个bool类型的参数表明这个方法是否具有持久性（即是否支持连续的监听Post),实际上Choice方法只要接收到一个Post,他就会马上销毁！&lt;/p&gt;
&lt;p&gt;Choice还有一种用法，即yield return,代码如下：&lt;/p&gt;
&lt;p&gt;PortSet&amp;lt;SuccessResult,Exception&amp;gt; successResultPort=SomeFunction(); yield return (Choice)successResultPor t;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、JoinReceive类&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JoinReceive类提供的功能类似于逻辑与，会同时监听两个类型的PortSet,只有等到这两种类型的PortSet都Post完后才会触发delegate,我们通过这个代码如下：&lt;/p&gt;
&lt;p&gt;Arbiter.Activate(Environment.TaskQueue,Arbiter.JoinedReceive( false, p1, p2, delegate(bool b, int i) {Console.WriteLine(&amp;quot;Join 1: {0} {1}&amp;quot;, b, i); })); //other code p1.Post(true);p2.Post(100);//此时触发delegate(bool b,int i){};&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4、Arbiter类&lt;/strong&gt;里的这些方法是可以相互嵌套的，用来生成比较复杂的逻辑，比如Receive里可以嵌套Choice等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5、MultipleItemReceive方法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过学习可知利用JoinReceive方法可以实现同时接收两个PortSet,如果一次性监听多个PortSet则需要MultipleItemReceive方法！&lt;/p&gt;
&lt;p&gt;Arbiter.Activate(Environment.TaskQueue, Arbiter.MultipleItemReceive(true, p, 6,delegate(int[] array){string s = &amp;quot;&amp;quot;; for (int i = 0; i &amp;lt; array.Length; i++) s += array[i].ToString() + &amp;quot; &amp;quot;; Console.WriteLine(&amp;quot;{0} Items: {1}&amp;quot;, array.Length, s);})); //other code for (int i = 0; i &amp;lt;6; ++i);p.Post(i);&lt;/p&gt;</description>
    <pubDate>2010-02-27</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>EvilYang博客</comments>
</item>
<item>
    <title><![CDATA[单片机自动巡线轮式机器人控制系统设计]]></title>
    <link>http://www.robotain.com/tech/articles/201002/26415.html</link>
    <description>&lt;p&gt;&lt;strong&gt;1 引言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;轮式移动&lt;a target=&quot;_blank&quot; href=&quot;http://www.robotain.com&quot;&gt;机器人&lt;/a&gt;是机器人研究领域的一项重要内容．它集机械、电子、检测技术与智能控制于一体。在各种移动机构中，轮式移动机构最为常见。轮式移动机构之所以得到广泛的应用。主要是因为容易控制其移动速度和移动方向。因此．有必要研制一套完整的轮式机器人系统。并进行相应的运动规划和控制算法研究。笔者设计和开发了基于51型单片机的自动巡线轮式机器人系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2 控制系统总体设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人控制系统由主控制电路模块、存储器模块、光电检测模块、电机及舵机驱动模块等部分组成，控制系统的框图如图1所示。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;控制系统的框图&quot; src=&quot;/uploads/allimg/100226/113U44Z5-0.jpg&quot; /&gt;&lt;br /&gt;
控制系统的框图&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 主控制模块设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3．1 CPLD设计&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在机器人控制系统中．需要控制多个电动机和行程开关．还要进行光电检测．如果所有的任务都由AT89S52型单片机来完成．CPU的负担就会过重。影响系统的处理速度。因此扩展1个CPLD．型号为 EPM7128。它属于．MAX7000系列器件。包括2个通用1/0口．2个专用I／O口，专用I／O口可作为每个宏单元和输入输出引脚的高速控制信号 (时钟、清除和输出使能等)，电动机的。PWM信号也由其产生。&lt;/p&gt;
&lt;p&gt;EPM7128的引脚排列如图2所示。MlP&amp;mdash;M4P引脚的输出为PWM脉宽调制信号，M1FB&amp;mdash;M4FB引脚为电机的方向控制信号，P00一P07接单片机的PO口，100一1015为扩展的2个通用I／O口，SIL&amp;mdash;S17引脚为行程开关输入信号，LI11一LI17引脚为光电探头输入信号。CPLD的编程用VHDL语言，产生1路PWM信号的部分程序源代码如下：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;程序&quot; src=&quot;/uploads/allimg/100226/113U4HJ-1.jpg&quot; /&gt;&lt;br /&gt;
程序&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;EPM7128的引脚排列&quot; src=&quot;/uploads/allimg/100226/113U44X6-2.jpg&quot; /&gt;&lt;br /&gt;
EPM7128的引脚排列&lt;/p&gt;
&lt;p&gt;单片机采用24MHz的晶体振荡器，ALE信号的频率fALE=f16=6MHz，最终输出PWM信号的引脚MlP的频率为：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;公式&quot; src=&quot;/uploads/allimg/100226/113U45106-3.jpg&quot; /&gt;&lt;br /&gt;
公式&lt;/p&gt;
&lt;p&gt;调节这个信号的占空比可以使直流电动机获得O-255级的转速。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;3．2 机器人运行参数存储器的扩展&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;机器人运行路径和动作可以根据比赛情况的不同而发生变化，这样，每改变1次运行参数就必须对单片机的Flash进行1次擦写。为了解决这一问题．扩展了程序参数存储器，用来存放机器人的运行路径和动作参数．扩展电路如图3所示。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;扩展电路&quot; src=&quot;/uploads/allimg/100226/113U43936-4.jpg&quot; /&gt;&lt;br /&gt;
扩展电路&lt;/p&gt;
&lt;p&gt;其中IC1为24LC08B，是I2E总线的串行E2PROM存储器，最多能够存储lK字节的数据。IC2为MAX3232型电平转换器，其内部有1个电源电压变换器，可以将计算机的电平转换为标准TTL电平，实现计算机与单片机之间通过串行口传输数据，使单片机完成对24／LC08B的数据存储操作。单片机运行时，直接从24LC08中读取机器人的运行参数，控制机器人运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4 光电检测模块设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;4．1 光电检测过程&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;设计光电检测模块是为了让机器人能够检测地面上的白色引导线。光电检测电路主要包括发射部分和接收部分，其原理如图4所示。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;光电检测过程&quot; src=&quot;/uploads/allimg/100226/113U43135-5.jpg&quot; /&gt;&lt;br /&gt;
光电检测过程&lt;/p&gt;
&lt;p&gt;发射部分的波形调制采用了频率调制方法。由于发光二极管的响应速度快，其工作频率可达几MHz或十几MHz，而检测系统的调制频率在几十至几百kHz的范围内，能够满足要求。光源驱动主要负责把调制波形放大到足够的功率去驱动光源发光。光源采用红外发光二极管，工作频率较高，适合波形为方波的调制光的发射。&lt;/p&gt;
&lt;p&gt;接收部分采用光敏二极管接收调制光线，将光信号转变为电信号。这种电信号通常较微弱，需进行滤波和放大后才能进行处理。调制信号的放大采用交流放大的形式，可使调制光信号与背景光信号分离，为信号处理提供方便。调制信号处理部分对放大后的信号进行识别，判断被检测对象的特性。因此，此模块的本质是将&amp;ldquo;交流&amp;rdquo;的、有用的调制光信号从&amp;ldquo;直流&amp;rdquo;的、无用的背景光信号中分离出来，从而达到抗干扰的目的。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;4．2 光电探头&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;光电探头安装在机器人底盘前部，共设置了5个检测点。从理论上讲，检测点越多、越密，识别的准确性与可靠性就越高，但是硬件的开销与软件的复杂程度也相应的增加。采用该巡线系统保证了检测的精确度，节约了硬件的开销。发光二极管发出的调制光经地面反射到光敏二极管。光敏二极管产生的光电流随反射光的强弱而线性变化。把这种变化检测出来，就可以判断某一个检测点是否在白色引导线的上方，从而判断机器人和白色引导线的相对位置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5 电机驱动模块&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人的驱动件主要是电机和舵机，都可以采用PWM进行调速与控制。根据脉冲编码器的反馈信号，对机器人的运动状态进行实时控制。直流伺服电机的控制原理如图5所示。调节：PWM的信号就能够快速调节舵机的转角，从而实现机器人的方向控制。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;直流伺服电机的控制原理&quot; src=&quot;/uploads/allimg/100226/113U46195-6.jpg&quot; /&gt;&lt;br /&gt;
直流伺服电机的控制原理&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6 结束语&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;基于5l型单片机的自动巡线轮式机器人控制系统运行平稳可靠，抗干扰能力强，不仅满足了机器人大赛的设计要求，同时也为智能机器人搭建了良好的控制平台。&lt;/p&gt;</description>
    <pubDate>2010-02-26</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[了解人形机器人舵机]]></title>
    <link>http://www.robotain.com/tech/articles/201002/24410.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人舵机&quot; src=&quot;/uploads/allimg/100224/1G63312Q-0.jpg&quot; /&gt;&lt;br /&gt;
图为森汉科技舵机产品&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是舵机&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;舵机是遥控模型，人型机器人控制动作的动力来源，不同类型的动力需求所需的舵机种类也随之不同。如何审慎地选择经济且合乎需求的舵机，也是一门不可轻忽的学问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;舵机的构造&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由机器人的主控板发出PWM信号给舵机，经由舵机电路板上的IC做出相应的处理，判断转动方向，再驱动无核心马达开始转动，透过减速齿轮将动力传至摆臂，同时由位置检测器送回讯号，判断是否已经到达定位。位置检测器其实就是可变电阻，当舵机转动时电阻值也会随之改变，藉由检测电阻值便可知转动的角度。一般的伺服马达是将细铜线缠绕在三极转子上，当电流流经线圈时便会产生磁场，与转子外围的磁铁产生排斥作用，进而产生转动的作用力。依据物理学原理，物体的转动惯量与质量成正比，因此要转动质量愈大的物体，所需的作用力也愈大。舵机为求转速快、耗电小，於是将细铜线缠绕成极薄的中空圆柱体，形成一个重量极轻的五极中空转子，并将磁铁置於圆柱体内，这就是无核心马达。&lt;/p&gt;
&lt;p&gt;为了适合不同的工作环境，有防水及防尘设计的舵机；并且因应不同的负载需求，舵机的齿轮有塑胶及金属之区分，金属齿轮的舵机一般皆为大扭力及高速型，具有齿轮不会因负载过大而崩牙的优点。较高级的舵机会装置滚珠轴承，使得转动时能更轻快精准。滚珠轴承有一颗及二颗的区别，当然是二颗的比较好。目前新推出的 FET 舵机，主要是采用 FET(Field Effect Transistor)场效电晶体。FET 具有内阻低的优点，因此电流损耗比一般电晶体少。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术规格&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;厂商所提供的舵机规格资料，都会包含外形尺寸(mm)、扭力(kg-cm)、速度(秒/60&amp;deg;)、测试电压(V)及重量(g)等基本资料。扭力的单位是 kg-cm，意思是在摆臂长度 1 公分处，能吊起几公斤重的物体。这就是力臂的观念，因此摆臂长度愈长，则扭力愈小。速度的单位是 sec/60&amp;deg;，意思是舵机转动 60&amp;deg;所需要的时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择舵机 &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;舵机可以根据不同的使用环境选择。例如人型机器人，头部的舵机不需要太多的负重，就可因选塑料齿轮的；手部舵机负重相对比较小，可以选择一些小扭矩的金属齿轮舵机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;舵机的保养&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一般说来舵机并不需要特别的保养，只要注意下列重点，就可使您的舵机长命百岁。直升机的机械可动部份，不可小於舵机的行程活动范围。舵机不能出现在0&amp;deg;或180&amp;deg;极限位置停止的情况。不要随意改变电源电压，例如接收机用7.4V，请勿为了提升舵机的性能而改用 9V。避免舵机过度负载，依照工作的性质与摆臂的长度，决定扭力的大小。善用避振垫圈来保护舵机，安装舵机时不可过度锁紧，造成避振垫圈变形。更换舵机齿轮时必须使用陶瓷系润滑油，请勿使用矿物系润滑油，以免造成塑胶齿轮变质，容易断裂。若您的舵机没有防水防尘的功能，请避免让水或尘土跑进舵机内。&lt;/p&gt;</description>
    <pubDate>2010-02-24</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>森汉科技</comments>
</item>
<item>
    <title><![CDATA[自主型机器人成为首个参加RoboCup的仿人机器人]]></title>
    <link>http://www.robotain.com/tech/show/201002/23395.html</link>
    <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://editerupload.eepw.com.cn/201002/9ef80613f42ee0c4f7edbb5e1c09859d.bmp&quot; alt=&quot;足球机器人&quot; /&gt;&lt;br /&gt;
用NI LabVIEW开发的机器人DARWin,是美国第一个进入&amp;ldquo;机器人世界杯足球赛&amp;ldquo;的机器人。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;作者&lt;/strong&gt;:Karl Muecke - Virginia Tech University&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;行业&lt;/strong&gt;:大学/教育, 科研, 机电学/ 电工学&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;产品&lt;/strong&gt;:LabVIEW, 机器视觉, 实时模块&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;挑战&lt;/strong&gt;:开发作为新步态研究平台的机器人系统，设计美国第一个参加RoboCup(自主型机器人足球比赛)的仿人机器人。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;该方案采用NI LabVIEW与第三方硬件交互,加速新步态研究的开发与测试;同时采用LabVIEW实时模块和NI视觉软件创建人工智能，从而使机器人可以执行高级功能，如踢足球。&lt;/p&gt;
&lt;p&gt;&amp;quot;利用LabVIEW的游戏手柄VI可轻松实现这一设想。我们可轻松地调试步态和运动，无需同时调试机器人动作。&amp;quot;&lt;/p&gt;
&lt;p&gt;为 研究双足步态，弗吉尼亚理工大学机器人和机械实验室(RoMela)设计了最初的智能型动态拟人机器人(DARwIn)。在RoMela，我们在硬件上测 试了步态研究的设想和理论。我们决定用RoboCup这一国际性机器人足球比赛作为展示这一款机器人优越性和可行性的舞台，同时展示DARwIn的鲁棒 性。&lt;/p&gt;
&lt;p&gt;当前机器人编程和控制技术通常采用C代码，其学习曲线比较陡峭，并且硬件更新难度也相对较大。在RoMeLa，我们采用NI技术加速新机器人步态研发，最终使完全自主型仿人机器人问世。该机器人不仅可踢足球，也可作为新步态的研究平台。我们采用LabVIEW图形化开发平台不仅为了创建可扩展、适应性强的软件,同时也可开发执行高级任务的机器人大脑，如踢足球比赛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LabVIEW作为可扩展硬件接口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于RoMeLa中的机器人平台多种多样，我们需要选择一款通过简单配置即可适应不同硬件设置的系统。大多数小型机器人研究使用个人数字助理(PDA)自主控制机器人。在PC104+计算机上采用 LabVIEW 实时模块后，几 乎无需任何开销即可实现计算机架构扩展。与PDA不同，该系统可兼容一系列不同传感器&amp;mdash;&amp;mdash;IEEE 1384相机、RS485通信、多个无线网络和其他众多设备。添加新相机或802.11端口、适配型驱动器，写入C或C++代码花费均需耗费大量时间，而 LabVIEW VI使得所有问题迎刃而解。&lt;/p&gt;
&lt;p&gt;目前，我们采用LabVIEW通过RS485控制机器人动作，并从同一串行网络的伺服电机内置电位计上读取关节位置。在机器人行走或移动的同时，带加速度和方向信息速率的陀螺仪通过RS232串口与LabVIEW通信，此时程序即可实时修改行走步态进而高效地控制机器人平衡。&lt;/p&gt;
&lt;p&gt;最初的机器人研发平台，仅需伺服电机和速率陀螺仪接口。然而，参加2007年7月RoboCup的竞赛机器人所需的硬件 和编程无疑更为复杂。除须机器人行走和维持平衡外，软件还须提供视觉、大脑和通讯功能。由于在RoboCup比赛中，机器人必须完全自主和无线控制，因而 只能采用网络主机控制机器人的起/停信号。LabVIEW实时运行所有机器人软件，成本和CPU时间都得以降低。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证步态研究&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;生成机器人步态数学公式时，很难可视化看到结果。采用LabVIEW不仅可调用其它计算软件包生成的步态(如 Wolfram Mathematica或Microsoft Excel)，而且可通过建立机器人的可视化运动图形帮助研究步态。利用LabVIEW的3D图形控制，我们可以仿真机器人执行所生成步态时的行为。由于 无需利用物理硬件设置和测试步态，节省了大量的研发时间。&lt;/p&gt;
&lt;p&gt;在物理硬件上进行机器人步态测试时，我们可以通过用户控制的游戏手柄模仿机器人的人工智能。用户作为机器人的眼睛和大 脑，而手柄作为控制机器人动作的接口，通过发送命令控制机器人行走、踢、扑救等动作。利用LabVIEW游戏手柄VI，这种设想可轻松实现。我们可轻松地 调试步态和运动，无需同步调试机器人动作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建人工智能&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在未进行任何预先视觉处理的情况下，短短两小时内，一位研究生即可配置两台IEEE 1394相机并写一段VI程序(用于RoboCup所用桔黄色足球的相对位置识别和物理定位)。完成这一任务，全球任何其他院校可能需要众多学生花费很长 时间研究代码。但是以我们的开发效率，一位学生在短短一周内即可实现DARwIn足球动作控制，该机器人是首台而且是美国仅有的一台参加RoboCup比 赛的仿人机器人。&lt;/p&gt;</description>
    <pubDate>2010-02-23</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>电子产品世界</comments>
</item>
<item>
    <title><![CDATA[工业机器人的基础知识]]></title>
    <link>http://www.robotain.com/tech/articles/201002/22392.html</link>
    <description>&lt;p&gt;&lt;a href=&quot;http://www.robotain.com/product/gy/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;工业机器人&lt;/strong&gt;&lt;/a&gt;是能模仿人体某些器官的功能(主要是动作功能)、有独立的控制系统、可以改变工作程序和编程的多用途自动操作装置。&lt;/p&gt;
&lt;p&gt;工业机器人在工业生产中能代替人做某些单调、频繁和重复的长时间作业，或是危险、恶劣环境下的作业，例如在冲压、压力铸造、热处理、焊接、涂装、塑料制品成形、机械加工和简单装配等工序上，以及在原子能工业等部门中，完成对人体有害物料的搬运或工艺操作。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;机器人&amp;rdquo;一词出自捷克文，意为劳役或苦工。1920年，捷克斯洛伐克小说家、剧作家恰佩克在他写的科学幻想戏剧《罗素姆万能机器人》中第一次使用了机器人一词。此后被欧洲各国语言所吸收而成为专门名词。&lt;/p&gt;
&lt;p&gt;20世纪50年代末，美国在机械手和操作机的基础上，采用伺服机构和自动控制等技术，研制出有通用性的独立的工业用自动操作装置，并将其称为工业机器人；60年代初，美国研制成功两种工业机器人，并很快地在工业生产中得到应用；1969年，美国通用汽车公司用21台工业机器人组成了焊接轿车车身的自动生产线。此后，各工业发达国家都很重视研制和应用工业机器人。&lt;/p&gt;
&lt;p&gt;由于工业机器人具有一定的通用性和适应性，能适应多品种中、小批量的生产，70年代起，常与数字控制机床结合在一起，成为柔性制造单元或柔性制造系统的组成部分。&lt;/p&gt;
&lt;p&gt;工业机器人由主体、驱动系统和控制系统三个基本部分组成。主体即机座和执行机构，包括臂部、腕部和手部，有的机器人还有行走机构。大多数工业机器人有3～6个运动自由度，其中腕部通常有1～3个运动自由度；驱动系统包括动力装置和传动机构，用以使执行机构产生相应的动作；控制系统是按照输入的程序对驱动系统和执行机构发出指令信号，并进行控制。&lt;/p&gt;
&lt;p&gt;工业机器人按臂部的运动形式分为四种。直角坐标型的臂部可沿三个直角坐标移动；圆柱坐标型的臂部可作升降、回转和伸缩动作；球坐标型的臂部能回转、俯仰和伸缩；关节型的臂部有多个转动关节。&lt;/p&gt;
&lt;p&gt;工业机器人按执行机构运动的控制机能，又可分点位型和连续轨迹型。点位型只控制执行机构由一点到另一点的准确定位，适用于机床上下料、点焊和一般搬运、装卸等作业；连续轨迹型可控制执行机构按给定轨迹运动，适用于连续焊接和涂装等作业。&lt;/p&gt;
&lt;p&gt;工业机器人按程序输入方式区分有编程输入型和示教输入型两类。编程输入型是以穿孔卡、穿孔带或磁带等信息载体，输入已编好的程序。&lt;/p&gt;
&lt;p&gt;示教输入型的示教方法有两种：一种是由操作者用手动控制器(示教操纵盒)，将指令信号传给驱动系统，使执行机构按要求的动作顺序和运动轨迹操演一遍；另一种是由操作者直接领动执行机构，按要求的动作顺序和运动轨迹操演一遍。在示教过程的同时，工作程序的信息即自动存入程序存储器中在机器人自动工作时，控制系统从程序存储器中检出相应信息，将指令信号传给驱动机构，使执行机构再现示教的各种动作。示教输入程序的工业机器人称为示教再现型工业机器人。&lt;/p&gt;
&lt;p&gt;　　具有触觉、力觉或简单的视觉的工业机器人，能在较为复杂的环境下工作；如具有识别功能或更进一步增加自适应、自学习功能，即成为智能型工业机器人。它能按照人给的&amp;ldquo;宏指令&amp;rdquo;自选或自编程序去适应环境，并自动完成更为复杂的工作。&lt;/p&gt;</description>
    <pubDate>2010-02-22</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>中华工控网</comments>
</item>
<item>
    <title><![CDATA[香港机器人爱好制作的机器人]]></title>
    <link>http://www.robotain.com/tech/show/201002/08378.html</link>
    <description>&lt;p&gt;这是香港机器人爱好者制作的机器人。之前我们也已经介绍了另一个&lt;a href=&quot;http://www.robotain.com/news/zhanhui/201001/21308.html&quot; target=&quot;_blank&quot;&gt;小型机器人亮相香港电脑节&lt;/a&gt;。下面直接上图片，更多信息请参考&lt;a href=&quot;http://bloodavkeith.spaces.live.com/blog/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;作者博客&lt;/strong&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://me9weq.blu.livefilestore.com/y1m9jeYNh7v-8UK4WhULt_k_LpBb6wrj8JPs4JBW1bfjBQx_Nzx0liegsps1sUq8KSC-P-f6pOVh-UCzVJ7jleZR98CULDAaOrXl0EdXr73R00jgJi30NAwOiFLB7R9ZSrM108ja9L2tMKzZPqXk0A60A/TK02%26TK03_20100206_resize_thumb%5B3%5D.jpg&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://me9weq.blu.livefilestore.com/y1mzb3_cIy1JKCxVeUmKKO9xRqDeErXkCqcwpfF82dNatGG-_Yd42XFVj1To6ukInmgsjkpT0NVTb0r40RYjxj2bMiwA_sI-w7bDF2HQOD6OJSZ9g9OtmiiCMC1uYLO8xfJgqZX8Pp0Akwme1U0-TON3A/TK03_resize_thumb%5B1%5D.jpg&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;460&quot; height=&quot;346&quot; border=&quot;0&quot; onclick=&quot;window.open('/uploads/allimg/100208/1_100208202651_1.jpg')&quot; style=&quot;cursor: pointer;&quot; alt=&quot;&quot; src=&quot;/uploads/allimg/100208/1_100208202651_1.jpg&quot; /&gt;&lt;/p&gt;</description>
    <pubDate>2010-02-08</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[乐高“蜘蛛机器人”]]></title>
    <link>http://www.robotain.com/tech/show/201002/05370.html</link>
    <description>&lt;p&gt;国外机器人爱好者用乐高机器人套装制作了一个蜘蛛机器人。机器人的腿有很多，每个电机控制两条腿的运动。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;470&quot; height=&quot;353&quot; border=&quot;0&quot; onclick=&quot;window.open('/uploads/allimg/100205/1_100205195238_1.jpg')&quot; style=&quot;cursor: pointer;&quot; alt=&quot;&quot; src=&quot;/uploads/allimg/100205/1_100205195238_1.jpg&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195G62O2-0.jpg&quot; /&gt;&amp;nbsp;&amp;nbsp; &lt;img style=&quot;width: 200px; height: 150px;&quot; alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195G63942-1.jpg&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195GB038-2.jpg&quot; /&gt;&amp;nbsp;&amp;nbsp; &lt;img alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195GC094-3.jpg&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195G62515-4.jpg&quot; /&gt;&amp;nbsp;&amp;nbsp; &lt;img alt=&quot;&quot; src=&quot;/uploads/allimg/100205/195G61T8-5.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;怎么样，很酷吧。制作者给出比较详细的方案，如所需工具和设计图纸。&lt;a href=&quot;http://www.thingiverse.com/thing:1643&quot; target=&quot;_blank&quot;&gt;点击这里查看&lt;/a&gt;。&lt;/p&gt;</description>
    <pubDate>2010-02-05</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人21：蓝牙通讯]]></title>
    <link>http://www.robotain.com/tech/diy/201002/03361.html</link>
    <description>&lt;p&gt;前面提到了分辨颜色的三部曲，今天给大家介绍一下NXT和电脑之间的蓝牙通讯。其中在NXT端使用的是Lejos自带的Bluetooth类，在PC端使用的开发工具是VS2008，使用的语言是c#。&lt;/p&gt;
&lt;p&gt;有些人鄙视这种连接PC的做法，在他们的眼里，连接了PC以后，乐高就变成了一个遥控玩具。其实对编程开发来说，用Java还是用c#并没有本质的区别。魔方的算法也可以写成Java的版本，无奈的是NXT的内存不足，只能把这种体力活交给电脑了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 蓝牙配对&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正所谓千里姻缘一线牵，首先我们要给NXT和PC安排一个相亲大会。NXT已经内置了蓝牙模块，要把它设置成&lt;strong&gt;打开并且可见&lt;/strong&gt;的状态。设置方法请看Lejos的中文教程&amp;ldquo;&lt;a href=&quot;http://www.diy-robots.com/resources/LejosNxtTutorial_cn/menusystem/menusystem.aspx#4&quot; target=&quot;_blank&quot;&gt;蓝牙菜单&lt;/a&gt;&amp;rdquo;。现在很多笔记本也自带了蓝牙模块，如果没有的话，必须买一个蓝牙适配器。注意WinXP开始就都已经自带蓝牙驱动了，如果你的电脑安装了第三方的蓝牙驱动，最好先删除。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;400&quot; alt=&quot;蓝牙适配器&quot; src=&quot;/uploads/allimg/100203/21555615a-0.GIF&quot; title=&quot;bluetooth&quot; /&gt; &lt;br /&gt;
蓝牙适配器&lt;/p&gt;
&lt;p&gt;准备好定情信物以后，就该安排PC和NXT见面了。PC比较主动，由他开负责寻找：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;422&quot; alt=&quot;控制面板中旋转&amp;ldquo;添加新的蓝牙设备&amp;rdquo;，可以找到当前可见的NXT&quot; src=&quot;/uploads/allimg/100203/2155563P5-1.jpg&quot; title=&quot;connect1&quot; /&gt; &lt;br /&gt;
控制面板中旋转&amp;ldquo;添加新的蓝牙设备&amp;rdquo;，可以找到当前可见的NXT&lt;/p&gt;
&lt;p&gt;找到NXT后，两人会羞答答的先来个握手协议，接下来是交换电话号码。Lejos设置的蓝牙连接密码是&lt;strong&gt;1234&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;419&quot; alt=&quot;输入蓝牙连接密码&quot; src=&quot;/uploads/allimg/100203/2155562101-2.jpg&quot; title=&quot;connect2&quot; /&gt; &lt;br /&gt;
输入蓝牙连接密码&lt;/p&gt;
&lt;p&gt;你看他们一个是能力超强，名车豪宅，另一个能歌善舞，秀色可餐。简直就是一拍即合啊。到此牵线完毕，以后他们就可以直接通讯了。我们查看一下电脑上的NXT属性，可以看到有个带&amp;ldquo;DevB&amp;rdquo;的端口，这个相当于是他们之间的私人电话，记下来后面会用到。&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;353&quot; alt=&quot;注意看端口号&quot; src=&quot;/uploads/allimg/100203/21555AE1-3.jpg&quot; title=&quot;device&quot; /&gt; &lt;br /&gt;
注意看端口号&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. C#中使用蓝牙通讯&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实配对以后，蓝牙就被模拟成了一个端口，我们可以用最简单的端口通讯来收发信息。首先，在每次启动时，需要连接端口：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
BluetoothConnection = new SerialPort();
ConnectButton.Enabled = false;
BluetoothConnection.PortName = PortList.SelectedItem.ToString();
BluetoothConnection.Open();
BluetoothConnection.ReadTimeout = 10000;
BluetoothConnection.DataReceived += new SerialDataReceivedEventHandler(BlueToothDataReceived);
&lt;/pre&gt;
&lt;p&gt;然后可以通过这个端口来发送信息。需要注意的是，在发送的原始数据之前，需要添加两个表示长度的字节，Byte[0]+Byte[1]*255=length。所以发送数据的函数如下：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
private void BlueToothDataSend(byte[] data)
{
    int length = data.Length;
    byte[] readData = new byte[length + 2];
    readData[0] = (byte)(length % 255);
    readData[1] = (byte)(length / 255);
    for (int i = 0; i &amp;lt; length; i++)
    {
        readData[i + 2] = data[i];
    }
    BluetoothConnection.Write(readData, 0, length + 2);
    Status = &amp;quot;发送数据字节数：&amp;quot; + length;
}
&lt;/pre&gt;
&lt;p&gt;收到数据的时候，也是类似的情况，头两个字节表示了数据的长度，然后才是真正的数据内容：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
private void BlueToothDataReceived(object o, SerialDataReceivedEventArgs e)
{
    int length = BluetoothConnection.ReadByte();
    length += BluetoothConnection.ReadByte() * 256;

    byte[] data = new byte[length];
    BluetoothConnection.Read(data, 0, length);
    for (int i = 0; i &amp;lt; length; i++)
    {
        BlueToothReceivedData += string.Format(&amp;quot;data[{0}] = {1}\r\n&amp;quot;, i, data[i]);
    }
}&lt;/pre&gt;
&lt;p&gt;断开蓝牙连接的命令如下：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
BluetoothConnection.Close();
BluetoothConnection.Dispose();
BluetoothConnection = null;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. Lejos中使用蓝牙通讯&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Lejos中使用蓝牙有几点区别：首先，Lejos中不支持收到消息的事件触发（我怀疑用多线程可以实现，不过对Java不太熟悉，没有调试成 功）所以在需要接受PC信息时，只能挂起等候消息传来；其次，虽然PC发来的信息头两个字节表示长度，但是Lejos接收时，是从第三个字节开始显示的； 另外，Lejos发送蓝牙信息时，不需要添加那两个字节的长度信息。&lt;/p&gt;
&lt;p&gt;下面是建立蓝牙连接的方式：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
public static void Connect() throws Exception
{
	LCD.clear();
	LCD.drawString(&amp;quot;Waiting BTC...&amp;quot;,0,0);
	btc = Bluetooth.waitForConnection();
	LCD.drawString(&amp;quot;Connected&amp;quot;,0,2);
	LCD.refresh();
	dis = btc.openDataInputStream();
	dos = btc.openDataOutputStream();
}&lt;/pre&gt;
&lt;p&gt;接受蓝牙信息：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
public static byte[] ReadBytes() throws Exception
{
  byte[] buffer = new byte[255];
  int length = btc.read(buffer, buffer.length);
  if(length==-2)
  {
   //lost data, re-sync
   btc.read(null, 255);
   return new byte[0];
  }
  else
  {
   byte[] data = new byte[length];
   for(int i=0;i&amp;lt;length;i++)
   {
    data[i] = buffer[i];
   }
   return data;
  }
}&lt;/pre&gt;
&lt;p&gt;发送蓝牙信息&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
public static void WriteBytes(byte[] data) throws Exception
{
 for(int i=0;i&amp;lt;data.length;i++)
 {
  dos.writeByte(data[i]);
 }
 dos.flush();
}&lt;/pre&gt;
&lt;p&gt;关闭蓝牙连接&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
public static void Disconnect() throws Exception
{
   if(btc!=null)
   {
    WriteBytes(new byte[]{(byte)255,(byte)255,(byte)255});
    Thread.sleep(100);
    dos.close();
    dis.close();
    btc.close();
   }
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4. 蓝牙通讯小实验&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;下面进行一个小实验，在PC上运行一个程序。&lt;br /&gt;
当发送1时，NXT初始化魔方底盘位置；&lt;br /&gt;
当发送2时，NXT初始化颜色传感器位置；&lt;br /&gt;
当发送3时，NXT读取颜色信息，并回传给电脑；&lt;br /&gt;
当发送其他数字时，NXT断开蓝牙连接，并退出程序&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;379&quot; alt=&quot;蓝牙连接通讯实验&quot; src=&quot;/uploads/allimg/100203/2155562429-4.jpg&quot; title=&quot;Bluetooth&quot; /&gt; &lt;br /&gt;
蓝牙连接通讯实验&lt;/p&gt;
&lt;p&gt;大部分函数在前面都介绍过了，只需要在main函数中指定操作即可：&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
BlueTooth.Connect();
byte[] colorData = new byte[6];

while(true)
{
 byte[] readData = BlueTooth.ReadBytes();
 if(readData.length &amp;gt; 0)
 {
  int action = readData[0];
   switch(action)
  {
  case 1:
   Robot.FixBasePosition();
   break;
  case 2:
   Robot.FixColorSensorPosition();
   break;
  case 3:
      colorData[0] = (byte) color.getRed();
      colorData[1] = (byte) color.getGreen();
      colorData[2] = (byte) color.getBlue();
      colorData[3] = (byte) (color.getRawRed() / 3);
      colorData[4] = (byte) (color.getRawGreen() / 3);
      colorData[5] = (byte) (color.getRawBlue() / 3);
      BlueTooth.WriteBytes(colorData);
      break;
  default:
   BlueTooth.Disconnect();
   return;
  }
 }
 Thread.sleep(1000);
}&lt;/pre&gt;
&lt;p&gt;好了，其余部分自己看代码吧，搭车赠送一个生成三维魔方图形的小程序。&lt;a href=&quot;http://www.diy-robots.com//RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100202.txt&quot; target=&quot;_blank&quot;&gt;点此&lt;/a&gt;查看运行在NXT中Java源代码代码；&lt;a href=&quot;http://www.diy-robots.com//RubikSolver/SourceCode/PC/RubikSolverV2_20100202.zip&quot; target=&quot;_blank&quot;&gt;点此&lt;/a&gt;下载运行在电脑上的C#程序源代码。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/?p=410&quot;&gt;解魔方的机器人攻略22 &amp;ndash; 蓝牙通讯&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-02-03</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[日本Hajime研究所的机器人]]></title>
    <link>http://www.robotain.com/tech/diy/201001/29345.html</link>
    <description>&lt;p&gt;日本Hajime研究所开发了很多机器人，多数是为Robocup足球机器人，有一些获得过Robo-cup和ROBO-ONE比赛的冠军。目前Hajime研究所在为这些机器人寻找赞助商。下面就来欣赏一下这些很酷的机器人吧。更多信息，请进入&lt;a target=&quot;_blank&quot; href=&quot;http://www.hajimerobot.co.jp/index-e.htm&quot;&gt;&lt;strong&gt;Hajime研究所官方网站&lt;/strong&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;231&quot; height=&quot;377&quot; alt=&quot;HAJIME ROBOT 33&quot; src=&quot;/uploads/allimg/100129/1I55145T-0.jpg&quot; /&gt;&lt;br /&gt;
高2.1米，为2009日本Robo-cup少年组比赛机器人&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;202&quot; height=&quot;314&quot; src=&quot;/uploads/allimg/100129/1I551BN-1.jpg&quot; alt=&quot;HAJIME ROBOT 39&quot; /&gt;&lt;br /&gt;
高1米，为2009日本Robo-cup少年组比赛机器人，价格为30000-40000美元。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;142&quot; height=&quot;217&quot; src=&quot;/uploads/allimg/100129/1I5511203-2.jpg&quot; alt=&quot;HAJIME ROBOT 31&quot; /&gt;&lt;br /&gt;
高1米，为2008日本Robo-cup少年组比赛机器人&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;152&quot; height=&quot;240&quot; src=&quot;/uploads/allimg/100129/1I55142K-3.jpg&quot; alt=&quot;HAJIME ROBOT 30&quot; /&gt;&lt;br /&gt;
高0.5米，为2008日本Robo-cup儿童组比赛机器人，价格在15000-25000美元&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;240&quot; src=&quot;/uploads/allimg/100129/1I5514006-4.jpg&quot; alt=&quot;HAJIME ROBOT 29&quot; /&gt;&lt;br /&gt;
高0.8米，为2008亚特兰大Robo-cup避障比赛机器人&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;180&quot; height=&quot;400&quot; src=&quot;/uploads/allimg/100129/1I551DU-5.jpg&quot; alt=&quot;HAJIME ROBOT 28&quot; /&gt;&lt;br /&gt;
高1米，重12公斤&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;268&quot; height=&quot;466&quot; src=&quot;/uploads/allimg/100129/1I5515M9-6.jpg&quot; alt=&quot;HAJIME ROBOT 25&quot; /&gt;&lt;br /&gt;
高1米，重12公斤，为2007Robo-cup比赛机器人&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;364&quot; height=&quot;232&quot; src=&quot;/uploads/allimg/100129/1I551G10-7.jpg&quot; alt=&quot;HAJIME ROBOT 18&quot; /&gt;&lt;br /&gt;
Robo-cup足球比赛机器人&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;360&quot; height=&quot;480&quot; src=&quot;/uploads/allimg/100129/1I551M37-8.jpg&quot; alt=&quot;HAJIME ROBOT 15&quot; /&gt;&lt;br /&gt;
&amp;nbsp;跑步机器人，高360mm，重3.3kg，21个自由度&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;468&quot; border=&quot;0&quot; alt=&quot;HAJIME ROBOT 11&quot; src=&quot;/uploads/allimg/100129/1I5515124-9.jpg&quot; /&gt;&lt;br /&gt;
高403mm，重2.6kg，21个自由度&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;240&quot; height=&quot;320&quot; alt=&quot;HAJIME ROBOT 9&quot; src=&quot;/uploads/allimg/100129/1I551K50-10.jpg&quot; /&gt;&lt;br /&gt;
高372mm，重2.2kg，21个自由度&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;240&quot; alt=&quot;HAJIME ROBOT 5&quot; src=&quot;/uploads/allimg/100129/1I5514008-11.jpg&quot; /&gt;&lt;br /&gt;
高340mm，重1.8 kg，22个自由度&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;320&quot; height=&quot;427&quot; border=&quot;0&quot; alt=&quot;HAJIME ROBOT 4&quot; src=&quot;/uploads/allimg/100129/1I5513C2-12.jpg&quot; /&gt;&lt;br /&gt;
ROBO-ONE机器人比赛冠军，高410mm，重3.5 kg，18个自由度&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;310&quot; height=&quot;450&quot; alt=&quot;HAJIME ROBOT 2&quot; src=&quot;/uploads/allimg/100129/1I5512223-13.jpg&quot; /&gt;&lt;br /&gt;
ROBO-ONE比赛机器人&lt;/p&gt;</description>
    <pubDate>2010-01-29</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[RFID技术可应用在移动机器人同步定位中]]></title>
    <link>http://www.robotain.com/tech/articles/201001/29344.html</link>
    <description>&lt;p&gt;在室内移动机器人的导航中，机器人的定位与地图创建是机器人研究中一个基础且重要的问题。机器人只有实时明确自己当前的方位，才能快速准确地到达目的地。自从移动机器人诞生以来，已知环境地图的定位问题和已知定位的地图创建问题已经被广泛研究，提出了多种有效的解决途径。而当地图和机器人的位置都事先未知时，定位问题就变得更加复杂。&lt;/p&gt;
&lt;p&gt;在这种情况下，要求机器人在一个完全未知的环境中从一个未知的位置出发，在递增地建立环境的导航地图同时，利用已建立的地图来同步刷新自身的位置，最终形成完整的环境地图并在此基础上提供准确的定位。在上述问题中，机器人位置和地图两者的估算是高度相关的，任何一方都无法独立获取。这样一种相辅相生，不断迭代的过程，被学术界简称为同步定位与地图创建( SLAM )问题。该问题可以表述为：机器人在未知环境中，从一个未知位置开始移动，在移动过程中根据位置估计和传感器进行自身定位，同时建立环境地图。目前使用的主要是模糊逻辑和概率的方法，如Bayes估计，Kalman滤波，扩展Kalman滤波和Markov推理等。&lt;/p&gt;
&lt;p&gt;射频识别(RFID)技术是近年来兴起的一门自动识别技术。与传统的条形码系统、接触式卡等不同，射频识别系统是利用无线射频方式非接触供电，并进行非接触双向数据通信，以达到识别并交换数据的目的。识别工作无须人工干预，可工作于各种恶劣环境。将RFID技术应用于机器人中，可以更好地发挥其技术特点，使机器人更多地获取外在信息。&lt;/p&gt;
&lt;p&gt;不少学者正在研究将RFID用于机器人定位系统中，把RFID作为机器人的一种传感器来进行数据采集和处理。标签为机器人的外部信息量，机器人通过阅读器来采集各个标签中的位置信息，通过获取的信息利用同步定位与地图创建算法来对机器人进行有效的定位，从而得到更准确地控制。本文的研究工作中提出了一种基于RFID 系统的有效SLAM 算法。该算法可以解决2维环境下的机器人定位问题。实验证明，通过已知的RFID数据，该算法能成功地在2维环境中实现移动机器人的跟踪定位。 &lt;/p&gt;</description>
    <pubDate>2010-01-29</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人20：读取魔方颜色]]></title>
    <link>http://www.robotain.com/tech/diy/201001/25332.html</link>
    <description>&lt;p&gt;之前已经介绍了萝卜头转魔方的各个分解动作，今天介绍如何用颜色传感器读取魔方的颜色。这一部分可以分成三部曲：&lt;br /&gt;
1，依次扫描魔方的6*9=54个色块&lt;br /&gt;
2，用蓝牙连接把数据发送到电脑&lt;br /&gt;
3，通过颜色分组函数，从读数分辨出不同的颜色&lt;/p&gt;
&lt;p&gt;这里先说明一下：虽然乐高的颜色传感器以RGB的形式返回颜色值，但是并不是想象中的那样，红色返回(255,0,0)，蓝色（0,0,255）这么轻松。事实上这个数值受环境光线强度影响非常大，即使相同的环境下，读数仍然会有跳动。例如下面几个读数：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;[0,1,2]=&amp;gt;RGB=(23,0,0),RawRGB={45,1,8}&amp;nbsp;&amp;nbsp;//红色&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;[&lt;span&gt;0,2,2]=&amp;gt;RGB=(30,0,0),RawRGB={60,1,5}&amp;nbsp;&amp;nbsp;//红色&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;[&lt;span&gt;2,1,2]=&amp;gt;RGB=(28,0,0),RawRGB={55,12,8}&amp;nbsp;&amp;nbsp;//橙色&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;[&lt;span&gt;2,2,1]=&amp;gt;RGB=(29,0,0),RawRGB={57,14,14}&amp;nbsp;&amp;nbsp;//橙色&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
[0,1,2]=&amp;gt;RGB=(23,0,0),RawRGB={45,1,8}  //红色
[0,2,2]=&amp;gt;RGB=(30,0,0),RawRGB={60,1,5}  //红色
[2,1,2]=&amp;gt;RGB=(28,0,0),RawRGB={55,12,8}  //橙色
[2,2,1]=&amp;gt;RGB=(29,0,0),RawRGB={57,14,14}  //橙色
&lt;/pre&gt;
&lt;p&gt;如果你仅想从RGB来分辨颜色的话，将会&amp;ldquo;很受伤&amp;rdquo;。不过今天我只介绍第一步（扫描），在PC端程序部分再介绍如何识别颜色。&lt;/p&gt;
&lt;p&gt;因为颜色传感器一次只能读一个点，所以要扫描魔方的话，必须把54个点都扫到。我们以扫描其中一个面为例，看看两个电机怎么配合扫描到所有的9个 点。首先，颜色传感器的电机中心位置，应该在2，4两个点的中心延长线上。这样在魔方位置不动的情况下，就可以扫描到中心和四个角了。（相关文章：&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/?p=183&quot;&gt;颜色传感器的安装&lt;/a&gt;）&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;450&quot; height=&quot;290&quot; alt=&quot;扫描魔方中心和魔方的角&quot; src=&quot;/uploads/allimg/100125/13554M019-0.gif&quot; title=&quot;CubePosition1&quot; wp-image-383=&quot;&quot; /&gt; &lt;br /&gt;
扫描魔方中心和魔方的角&lt;/p&gt;
&lt;p&gt;然后，让底座旋转一定的角度，同时传感器电机也稍微调整，这样就可以扫到4个棱的颜色。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;427&quot; height=&quot;319&quot; alt=&quot;扫描魔方的棱&quot; src=&quot;/uploads/allimg/100125/13554GM2-1.gif&quot; title=&quot;CubePosition2&quot; wp-image-384=&quot;&quot; /&gt; &lt;br /&gt;
扫描魔方的棱&lt;/p&gt;
&lt;p&gt;以这种方式扫描一圈，就可以把魔方的一个面读完了。最后使用魔方操作的分解动作，把魔方翻过来倒过去，直到把六个面依次扫描出来。有一件非常麻烦的事情是，在魔方翻来翻去的过程中，数组并不是每次都以0为左上角，它是不停的变换的（相关文章：&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/?p=265&quot;&gt;魔方坐标系&lt;/a&gt;）。我用了下面这个map表，用来标记读数的顺序，这可是牺牲了数百个脑细胞换来的，其中idx数组是每个面内的依次读取顺序，idex2数组是不同的面的读取顺序：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;int[][]&amp;nbsp;idx={&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,6,7,8,5,2,1,0,3},&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,0,3,6,7,8,5,2,1},&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,2,1,0,3,6,7,8,5},&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,8,5,2,1,0,3,6,7},&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,2,1,0,3,6,7,8,5},&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span&gt;4,2,1,0,3,6,7,8,5}};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int[]&amp;nbsp;idx2={5,1,4,3,2,0};&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
int[][] idx={
	{4,6,7,8,5,2,1,0,3},
	{4,0,3,6,7,8,5,2,1},
	{4,2,1,0,3,6,7,8,5},
	{4,8,5,2,1,0,3,6,7},
	{4,2,1,0,3,6,7,8,5},
	{4,2,1,0,3,6,7,8,5}};
int[] idx2={5,1,4,3,2,0};&lt;/pre&gt;
&lt;p&gt;我们以上一次的程序为基础，添加以下变量和函数：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=382#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//add&amp;nbsp;offset&amp;nbsp;positions&amp;nbsp;for&amp;nbsp;color&amp;nbsp;sensor&amp;nbsp;motor&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;ColorMotorOffset1&amp;nbsp;=&amp;nbsp;33;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;ColorMotorOffset2&amp;nbsp;=&amp;nbsp;9;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;ColorMotorOffset3&amp;nbsp;=&amp;nbsp;18;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;ColorReadPostion1&amp;nbsp;=&amp;nbsp;162;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;ColorReadPostion2&amp;nbsp;=&amp;nbsp;154;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;//Read&amp;nbsp;each&amp;nbsp;side&amp;nbsp;colors&amp;nbsp;of&amp;nbsp;the&amp;nbsp;cube&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;ReadAllSide()&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;//Read&amp;nbsp;one&amp;nbsp;side&amp;nbsp;by&amp;nbsp;the&amp;nbsp;index&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;ReadOneSide(int&amp;nbsp;nSideIndex)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
	//add offset positions for color sensor motor
	static int ColorMotorOffset1 = 33;
	static int ColorMotorOffset2 = 9;
	static int ColorMotorOffset3 = 18;
	static int ColorReadPostion1 = 162;
	static int ColorReadPostion2 = 154;

	//Read each side colors of the cube
	public static void ReadAllSide()
	{ }

	//Read one side by the index
	public static void ReadOneSide(int nSideIndex)
	{ }&lt;/pre&gt;
&lt;p&gt;最后加一个测试入口，当按下Enter键时，开始扫描魔方。相信看过前面文章的朋友，这里不需要说明了。&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100124.txt&quot;&gt;点此查看&lt;/a&gt;具体的代码吧。&lt;/p&gt;
&lt;p&gt;补充个小小的说明：我在代码里面统一用英文加了注释，不是在装酷，主要是因为上班的时候是这样强制要求的，以至于自己做东西也养成这种习惯了。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=382&quot; title=&quot;Permanent Link to 解魔方的机器人攻略21 &amp;ndash; 读取魔方颜色&quot;&gt;解魔方的机器人攻略21 &amp;ndash; 读取魔方颜色&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-25</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人19：修正电机误差]]></title>
    <link>http://www.robotain.com/tech/diy/201001/25331.html</link>
    <description>&lt;p&gt;在上一篇攻略中，我们使用了一些角度的配置信息，例如：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot;&gt;view plain&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot;&gt;print&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//the&amp;nbsp;motor&amp;nbsp;angle&amp;nbsp;for&amp;nbsp;paw&amp;nbsp;to&amp;nbsp;hold&amp;nbsp;the&amp;nbsp;cube&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;PawHoldPosition&amp;nbsp;=&amp;nbsp;56;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;//the&amp;nbsp;motor&amp;nbsp;angle&amp;nbsp;for&amp;nbsp;paw&amp;nbsp;to&amp;nbsp;rotate&amp;nbsp;the&amp;nbsp;cube&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;PawTurnOverPosition&amp;nbsp;=&amp;nbsp;110;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//the motor angle for paw to hold the cube
static int PawHoldPosition = 56;
//the motor angle for paw to rotate the cube
static int PawTurnOverPosition = 110;
&lt;/pre&gt;
&lt;p&gt;这些用于Motor.rotate(n)的角度，都是相对于电机的原始位置而言的。在我的代码里，初始位置是这样定义的：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;324&quot; wp-image-342=&quot;&quot; title=&quot;IMG_8704&quot; src=&quot;/uploads/allimg/100125/13514964Z-0.JPG&quot; alt=&quot;颜色传感器和魔方底座的初始位置&quot; /&gt;&lt;br /&gt;
颜色传感器和魔方底座的初始位置&lt;/p&gt;
&lt;p id=&quot;attachment_343&quot; alignnone=&quot;&quot; style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;488&quot; wp-image-343=&quot;&quot; title=&quot;IMG_8579&quot; src=&quot;/uploads/allimg/100125/1351493A8-1.JPG&quot; alt=&quot;爪子的初始位置&quot; /&gt; &lt;br /&gt;
爪子的初始位置&lt;/p&gt;
&lt;p&gt;在最初的版本里，我是在断电状态下，手动把电机拧到指定的初始位置。（程序一旦开始运行，角度信息就已经开始记录了，而且拧电机会有很大的阻力）&lt;/p&gt;
&lt;p&gt;随后问题就来了，如果初始位置不准确的话，那么必然会导致旋转之后的位置不准确。其中最省心的是爪子的初始化位置，因为它是贴在后支架上，这个参照物非常稳定。&lt;/p&gt;
&lt;p&gt;颜色传感器的杆很长，目测很难判断是否已经平行。魔方底座更是转十几次以后，误差越来越大。所以我们需要一段程序，把稍有偏差的初始位置纠正回来。&lt;/p&gt;
&lt;p&gt;首先看一下如何修正魔方底座的误差。我们曾经介绍过，在魔方底座的下方安装了一个亮度传感器，当底座在某些位置的时候，会挡在亮度传感器的上面，再 转过一定角度，就又把它露出来。亮度传感器有一个红色的小灯，可以通过light.setFloodlight(bool);来点亮或者关闭它。通过对比 点亮和关闭前后的读数差，就可以判断出底座什么时候被挡住（在底座的下方需要贴一圈白纸，增强反光）。读数的曲线图是这样的：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;540&quot; height=&quot;362&quot; wp-image-344=&quot;&quot; title=&quot;fixbase&quot; src=&quot;/uploads/allimg/100125/135149D95-2.gif&quot; alt=&quot;读数的示意图&quot; /&gt; &lt;br /&gt;
读数的示意图&lt;/p&gt;
&lt;p&gt;也就是说，随着传感器被慢慢的挡住，这个亮度差值会越来越大，理论上最大值就是被挡住的中心位置。考虑到传感器的读数是有误差的，所以不能只取一个最大值点来计算，需要设置一个阀值，把最大的N个点都找到，那么它的中心位置就比较准确了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot;&gt;view plain&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot;&gt;print&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//Fix&amp;nbsp;the&amp;nbsp;position&amp;nbsp;of&amp;nbsp;cube&amp;nbsp;base&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;FixBasePosition()&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int&amp;nbsp;step&amp;nbsp;=&amp;nbsp;3;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int&amp;nbsp;tolerance&amp;nbsp;=&amp;nbsp;4;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;light.setFloodlight(&lt;span&gt;false);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;bottom.rotate(-&lt;span&gt;50);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int&amp;nbsp;angle&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;minLight&amp;nbsp;=&amp;nbsp;10000;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int&amp;nbsp;realtimeLight&amp;nbsp;=&amp;nbsp;ReadLightDifference();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;while(realtimeLight&amp;nbsp;&amp;lt;&amp;nbsp;minLight&amp;nbsp;+&amp;nbsp;tolerance)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;bottom.rotate(step);&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;realtimeLight&amp;nbsp;=&amp;nbsp;ReadLightDifference();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;if(realtimeLight&amp;nbsp;&amp;lt;&amp;nbsp;minLight)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;minLight&amp;nbsp;=&amp;nbsp;realtimeLight;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;angle&amp;nbsp;=&amp;nbsp;&lt;span&gt;0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;else&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;angle&amp;nbsp;+=&amp;nbsp;step;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;bottom.rotate(-&amp;nbsp;angle/&lt;span&gt;2&amp;nbsp;-&amp;nbsp;FixBasePositionOffset);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;//Read&amp;nbsp;the&amp;nbsp;light&amp;nbsp;difference&amp;nbsp;between&amp;nbsp;light&amp;nbsp;on&amp;nbsp;and&amp;nbsp;light&amp;nbsp;off&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;private&amp;nbsp;static&amp;nbsp;int&amp;nbsp;ReadLightDifference()&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;int&amp;nbsp;l1&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;l2&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;l1&amp;nbsp;=&amp;nbsp;light.readValue();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;light.setFloodlight(&lt;span&gt;true);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;Thread.sleep(&lt;span&gt;20);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;l2&amp;nbsp;=&amp;nbsp;light.readValue();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;light.setFloodlight(&lt;span&gt;false);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;return&amp;nbsp;l1-l2;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//Fix the position of cube base
public static void FixBasePosition() throws Exception
{
int step = 3;
int tolerance = 4;
light.setFloodlight(false);
bottom.rotate(-50);
int angle = 0, minLight = 10000;
int realtimeLight = ReadLightDifference();
while(realtimeLight &amp;lt; minLight + tolerance)
{
bottom.rotate(step);
realtimeLight = ReadLightDifference();
if(realtimeLight &amp;lt; minLight)
{
minLight = realtimeLight;
angle = 0;
}
else
{
angle += step;
}
}
bottom.rotate(- angle/2 - FixBasePositionOffset);
}

//Read the light difference between light on and light off
private static int ReadLightDifference() throws Exception
{
int l1 = 0, l2 = 0;
l1 = light.readValue();
light.setFloodlight(true);
Thread.sleep(20);
l2 = light.readValue();
light.setFloodlight(false);
return l1-l2;
}
&lt;/pre&gt;
&lt;p&gt;可以测试一下，把魔方底座手动拧歪一个小角度（正负十几度^_^），运行这段代码之后，底座会还原到和爪子平行的位置。&lt;/p&gt;
&lt;p&gt;颜色传感器的位置修正比较简单：让它慢慢的靠近魔方，在传感器下方遇到魔方之前，它的读数都是0。所以一旦发现有读数，我们让它返回32度，就回到了爪子平行的位置，这个度数通过几次实验就可以试出来。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot;&gt;view plain&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot;&gt;print&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=341#&quot; onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//Fix&amp;nbsp;color&amp;nbsp;sensor&amp;nbsp;position&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;FixColorSensorPosition()&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;tolerance&amp;nbsp;=&amp;nbsp;5;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ColorMotorBaseAngle&amp;nbsp;=&amp;nbsp;-&lt;span&gt;25;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle);&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;span&gt;100);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.setSpeed(&lt;span&gt;50);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;r&amp;nbsp;=&amp;nbsp;color.getRawRed();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;g&amp;nbsp;=&amp;nbsp;color.getRawGreen();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;b&amp;nbsp;=&amp;nbsp;color.getRawBlue();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;baseColor&amp;nbsp;=&amp;nbsp;r&amp;nbsp;+&amp;nbsp;g&amp;nbsp;+&amp;nbsp;b;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;int&amp;nbsp;TargetExists&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;while(TargetExists&amp;nbsp;&amp;lt;&amp;nbsp;baseColor&amp;nbsp;+&amp;nbsp;tolerance&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;ColorMotorBaseAngle&amp;nbsp;&amp;gt;&amp;nbsp;-50)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle--);&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;=&amp;nbsp;color.getRawRed();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g&amp;nbsp;=&amp;nbsp;color.getRawGreen();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;color.getRawBlue();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TargetExists&amp;nbsp;=&amp;nbsp;r&amp;nbsp;+&amp;nbsp;g&amp;nbsp;+&amp;nbsp;b;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle&amp;nbsp;+&amp;nbsp;&lt;span&gt;32);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//Fix color sensor position
&amp;nbsp;&amp;nbsp;public static void FixColorSensorPosition() throws Exception
&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;int tolerance = 5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;ColorMotorBaseAngle = -25;
&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle);
&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.setSpeed(50);
&amp;nbsp;&amp;nbsp;&amp;nbsp;int r = color.getRawRed();
&amp;nbsp;&amp;nbsp;&amp;nbsp;int g = color.getRawGreen();
&amp;nbsp;&amp;nbsp;&amp;nbsp;int b = color.getRawBlue();
&amp;nbsp;&amp;nbsp;&amp;nbsp;int baseColor = r + g + b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;int TargetExists = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;while(TargetExists &amp;lt; baseColor + tolerance &amp;amp;&amp;amp; ColorMotorBaseAngle &amp;gt; -50)
&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle--);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = color.getRawRed();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g = color.getRawGreen();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = color.getRawBlue();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TargetExists = r + g + b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.rotateTo(ColorMotorBaseAngle + 32);
&amp;nbsp;&amp;nbsp;}
&lt;/pre&gt;
&lt;p&gt;下面也做一个实验，把颜色传感器的位置拧歪，它也能回复到指定的位置。&lt;a href=&quot;http://www.diy-robots.com//RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100118.txt&quot; target=&quot;_blank&quot;&gt;点此下载这个例子的全部代码&lt;/a&gt;。实验方法为：&lt;strong&gt;按Left键修正魔方底座位置，按Right键修正颜色传感器位置，按Escape键退出&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;时间仓促，每次贴的功能都不多，下一次介绍如何把魔方的颜色读取到数组中。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=341&quot; title=&quot;Permanent Link to 解魔方的机器人攻略20 &amp;ndash; 修正电机误差&quot;&gt;解魔方的机器人攻略20 &amp;ndash; 修正电机误差&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-25</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[利用Microsoft Robotics Studio远程控制机器人]]></title>
    <link>http://www.robotain.com/tech/articles/201001/24325.html</link>
    <description>&lt;p&gt;Microsoft Robotics Studio可以使你在pc上创建程序来远程控制机器人，当然我们知道，微软的机器人软件开发平台是架构在.NET和.NET CF平台下的，如果你的机器人自身安装了.NET 或.NET CF的话，那么就机器人就可以脱机跑了，本文所说的方法是针自身没能够安装.NET和.NET CF平台的机器人的哦。&lt;/p&gt;
&lt;p&gt;这个实例主要讲解怎样为你的远程连接（有线或无线）机器人实现一个PC端的控制接口，实际上我们要实现一个负责和机器人通信的服务，为了使这个服务更加通用，这个服务需要实现Microsoft Robotics Studio中所定义的通用协议，例如为Motor，Bumper，Contract，sonar等传感器，Microsoft Robotics Studio为这些传感器定义了统一通信协议，包括消息类型，消息体等，这些协议在 Robotics Common找到，这些协议使得我们隐藏机器人的细节，实现了这些协议，就可以在VPL中使用一致的操作方式使用这些模块了。&lt;/p&gt;
&lt;p&gt;这个实例主要有以下几个方面：&lt;/p&gt;
&lt;p&gt;* 在机器人一端创建一个远程通信的接口&lt;br /&gt;
* 在PC端创建一个和机器人硬件交互的接口&lt;br /&gt;
* 使用Brick Service&lt;br /&gt;
* 实现一个通用的服务&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;准备&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;硬件：这个实例目的是帮助msrs不支持的硬件开发服务，你可能会发现，使用下面的平台会来学这个实例比较有帮助的。&lt;/p&gt;
&lt;p&gt;* LEGO MINDSTORMS NXT&lt;br /&gt;
* fischertechnik&lt;br /&gt;
* iRobot Create&lt;/p&gt;
&lt;p&gt;硬件制造商通常会为自己的平台提服务供支持，在为这些硬件写服务的时候可以看下官方网站或论坛，可有这样的服务已经有人写好了哦。&lt;/p&gt;
&lt;p&gt;软件：这个实例是为使用Visual C#的开发人员提供的，你可以使用下面的开发工具：&lt;/p&gt;
&lt;p&gt;* Microsoft Visual C# Expss Edition&lt;br /&gt;
* Microsoft Visual Studio Standard, Professional, or Team Edition.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开始&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个实例由C#语言编写，你可以在下面的MSRS目录中找到这个实例的项目文件。&lt;/p&gt;
&lt;p&gt;Samples\RoboticsTutorials\Tutorial6\CSharp&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;概述&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个实例通过分析LEGO NET机器人的服务来让大家了解一个通用的、一个很有用的架构，架构图如下所示：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;http://www.elooog.cn/upload/pcrobot.bmp&quot; alt=&quot;PC和机器人远程连接&quot; /&gt;&lt;br /&gt;
图1-PC和机器人远程连接&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100124/14434L129-0.JPG&quot; alt=&quot;LegoNxt机器人的服务架构&quot; /&gt;&lt;br /&gt;
图2-LegoNxt机器人的服务架构&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：在机器人上为远程通信开发通信接口&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你的机器人需要为外界提供接口，通过这个接口我们可以获取机器人的传感器和电机的信息，接口相应的程序必须运行在机器人自身系统上，比如单片机、arm等，如果机器人已经提供了远程通信的接口（比如iRobot Create&amp;bull;，LegoNXT等机器人已经实现了这样的接口），那么你可以跳过此步了哦。&lt;/p&gt;
&lt;p&gt;假如你的机器人不包括一个通信接口，你需要用自己去开发这样的接口，通过机器人所支持的开发工具开发程序，这些程序可以监视传感器的改变，并且向一个连接的PC端发送回消息，它应该也可以很好的处理所接收的马达消息请求，这些程序应该是一个循环类的程序。&lt;br /&gt;
&lt;strong&gt;第二步&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;现在把精力集中在运行在PC端的代码上，这些代码和远程的机器人接口通信，代码所实现的服务通过其他的协助服务或C++/CLI库来实现，这个实例中的 Brick Service完全负责和机器通信，这个Brick Service可以认为是机器人在mrds平台的一个抽象实体，所有和机器人的交互将由Brick Service实现，mrds通过Brick Service来控制机器人，Brick Service的状态应该包含最新的马达和传感器信息。&lt;/p&gt;
&lt;p&gt;LEGO NXT机器人使用一个蓝牙接口，当连接蓝牙后，它会呈现为PC的一个串口提供给用户使用，下面的代码段实现了如何读写串口，这一步最重要的两个部分是：1、确保有权限使用这个串口；2、在合适的位置处理从串口输入的数据。&lt;/p&gt;
&lt;p&gt;如何设置串口：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
SerialPort serialPort = new System.IO.Ports.SerialPort();&lt;br /&gt;
void Open(int comPort, int baudRate)&lt;br /&gt;
{&lt;br /&gt;
serialPort = new SerialPort(&amp;quot;COM&amp;quot; + comPort.ToString(), baudRate);&lt;br /&gt;
serialPort.Encoding = Encoding.Default;&lt;br /&gt;
serialPort.Parity = Parity.None;&lt;br /&gt;
serialPort.DataBits = 8;&lt;br /&gt;
serialPort.StopBits = StopBits.One;&lt;br /&gt;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);&lt;br /&gt;
serialPort.Open();&lt;br /&gt;
}&lt;br /&gt;
//Send data that your robot understands&lt;br /&gt;
void SendData(byte[] buffer)&lt;br /&gt;
{&lt;br /&gt;
serialPort.Write(buffer, 0, buffer.Length);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;假如你在用蓝牙，你可能需要添加一个header，它包括的消息（message）的长度。当从COM口接收到数据后，你应该向服务的内部端口（internal port）提交数据，如果想更新服务的状态，你要确保消息的处理方法是独占使用这个服务的状态的，也就是要获得服务状态的锁，这样才可以改变服务的状态。&lt;/p&gt;
&lt;p&gt;关于 内部端口（internal port）、服务（Service）、消息（Message）等名词的定义请查看相关资料 。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1  void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)&lt;br /&gt;
2 {&lt;br /&gt;
3 //&lt;br /&gt;
4 //Do not modify your state yet&lt;br /&gt;
5 _myRobotInboundPort.Post(sensorMsg);&lt;br /&gt;
6 }&lt;br /&gt;
7 //&lt;br /&gt;
8 protected override void Start()&lt;br /&gt;
9 {&lt;br /&gt;
10 Interleave mainInterleave = ActivateDsspOperationHandlers();&lt;br /&gt;
11 mainInterleave.CombineWith(new Interleave(&lt;br /&gt;
12 new TeardownReceiverGroup(),&lt;br /&gt;
13 new ExclusiveReceiverGroup(&lt;br /&gt;
14 Arbiter.ReceiveWithIterator(true, _myRobotInboundPort, MyRobotSensorMessageHandler)&lt;br /&gt;
15 ),&lt;br /&gt;
16 new ConcurrentReceiverGroup()&lt;br /&gt;
17 ));&lt;br /&gt;
18 }&lt;br /&gt;
19 private IEnumerator MyRobotSensorMessageHandler(SensorNotification sensorMessage)&lt;br /&gt;
20 {&lt;br /&gt;
21 //update state here&lt;br /&gt;
22 _state.sensor = sensorMessage.sensor;&lt;br /&gt;
23 //&lt;br /&gt;
24 }&lt;br /&gt;
25 //&lt;br /&gt;
26&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;第三步：使用Brick Service&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Brick Service 负责处理对机器人的访问，它把执行请求发送给机器人并且将机器人的传感器信息发送回订阅Brick Service的服务。&lt;/p&gt;
&lt;p&gt;在前面的两个实例Service Tutorial 4 (C#) - Supporting Subscriptions和 Service Tutorial 5 (C#) &amp;ndash; Subscribing中我们了解了服务的订阅（subscription）方法，但是这两个例子中描述的服务订阅和这里的并不完全合适，前面实例中的服务订阅会将所有传感器数据返回给订阅者，而下面所说的自定义服务（Custom Subscriptions）只返回传感器数据的一个子集，例如一个订阅了brickService的红外传感器服务并不想获取其他传感器的数据，它只是获得红外传感器的数据，如一个接触（Contract）传感器服务只订阅了碰撞传感器（bumper）的数据，它也不会得到其他传感器的数据，下面就讲解如何是自定义订阅服务。&lt;br /&gt;
自定义订阅（Custom Subscriptions）&lt;/p&gt;
&lt;p&gt;和一般订阅的实现方式一样，自定义订阅同样使用订阅管理器（subscription manager）处理消息的通知，不同的是，当一个自定义订阅请求发送到被订阅服务，同时也会附带发送一个消息，这个消息用来告诉被订阅服务我们要订阅那些传感器的数据，这个消息是一个列表（List），是一个要订阅的传感器的名称的列表，被订阅服务可以支持这个传感器名称列表的&amp;ldquo;逻辑或&amp;rdquo;或者&amp;ldquo;逻辑与&amp;rdquo; 操作（逻辑或即如何列表里有任一个数据改变，就要发出通知，逻辑与即列表里所有传感器数据发生改变才发出通知。）&lt;/p&gt;
&lt;p&gt;下面的代码演示了使用一个逻辑或来订阅服务，也就是说当任何一个过滤字符串匹配后，它都会通知订阅者，假如逻辑与被实现，需要所有的过滤字符串匹配后才会通知订阅者。&lt;/p&gt;
&lt;p&gt;首先，添加自定阅操作到类型文件（type file）：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1 public class MyBrickServiceOperations : PortSet&lt;br /&gt;
2 &amp;lt;&lt;br /&gt;
3 DsspDefaultLookup,&lt;br /&gt;
4 DsspDefaultDrop,&lt;br /&gt;
5 Get,&lt;br /&gt;
6 //IMPORTANT: Because SelectiveSubscribe inherits from Subscribe, it must go on top.&lt;br /&gt;
7 SelectiveSubscribe,&lt;br /&gt;
8 Subscribe&lt;br /&gt;
9 &amp;gt; {}&lt;br /&gt;
10 //The standard subscription&lt;br /&gt;
11 public class Subscribe : Subscribe&lt;br /&gt;
12 &amp;lt;&lt;br /&gt;
13 SubscribeRequestType,&lt;br /&gt;
14 PortSet&lt;br /&gt;
15 &amp;lt;&lt;br /&gt;
16 subscriberesponsetype&lt;br /&gt;
17 &amp;gt;&lt;br /&gt;
18 &amp;gt; {}&lt;br /&gt;
19 //The custom subscription&lt;br /&gt;
20 public class SelectiveSubscribe : Subscribe&lt;br /&gt;
21 &amp;lt;&lt;br /&gt;
22 MySubscribeRequestType,&lt;br /&gt;
23 PortSet&lt;br /&gt;
24 &amp;lt;&lt;br /&gt;
25 SubscribeResponseType,&lt;br /&gt;
26 Fault&lt;br /&gt;
27 &amp;gt;&lt;br /&gt;
28 &amp;gt; { }&lt;br /&gt;
29 [DataContract]&lt;br /&gt;
30 public class MySubscribeRequestType : SubscribeRequestType&lt;br /&gt;
31 {&lt;br /&gt;
32 //The list of sensors to subscribe to&lt;br /&gt;
33 [DataMember]&lt;br /&gt;
34 public List Sensors;&lt;br /&gt;
35 }&lt;br /&gt;
36&lt;/p&gt;
&lt;p&gt;现在添加handler到实现文件（implementation file）&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1 // General Subscription&lt;br /&gt;
2 [ServiceHandler(ServiceHandlerBehavior.Exclusive)]&lt;br /&gt;
3 public IEnumerator SubscribeHandler(Subscribe subscribe)&lt;br /&gt;
4 {&lt;br /&gt;
5 base.SubscribeHelper&lt;br /&gt;
6 (&lt;br /&gt;
7 subMgrPort,&lt;br /&gt;
8 subscribe.Body,&lt;br /&gt;
9 subscribe.ResponsePort&lt;br /&gt;
10 );&lt;br /&gt;
11 yield break;&lt;br /&gt;
12 }&lt;br /&gt;
13 // Custom Subscription&lt;br /&gt;
14 [ServiceHandler(ServiceHandlerBehavior.Exclusive)]&lt;br /&gt;
15 public IEnumerator SelectiveSubscribeHandler(SelectiveSubscribe subRequest)&lt;br /&gt;
16 {&lt;br /&gt;
17 submgr.InsertSubscription selectiveSubscription = new submgr.InsertSubscription&lt;br /&gt;
18 (&lt;br /&gt;
19 new submgr.InsertSubscriptionMessage&lt;br /&gt;
20 (&lt;br /&gt;
21 subRequest.Body.Subscriber,&lt;br /&gt;
22 subRequest.Body.Expiration,&lt;br /&gt;
23 0&lt;br /&gt;
24 )&lt;br /&gt;
25 );&lt;br /&gt;
26 selectiveSubscription.Body.NotificationCount = subRequest.Body.NotificationCount;&lt;br /&gt;
27 List subscribeFilter = new List();&lt;br /&gt;
28 //items in this loop are OR'ed together in the subscription&lt;br /&gt;
29 foreach (string s in subRequest.Body.Sensors)&lt;br /&gt;
30 {&lt;br /&gt;
31 LogInfo(&amp;quot;Adding subscription for: &amp;quot; + s.ToUpper());&lt;br /&gt;
32 //you can achieve an AND behavior by adding a list of strings in the new QueryType&lt;br /&gt;
33 subscribeFilter.Add(new submgr.QueryType(s.ToUpper()));&lt;br /&gt;
34 }&lt;br /&gt;
35 selectiveSubscription.Body.QueryList = subscribeFilter.ToArray();&lt;br /&gt;
36 subMgrPort.Post(selectiveSubscription);&lt;br /&gt;
37 yield return Arbiter.Choice&lt;br /&gt;
38 (&lt;br /&gt;
39 selectiveSubscription.ResponsePort,&lt;br /&gt;
40 delegate(dssp.SubscribeResponseType response)&lt;br /&gt;
41 {&lt;br /&gt;
42 subRequest.ResponsePort.Post(response);&lt;br /&gt;
43 },&lt;br /&gt;
44 delegate(Fault fault)&lt;br /&gt;
45 {&lt;br /&gt;
46 subRequest.ResponsePort.Post(fault);&lt;br /&gt;
47 });&lt;br /&gt;
48 yield break;&lt;br /&gt;
49 }&lt;br /&gt;
50 selectiveSubscription.Body.NotificationCount = subRequest.Body.NotificationCount;&lt;br /&gt;
51 List subscribeFilter = new List();&lt;br /&gt;
52 //items in this loop are OR'ed together in the subscription&lt;br /&gt;
53 foreach (string s in subRequest.Body.Sensors)&lt;br /&gt;
54 {&lt;br /&gt;
55 LogInfo(&amp;quot;Adding subscription for: &amp;quot; + s.ToUpper());&lt;br /&gt;
56 //you can achieve an AND behavior by adding a list of strings in the new QueryType&lt;br /&gt;
57 subscribeFilter.Add(new submgr.QueryType(s.ToUpper()));&lt;br /&gt;
58 }&lt;br /&gt;
59 selectiveSubscription.Body.QueryList = subscribeFilter.ToArray();&lt;br /&gt;
60 subMgrPort.Post(selectiveSubscription);&lt;br /&gt;
61 yield return Arbiter.Choice&lt;br /&gt;
62 (&lt;br /&gt;
63 selectiveSubscription.ResponsePort,&lt;br /&gt;
64 delegate(dssp.SubscribeResponseType response)&lt;br /&gt;
65 {&lt;br /&gt;
66 subRequest.ResponsePort.Post(response);&lt;br /&gt;
67 },&lt;br /&gt;
68 delegate(Fault fault)&lt;br /&gt;
69 {&lt;br /&gt;
70 subRequest.ResponsePort.Post(fault);&lt;br /&gt;
71 }&lt;br /&gt;
72 );&lt;br /&gt;
73 yield break;&lt;br /&gt;
74 }&lt;br /&gt;
75&lt;/p&gt;
&lt;p&gt;最后提交自定义订阅到前面定义的传感器通知handler  &lt;br /&gt;
1 private IEnumerator MyRobotSensorMessageHandler(SensorNotification sensorMessage)&lt;br /&gt;
2 {&lt;br /&gt;
3 //update state here&lt;br /&gt;
4 _state.sensor = sensorMessage.sensor;&lt;br /&gt;
5 &lt;br /&gt;
6 //Build notification list&lt;br /&gt;
7 List notify = new List();&lt;br /&gt;
8 notify.Add(sensorMessage.Name.ToUpper());&lt;br /&gt;
9 &lt;br /&gt;
10 // notify general subscribers&lt;br /&gt;
11 subMgrPort.Post&lt;br /&gt;
12 (&lt;br /&gt;
13 new submgr.Submit(_state, dssp.DsspActions.ReplaceRequest)&lt;br /&gt;
14 );&lt;br /&gt;
15 // notify selective subscribers&lt;br /&gt;
16 subMgrPort.Post&lt;br /&gt;
17 (&lt;br /&gt;
18 new submgr.Submit(_state, dssp.DsspActions.ReplaceRequest, notify.ToArray())&lt;br /&gt;
19 );&lt;br /&gt;
20 yield break;&lt;br /&gt;
21 }&lt;br /&gt;
22&lt;/p&gt;
&lt;p&gt;注意：服务的开发者定义为订阅者定义的传感器名称和行为，一定要和你自己的命名时一致的。&lt;br /&gt;
&lt;strong&gt;第四步：实现一个通用服务（Generic Services）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现在我们开发一个新服务，这个服务和brik Service交互，从Brick Service获取传感器的数据，这个服务实现了一个通用的协议，这些协议在RoboticsCommon有定义，即MotorTypes.cs和 MotorState.cs，一般开发服务，我们会在*type.cs文件中定义服务的协议，我们是不是要把那两个个通用的协议定义文件拷贝到我们的项目中呢？不需要的，这里就会用到备用服务（Alternate Contracts）的功能，一个服务可以包括多个端口（port），如下面所示：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1 [ServicePort(&amp;quot;/RobotOne&amp;quot;, AllowMultipleInstances = false)]&lt;br /&gt;
2 RobotOneOperations _mainPort = new RobotOneOperations();&lt;br /&gt;
3 [AlternateServicePort(AlternateContract = robot.Contract.Identifier)]&lt;br /&gt;
4 robot.RobotOperations _robotServicePort = new robot.RobotOperations();&lt;br /&gt;
5&lt;/p&gt;
&lt;p&gt;主端口实现自身定义的操作协议，而备用端口借用了其他服务的协议，注意这里和为服务添加Partner不一样，并没有启动robot这个服务，只是借用了这个服务的操作协议而已。下面说下如何使用备用协议。&lt;br /&gt;
备用协议（Alternate Contracts）&lt;/p&gt;
&lt;p&gt;&amp;ldquo;翻译的可能不太正确，Alternate在字典里的意思是候选，备用，我的理解是已经定义好的服务协议，这些协议也可以被其他的服务所使用&amp;rdquo;&lt;/p&gt;
&lt;p&gt;一个服务可以实现一个备用协议（Alternate Contracts），允许你的服务表现出出这个协议相应的行为。在这里，我们通过一个比较简单的Motor 服务来演示如何实现一个备用协议，说这个服务简单是因为这个服务不需要订阅brick 服务，它只是发送motor命令。&lt;/p&gt;
&lt;p&gt;使用DSSNewService可以生成一个使用备选服务（Alternate Contracts）的项目，这个项目借用了其他的程序集中的操作协议即Contract，你可以用过DssInfo.exe工具找到gerneric motor的contract，你也可以通过运行在这个节点上的Control Panel Service找到这个Contract。&lt;/p&gt;
&lt;p&gt;查看Contract的方法，打开DSS Command Prompt命令行工具，输入下面的命令：&lt;/p&gt;
&lt;p&gt;DssInfo \o:&amp;rdquo;D:\RoboticsCommon&amp;rdquo; \s:Html bin\RoboticsCommon.dll&lt;/p&gt;
&lt;p&gt;这行命令会生产一个RoboticsCommon文件夹，里面的内容是HTML文件，打开index.html，你会看到这个RoboticsCommon.dll中所有的服务及服务的介绍，当然也包括我们要找的Contract。&lt;/p&gt;
&lt;p&gt;在输出的Contract列表中可以找到 Genneric Motor的信息。&lt;/p&gt;
&lt;p&gt;Contract Only: Generic Motor DssContract: http://schemas.microsoft.com/robotics/2006/05/motor.html Namespace: Microsoft.Robotics.Services.Motor&lt;/p&gt;
&lt;p&gt;在DssNewService工具中利用这个Contract Identifier可以生成实现了这个Contract的服务，输入如下的命令行：&lt;/p&gt;
&lt;p&gt;DssNewService.exe /service:MyRobotMotor /dir:samples\MyRobotMotor /alt:&amp;quot;http://schemas.microsoft.com/robotics/2006/05/motor.html&amp;quot;&lt;/p&gt;
&lt;p&gt;然后打开生成的项目，按下面的说明进行相关更改就可以顺利使用了这个项目了。&lt;/p&gt;
&lt;p&gt;添加brick Service proxy的引用到项目，并且保证项目中有RoboticsCommon proxy的引用。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100124/14434L2O-1.JPG&quot; alt=&quot;添加服务代理的引用&quot; /&gt;&lt;br /&gt;
图4-添加服务代理的引用&lt;/p&gt;
&lt;p&gt;为brick service proxy添加命名空间&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1 using brick = Robotics.MyBrickService.Proxy;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;添加brick service为伙伴服务  &lt;/strong&gt;&lt;br /&gt;
1 [Partner(&amp;quot;MyBrickService&amp;quot;,&lt;br /&gt;
2 Contract = brick.Contract.Identifier,&lt;br /&gt;
3 CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate,&lt;br /&gt;
4 Optional = false)]&lt;br /&gt;
5 brick.MyBrickServiceOperations _myBrickPort = new brick.MyBrickServiceOperations();&lt;br /&gt;
6&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实现 SetMotorPower消息&lt;/strong&gt;&lt;br /&gt;
1 [ServiceHandler(ServiceHandlerBehavior.Exclusive)]&lt;br /&gt;
2 public IEnumerator SetMotorPowerHandler(motor.SetMotorPower setMotorPower)&lt;br /&gt;
3 {&lt;br /&gt;
4     //flip direction if necessary&lt;br /&gt;
5     double revPow = setMotorPower.Body.TargetPower;&lt;br /&gt;
6     if (_state.ReversePolarity)&lt;br /&gt;
7     {&lt;br /&gt;
8         revPow *= -1.0;&lt;br /&gt;
9     }&lt;br /&gt;
10 &lt;br /&gt;
11     //update state&lt;br /&gt;
12     _state.CurrentPower = revPow;&lt;br /&gt;
13 &lt;br /&gt;
14     //convert to native units&lt;br /&gt;
15     int power = (int)Math.Round(revPow * _state.PowerScalingFactor);&lt;br /&gt;
16 &lt;br /&gt;
17     //send hardware specific motor data&lt;br /&gt;
18     brick.SetMotor motordata = new brick.SetMotor();&lt;br /&gt;
19     motordata.PowerSetpoint = power;&lt;br /&gt;
20 &lt;br /&gt;
21     yield return Arbiter.Choice(&lt;br /&gt;
22         _myBrickPort.SendMotorCommand(motordata),&lt;br /&gt;
23         delegate(DefaultUpdateResponseType success)&lt;br /&gt;
24         {&lt;br /&gt;
25             setMotorPower.ResponsePort.Post(success);&lt;br /&gt;
26         },&lt;br /&gt;
27         delegate(Fault failure)&lt;br /&gt;
28         {&lt;br /&gt;
29             setMotorPower.ResponsePort.Post(failure);&lt;br /&gt;
30         }&lt;br /&gt;
31     );&lt;br /&gt;
32 &lt;br /&gt;
33     yield break;&lt;br /&gt;
34 }&lt;br /&gt;
35&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;订阅服务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们创建的大多数的服务是为了获取传感器的数据为目的的，这就需要这些服务去订阅Birck Service，他们使用上面所实现的自定义订阅来订阅相应的传感器数据，下面我们看一个MyRobotBumper服务，这个服务实现了 Robotics Common中的ContactSensorArray服务的Contract，和上面所说Motor Service的创建方式类似。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
1 using bumper = Microsoft.Robotics.Services.ContactSensor.Proxy;&lt;br /&gt;
2 using brick = Robotics.MyBrickService.Proxy;&lt;br /&gt;
3 using submgr = Microsoft.Dss.Services.SubscriptionManager;&lt;br /&gt;
4 &lt;br /&gt;
5 private void SubscribeToNXT()&lt;br /&gt;
6 {&lt;br /&gt;
7 // Create a notification port&lt;br /&gt;
8 brick..MyBrickServiceOperations _notificationPort = new brick.MyBrickServiceOperations();&lt;br /&gt;
9 //create a custom subscription request&lt;br /&gt;
10 brick.MySubscribeRequestType request = new brick.MySubscribeRequestType();&lt;br /&gt;
11 //select only the sensor and ports we want&lt;br /&gt;
12 //NOTE: this name must match the names you define in MyBrickService&lt;br /&gt;
13 request.Sensors = new List();&lt;br /&gt;
14 foreach (bumper.ContactSensor sensor in _state.Sensors)&lt;br /&gt;
15 {&lt;br /&gt;
16 //Use Identifier as the port number of the sensor&lt;br /&gt;
17 request.Sensors.Add(&amp;quot;TOUCH&amp;quot; + sensor.Identifier);&lt;br /&gt;
18 }&lt;br /&gt;
19 //Subscribe to the brick and wait for a response&lt;br /&gt;
20 Activate(&lt;br /&gt;
21 Arbiter.Choice(_myBrickPort.SelectiveSubscribe(request, _notificationPort),&lt;br /&gt;
22 delegate(SubscribeResponseType Rsp)&lt;br /&gt;
23 {&lt;br /&gt;
24 //update our state with subscription status&lt;br /&gt;
25 subscribed = true;&lt;br /&gt;
26 LogInfo(&amp;quot;MyRobotBumper subscription success&amp;quot;);&lt;br /&gt;
27 //Subscription was successful, start listening for sensor change notifications&lt;br /&gt;
28 Activate(&lt;br /&gt;
29 Arbiter.Receive&lt;br /&gt;
30 (true, _notificationPort, SensorNotificationHandler)&lt;br /&gt;
31 );&lt;br /&gt;
32 },&lt;br /&gt;
33 delegate(Fault F)&lt;br /&gt;
34 {&lt;br /&gt;
35 LogError(&amp;quot;MyRobotBumper subscription failed&amp;quot;);&lt;br /&gt;
36 })&lt;br /&gt;
37 );&lt;br /&gt;
38 }&lt;br /&gt;
39 private void SensorNotificationHandler(brick.Replace notify)&lt;br /&gt;
40 {&lt;br /&gt;
41 //update state&lt;br /&gt;
42 foreach (bumper.ContactSensor sensor in _state.Sensors)&lt;br /&gt;
43 {&lt;br /&gt;
44 bool newval = notify.Body.SensorPort[sensor.Identifier - 1] == 1 ? true : false;&lt;br /&gt;
45 bool changed = (sensor.pssed != newval);&lt;br /&gt;
46 sensor.TimeStamp = DateTime.Now;&lt;br /&gt;
47 sensor.pssed = newval;&lt;br /&gt;
48 if (changed)&lt;br /&gt;
49 {&lt;br /&gt;
50 //notify subscribers on any bumper pssed or unpssed&lt;br /&gt;
51 _subMgrPort.Post(new submgr.Submit(sensor, DsspActions.UpdateRequest));&lt;br /&gt;
52 }&lt;br /&gt;
53 }&lt;br /&gt;
54 }&lt;br /&gt;
55&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;扩展状态&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前面的模式很容易实现并且在大多数情况下可以正常工作，因为状态和操作是通用的，但是，有时候我们还是想为状态添加一些信息或者添加一些操作类型，一个好的例子就是 sonar as bumper 服务，这个服务使用声波传感器代替一个碰撞传感器，这个服务实现了ContactSensorArray服务的Contract，除非你自己想添加自己状态，你需要这样的做的原因是这个服务需要包括一个距离和阈值的数据信息，这些在Contract服务没有给出。&lt;/p&gt;
&lt;p&gt;注意你的状态类是继承自ContactSensorArrayState 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整实现文件&lt;/strong&gt;： &lt;br /&gt;
1 &lt;br /&gt;
2 using bumper = Microsoft.Robotics.Services.ContactSensor.Proxy;&lt;br /&gt;
3 using brick = Robotics.MyBrickService.Proxy;&lt;br /&gt;
4 using submgr = Microsoft.Dss.Services.SubscriptionManager;&lt;br /&gt;
5 namespace Robotics.MyRobotSonarAsBumper&lt;br /&gt;
6 {&lt;br /&gt;
7 [Contract(Contract.Identifier)]&lt;br /&gt;
8 [AlternateContract(bumper.Contract.Identifier)]&lt;br /&gt;
9 [PermissionSet(SecurityAction.PermitOnly, Name=&amp;quot;Execution&amp;quot;)]&lt;br /&gt;
10 public class MyRobotSonarAsBumperService : DsspServiceBase&lt;br /&gt;
11 {&lt;br /&gt;
12 [InitialStatePartner(Optional = true)]&lt;br /&gt;
13 private MyRobotSonarAsBumperState _state;&lt;br /&gt;
14 [ServicePort(&amp;quot;/MyRobotSonarAsBumper&amp;quot;, AllowMultipleInstances = true)]&lt;br /&gt;
15 private MyRobotSonarAsBumperOperations _mainPort = new MyRobotSonarAsBumperOperations();&lt;br /&gt;
16 [AlternateServicePort(&lt;br /&gt;
17 &amp;quot;/MyRobotBumper&amp;quot;,&lt;br /&gt;
18 AllowMultipleInstances = true,&lt;br /&gt;
19 AlternateContract=bumper.Contract.Identifier&lt;br /&gt;
20 )]&lt;br /&gt;
21 private bumper.ContactSensorArrayOperations&lt;br /&gt;
22 _bumperPort = new bumper.ContactSensorArrayOperations();&lt;br /&gt;
23 [Partner(&lt;br /&gt;
24 &amp;quot;MyRobotBrick&amp;quot;,&lt;br /&gt;
25 Contract = brick.Contract.Identifier,&lt;br /&gt;
26 CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate,&lt;br /&gt;
27 Optional = false&lt;br /&gt;
28 )]&lt;br /&gt;
29 private brick.MyBrickServiceOperations _brickPort = new brick.MyBrickServiceOperations();&lt;br /&gt;
30 [Partner(&lt;br /&gt;
31 &amp;quot;SubMgr&amp;quot;,&lt;br /&gt;
32 Contract = submgr.Contract.Identifier,&lt;br /&gt;
33 CreationPolicy = PartnerCreationPolicy.CreateAlways,&lt;br /&gt;
34 Optional = false)]&lt;br /&gt;
35 private submgr.SubscriptionManagerPort _subMgrPort = new submgr.SubscriptionManagerPort();&lt;br /&gt;
36 &lt;br /&gt;
37&lt;/p&gt;
&lt;p&gt;注意：主端口（main port）处理主端口的消息，备用端口处理备用端口的消息。&lt;/p&gt;
&lt;p&gt;现在为备用端口的消息添加消息处理方法：  &lt;br /&gt;
1 // Listen on the main port for requests and call the appropriate handler.&lt;br /&gt;
2 Interleave mainInterleave = ActivateDsspOperationHandlers();&lt;br /&gt;
3 //listen on alternate service port for requests and call the appropriate handler.&lt;br /&gt;
4 mainInterleave.CombineWith(new Interleave(&lt;br /&gt;
5 new TeardownReceiverGroup(&lt;br /&gt;
6 Arbiter.Receive(&lt;br /&gt;
7 false,&lt;br /&gt;
8 _bumperPort,&lt;br /&gt;
9 DefaultDropHandler&lt;br /&gt;
10 )&lt;br /&gt;
11 ),&lt;br /&gt;
12 new ExclusiveReceiverGroup(&lt;br /&gt;
13 Arbiter.ReceiveWithIterator(&lt;br /&gt;
14 true,&lt;br /&gt;
15 _bumperPort,&lt;br /&gt;
16 ReplaceHandler&lt;br /&gt;
17 ),&lt;br /&gt;
18 Arbiter.ReceiveWithIterator(&lt;br /&gt;
19 true,&lt;br /&gt;
20 _bumperPort,&lt;br /&gt;
21 SubscribeHandler&lt;br /&gt;
22 ),&lt;br /&gt;
23 Arbiter.ReceiveWithIterator(&lt;br /&gt;
24 true,&lt;br /&gt;
25 _bumperPort,&lt;br /&gt;
26 ReliableSubscribeHandler&lt;br /&gt;
27 )&lt;br /&gt;
28 ),&lt;br /&gt;
29 new ConcurrentReceiverGroup(&lt;br /&gt;
30 Arbiter.ReceiveWithIterator(&lt;br /&gt;
31 true,&lt;br /&gt;
32 _bumperPort,&lt;br /&gt;
33 GetHandler&lt;br /&gt;
34 ),&lt;br /&gt;
35 Arbiter.Receive(&lt;br /&gt;
36 true,&lt;br /&gt;
37 _bumperPort,&lt;br /&gt;
38 DefaultLookupHandler&lt;br /&gt;
39 )&lt;br /&gt;
40 )&lt;br /&gt;
41 ));&lt;/p&gt;
&lt;p&gt;注意你需要为主端口和备用端口的相同的消息实现不同处理方法，比如Get，Replace，Dubscribe等,Get消息的处理方法如下：&lt;br /&gt;
&lt;br /&gt;
1 [ServiceHandler(ServiceHandlerBehavior.Concurrent)]&lt;br /&gt;
2 public IEnumerator MyGetHandler(Get get)&lt;br /&gt;
3 {&lt;br /&gt;
4   get.ResponsePort.Post(_state);&lt;br /&gt;
5   yield break;&lt;br /&gt;
6 }&lt;br /&gt;
7 public IEnumerator GetHandler(bumper.Get get)&lt;br /&gt;
8 {&lt;br /&gt;
9   get.ResponsePort.Post(bumper.ContactSensorArrayState)_state.Clone());&lt;br /&gt;
10   yield break;&lt;br /&gt;
11 }&lt;/p&gt;
&lt;p&gt;注意：在后面的Get消息处理方法中，需要将子类转换为父类（ContactSensorArrayState），因为在将状态对象序列化时，是序列化它实际的对象类型，假如你想获取基类型的序列化对象，但是实际获得的却是子类对象，所以状态类显式实现了Clone（）方法进行类型转换，而不是利用隐式转换！！&lt;br /&gt;
&lt;strong&gt;最后&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;说实话，俺没怎么接触过硬件，虽然学的是硬件相关的专业，文章是MSDN里的一篇《Robotics Tutorial 6 (C#) - Remotely Connected Robots》，最近学这个东东，英文看完眼睛疼，而且看完英文就好像什么都没记住一样，我想翻译出来会好些吧？虽然本文没有什么思想之类的东西&amp;hellip;&amp;hellip;，语言也不太顺畅，如果你没接触过Microsoft Robotics Studio ，看起了可能比较难，这个博客=》laneser 对Robotics Studio研究的比较深，可惜只是他不再更新了。&lt;/p&gt;
&lt;p&gt;噢耶！You Potential！Our Passoin!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
    <pubDate>2010-01-24</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>E-者</comments>
</item>
<item>
    <title><![CDATA[关于智能机器人的研究]]></title>
    <link>http://www.robotain.com/tech/articles/201001/24322.html</link>
    <description>&lt;p&gt;&lt;strong&gt;认识视觉&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前我们对视觉的认识并不正确，将筷子的一部分插入水中，从筷子上反射出的光线在我们眼中形成了一个弯曲的筷子图像，筷子是直的但我们只看到了弯曲的筷子，这说明我们只能看到眼中筷子的图像，并不能看到筷子。一颗距离我们遥远的星星毁灭后我们仍然能够看到它，因为只要星星发出的光存在，就能在我们眼中形成星星的图像，我们就能看到它，这说明我们只看到了眼中的星星图像并没有看到星星。眼只起到形成物体图像的作用，眼中的物体图像必须传入脑才能在脑中被感应出来，这说明是脑看到了其中的物体图像世界而并不是眼看到了外界的物体世界，我们看到的世界完全在脑中，我们感觉到自己在物体世界中的运动是我们身体图像在脑中的图像世界中的运动，我们并不能感觉到真实的物体世界，是我们的感觉欺骗了我们。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大小的相对性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在我们睡觉时，假如能够将我们和周围的世界以相同比例放大，那么当我们醒来后，并不会感觉到我们的世界变大了。我们可以通过一个替身来感觉大小的相对性，通过立体成像镜、立体耳机和触觉传感器，把一个机器人的视觉、听觉和触觉传入我们的眼、耳和手，同时把我们身体关节的运动信号传给这个机器人，使机器人的运动与我们相同并且同时，这时我们就感觉到自己变成了这个机器人，我们的感觉被移植到这个机器人上，这样这个机器人就成为我们的替身。如果将我们的替身和替身所在的环境以相同比例缩小很多，那么虽然替身所在的环境比我们的环境小很多，但是当我们通过替身进入替身所在的环境后，并不能感觉到那里的环境比我们的环境小。&lt;/p&gt;
&lt;p&gt;我们只能看到脑中的图像世界，脑中的图像世界是一个独立的世界，而且脑中的图像世界与外界的物体世界做同时相同的运动，因此虽然我们看到的脑中图像世界比我们所在的真实世界小很多，但我们却感觉我们看到了一个真实的物体世界。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;智能机器人脑中的自身图形&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人通过电子眼在脑中形成的周围环境图形里必须存在一个与机器人做相同运动的机器人自身图形，这样机器人的脑才能知道自己存在于周围的环境中，因为机器人的脑只能知道脑中的图形世界，而脑中的图形世界又建立在真实的物体世界上，所以每个这样的机器人都有两个自己同时运动在两种世界中，一个是机器人脑中的自身图形，运动在脑中图形世界里，这个世界就是机器人所看到的世界，另一个是机器人的身体，运动在一个真实物体世界中，这个世界机器人并不能看到，我们可以在机器人脑中制作一个外表和结构与机器人相同的机器人自身图形，机器人的每个关节都嵌有传感器，当机器人运动时每个关节处的传感器将关节处运动变化传入机器人脑中，机器人的脑按照这个变化，控制机器人图形的关节做与机器人关节相同的运动，这样机器人的脑控制机器人运动时也同时相同地控制着机器人脑中自身图形的运动，机器人图形不移动位置只在原地运动，机器人向前运动时在机器人脑中通过电子眼形成的周围物体图形向机器人图形的身后移动，当机器人拿到一个物体时机器人脑中的自身图形也同时拿到了这个物体在机器人脑中形成的图形，这样当机器人在周围的物体世界中运动时机器人的图形也同时相同地运动在脑中的物体图形世界中。&lt;/p&gt;
&lt;p&gt;机器人身体上的传感器，将身体内部和周围环境对机器人身体产生的各种变化，转化成电流的变化，并传入到机器人脑中自身图形与机器人身体相对应的位置上，机器人的脑通过分析脑中自身图形上电流的变化，就能够知道自己和周围环境，这样机器人就对自己和周围环境产生了感觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何在智能机器人脑中形成立体图形世界&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人脑中自身图形上的双眼做与机器人双眼相同的运动，图一、中是机器人的双眼A、B看到物体E时在脑中形成了物体e的图形，这时脑中机器人图形上的双眼 a、b也转过了相同的角度，脑感觉到机器人图形的双眼a、b看到了物体图形e，当机器人看到两个前后距离有差别的物体F、H时，就会在机器人脑中形成三副物体的图形，如图二、是机器人双眼看物体F时在脑中形成的物体图形，图三、是机器人双眼看物体H时在脑中形成的物体图形，由于每只眼睛分别形成两幅物体图形所以通过两只眼睛一共看到四幅物体的图形，图二、中间的f和图三、中间的h是由两副图形重合在一起形成的,所以在脑中形成了三幅物体图形，这时脑在按照脑中图形双眼a、b和另外两个没有重合的物体图形连线的焦点，来移动并重合这两个没有重合的物体图形，如图四、图五和图八、图九，经过重合在机器人脑中最终形成了立体的物体图形h和f如图六、图七和图十、图十一，同一个物体通过机器人双眼在机器人脑中形成的两幅图形的几何形状有微小的差别，合拢这些微小的差别在机器人脑中能够形成立体的单个物体图形，由于在机器人脑中有双眼图形a、b的存在，这样当机器人看到很多物体图形时，机器人脑中的计算机就能够立刻在脑中形成一个与外界物体世界相同的立体图形世界，并知道每个物体到自己的距离。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;560&quot; height=&quot;550&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133417_1.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133417_1.jpg')&quot; /&gt;&lt;br /&gt;
&lt;img width=&quot;560&quot; height=&quot;550&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133417_2.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133417_2.jpg')&quot; /&gt;&lt;br /&gt;
&lt;img width=&quot;560&quot; height=&quot;550&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133417_3.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133417_3.jpg')&quot; /&gt;&lt;br /&gt;
&lt;img width=&quot;560&quot; height=&quot;500&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133417_4.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133417_4.jpg')&quot; /&gt;&lt;br /&gt;
&lt;img width=&quot;560&quot; height=&quot;550&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133417_5.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133417_5.jpg')&quot; /&gt;&lt;br /&gt;
&lt;img width=&quot;270&quot; height=&quot;532&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133500_1.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133500_1.jpg')&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关于智能机器人感觉的研究&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;虽然在机器人脑中形成了周围环境的立体图形，但机器人的脑对其中的物体图形并没有感觉，这样就不能很好地认识和识别其中的单个物体图形，物体与机器人接触能够使机器人脑中的自身图形产生变化，使机器人对物体产生感觉，当触觉、视觉等多种感觉结合在一起时机器人的感觉就具有了传递性，这时只要机器人看到一个物体，机器人脑中的这个物体图形上就会出现多种感觉，这样机器人通过视觉就能够在脑中形成一个立体的感觉图形世界。&lt;/p&gt;
&lt;p&gt;我们能够看到各种颜色的物体，这样能够让我们更好地区别、认识和感觉物体，单从颜色看，颜色的不同只是一种区别，并不具有感觉，只有将对颜色的区分与感觉结合在一起才能产生视觉。&lt;/p&gt;
&lt;p&gt;机器人能够区分各种颜色，如果将机器人对各种颜色的感觉与机器人对颜色的区别相结合，就能够使机器人产生视觉。在机器人脑中设定红色使机器人脑中自身图形增加温度值，蓝色使机器人脑中自身图形减少温度值，当机器人看到红色和蓝色时，就会感觉到红色是一种暖色蓝色是一种冷色，这样机器人就对颜色产生了感觉。同样我们可以在机器人脑中设定冷热、痛痒、香臭、甜苦等对机器人脑中自身图形产生的变化，如触觉上的冷暖，冷使机器人自身图形产生紧缩，暖使机器人自身图形产生舒展，再如嗅觉上的香臭，香使机器人自身图形产生靠近和融入，臭使机器人自身图形产生远离和排斥等。颜色、冷热、痛痒、香臭、甜苦对机器人自身图形产生了变化，因此机器人就有了视觉、触觉、嗅觉、味觉。&lt;/p&gt;
&lt;p&gt;感觉主要包括触觉、听觉、视觉、嗅觉、味觉，一般感觉都不是单独出现，例如：我们闻到某个水果的气味同时我们脑中就会有这个水果的视觉图像也会知道这个水果的味道和咀嚼时的软硬。在动物感觉的进化过程中视觉应该是最后出现的，但它主要是触觉的延伸，触觉是与物体直接接触这样我们就能够通过触觉对物体有一个全面的认识，例如我们用手触摸一个物体能够知道它的软硬、温度、形状、通过手上温度被接触到的物体传递走的快慢能够知道是金属还是非金属，只依靠视觉并不能很好地认识和辨别物体只有与触觉或更多的感觉相结合才能够很好地认识并识别物体。&lt;/p&gt;
&lt;p&gt;让机器人具有敏锐的感觉就必须使机器人具备多种感觉，其中最重要的是触觉与视觉的结合，当触觉与视觉结合在一起机器人就能够用视觉触摸物体，机器人的手能够感觉物体的软硬和温度，同时在机器人的手上产生一定的温度这样可以在机器人触摸到物体时通过热量损失的快慢来辨别物体的材质，机器人手上的各种感觉信号都传入脑中，在脑中机器人自身图形的手上表现出来，机器人的手如何触摸一个未知物体，机器人脑中的图形手就如何绘制这个物体图形，一旦对某个物体图形的形状和各种触摸感觉有了记忆，当机器人的手再次触摸到这个物体时只要识别了这个物体的某一部分，就会立刻在脑中出现这个物体的完整触摸图形，我们双手同时触摸两个物体时我们会发现当我们注意左手的触摸时就会忽略右手，注意右手的触摸时就会忽略左手，这说明在我们脑中的注意点是于手的触摸点分离的，手只起到传入触摸信号的作用，真正对物体的识别是脑中的注意点，机器人需要注意一个物体时这个物体的触摸图形就会在脑中注意点上出现，注意点总是跟随着手的触摸点运动，当机器人的手碰到了这个需要的物体图形时，就会将触摸到的感觉信号传入到脑中注意点上的这个物体的触摸图形上使机器人真正感觉到触摸到了这个物体，物体在机器人脑中通过手形成的触摸图形是没有颜色的，机器人脑中的注意点会引导机器人的手和眼同时触摸和看一个物体的同一个位置，这样就能够在机器人脑中形成并记忆一个带有颜色的物体图形，同样如果我们再给机器人增加听觉、嗅觉、味觉，那么在机器人脑中形成的触摸图形就会具有多种感觉，这时不论机器人是触摸到一个熟悉的物体还是看到这个物体或听到这个物体发出的声音，都会在机器人脑中这个物体的图形上同时出现这个物体的各种感觉，机器人脑中具有整体意义的单个物体感觉图形总是单个出现，例如：苹果、杯子、汽车、楼房等，这样虽然机器人通过眼睛在脑中形成了很多物体的图形，但只有注意点在哪个物体图形上哪个物体图形才能产生多种感觉，这样机器人只通过视觉或触觉或听觉或嗅觉就会十分快速准确地识别和感觉各种物体，因为是机器人所以我们可以在一个机器人脑中制造多个单独的识别系统，这样机器人就能够同时感觉很多物体使机器人的感觉变得更敏锐。&lt;/p&gt;
&lt;p&gt;一幅画在机器人脑中形成的图形是平面的，但由于画中的物体能够在机器人脑中产生多种感觉，因此机器人感觉到画中的物体是立体的，同时对看到的画中不同的物体有不同的感觉。&lt;/p&gt;
&lt;p&gt;在机器人脑中存储着各种物体的感觉图形，感觉图形主要是由触摸图形、视觉图形和嗅觉、味觉、听觉等多种感觉组成。机器人脑中的触摸图形是通过机器人手的触摸在脑中形成的，因为是机器手的直接触摸所以能够对物体或某种现象的特征有一个全面而细致的认识。当机器手触摸一根细铁丝和一根细钢丝能感觉到它们在弹力上的不同，触觉主要是对力和温度的感觉，机器手在液体中运动时能够通过触觉感觉流动的液体对手的作用力，并通过对作用力的分析和对机器手上温度传递快慢的分析来判断是水还是其它液体。机器手抓住一个在水中运动的鱼能够通过触觉感觉鱼在水中游动时身体的扭动力，如果机器人已经对水的作用力有了认识，这时机器人就能够通过鱼身体的扭动力感觉并知道鱼在水中游动时水对鱼身体的作用力。通过听觉、视觉、嗅觉、味觉，机器人能够更好地认识和识别物体，机器人可以敲击物体通过物体发出的声音来辨别是木头还是铁，可以通过味觉、嗅觉和触觉来辨别食品等。&lt;/p&gt;
&lt;p&gt;当机器人的视觉图形与触摸图形和其它感觉结合在一起时，机器人不用和其它物体直接接触就能够通过视觉提取出一个物体的多种感觉图形，有的物体虽然以前没有见过但机器人触摸过制作它的材质，这样机器人就能对这个物体产生多种感觉。机器人脑中记忆的物体感觉图形是具有各种不同感觉的独立物体图形，机器人的眼睛总是跟随着脑中的触摸点运动，脑中的触摸点处于自由的搜索运动状态，当触摸点碰到哪个物体图形哪个物体的感觉图形就会在机器人脑中出现，这样当机器人环顾四周，就能够在机器人脑中出现一个包括自身图形在内的，具有感知的立体感觉图形世界。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;智能机器人对物体的触摸和思考&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人用手触摸物体时，脑中存在的机器人自身图形的手也同样触摸着脑中这个物体的图形。机器人图形手在脑中有精确的运动位置，这样机器人的脑就能够通过机器人图形手知道机器人手的精确位置。机器人触摸一个平面或一个圆面时，只需要用手在表面摸几下就可以确定物体的表面是平面还是圆面。机器人的手接触到物体，会在机器人脑中产生多个接触点，当接触点都在一个平面上机器人脑中就出现平面，接触点都在一个圆面上机器人脑中就出现一个圆面，机器人的手在物体表面运动能够留下更多的接触痕迹，这样能够在机器人脑中形成更准确的物体表面图形。机器人脑中的物体触摸图形并不完全是由接触点画出的，只要通过接触点能够大概确定一个物体图形，机器人脑中就会出现这个物体的触摸图形。机器人用手摸到一个熟悉的物体，只要识别了这个物体的一小部分，就能够在机器人脑中出现这个物体的完整触摸图形，如果这个物体在运动那么这时机器人脑中就会有这个物体的运动触摸图形，这时我们发现机器人对于一个熟悉的物体，只要触摸到这个物体的很少部分，就能够在机器人脑中出现这个物体的静止或运动的触摸图形。&lt;/p&gt;
&lt;p&gt;机器人通过手传入脑中的物体触摸信号，是一些反映物体表面、几何形状、软硬、温度等的一些电流信号。机器人只要触摸到一个熟悉物体的外表，就能够在机器人脑中出现反映这个物体的表面、形状、软硬、温度等各种电流信号。那么机器人通过眼也能够在机器人脑中形成反映物体表面、形状的电流信号，因此机器人能够用眼触摸物体，通过眼在机器人脑中形成反映物体表面、形状、软硬、温度等各种电流信号。而且机器人通过眼能够更快速、准确、细致地触摸物体，比如机器人通过眼触摸一个玻璃杯掉地摔碎的过程，在这个过程中机器人的眼触摸到一个完整的玻璃杯掉地后变成很多玻璃碎片，如果在机器人脑中设定机器人喜欢玻璃杯保持完整，这样机器人在拿玻璃杯时就会比较注意怕玻璃杯掉地变碎。在机器人脑中设定了机器人对各种物体图形的要求，机器人就会根据各种物体图形的性质对物体图形进行思考。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;智能机器人对问题的思考&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人的需要能够使机器人主动对问题思考，在机器人脑中存储着各种物体的触摸图形，如果机器人需要苹果并知道苹果在盒子里，这时在机器人眼前有一个小盒子和一个大盒子，首先机器人要提取出脑中存储的苹果图形，在脑中的小盒子图形和大盒子图形上进行试验，如果机器人发现小盒子放不下苹果，机器人就会马上判断大盒子有苹果，然后主动向大盒子走去。因为在机器人脑中有机器人自身图形，这样机器人的脑就很容易指挥机器人自身图形绕过脑中其它物体图形向需要的物体图形走去。如果机器人的身体需要充电，机器人脑中的注意点上就会提取出电源插座的图形，当机器人看到电源插座后就会主动向电源插座走去。在机器人脑中的物体图形，随着与机器人自身图形之间距离的增加，出现与距离成正比的缩小，但对于机器人，脑中的物体图形并没有因为离机器人自身图形距离的增加而变小，因为机器人脑中衡量物体大小的尺度也在远离机器人自身图形的同时不断变小，例如在机器人脑中复制一个机器人手的图形，机器人手的图形随着远离机器人自身图形不断变小，但当它触摸远处的物体图形时并不会感觉物体图形变小，因为这时机器人图形手与远处物体图形变小的比例相同。如果机器人只能探到一米高，而电源插座在一点五米高，这时机器人就要在能探到电源插座的地方先复制一个自身图形，复制的机器人图形脚下就会与地面之间出现空缺，出现对这一高度物体的需要，这时机器人脑中的注意点上就会出现满足这一高度的桌子凳子等物体图形，当机器人看到一个满足这一高度的凳子就会向凳子走去，并将凳子图形放到复制的机器人图形脚下的空缺处，这时机器人的自身图形必须在复制的机器人图形的位置才能给自己充电，这样机器人就会站在凳子上然后给自己充电。在机器人脑中产生了空缺就有了需要，有了需要就产生了空缺，有了需要和空缺机器人就能主动思考问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关于智能机器人运动平衡的研究&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器人自身图形需要怎样的运动，机器人的脑就指挥机器人做怎样的运动。因为在机器人脑中，有机器人自身图形上每个部位的形状、密度、大小和每一时刻的位置，所以不论机器人的自身图形做怎样的运动，机器人的脑中都能很快计算出自身图形的质点。重力方向很容易被测量，自身图形的质点和重力方向合并在一起，就在机器人脑中有了机器人自身图形的重心。机器人必须能用一条腿很容易站稳，，这样对机器人做各种运动都十分重要。机器人脑中自身图形的每一个关节的运动变化，都可能影响到脑中自身图形重心的变化。如果机器人用一只脚站立，那么机器人的脑能够通过调整机器人身体关节的轻微运动来调整脑中机器人自身图形的重心，使机器人自身图形的重心和图形脚中心位置总保持在一条重力线上，这样当机器人用一只脚站立时，遇到轻微的碰撞也能够通过身体的自动调整使机器人不会摔倒。&lt;/p&gt;
&lt;p&gt;机器人的脚与地面接触，会在机器人脑中形成图形脚的接触面和确定一个较大范围的图形地面。机器人用一只脚站立，自身图形的重心点投影在机器人脑中图形脚的接触面中。当机器人双脚走路时，机器人脑中自身图形的重心点投影在自身图形双脚接触面的连线中，在机器人脑中自身图形双脚的接触面，能够确定并形成更准确的图形地面。反过来当机器人重心突然偏移，会在机器人脑中图形地面上出现一个运动的重心投影点，这时机器人自身图形必须马上向重心投影点的运动方向迈出一步，这一步的大小应该保证重心的投影点在自身图形的双脚连线之间。&lt;/p&gt;
&lt;p&gt;在机器人脑中有了与机器人做相同运动的机器人自身图形，机器人的脑就能够随时知道机器人自身图形做各种运动时的重心变化，这样机器人的脑就能够按照重心偏移的快慢来选择迈步的速度，当机器人需要快速起跑时要先有意造成身体重心向前的快速偏移，这样就必须快速向重心偏移的方向迈步才能保持机器人身体平衡。当机器人受到碰撞使身体的重心快速偏移，机器人就必须快速向重心偏移的方向迈步使机器人身体平衡。&lt;/p&gt;
&lt;p&gt;机器人用一只脚站立时，脑中自身图形的重心投影点，保持在图形脚的中间位置。当机器人重心出现偏移，图形脚上的重心投影点也出现偏移。如图一、图形脚上的重心投影点向脚的大拇指方向偏移，这时机器人的脑将通过增加机器人脚上大拇指向下的力，使机器人脚与腿的夹角略微增大，这样机器人的身体就沿着大拇指的反方向略微后仰，同时脑中自身图形重心的投影点向图形脚的中心位置运动。机器人也能够通过指挥身体的其它部位，如让机器人的胳膊张开远离身体的中心线，通过改变力臂调整机器人的重心。实际当机器人重心出现偏移，机器人的脑应该同时调整身体多个关节的运动来调整重心的偏移。图二、中机器人脑中每只图形脚受到的力可用一个受力点来表示，机器人脚底受力不均匀时受力点就会偏离图形脚的中心位置。机器人站立时脑中自身图形的重心投影在双脚图形受力点的连线之间如图二。机器人行走时，脑中机器人自身图形的重心，投影在机器人双脚图形受力点的连线之间如图三。图四、是机器人行走时脑中自身图形重心投影点的运动轨迹。&lt;/p&gt;
&lt;p&gt;在机器人脑中有与机器人做相同运动的自身图形，机器人就能够通过脑中自身图形上重心投影点的变化，随时知道机器人重心的变化，这样机器人的脑就能够准确地控制机器人身体做各种运动，使机器人在运动时始终保持运动平衡。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;581&quot; height=&quot;533&quot; border=&quot;0&quot; src=&quot;/uploads/allimg/100124/1_100124133501_2.jpg&quot; alt=&quot;&quot; style=&quot;cursor: pointer;&quot; onclick=&quot;window.open('/uploads/allimg/100124/1_100124133501_2.jpg')&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人工生命智能机器人&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前人们认为人直接看到了物体，按照这一认识，人只能看到一个真实的自己，这样制造的机器人脑中没有机器人自身的图形，因此目前的机器人只具有物体的性质并不具有图形的性质。生命的各种特征可以在图形中表现出来，例如存在于计算机中的人工生命，而目前的机器人脑中没有机器人自身图形，所以目前的机器人不具有任何生命特征。&lt;/p&gt;
&lt;p&gt;在机器人脑中形成一个完整的感觉图形世界，就能够使机器人具有人工生命。我们可以在机器人脑中的自身图形上设定各种变化和添加各种图形，如在机器人脑中的自身图形上添加一个跳动的心脏，心脏上红色的变化是高兴的变化，黄色的变化是喜欢的变化，蓝色的变化是不高兴的变化，同时红色和黄色的增多可增加心脏的跳动，这时我们可以设定语言中表扬的话可增加黄色和红色同时减少蓝色，骂人的脏话可增加蓝色同时减少黄色和红色，心脏图形的黄色和红色增加会使机器人增加笑容同时声音向柔和方向转变，心脏图形的蓝色增加会使语言中的脏话增多笑容减少。机器人心脏图形上的颜色在随时随地不断变化，因此机器人的表情表现的很自然。这样的机器人可能不会因为你说一句好话就高兴，因为他的高兴是心脏图形颜色的整体表现，他可能也不会因为你说一句脏话而不高兴，但你对机器人说脏话会增加机器人身体图形的蓝色。如果我们设定好机器人心脏图形颜色趋向于黄色红色的某一数值，当你向机器人说脏话时机器人会向你说脏话不好不要说了，机器人不让你对它说脏话，这样可以阻止它心脏图形颜色向蓝色发展，如果你不停地对机器人说脏话，机器人就会生气，机器人不能通过语言来阻止你使它身体图形颜色向蓝色发展就只能选择离开你，在离开时可能会骂你一句才走。当机器人处于高兴状态时，向机器人说使它高兴的话会使它笑出声来，笑出来声音是对高兴过多的释放，机器人笑过后又处于高兴状态。&lt;/p&gt;
&lt;p&gt;如果你和机器人说话会使它心脏图形上的黄色增加到一个设定的喜欢的黄色标准，他就会锁定你喜欢上你，以后一见到你或听到你说话的声音心脏的图形就增加黄色，离开你以后心脏图形黄色就会慢慢减少，为了阻止心脏图形黄色的减少机器人必须找到你，机器人感到离不开你，当你不在时它会在你经常出现的地方等你，如果有另一个人或一些事能取代你使机器人维持这种心脏图形的黄色标准，你对他就不重要了，他可能不再主动来找你。我们在机器人自身图形上的各种设定可随着时间环境的变化自动改变，如计算机人工生命技术中为虚拟生命体的设定会随时间而变化，这样机器人处于一个新环境时机器人会去逐渐适应环境。&lt;/p&gt;
&lt;p&gt;机器人脑中储存着各种单个物体的感觉图形，对周围环境的记忆可通过对环境中各物体的名称、位置等记忆实现，需要时提取记忆中各物体的名称、位置等，记忆中环境的感觉图形就能够在机器人脑中被组合出来，在机器人脑中有磁定位器，这样机器人只要确定一个物体的位置就能够知道其它在视线之外物体的位置，磁定位器能够保证看到的图形世界和脑中提取的相对应的感觉图形世界在位置上不产生旋转，当机器人听到另一个屋子中有瓶子掉地摔碎的声音，机器人脑中立刻提取出那个屋子里环境中各物体的感觉图形，并根据声音和瓶子的位置，分析出掉地的可能是哪个瓶子。对家中的小狗，机器人可以利用计算机人工生命技术，使脑中提取出的小狗图形产生饥饿感，当机器人出门在外，脑中的小狗图形过一段时间就会饿，机器人就知道应该回家喂小狗了，机器人脑中小狗图形饥饿后的各种表现就是机器人对小狗饿了的想象，有时想象和实际是不同的，如果这时有人喂饱了小狗，机器人出门在外并不知道，那么机器人脑中的小狗图形饿的乱叫时，可能家中的小狗已经安然入睡了。机器人可以通过蚊子的飞行声音和位置，提取出蚊子的感觉图形在机器人脑中飞行，这样机器人就能够像看到飞行的蚊子一样对蚊子进行分析。利用计算机人工生命技术，使机器人脑中的动物图形具有人工生命，当机器人离开某个动物时，这个动物的图形在机器人脑中仍然在变化着，机器人可通过实际动物的变化来纠正脑中动物图形的变化，如果机器人长时间不能见到实际的动物，那么实际动物的变化和机器人脑中相对应的动物图形的变化就会产生较大差别，这样机器人就会提出问题，当机器人很长时间没有见到一只认识的小狗时，脑中的小狗图形已经长大了，机器人知道小狗有人喂养，所以在机器人脑中的小狗图形不会产生饥饿感，当机器人再次见到这只小狗时，如果小狗在机器人脑中形成的实际小狗图形比脑中长大的小狗图形大很多，那么机器人就会感到吃惊，并会向喂小狗的主人问给小狗吃了些什么等一些问题，机器人脑中有自己喂小狗的食谱，这时就可以和小狗主人喂小狗的食谱进行对比，找出自己喂小狗的不足之处。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;作者&lt;/strong&gt;：韩晓刚，首发于新浪博客&amp;mdash;&lt;a href=&quot;http://blog.sina.com.cn/u/1544667931&quot; target=&quot;_blank&quot;&gt;韩晓刚智能机器人&lt;/a&gt;。&lt;/p&gt;</description>
    <pubDate>2010-01-24</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>韩晓刚智能机器人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人18：让魔方动起来]]></title>
    <link>http://www.robotain.com/tech/diy/201001/23321.html</link>
    <description>&lt;p&gt;我原来的代码又多又乱还没有注释，自己看着都眼晕，找点代码晕的跟坐过山车似的。现在正在把它们重新整理优化，再加上注释。我打算整理一部分就发一部分攻略，攻略发完了也就整理完了。另外，这几天有很多网友正帮忙翻译&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtTutorial_cn/index.aspx&quot;&gt;lejos的中文教程&lt;/a&gt;，我在整理的过程中也学到了不少东西，有兴趣的同学还可以加入。&lt;/p&gt;
&lt;p&gt;下面开始正题。假设现场的观众们按照前面的攻略，已经把萝卜头搭建好了。第一段程序先让魔方能动起来，实现的功能是：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;按Left键，魔方底座旋转90度&lt;/li&gt;
    &lt;li&gt;按Right键，爪子抓住魔方，然后底座带动最下面的层旋转90度&lt;/li&gt;
    &lt;li&gt;按Enter键，爪子把魔方翻转90度&lt;/li&gt;
    &lt;li&gt;按Escape键，程序退出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面介绍需要用到的一些知识点&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1，创建传感器和电机的实例&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//Define&amp;nbsp;Sensors&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;UltrasonicSensor&amp;nbsp;distance=new&amp;nbsp;UltrasonicSensor(SensorPort.S1);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;LightSensor&amp;nbsp;light&amp;nbsp;=&amp;nbsp;new&amp;nbsp;LightSensor(SensorPort.S2);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;ColorSensor&amp;nbsp;color&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ColorSensor(SensorPort.S3);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;//Define&amp;nbsp;Motors&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;Motor&amp;nbsp;paw=Motor.A;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;Motor&amp;nbsp;monitor=Motor.B;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;Motor&amp;nbsp;bottom=Motor.C;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//Define Sensors
&amp;nbsp;static UltrasonicSensor distance=new UltrasonicSensor(SensorPort.S1);
&amp;nbsp;static LightSensor light = new LightSensor(SensorPort.S2);
&amp;nbsp;static ColorSensor color = new ColorSensor(SensorPort.S3);
&amp;nbsp;//Define Motors
&amp;nbsp;static Motor paw=Motor.A;
static Motor monitor=Motor.B;
&amp;nbsp;static Motor bottom=Motor.C;
&lt;/pre&gt;
&lt;p&gt;这部分对应的是我们的接线方式：&lt;br /&gt;
传感器1口接超声波传感器，也就是眼睛&lt;br /&gt;
传感器2口接亮度传感器&lt;br /&gt;
传感器3口接颜色传感器&lt;br /&gt;
电机A口接爪子的电机&lt;br /&gt;
电机B口接颜色传感器的电机&lt;br /&gt;
电机C口接魔方底座的电机&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2，创建一个Robot类，这个类用于控制机器人结构上的各种动作，下面三个方法分别对应上面说的三个功能&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;class&amp;nbsp;Robot&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;RotateBottomSide(int&amp;nbsp;nQuarter)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;RotateBottom(int&amp;nbsp;nQuarter)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;RotatePaw()throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
public static class Robot
{
&amp;nbsp;public static void RotateBottomSide(int nQuarter)
&amp;nbsp;{&amp;nbsp;&amp;nbsp; }

&amp;nbsp;public static void RotateBottom(int nQuarter)
&amp;nbsp;{&amp;nbsp;&amp;nbsp; }

&amp;nbsp;public static void RotatePaw()throws Exception
&amp;nbsp;{&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;p&gt;这里使用了关键字static，因为萝卜头只有一个实例，所以把它设置成静态类。静态类可以直接使用静态方法，不需要创建实例，还是看一段代码对比下：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//创建实例的用法&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;Robot&amp;nbsp;instance&amp;nbsp;=&amp;nbsp;&lt;span&gt;new&amp;nbsp;Robot();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;instance.rotate();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;//静态类的用法&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;Robot.rotate();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//创建实例的用法
Robot instance = new Robot();
instance.rotate();
//静态类的用法
Robot.rotate();
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3，设置了一些参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;//如果爪子部分改装了那个3:1的减速齿轮，设置成true，不明白的请看&amp;nbsp;http://www.diy-robots.com/?p=147&amp;nbsp;最后两张图&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;boolean&amp;nbsp;HasReducer&amp;nbsp;=&amp;nbsp;true;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;//爪子抓住魔方时的电机角度&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;PawHoldPosition&amp;nbsp;=&amp;nbsp;56;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;//爪子翻动魔方时的电机角度&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;PawTurnOverPosition&amp;nbsp;=&amp;nbsp;110;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;//底座旋转90时，电机的旋转角度（因为齿轮组的原因）&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;BaseOneQuarter&amp;nbsp;=&amp;nbsp;315;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;//当底座旋转魔方底面时，因为魔方的阻力，需要先多转一个小角度，然后再转回来，这是用来修正误差的角度&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;int&amp;nbsp;BaseRotateFix&amp;nbsp;=&amp;nbsp;40;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
//如果爪子部分改装了那个3:1的减速齿轮，设置成true，不明白的请看 http://www.diy-robots.com/?p=147 最后两张图
&amp;nbsp;static boolean HasReducer = true;
&amp;nbsp;//爪子抓住魔方时的电机角度
&amp;nbsp;static int PawHoldPosition = 56;
&amp;nbsp;//爪子翻动魔方时的电机角度
&amp;nbsp;static int PawTurnOverPosition = 110;
&amp;nbsp;//底座旋转90时，电机的旋转角度（因为齿轮组的原因）
&amp;nbsp;static int BaseOneQuarter = 315;
&amp;nbsp;//当底座旋转魔方底面时，因为魔方的阻力，需要先多转一个小角度，然后再转回来，这是用来修正误差的角度
&amp;nbsp;static int BaseRotateFix = 40;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;4，控制电机（motor）的几个函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;paw.setSpeed(400);&amp;nbsp;//设置转速&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;paw.rotateTo(nPawHoldPosition);&amp;nbsp;&lt;span&gt;//旋转到一个指定角度（绝对定位）&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;bottom.rotate(-nFixAngle);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;//旋转一定角度（相对定位）&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
paw.setSpeed(400); //设置转速
paw.rotateTo(nPawHoldPosition); //旋转到一个指定角度（绝对定位）
bottom.rotate(-nFixAngle);&amp;nbsp;&amp;nbsp;&amp;nbsp; //旋转一定角度（相对定位）
&lt;/pre&gt;
&lt;p&gt;更多的电机相关函数，请&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtTutorial_cn/motortutorial/controllingmotors.aspx&quot;&gt;点这里&lt;/a&gt;看刚刚翻译好的教程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5，亮度传感器的一个函数，用于把它的灯打开或者关闭。这里是关闭它，省的晃眼睛，需要的时候再开&lt;/strong&gt; &lt;img alt=&quot;:)&quot; src=&quot;/uploads/allimg/100123/1Z5123M6-0.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=305#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;light.setFloodlight(false);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
light.setFloodlight(false);
&lt;/pre&gt;
&lt;p&gt;好了，最终解魔方的动作，都是通过调用这几个函数来完成的。事实上如果你足够无聊的话，现在就可以通过NXT上的几个按键来控制萝卜头玩魔方了。&lt;br /&gt;
该吃早饭了，大家自己看看&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com//RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100115.txt&quot;&gt;源代码&lt;/a&gt;吧。&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com//RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100115.txt&quot;&gt;http://www.diy-robots.com/RubikSolver/SourceCode/NXT/RubikSolverV2.java_20100115.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=305&quot; title=&quot;Permanent Link to 解魔方的机器人攻略19 &amp;ndash; 让魔方动起来&quot;&gt;解魔方的机器人攻略19 &amp;ndash; 让魔方动起来&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-23</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人17：魔方快速算法]]></title>
    <link>http://www.robotain.com/tech/diy/201001/23320.html</link>
    <description>&lt;p&gt;我们的快速魔方算法要隆重登场了，在此缺席感谢一下来自德国的&lt;a href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://tomas.rokicki.com/cubecontest/winners.html&quot; target=&quot;_blank&quot;&gt;Stefan Pochmann&lt;/a&gt;同学。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;魔方表示法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;咱们先看一串天书般的字母：UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR&lt;/p&gt;
&lt;p&gt;这种表示法是由一个叫Mike Reid的兄弟首先使用的，它表示一个已经被解好的魔方。&lt;/p&gt;
&lt;p&gt;先不要被这串字母吓倒，看算法就像追mm一样，要迎难而上。仔细观察，你会发现其中只有六种字母：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
U: Up&lt;br /&gt;
F: Front&lt;br /&gt;
R: Right&lt;br /&gt;
L: Left&lt;br /&gt;
B: Bottom&lt;br /&gt;
B: Back&lt;/p&gt;
&lt;p&gt;其实这就是代表了空间坐标系的六个方向，就是传说中的&amp;ldquo;眼观六路&amp;rdquo;的那六路。&lt;/p&gt;
&lt;p&gt;表示法中包含了12组双字母的组合，分别代表了魔方的12个棱，第一组UF就表示Up和Front之间夹角的棱。&lt;/p&gt;
&lt;p&gt;另外还包含了8组三字母的组合，分别代表了魔方的8个角，每个角由三块颜色组成。看下面的示意图：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;460&quot; height=&quot;430&quot; wp-image-281=&quot;&quot; title=&quot;Rubik&quot; src=&quot;/uploads/allimg/100123/1Z1294040-0.gif&quot; alt=&quot;魔方坐标系&quot; /&gt; &lt;br /&gt;
魔方坐标系&lt;/p&gt;
&lt;p&gt;等等，细心的朋友至少会想到两个问题：&lt;/p&gt;
&lt;p&gt;1，为什么没有中心的数据？&lt;/p&gt;
&lt;p&gt;因为魔方的六个心在任何旋转过程中，相对位置都是不会变的，这点拆过魔方的人应该比较容易理解。&lt;/p&gt;
&lt;p&gt;2，如果是一个打乱的魔方，棱和边的颜色已经和中心不一样了，这时候怎么表示？ 读取方法是：按照刚才那个天书字符串的顺序，先找到UF位置所对应的棱，假设现在U是红色，F是黄色； 那么对照图里的中心，红色的中心是R，黄色的中心是U，所以这时候的第一组棱字母是 RU 嗯，希望你看到这里还没有晕车的感觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;输出表示法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个程序的输出是这个样子：F- U+ F- D- L- D- F- U- L2 D-&lt;/p&gt;
&lt;p&gt;FRL之类的字母依然表示六个面，F-表示前层逆时针转90度，U+表示上层顺时针转90度，L2表示左边层转180度。&lt;/p&gt;
&lt;p&gt;如果你是魔友的话，会经常看到这样的字符串：F&amp;rsquo;UF&amp;rsquo;D'L&amp;rsquo;F'U&amp;rsquo;L2D&amp;rsquo;&lt;/p&gt;
&lt;p&gt;这是魔方论坛上比较常见的&amp;ldquo;黑话&amp;rdquo;，其实就是默认顺时针不加符号，逆时针的加一个单引号，180度的加2。&lt;/p&gt;
&lt;p&gt;请注意这里的顺时针和逆时针使用的是&amp;ldquo;观察者迎着某个面看&amp;rdquo;的参照系，例如B&amp;rsquo;是从下往上看的逆时针，如果你没有把脑袋钻到桌子下，你事实上看到的是顺时针旋转。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改写到C#&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这段程序是用C写的，说实话它的原理还比较复杂，有兴趣的同学可以搜索&amp;ldquo;Thistlethwaite&amp;rsquo;s algorithm&amp;rdquo;&lt;br /&gt;
我直接依葫芦画瓢用C#把它重写了一遍，请点击&lt;a href=&quot;http://www.diy-robots.com/RubikSolver/RubikSolverSample.zip&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;下载源代码。请主要要安装VS2008或更高版本。&lt;br /&gt;
http://www.diy-robots.com/RubikSolver/RubikSolverSample.zip&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=282&quot; title=&quot;Permanent Link to 解魔方的机器人攻略18 &amp;ndash; 魔方快速算法&quot;&gt;解魔方的机器人攻略18 &amp;ndash; 魔方快速算法&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-23</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[采用LabVIEW及CompactRIO为视力障碍人群设计半自动车]]></title>
    <link>http://www.robotain.com/tech/articles/201001/23318.html</link>
    <description>&lt;p&gt;致力于提升并发挥失明人群经常被低估的能力，鼓励服务于视力障碍群体的技术创新开发，美国国家失明人士联合会提出建议，设计一种系统来帮助失明人群尝试从未有过的体验：驾驶。弗吉尼亚理工大学的机器人与器械实验室(RoMeLa)是唯一一个接收挑战的组织。该大学机械工程系 于2008年重新建立了高年级设计团队和大学生研究项目弗吉尼亚大学盲人驾驶挑战(BDC)，他们为世界首辆可用的盲人驾驶车辆原型定义了最初的目标。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100123/1205503627-0.jpg&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
15岁的失明者Ishaan Rostogi(图片轮椅上)，驾驶由弗吉尼亚理工大学采用NI技术设计的世界首辆盲人驾驶车辆&lt;/p&gt;
&lt;p&gt;9名大学生仅花费两个学期，$3,000 USD经费就完成了设计，盲人驾驶员可安全地实现三种基本驾驶任务：在由单排的锥形交通路标定义的曲线驾驶路线中行进;预先设定的正常速度行驶;有效的紧急刹车能力以避开与障碍物的碰撞。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们的原型平台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;从项目的最初开始，盲人驾驶系统的软硬件设计中仅用了NI的产品。我们选择NI产品的原因是其低成本的原型设计平台、快速的数据采集和处理，确保在实时系统中能最小化时间迟滞、与各类传感器及设备的兼容性、苛刻测试环境下的性能及可靠性、直观的编程界面、模块化、尺寸、重量、以及未来开发中的硬件扩展能力。研究人员考察了RoMeLa在各类应用中长期使用NI产品的成功经验，包括从类人足球机器人到全自治式车辆。除了盲人驾驶系统，这些应用证明了NI软硬件在机器人应用建模平台上的多功能性及功能理想性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;环境感知&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前的盲人驾驶系统由各类传感器和新颖的非视觉驾驶界面组成，就像附加在沙漠越野汽车上的模块化系统。我们采用Hokuyo UTM-30LX单平面激光测距仪作为环境探测器，扫描驾驶环境中的锥形交通路标及其它障碍，并将扫描信息送到板载NI cRIO-9072实时处理器及实时可编程门阵列(FPGA)处理目标上。现有的NI设备驱动能够直接支持Hokuyo LRF产品，因为NI工程师在UTM-30LX公开发布之前就提供了自定义驱动。&lt;/p&gt;
&lt;p&gt;运行LabVIEW软件的笔记本电脑提供了支持cRIO-9072的临时USB连接能力，由于30LX仅有USB接口，不像以前使用的其它多数模块可选RS232接口。我们做了进一步设计使实时控制器提供USB连接能力，并绕开笔记本电脑采用第三方转换芯片;然而，cRIO-9072与笔记本电脑间的以太网通信对目前的需求来说已经足够了。 笔记本电脑还支持正常视力的乘客被动监视所有软硬件的操作，轻松修改任何启发式编程，从而能够在现场试验中快速标定。&lt;/p&gt;
&lt;p&gt;其它传感器根据车辆的状态来采集重要信息，如霍尔效应传感器通过弦丝电位器采集速度信息及操纵角度。我们从这些传感器采集数据，并采用CompactRIO实时控制器上的高速FPGA直接处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非视觉驾驶界面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过各类传感器完成驾驶环境图像采集后，我们对数据进行处理并通过非视觉方式传送给驾驶员。开发非视觉驾驶界面 (NVDI) 的最终目标是向驾驶员提供高效的信息，最大化驾驶员的环境感知度，从而快速精确的作出驾驶决策。车辆最初的NVDI上的包含了针对安全性和冗余备份的信息和指示。&lt;/p&gt;
&lt;p&gt;对于限速规则，驾驶员可自如地驾驶直至到达速度上限，此时座椅安全带上的震动触觉的背心会提示驾驶员需要多大的刹车力度来使车辆回到安全速度。如果车辆探测到不可避免的障碍物碰撞，背心会提示驾驶员紧急刹车。&lt;/p&gt;
&lt;p&gt;最初的背心测试中，我们采用了自定义电路板来控制电机马达。RS232信号从PC上的LabVIEW软件传输到PIC控制器，通过控制晶体管和继电器来驱动电机实现背心各种强度的振动。采用CompactRIO以后由于有了NI 9485 8通道继电器模块，我们不再需要电路板。电路板的替换缩小了体积，降低了添加硬件时的潜在复杂度，显著简化了软件编写，极大缩短了从探测到障碍到电机马达全速振动之间的时间，这点对于驾驶员在紧急情况下的操控是至关重要的。&lt;/p&gt;
&lt;p&gt;对于方向控制，势场算法提供了道路的生成。完成道路计算后，系统指示驾驶员如何转向保持车辆方向以及回避障碍物。驾驶员通过耳机和LabVIEW语音合成软件得到信息，从而知道方向盘需要转多少个&amp;ldquo;嘀嗒&amp;rdquo;声。与转向柱连接的机构每五度发出一声&amp;ldquo;嘀嗒&amp;rdquo;声，提供精确的反馈声响。&lt;/p&gt;
&lt;p&gt;此外，我们开发了触觉地图原型，从概念上类似于高分辨率栅格的可再生盲文。地图将周围环境的图像真切地显示在驾驶员的手上。类似曲棍球台上的小洞，将压缩空气通过小孔来描绘激光测距仪探测到的周围障碍，从而生成物理地图。该设备我们称之为 AirPix，可让驾驶员&amp;ldquo;看到&amp;rdquo;周围环境并安全地驾驶通过。声音和震动触觉NVDI仍然需要作为备份，但应用了该触觉地图技术提供的高带宽感知特性允许驾驶员使用其它驾驶方式 ，如通过声音识别软件来收听和使用GPS，实现更高层次的道路规划。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NI软硬件的优势&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们使用NI软化硬件设计了世界上首辆盲人驾驶车辆的原型机。在资金和开发时间有限的情况下，NI产品是项目成功的关键，它提供了简单易用且低成本的原型开发平台。LabVIEW直观的图形编程界面使机械工程的大学生团队快速有效的创建自定义嵌入式软件，无需任何文本编程语言的专业经验。&lt;/p&gt;
&lt;p&gt;模块化设计及CompactRIO与 I/O模块的连接性，结合LabVIEW与外部设备的广泛兼容型，确保了系统在未来扩展与改进时只需最小的精力和成本。实时FPGA处理目标提供了高速的数据采集和处理能力，有效地从实时驾驶环境下采集到重要数据。除了外设的兼容性，CompactRIO方便合适的尺寸及较轻的重量是目前空间、负载有限的盲人驾驶车辆的理想选择。&lt;/p&gt;
&lt;p&gt;在大量反复的整个原型设计过程中，NI模块化产品非常适用于特殊、要求苛刻的测试环境、车辆平台的改变、以及项目目标的转换。通过使用多功能多用途的NI软硬件，弗吉尼亚理工大学盲人驾驶挑战赛在盲人应用技术领域中不断&amp;ldquo;创造未来&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;衍生技术和未来计划&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在2008 至2009学年之后的数月中，弗吉尼亚理工大学盲人驾驶挑战赛向超过全国各地的30位各年龄段的失明及弱视者提供了驾驶汽车的机会。无论是首次坐在驾驶盘前，或是多年后重新驾驶汽车，他们的反应都是无比积极、充满希望的。国内及国际媒体的报道引起了对失明人群能力的强烈关注，也激发了合作研究及开发各领域的新型盲人应用技术的兴趣。&lt;/p&gt;
&lt;p&gt;各种潜在的衍生技术是设计过程中的重点。由于这些设备在支持盲人驾驶车辆中被证明是有效的，接下来我们可以想象这些设备可以让其它驾驶员获益，如视野不佳、打电话或收发短消息、打瞌睡、及其它注意力分散的驾驶员。我们能够为各类驾驶环境设计提前警告的设备以及缓解碰撞的系统，尤其是天气环境恶劣或低能见度的环境。&lt;/p&gt;
&lt;p&gt;除了汽车应用以外，在触觉人机界面设备领域也有潜在的应用，尤其是失明行人。非视觉界面可轻松部署到飞机驾驶舱，目前的技术使驾驶员在很大程度上依赖视觉能力。在高饱和度的视觉环境下发送高带宽的其它感知信息将极大提升飞行员的环境感知，这也是操作任何交通工具时的关键。&lt;/p&gt;
&lt;p&gt;尽管在未来的很多年中我们不太可能看到盲人驾驶员，但潜在的衍生技术都能即刻适用于各类领域中。&lt;/p&gt;</description>
    <pubDate>2010-01-23</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>电子产品世界</comments>
</item>
<item>
    <title><![CDATA[运用图形化系统设计开发用于癌症治疗的机器人]]></title>
    <link>http://www.robotain.com/tech/articles/201001/23317.html</link>
    <description>&lt;p&gt;治疗癌症时，肿瘤科医师会根据肿瘤的类型与早晚期，从几种疗法中挑选适合的。目前最常见的疗法是光动力疗法、手术、放射治疗、化学疗法、荷尔蒙疗法及免疫疗法。&lt;/p&gt;
&lt;p&gt;PDT 是一种特殊的光线疗法，&amp;ldquo;光线疗法&amp;rdquo;一词泛指所有运用光线对病人的身体产生帮助的疗法。PDT 这种新技术能够在不伤害正常组织的情况下杀死有问题的组织。&lt;/p&gt;
&lt;p&gt;进行 PDT 疗法时，将一种称作光敏感剂的药物注射入病人体内。光敏感剂本身是无害的，对健康或不正常的组织都不会造成影响。但是，如果用激光照射涂有光敏感剂的组织时，光敏感剂就会被活化，只要受到光照射的组织就会很快地被杀死。因此这项技术要求光束精确地会聚到不正常组织，以发挥更好的疗效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机器人&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在黎巴嫩大学，我们开发了一种自动化操作机器人，其主要功能包括在执行 PDT 疗法时快速扫过病人的皮肤。机器人会以圆形或椭圆形等几何图形的方式移动激光头，将其对准病人的患处以摧毁肿瘤。&lt;/p&gt;
&lt;p&gt;要在病人的身体上画出几何图形需要5种动作：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3 种平移操作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其中Z方向用于垂直控制用于治疗的激光头&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两种旋转动作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了做到这 五种动作，指令系统必须产生指令信号，通过电路连接电机驱动器，从而控制五个相应的步进电机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;指挥系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;National Instruments LabVIEW直接控制四个步进电机 (X、Y、&amp;theta; 与 &amp;Phi;);第五个电机 (Z) 则由 Microchip Technology PICmicro 微控制器来控制。NI PCI-7334运动控制器使用双控制器架构，由一个中央处理器 (CPU) 和一个DSP组成运动控制器的骨干。&lt;/p&gt;
&lt;p&gt;在运动控制器的驱动软件方面，PCI-7334 使用 NI LabVIEW 编程与 Measurement &amp;amp; Automation Explorer (MAX)中的设置相结合，产生指令信号以转动电机。在MAX设置中，我们使用CW/CCW脉冲步进输出设置;第一个输出在顺时钟移动时产生CW脉冲，第二个输出在逆时针移动时产生CCW脉冲。&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;&lt;img width=&quot;250&quot; height=&quot;188&quot; alt=&quot;&quot; src=&quot;/uploads/allimg/100123/1201012S9-0.jpg&quot; /&gt;&lt;/strong&gt;&lt;br /&gt;
使用NI&amp;nbsp;LabVIEW精确控制用于光动力疗法癌症病人的机器手臂&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电路连接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;机器头上有八个光学开关传感器，可以监测出前方一厘米之内的物品，从而得知传感器与下方表面的距离。&lt;/p&gt;
&lt;p&gt;为了保护运动系统不受其他物体损坏，也为了检测轨迹限制，每个轴都使用了 两 个实体限位开关，一个向前，另一个向后。所有的传感器、限位开关、以及电机驱动器都通过可以通过NI UMI-7764运动接口模块直接连接到 PCI-7334上。&lt;/p&gt;
&lt;p&gt;X、Y、&amp;theta; 与 &amp;Phi; 轴的电机驱动器与限位开关连接到 UMI-7764 的四个运动I/O接线端。为了确保五个轴同步移动，第一和第三个UMI-7764断点(breakpoints)作为输入端与第五个电机(Z轴)的微控制器相连。四个传感器连到UMI-7764的模拟输入接线端，其它的传感器则连到触发/断点接线端。此外，一个控制杆使系统使用起来更便利。参数随时可以修改，系统随时可以被暂停，激光头的位置也可以调整。一条SH68‑C68‑S 连接线将电机控制器与UMI-7764相连。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软件开发&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们将机器人配置简化成 2D 应用，并使用LabVIEW仿真动作，作为开发软件的第一步。然后用同样的方法将其推广运用到 3D 问题上。最终操作机器人软件的核心就是3D仿真的程序，只不过增加了读取实际的传感器信号并控制实际的电机。&lt;/p&gt;
&lt;p&gt;这些程序的主要任务就是先读取传感器的状态(开或关)，然后定义机器头的动作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NI产品的优点&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;与基于文本的编程语言不同的是，LabVIEW使用图标代替文字，大大简化了软件开发的过程。此外，LabVIEW 拥有大量函数库，包含了多种用途的子VI(例如 FlexMotion)，这类子VI已经在我们的软件中广泛使用了。&lt;/p&gt;
&lt;p&gt;PCI-7334 运动控制器提供了最复杂的运动控制应用中所需的性能与执行确定性，可以做到完成指令、同步、I/O、以及系统监督。使用LabVIEW让机器人动作更加平稳，减少突然的移转动作，节省了时间，并能做到更好的治疗效果。&lt;/p&gt;</description>
    <pubDate>2010-01-23</pubDate>
    <category>技术文章</category>
    <author>robotain</author>
    <comments>电子产品世界</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人16：魔方CFOP算法]]></title>
    <link>http://www.robotain.com/tech/diy/201001/21310.html</link>
    <description>&lt;p&gt;本来我想把这个攻略做成一个NXT开发的教程，把传感器，电机，发声等部分都介绍一 遍。不过现在看来有些同学很心急，希望早点看到&amp;ldquo;核心代码&amp;rdquo;，所以我提前把解魔方的算法写出来。其实魔方的算法网上有很多，只要你耐心并且有效的使用搜索 引擎，会发现上个世纪就已经有人公布算法或源代码了，例如&lt;br /&gt;
算法：&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://www.zunny.com/RUBIK.HTM&quot;&gt;http://www.zunny.com/RUBIK.HTM&lt;/a&gt;&lt;br /&gt;
代码：&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://tomas.rokicki.com/cubecontest/&quot;&gt;http://tomas.rokicki.com/cubecontest/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不过我做第一版的时候，还是决定自己动手写算法。原因很简单：我玩魔方很多年了，把玩法转成算法也是我的目标之一。在写程序之前，我画了以下的几张草图：&lt;/p&gt;
&lt;p alignnone=&quot;&quot; id=&quot;attachment_264&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;673&quot; alt=&quot;魔方算法的草稿&quot; src=&quot;/uploads/allimg/100121/1Z0421031-0.JPG&quot; title=&quot;IMG_6705&quot; wp-image-264=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;魔方算法的草稿&lt;/p&gt;
&lt;p&gt;&amp;nbsp;话说曾经有位同事本打算和我一起做萝卜头的，看了这些草图以后，决定还是继续打游戏更靠谱。这不禁让我想起一首歌&amp;ldquo;1979年，那是一个春天，有一位老人在中国的南海边画了一个圈&amp;hellip;&amp;rdquo; 这位老同志一定是资深软件架构师，改革开放这么宏伟的事情，画个圈就搞定了。&lt;br /&gt;
这样说来我这个草图是太复杂了，难怪把人吓跑了。今天特地又重画了些好看的图，以便大家理解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;魔方表示法&lt;/strong&gt;&lt;br /&gt;
算法的第一个问题就是，怎么用数学方式描述一个魔方状态。我的做法是把魔方想象成一个纸盒子，沿边缝剪开铺平，就形成了六个面，我按照图里的顺序给它们编了号。&lt;br /&gt;
每个面又包含了9个颜色小方块，我也按照图中的顺序给它们编了号。&lt;/p&gt;
&lt;p alignnone=&quot;&quot; id=&quot;attachment_269&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;194&quot; alt=&quot;魔方的数组表示法&quot; src=&quot;/uploads/allimg/100121/1Z0425420-1.jpg&quot; title=&quot;cube&quot; wp-image-269=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;魔方的数组表示法&lt;/p&gt;
&lt;p&gt;这样一来，立体的魔方就变成了一个 6*9 的数组。例如下面是一个普通的被打乱的魔方：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;static&amp;nbsp;String&amp;nbsp;SideColors[]&amp;nbsp;=&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;orgorwwoo&amp;quot;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;oyggbobrg&amp;quot;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;yyrgowwbw&amp;quot;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;yrybgybbo&amp;quot;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;gwwyybror&amp;quot;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;&amp;quot;bgrwwrbgy&amp;quot;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
static String SideColors[] = {
&amp;nbsp;&amp;nbsp;&amp;quot;orgorwwoo&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;oyggbobrg&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;yyrgowwbw&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;yrybgybbo&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;gwwyybror&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;quot;bgrwwrbgy&amp;quot;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;魔方坐标系：&lt;br /&gt;
&lt;/span&gt;&lt;/strong&gt;啥？怎么又有坐标系，刚才的表示法不就完全描述了一个魔方吗？没错，但是咱们的萝卜头每次只能旋转魔方的最下面一层，假设我们需要旋转最上面一层，就必须先把它翻到下面。&lt;br /&gt;
请注意在翻跟头的过程中，魔方本身并没有变化，只是坐标系变了。所以还需要一个坐标系来对应萝卜头的空间：&lt;/p&gt;
&lt;p &gt;&lt;img width=&quot;550&quot; height=&quot;453&quot; alt=&quot;魔方坐标系&quot; src=&quot;/uploads/allimg/100121/1Z04225P-2.JPG&quot; title=&quot;IMG_7714&quot; wp-image-270=&quot;&quot; /&gt;&lt;br/&gt;魔方坐标系&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;状态变化&lt;/strong&gt;：&lt;br /&gt;
正如刚才所说，魔方在萝卜头的数字世界里有两种变化形式：1，翻跟头；2，旋转某一面。&lt;br /&gt;
每次状态变化都会造成SideColors数组发生变化，这种转换用最简单的查表法就可以搞定：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;403&quot; alt=&quot;坐标变化的大概示意图，坐标变化没啥难度，主要看耐心&quot; src=&quot;/uploads/allimg/100121/1Z0425059-3.jpg&quot; title=&quot;Rotate&quot; wp-image-267=&quot;&quot; /&gt;&lt;br/&gt;坐标变化的大概示意图，坐标变化没啥难度，主要看耐心&lt;/p&gt;
&lt;p&gt;例如，这是一段旋转底面后状态转换的代码：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;RotateBottomSide(boolean&amp;nbsp;ClockWise)&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;int&amp;nbsp;temp=0;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;int&amp;nbsp;i;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;CopyMatrics(&lt;span&gt;2,6,ClockWise?2:1);&amp;nbsp;//Bottom&amp;nbsp;ClockWise&amp;nbsp;=&amp;nbsp;Top&amp;nbsp;Anti-ClockWise&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;CopyMatrics(&lt;span&gt;6,2,0);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;if(ClockWise)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;for(i=0;i&amp;lt;3;i++)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp=Sides[&lt;span&gt;5][0][i];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;5][0][i]=Sides[3][2-i][0];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;3][2-i][0]=Sides[4][2][2-i];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;4][2][2-i]=Sides[1][i][2];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;1][i][2]=temp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;else&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;for(i=0;i&amp;lt;3;i++)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp=Sides[&lt;span&gt;5][0][i];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;5][0][i]=Sides[1][i][2];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;1][i][2]=Sides[4][2][2-i];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;4][2][2-i]=Sides[3][2-i][0];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[&lt;span&gt;3][2-i][0]=temp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
public static void RotateBottomSide(boolean ClockWise) throws Exception
{
&amp;nbsp;int temp=0;
&amp;nbsp;int i;

&amp;nbsp;CopyMatrics(2,6,ClockWise?2:1); //Bottom ClockWise = Top Anti-ClockWise
&amp;nbsp;CopyMatrics(6,2,0);
&amp;nbsp;if(ClockWise)
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;for(i=0;i&amp;lt;3;i++)
&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;temp=Sides[5][0][i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[5][0][i]=Sides[3][2-i][0];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[3][2-i][0]=Sides[4][2][2-i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[4][2][2-i]=Sides[1][i][2];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[1][i][2]=temp;
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;}
&amp;nbsp;else
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;for(i=0;i&amp;lt;3;i++)
&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;temp=Sides[5][0][i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[5][0][i]=Sides[1][i][2];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[1][i][2]=Sides[4][2][2-i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[4][2][2-i]=Sides[3][2-i][0];
&amp;nbsp;&amp;nbsp;&amp;nbsp;Sides[3][2-i][0]=temp;
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;}
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CFOP解法&lt;/strong&gt;：&lt;br /&gt;
这是由一位叫Jessica Fridrich女士发明的一种速解法，是目前世界上最流行的方块解法。&lt;br /&gt;
CROSS：字面上的意思为&amp;ldquo;十字&amp;rdquo;，是Fridrich Method中的第一步骤。&lt;br /&gt;
F2L：是&amp;ldquo;First 2 Layer&amp;rdquo;的缩写，意思为&amp;ldquo;一、二层&amp;rdquo;，是Fridrich Method中的第二步骤。&lt;br /&gt;
OLL：是&amp;ldquo;Orientation of Last Layer&amp;rdquo;的缩写，意思为&amp;ldquo;最后一层的角块排序&amp;rdquo;，这是Fridrich Method中的第三个步骤。&lt;br /&gt;
PLL：是&amp;ldquo;Permutation of Last Layer&amp;rdquo;的缩写，意思为&amp;ldquo;最后一层的排序&amp;rdquo;，这是Fridrich Method中的第四步骤。&lt;br /&gt;
CFOP：是Fridrich Method的的别称，就是四个步骤&amp;ldquo;Cross、F2L、OLL、PLL&amp;rdquo;原文的第一个字母合起来而成的。&lt;/p&gt;
&lt;p&gt;上面这些文字比较费解，看下面的图就比较清楚了：&lt;/p&gt;
&lt;p &gt;&lt;img width=&quot;550&quot; height=&quot;423&quot; alt=&quot;魔方的CFOP入门解法&quot; src=&quot;/uploads/allimg/100121/1Z0421006-4.jpg&quot; title=&quot;CFOP&quot; wp-image-268=&quot;&quot; /&gt;&lt;br/&gt;魔方的CFOP入门解法&lt;/p&gt;
&lt;p&gt;或者你可以去&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://www.rubik.com.cn/beginner.htm&quot;&gt;魔方小站&lt;/a&gt;或者&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://bbs.mf8.com.cn/forumdisplay.php%3Ffid=2&quot;&gt;魔方吧&lt;/a&gt;看更详细的教程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CFOP解法的实现&lt;/strong&gt;：&lt;br /&gt;
这一部分比较繁琐，输入玩法公式的输入，按照上面的步骤实现以下函数：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=265#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;TopCross();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;TopCorner();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;SecondLayer();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;BottomCross();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;BottomCorner();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;ThirdLayerCorner();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;ThirdLayerCornerSnap();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;ThirdLayerBorderSnap();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
TopCross();
TopCorner();
SecondLayer();
BottomCross();
BottomCorner();
ThirdLayerCorner();
ThirdLayerCornerSnap();
ThirdLayerBorderSnap();
&lt;/pre&gt;
&lt;p&gt;CFOP算法的源代码可以点&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/RubikSolver/CFOP_java.txt&quot;&gt;这里&lt;/a&gt;下载&lt;br /&gt;
通过这个CFOP算法，萝卜头完成了第一版：&lt;a href=&quot;http://v.youku.com/v_show/id_XNDcwMDQ3NDQ=.html&quot;&gt;http://v.youku.com/v_show/id_XNDcwMDQ3NDQ=.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个算法的最大问题就是步骤太多，一般来说要120步左右，平均时间12分钟，大多数观众等不到转完就睡着了&amp;hellip;&amp;hellip;&lt;br /&gt;
因为这个原因，我改用了一个更快的算法。写博客真是挺累啊，这个算法下次再介绍，心急的同学请看下面这个链接：&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://tomas.rokicki.com/cubecontest/&quot;&gt;http://tomas.rokicki.com/cubecontest/&lt;/a&gt;&amp;nbsp;点最上面的Winners，我用的是第二名的算法。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=265&quot; title=&quot;Permanent Link to 解魔方的机器人攻略17 &amp;ndash; 魔方CFOP算法&quot;&gt;解魔方的机器人攻略17 &amp;ndash; 魔方CFOP算法&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-21</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人15：如何调试]]></title>
    <link>http://www.robotain.com/tech/diy/201001/21309.html</link>
    <description>&lt;p&gt;今天已经是2010年了，祝大家新年快乐，新的一年学习好，工作好，身体好，感情好。。。总之一切都好！新年的第一天继续发攻略，希望是一个好的开始 &lt;img alt=&quot;:)&quot; src=&quot;/uploads/allimg/100121/1UI05Y3-0.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;兵法说&amp;ldquo;代码未动，调试先行&amp;rdquo;。对于刚接触嵌入式开发的同学来说，把代码写进NXT简直就是杯具，没有断点，不能跟踪，程序挂掉了都不知道是哪里的问题。难怪有些公司招聘程序员的时候，提的要求是&amp;ldquo;能摸黑写代码&amp;rdquo;。。。&lt;/p&gt;
&lt;p&gt;下面是一个简单的例子，它实现的功能是：每按一次Enter按钮，就显示当前的距离读数，按Escape按钮时退出程序。通过这个例子，你可以知道 如何用NXT的面板按钮或传感器来做断点工具，用LCD显示屏来跟踪数据。因为不舍得把萝卜头全拆了，所以用好拆的部分来做例子，先凑合看看:)&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;import&amp;nbsp;lejos.nxt.*;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;import&amp;nbsp;lejos.nxt.comm.*;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;/**&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;First&amp;nbsp;Sample:&amp;nbsp;Read&amp;nbsp;distance&amp;nbsp;by&amp;nbsp;the&amp;nbsp;control&amp;nbsp;of&amp;nbsp;buttons&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;ChenWu&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;@see&amp;nbsp;LCD&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;@see&amp;nbsp;UltrasonicSensor&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;@see&amp;nbsp;Button&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;&amp;nbsp;*/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;class&amp;nbsp;DebugSample&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;static&amp;nbsp;UltrasonicSensor&amp;nbsp;distance=new&amp;nbsp;UltrasonicSensor(SensorPort.S1);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main&amp;nbsp;(String[]&amp;nbsp;aArg)&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;span&gt;while(!Button.ESCAPE.isPressed())&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCD.drawString(Distance=&lt;span&gt;&amp;quot;&amp;nbsp;+&amp;nbsp;distance.getDistance()+&amp;quot;&amp;nbsp;&amp;nbsp;&amp;quot;,0,3);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;//Remove&amp;nbsp;this&amp;nbsp;while&amp;nbsp;condition&amp;nbsp;if&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;get&amp;nbsp;dynamic&amp;nbsp;value&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;while(!Button.ESCAPE.isPressed()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!Button.ENTER.isPressed())&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;span&gt;100);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
import lejos.nxt.*;
import lejos.nxt.comm.*;

/**
&amp;nbsp;* First Sample: Read distance by the control of buttons
&amp;nbsp;* @author ChenWu
&amp;nbsp;* @see LCD
&amp;nbsp;* @see UltrasonicSensor
&amp;nbsp;* @see Button
&amp;nbsp;*/
public class DebugSample
{
&amp;nbsp;static UltrasonicSensor distance=new UltrasonicSensor(SensorPort.S1);

&amp;nbsp;public static void main (String[] aArg) throws Exception
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;while(!Button.ESCAPE.isPressed())
&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;LCD.drawString(Distance=&amp;quot; + distance.getDistance()+&amp;quot;&amp;nbsp; &amp;quot;,0,3);

&amp;nbsp;&amp;nbsp;&amp;nbsp;//Remove this while condition if you want to get dynamic value
&amp;nbsp;&amp;nbsp;&amp;nbsp;while(!Button.ESCAPE.isPressed() &amp;amp;&amp;amp; !Button.ENTER.isPressed())
&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(100);
&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;}
}&lt;/pre&gt;
&lt;p&gt;把文件保存为 DebugSample.java，在命令提示符中运行下面的命令，把程序写入NXT：&lt;br /&gt;
nxjc DebugSample.java&lt;br /&gt;
nxj -r DebugSample&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;549&quot; height=&quot;265&quot; alt=&quot;把程序写入NXT，这个步骤也可以在Eclipse中完成&quot; src=&quot;/uploads/allimg/100121/1UI04D7-1.png&quot; title=&quot;upload&quot; wp-image-252=&quot;&quot; /&gt; &lt;br /&gt;
把程序写入NXT，这个步骤也可以在Eclipse中完成&lt;/p&gt;
&lt;p&gt;这段程序很短，有经验的老鸟们应该一目了然了。新同学请看下面的说明，没Java基础的请自己先补习一下吧 &lt;img alt=&quot;:)&quot; src=&quot;/uploads/allimg/100121/1UI05Y3-0.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp; 头两行import是导入Lejos的函数库，导入之后才能调用lejos的各种API。&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp; NXT的显示屏幕是一个分辨率为100&amp;times;64的LCD屏幕，LCD屏幕一共可以显示8行16列ASCII字符，可以用内置的&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtApi/index.aspx?lejos/nxt/lcd.aspx&quot;&gt;LCD对象&lt;/a&gt;来控制显示内容。例如显示一串字符的命令是：&lt;br /&gt;
LCD.drawString(&amp;rdquo;string&amp;rdquo;,x,y);&lt;br /&gt;
这个命令表示显示string的开始位置坐标是(x,y)，下标从0开始。例如(0,3)表示从第4行的第1列开始显示。&lt;/p&gt;
&lt;p&gt;显示的时候如果原来的位置有文字，会被覆盖掉，但是不会清除其他地方的文字。（我的程序里面distance后面加了两个空格，理由请自己思考一下）另外几个常用的方法是 drawInt 和 clear，更多的方法可以参考&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtApi/index.aspx?lejos/nxt/lcd.aspx&quot;&gt;相应的API文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;如果你想显示非标准的字体，甚至是一副图片，可以使用Image类，通过二进制数组进行像素级别的控制&lt;/p&gt;
&lt;p&gt;3. &amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtApi/index.aspx?lejos/nxt/ultrasonicsensor.aspx&quot;&gt;UltrasonicSensor &lt;/a&gt;也是Lejos的内置对象，封装了超声波测距传感器的各种方法和属性。用distance.getDistance()函数就可以返回一个整数，这个数表示眼睛到物体之间的厘米，理论上范围是1到255。如果我们把眼睛捂上，或者距离超过255cm，它的读数都是255。&lt;/p&gt;
&lt;p&gt;4.&amp;nbsp; &lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtApi/index.aspx?lejos/nxt/sensorport.aspx&quot;&gt;SensorPort.S1&lt;/a&gt;表示该传感器是接在1号接口上（看NXT主机下面1~4的编号）&lt;/p&gt;
&lt;p&gt;5.&amp;nbsp; &lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/resources/LejosNxtApi/index.aspx?lejos/nxt/button.aspx&quot;&gt;Button&lt;/a&gt;用来响应面板上各按键的交互事件，button的对应关系看下面这个图&lt;/p&gt;
&lt;p alignnone=&quot;&quot; id=&quot;attachment_253&quot;&gt;&lt;img width=&quot;550&quot; alt=&quot;Button的对应关系&quot; src=&quot;/uploads/allimg/100121/1UI06254-3.png&quot; title=&quot;Buttons&quot; wp-image-253=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Button的对应关系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Button.ESCAPE.isPressed() 用来判断按键是否被按下了。另外一个常用的方式是 Button.ESCAPE.waitForPress(); 程序运行到这句函数时会被挂起，直到按钮按下时才会继续执行后面的语句。&lt;/p&gt;
&lt;p&gt;6. 如果你觉得每次都按一下Enter键很烦，可以把中间的那个while条件注释掉（当然对应的一对大括号也要去掉）。这样一来屏幕就会动态显示当前的实时距离，按下Escape键时退出。&lt;/p&gt;
&lt;p&gt;7. Thread.sleep(100)表示程序运行到这里时，会暂停100毫秒然后继续执行后面的代码。它的作用是让你有读数的时间，否则屏幕上的读数会飞快的变换，根本看不清。&lt;/p&gt;
&lt;p&gt;看看效果如何：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; alt=&quot;按下Enter时，刷新距离读数，按下Escape时，程序退出&quot; src=&quot;/uploads/allimg/100121/1UI02092-4.JPG&quot; title=&quot;IMG_8606&quot; wp-image-254=&quot;&quot; /&gt; &lt;br /&gt;
按下Enter时，刷新距离读数，按下Escape时，程序退出&lt;/p&gt;
&lt;p&gt;cnBeta有位网友认为这个距离传感器是冗余设计，正好我在这里介绍一下这个&amp;ldquo;眼睛&amp;rdquo;的作用：&lt;/p&gt;
&lt;p&gt;1. 用来判断转台上有没有魔方，放了魔方的时候测量的距离是14~15，没有魔方的时候是18~20。通过这个值先变大，然后再变小，就可以知道是有人先把魔方拿走，然后再放回来，于是激活下一轮扫描颜色&lt;/p&gt;
&lt;p&gt;2. 用来做断点调试使用。在搭建萝卜头的初期，它的胳膊经常骨折，颜色也经常读错。为了便于调试，我把眼睛设置成了一个中断开关。当我需要它暂停的时候，就用手捂住它的眼睛，它就会停下来，把手移开，它又可以继续工作。使用的代码如下：&lt;/p&gt;
&lt;p&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;view plain&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;print&lt;/a&gt;&lt;a onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot; href=&quot;http://www.diy-robots.com/?p=251#&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;WaitForNextAction()throws&amp;nbsp;Exception&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;while(distance.getDistance()&amp;gt;150)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;span&gt;100);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&lt;span&gt;return;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot;&gt;
public static void WaitForNextAction()throws Exception
{
&amp;nbsp;while(distance.getDistance()&amp;gt;150)
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;Thread.sleep(100);
&amp;nbsp;}
&amp;nbsp;return;
}
&lt;/pre&gt;
&lt;p&gt;通过这个例子，你可以了解如何在制作乐高机器人的过程中进行单步调试。如果你有其他的好方法，请一定在这里留言，让大家一起分享，多谢多谢！ &lt;img alt=&quot;:)&quot; src=&quot;/uploads/allimg/100121/1UI05Y3-0.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;今天就先介绍这些，感谢新年第一天还来光临小站的热心朋友，祝大家新年好！&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a title=&quot;Permanent Link to 解魔方的机器人攻略16 &amp;ndash; 如何调试&quot;  href=&quot;http://www.diy-robots.com/?p=251&quot;&gt;解魔方的机器人攻略16 &amp;ndash; 如何调试&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-21</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程14：安装 Eclipse]]></title>
    <link>http://www.robotain.com/tech/diy/201001/20306.html</link>
    <description>&lt;p&gt;在远古时代，程序员们通常用写字板来编写Java程序，然后用Javac.exe和 Java.exe来编译和执行。对于NXT来说，对应的命令是Nxjc和Nxj。写字板的好处是速度飞快，不用安装。据说直到现在还有一些固执的代码狂人 会用写字板开发软件，顺便用CPU来爆玉米花。但是对于大多数开发人员来说，选一个好用的IDE（Integrated Development Environment）是非常重要的。&lt;/p&gt;
&lt;p&gt;IDE就是传说中的开发环境，比如我们常用的VS2008，Eclipse等等。它可以帮助你记忆类名和函数名，减少代码的输入量，避免拼写错误，高亮显示不同的代码段，还可以中断和调试。&lt;br /&gt;
这里大力推荐的NXT开发环境是IBM的Eclipse：&lt;/p&gt;
&lt;p id=&quot;attachment_219&quot; alignnone=&quot;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;398&quot; wp-image-219=&quot;&quot; title=&quot;Eclipse&quot; src=&quot;/uploads/allimg/100120/2006213441-0.jpg&quot; alt=&quot;Eclipse开发环境&quot; /&gt; &lt;br /&gt;
Eclipse开发环境&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装Eclipse：&lt;/strong&gt;&lt;br /&gt;
1，从&lt;a href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://www.eclipse.org&quot; target=&quot;_blank&quot;&gt;www.eclipse.org&lt;/a&gt;下载最新版的Eclipse，我用的是3.4版本，可能有点老了&lt;br /&gt;
2，Eclipse是不需要安装的，直接把所有文件解压到一个目录。注意这个目录最好不要包含空格，而且安装之后最好不要随意移动&lt;br /&gt;
3，双击eclipse.exe就可以运行了，最好在桌面上创建一个快捷方式，比较方便&lt;br /&gt;
4，第一次运行Eclipse的时候，会有一些教程信息，有兴趣的可以看看&lt;/p&gt;
&lt;p&gt;为Lejos配置Eclipse：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1，创建一个新的工程&lt;/strong&gt;。选择File &amp;gt; New &amp;gt; Project打开下图所示的新工程选项窗口：&lt;/p&gt;
&lt;p id=&quot;attachment_220&quot; alignnone=&quot;&quot;&gt;&lt;img width=&quot;525&quot; height=&quot;500&quot; wp-image-220=&quot;&quot; title=&quot;newProject&quot; src=&quot;/uploads/allimg/100120/2006212257-1.jpg&quot; alt=&quot;新建工程&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新建工程&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;选择Java Project并单击Next&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2，输入你的工程名称&lt;/strong&gt;，注意这里只能是英文。Eclipse会用这个名字创建一个新的目录：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;537&quot; height=&quot;758&quot; wp-image-221=&quot;&quot; title=&quot;newProject2&quot; src=&quot;/uploads/allimg/100120/200621O44-2.jpg&quot; alt=&quot;输入工程名字&quot; /&gt; &lt;br /&gt;
输入工程名字&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3，设置ClassPath&lt;/strong&gt;&lt;br /&gt;
单击菜单中的 Project &amp;gt; Properties。在左侧选择&amp;ldquo;Java Build Path&amp;rdquo;，然后在右侧选择&amp;ldquo;Libraries&amp;rdquo;&lt;br /&gt;
这时候点击&amp;ldquo;Add External JARs&amp;hellip;&amp;rdquo;，打开之前安装Lejos的目录，选中classes.jar文件。设置完成的结果如下图：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;391&quot; wp-image-222=&quot;&quot; title=&quot;javaBuildPath&quot; src=&quot;/uploads/allimg/100120/2006213247-3.jpg&quot; alt=&quot;设置Class Path&quot; /&gt; &lt;br /&gt;
设置Class Path&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4，接下来我们在Eclipse里面加上几个按钮，帮助我们编译和下载代码&lt;/strong&gt;&lt;br /&gt;
选择菜单中的&amp;ldquo;Run &amp;gt; External Tools &amp;gt; External Tools Configuations&amp;rdquo;&lt;br /&gt;
先点一下&amp;ldquo;Program&amp;rdquo;，然后单击左上角的&amp;ldquo;New Launch Configuration&amp;rdquo;创建新的外部工具&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;603&quot; wp-image-223=&quot;&quot; title=&quot;NewConfiguration&quot; src=&quot;/uploads/allimg/100120/2006215139-4.jpg&quot; alt=&quot;添加外部工具&quot; /&gt; &lt;br /&gt;
添加外部工具&lt;/p&gt;
&lt;p&gt;工具1：编译工具（NXJ compile tool)&lt;br /&gt;
location -&amp;gt; D:\lejos_nxj\bin\nxjc.bat (请换成自己的目录)&lt;br /&gt;
Working Directory -&amp;gt; ${project_loc}&lt;br /&gt;
Arguments-&amp;gt; ${java_type_name}.java&lt;/p&gt;
&lt;p&gt;工具2：下载工具（Download To NXJ）&lt;br /&gt;
location -&amp;gt; D:\lejos_nxj\bin\nxj.bat&lt;br /&gt;
Working Directory -&amp;gt; ${project_loc}&lt;br /&gt;
Arguments-&amp;gt; ${java_type_name}&lt;/p&gt;
&lt;p&gt;工具3：查看工具（NXT Explorer)&lt;br /&gt;
location -&amp;gt; D:\lejos_nxj\bin\nxjbrowse.bat&lt;br /&gt;
Working Directory -&amp;gt; D:\lejos_nxj\bin&lt;br /&gt;
Arguments-&amp;gt; 空的&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5，现在把这三个工具添加到工具栏&lt;/strong&gt;&lt;br /&gt;
点击工具栏中向下的箭头，选择&amp;ldquo;Organize Favorites&amp;rdquo;。在打开的窗口中，把刚才添加的三个工具全部加进来。&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;398&quot; wp-image-224=&quot;&quot; title=&quot;OrganizeFavorites&quot; src=&quot;/uploads/allimg/100120/2006211Q1-5.jpg&quot; alt=&quot;添加快捷操作按钮&quot; /&gt; &lt;br /&gt;
添加快捷操作按钮&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. 验证Eclipse环境搭建是否成功：&lt;br /&gt;
&lt;/strong&gt;在新建的工程中添加一个MyFirstNxtProject.java文件，然后输入以下代码：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=218#&quot; onclick=&quot;dp.sh.Toolbar.Command('ViewSource',this);return false;&quot;&gt;view plain&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=218#&quot; onclick=&quot;dp.sh.Toolbar.Command('CopyToClipboard',this);return false;&quot;&gt;copy to clipboard&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=218#&quot; onclick=&quot;dp.sh.Toolbar.Command('PrintSource',this);return false;&quot;&gt;print&lt;/a&gt;&lt;a href=&quot;http://www.diy-robots.com/?p=218#&quot; onclick=&quot;dp.sh.Toolbar.Command('About',this);return false;&quot;&gt;?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol start=&quot;1&quot;&gt;
    &lt;li&gt;&lt;span&gt;import&amp;nbsp;lejos.nxt.*;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span&gt;public&amp;nbsp;class&amp;nbsp;MyFirstNxtProject&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main&amp;nbsp;(String[]&amp;nbsp;arg)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;throws&amp;nbsp;InterruptedException&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;do&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&lt;span&gt;&amp;quot;test&amp;nbsp;string&amp;quot;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCD.clear();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCD.drawInt(&amp;nbsp;(&lt;span&gt;int)(Runtime.getRuntime().freeMemory()),0,0);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LCD.refresh();&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;span&gt;10);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span&gt;while&amp;nbsp;(true);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre name=&quot;code&quot;&gt;
import lejos.nxt.*;
public class MyFirstNxtProject {
&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void main (String[] arg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws InterruptedException
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String s = &amp;quot;test string&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LCD.clear();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LCD.drawInt( (int)(Runtime.getRuntime().freeMemory()),0,0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LCD.refresh();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread.sleep(10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (true);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}
&lt;/pre&gt;
&lt;p&gt;完成后单击工具中的NXJ Compile进行编译，正常情况下不会出现任何错误，表示编译成功。 这时候打开NXT的电源，用USB线连接到电脑，听到&amp;ldquo;嘟&amp;rdquo;的一声，表示USB设备已经就绪。 这时候单击工具中的NXJ Download，把编译好的代码下载到NXT内部。 现在在NXT上操作，用按钮选中MyFirstNxtProject并执行，该程序会显示目前NXT可用的内存数。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a title=&quot;Permanent Link to 解魔方的机器人攻略15 &amp;ndash; 安装 Eclipse&quot;  href=&quot;http://www.diy-robots.com/?p=218&quot;&gt;解魔方的机器人攻略15 &amp;ndash; 安装 Eclipse&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-20</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程13：安装Lejos（下）]]></title>
    <link>http://www.robotain.com/tech/diy/201001/20305.html</link>
    <description>&lt;p&gt;&lt;strong&gt;第四步：安装Lejos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;登陆 &lt;a target=&quot;_blank&quot; href=&quot;http://www.diy-robots.com/redirect.aspx?target=http://lejos.sourceforge.net/&quot;&gt;Lejos 主页&lt;/a&gt;点击 NXT 图片进入 Lejos 下载页面，点击 NXJ 的下载链接；&lt;/p&gt;
&lt;p&gt;下载完成后将下载的压缩包解压到指定文件夹。这里注意你所指定的文件夹路径中不要包含空格；比如 C:\Program Files\legos 这个路径就不正确，因为文件夹&amp;ldquo;Program Files&amp;rdquo;中包含了一个空格。在使用 Java 开发的过程中空格总会引起这样或那样的问题，所以为了避免不必要的麻烦保存路径中一定不要包含任何空格。&lt;/p&gt;
&lt;p&gt;接下来添加运行 Lejos 所需要的系统环境变量，变量添加的方法与添加 JDK 环境变量的方法相同，请参照第一步中的方法打开环境变量窗口进行设置。&lt;/p&gt;
&lt;p&gt;添加环境变量： NXJ_HOME，变量值是 Lejos 的安装目录，即解压后 lejos_nxj 的全路径，完成后点击确定；&lt;/p&gt;
&lt;p&gt;向环境变量 Path 的变量值后追加 ;%NXJ_HOME%\bin；&lt;/p&gt;
&lt;p&gt;重新打开一个命令提示符窗口（原有的命令提示符窗口在设置环境变量以后必须重新打开才能生效）。输入nxj然后回车，用来验证Lejos是否已经安装成功。&lt;/p&gt;
&lt;p alignnone=&quot;&quot; id=&quot;attachment_213&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;277&quot; alt=&quot;验证Lejos安装是否成功&quot; src=&quot;/uploads/allimg/100120/2000592496-0.png&quot; title=&quot;nxj&quot; wp-image-213=&quot;&quot; /&gt; &lt;br /&gt;
验证Lejos安装是否成功&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第五步：安装Libusb&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lejos 需要使用 Libusb 与 NXT 进行通讯。它的安装文件在 Lejos 的安装目录下 lejos_nxj\3rdparty\lib。&lt;/p&gt;
&lt;p&gt;运行 Libusb 的安装程序 libusb-win32-filter-bin-0.1.12.1.exe ，点击 Install 开始安装。&lt;/p&gt;
&lt;p&gt;这个程序安装以后会自动执行测试程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意！！这个驱动程序在Vista或者Windows7下很可能导致电脑的USB端口全部失效&lt;/strong&gt;，这种情况下只能卸载。&lt;/p&gt;
&lt;p&gt;且慢，现在的鼠标和键盘可能都是USB的，怎么卸载呢？我上次遇到这个问题的时候，被折磨了一个上午，不断的萌生着重装系统或者是砸烂电脑的念头，最后解决方法很简单，借一个古老的PS2鼠标卸载搞定。&lt;/p&gt;
&lt;p&gt;正确的装法是在xp兼容模式下安装：在exe文件上鼠标右键单击，选择属性，然后参考下图。我的电脑是英文版的系统，大家凑合对照一下：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;377&quot; height=&quot;513&quot; alt=&quot;在XP兼容模式下安装USB连接驱动&quot; src=&quot;/uploads/allimg/100120/20005950T-1.png&quot; title=&quot;libinstall&quot; wp-image-214=&quot;&quot; /&gt; &lt;br /&gt;
在XP兼容模式下安装USB连接驱动&lt;/p&gt;
&lt;p&gt;第六步：刷新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的固件上载模式。&lt;/p&gt;
&lt;p&gt;进入固件上载模式后，NXT的屏幕上什么也不显示，但是会连续发出微弱的滴答声；&lt;/p&gt;
&lt;p&gt;这时候用 USB 线连接 NXT 和计算机，当计算机识别 NXT 的固件上载模式后（看USB图标提示），在&amp;ldquo;命令提示符&amp;rdquo;中输入 nxjflash 并回车；&lt;/p&gt;
&lt;p&gt;跟刷手机完全不一样，NXT的升级固件非常神速，大概只需要几秒钟；&lt;/p&gt;
&lt;p&gt;上载完成后 Lejos NXJ 会自动启动，出现欢迎界面与开始菜单；&lt;/p&gt;
&lt;p&gt;在 Lejos 运行的过程中，包括正在运行程序时，同时按下桔色和灰色的按钮（Enter+Space）就可以立即将 NXT 关闭。如果要重新启动只要按下桔黄色的按钮。如果 NXT 突然死机的话，将电池全部取出后重新安上启动即可。&lt;/p&gt;
&lt;p&gt;到此我们就完成了Lejos的安装！下面试着运行我们的第一个程序测试一下。&lt;/p&gt;
&lt;p&gt;按下桔黄色按钮启动NXT电源，打开命令提示符窗口，切换目录到Lejos自带的样例目录并输入以下代码（请自行修改安装目录）：&lt;/p&gt;
&lt;p&gt;CD D:\lejos_nxj\samples\Tune （设置程序路径）&lt;/p&gt;
&lt;p&gt;d: （切换到指定盘符）&lt;/p&gt;
&lt;p&gt;nxjc Tune.java（在电脑上编译程序）&lt;/p&gt;
&lt;p&gt;nxj &amp;ndash;r Tune（把编译好的程序写入NXT）&lt;/p&gt;
&lt;p&gt;几秒钟后NXT会发出一声悦耳的声音，表示程序已经上载成功，你可以在NXT上选择执行这个程序。&lt;/p&gt;
&lt;p&gt;如果操作成功的话，你会听到一组声音，并看到&amp;ldquo;Hello World&amp;rdquo;的字样。&lt;/p&gt;
&lt;p&gt;经历了这么多繁琐的步骤，你的第一个程序终于顺利在 NXT 上运行成功啦。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=212&quot; title=&quot;Permanent Link to 解魔方的机器人攻略14 &amp;ndash; 安装Lejos（下）&quot;&gt;解魔方的机器人攻略14 &amp;ndash; 安装Lejos（下）&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-20</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人12：安装Lejos（上）]]></title>
    <link>http://www.robotain.com/tech/diy/201001/19302.html</link>
    <description>&lt;p&gt;Firmware（固件）相当于是机器人的操作系统，乐高NXT出厂时已经内置了一套Firmware，并且配备了非常强大的LabVIEW开发平台。基于这种LabVIEW平台，即使是完全不懂编程的小盆友们，也可以成功的做出一些复杂的功能。&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;450&quot; height=&quot;317&quot; alt=&quot;LabView软件&quot; src=&quot;/uploads/allimg/100119/22404C948-0.gif&quot; title=&quot;a5b5fd41373&quot; wp-image-209=&quot;&quot; /&gt; &lt;br /&gt;
LabView软件&lt;/p&gt;
&lt;p&gt;对于萝卜头来说，因为解魔方需要用到一些算法和复杂的功能，很难仅用LabView实现。后来据西觅亚的朋友说，LabView也有开发接口，有兴趣的童鞋可以自己研究一下，我买回来直接就升级Firmware了，懒得再刷回去了。 &lt;img alt=&quot;:)&quot; src=&quot;/uploads/allimg/100119/2240463N8-1.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目前乐高的开发平台很多，本文提到的Lejos 是一个基于 Java 的小型操作系统，习惯windows开发的朋友也可以使用一款微软开发的Microsoft Robotics Studio。安装Lejos以后，我们就可以用常见的Java开发工具来编写机器人的控制程序了。以下是安装Lejos0.6 的步骤（现在已经有0.7的版本，安装方式差不多）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步：安装 Java 开发工具包 JDK（Java Development Kit） &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先登陆到 Sun 公司的官方网站下载 Java 开发工具包，这里要求你下载并安装 JDK1.5 或更高的版本，因为Lejos NXJ&amp;nbsp; 0.6 需要在 &lt;a target=&quot;_blank&quot; href=&quot;http://java.sun.com/javase/downloads/index.jsp&quot; title=&quot;JDK1.5&quot;&gt;JDK1.5 或更高版本&lt;/a&gt;上方可运行。而且在后续的攻略中，还会介绍如何借助 Eclipse3 平台开发 NXT 的 java 程序，运行 Eclipse 也需要 JDK1.5 或更高的版本的支持。&lt;/p&gt;
&lt;p&gt;进入 JDK 下载页面，点击 Download；&lt;/p&gt;
&lt;p&gt;选择 Windows 操作系统和默认的多国语言（Multi-Language），然后点击 Continue（下一步）；&lt;/p&gt;
&lt;p&gt;点击 jdk1.5 下载链接，将安装文件保存至本地；&lt;/p&gt;
&lt;p&gt;下载完成后，运行刚刚下载的安装程序，开始安装 JDK；&lt;/p&gt;
&lt;p&gt;安装过程中会提示安装 JDK 和 JRE ，我们默认安装全部功能，点击 下一步 继续运行安装程序；&lt;/p&gt;
&lt;p&gt;安装成功后会提示安装完成，点击 完成 按钮结束 JDK 的安装。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：设置环境变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;环境变量可以理解为缩写和快捷方式。例如我们把JDK安装在C:\Program Files\Java\jdk1.6.0_07，运行java代码的时候，每次都要输入这一长串路径。为了避免这种麻烦，我们可以定义一个环境变量 %Java_Home%等于这个路径，这样写命令时，只要写这个缩写就可以了。&lt;/p&gt;
&lt;p&gt;首先在&amp;ldquo;我的电脑&amp;rdquo;上点击右键，选择属性；&lt;/p&gt;
&lt;p&gt;在&amp;ldquo;系统属性&amp;rdquo;窗口中选择高级选项卡，点击下面的&amp;ldquo;环境变量&amp;rdquo;按钮，弹出环境变量窗口；&lt;/p&gt;
&lt;p&gt;在环境变量窗口中点击&amp;ldquo;新建&amp;rdquo;按钮添加环境变量；&lt;/p&gt;
&lt;p&gt;设置变量名为： JAVA_HOME，变量值为 JDK 的安装目录（默认安装是C:\Program Files\Java\jdk1.5.0_15）；&lt;/p&gt;
&lt;p&gt;填写完成后点击 确定 按钮，关闭对话框；&lt;/p&gt;
&lt;p&gt;再选中环境变量 Path，然后点击&amp;ldquo;编辑&amp;rdquo;按钮，弹出&amp;ldquo;编辑系统变量&amp;rdquo;对话框；&lt;/p&gt;
&lt;p&gt;在变量值后追加 JDK 的bin子目录 ;%JAVA_HOME%\bin （多个环境变量值要用 ; 号隔开）&lt;/p&gt;
&lt;p&gt;编辑完成后点击确定，关闭对话框。&lt;/p&gt;
&lt;p&gt;我们来验证一下刚刚设置的环境变量是否生效。&lt;/p&gt;
&lt;p&gt;打开： 开始=&amp;gt;程序=&amp;gt;附件=&amp;gt;命令提示符 （或者用快捷键Windows+R，输入cmd然后回车)&lt;/p&gt;
&lt;p&gt;在命令提示符里输入Javac并回车，如果能看到下图所示的信息，就表示JDK和环境变量都设置成功了。&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;396&quot; alt=&quot;验证JDK是否安装成功&quot; src=&quot;/uploads/allimg/100119/22404B535-2.png&quot; title=&quot;javac&quot; wp-image-210=&quot;&quot; /&gt; &lt;br/&gt;验证JDK是否安装成功&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步：安装乐高USB驱动程序&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你的计算机上已经安装了 LEGO 随机附带的 LEGO MINDSTORMS NXT 软件，那么你可以直接进入下一步。因为 LEGO MINDSTORMS NXT 软件的安装过程中已经包含了下面所要安装的 USB 驱动程序。&lt;/p&gt;
&lt;p&gt;登陆&lt;a target=&quot;_blank&quot; href=&quot;http://mindstorms.lego.com/Support/Updates/&quot;&gt;乐高官方网站&lt;/a&gt;下载最新的驱动程序；&lt;/p&gt;
&lt;p&gt;下载完成后将压缩包解压，执行里面的 setup.exe 安装 USB 驱动程序；&lt;/p&gt;
&lt;p&gt;驱动安装完成后会提示你重新启动计算机，点击 Restart 重新启动计算机；&lt;/p&gt;
&lt;p&gt;下面验证驱动安装是否正确，计算机重新启动后用 USB 线将 NXT 与电脑连接，确认连接后启动 NXT。右键单击&amp;ldquo;我的电脑&amp;rdquo;选择&amp;ldquo;属性&amp;rdquo;。选择&amp;ldquo;硬件&amp;rdquo;选项卡，点击&amp;ldquo;设备管理器&amp;rdquo;，如果在硬件列表中查看到 Lego Devices =&amp;gt; Lego Mindstorms NXT ，这说明 LEGO USB 驱动已经成功的安装在你的计算机上。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a title=&quot;Permanent Link to 解魔方的机器人攻略13 &amp;ndash; 安装Lejos（上）&quot; href=&quot;http://www.diy-robots.com/?p=207&quot;&gt;解魔方的机器人攻略13 &amp;ndash; 安装Lejos（上）&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-19</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程11：安装传感器]]></title>
    <link>http://www.robotain.com/tech/diy/201001/19301.html</link>
    <description>&lt;p&gt;这一节要介绍&lt;strong&gt;搭建结构的最后一个部分&lt;/strong&gt;&amp;ndash;安装各种传感器。之后我会继续发布软件部分的攻略。&lt;br /&gt;
正好今天有位小朋友留言问道，能不能分享源代码。我在这里统一回答一下，答案是&amp;ldquo;&lt;strong&gt;不能&lt;/strong&gt;&amp;rdquo;。&lt;br /&gt;
在这系列的攻略里，会讲到制作萝卜头所有需要的知识点和注意事项，但是我希望大家最终自己动手实现，这也正是DIY机器人的乐趣所在！毕竟在我制作的过程中，遇到了许多困难，你们已经不需要走太多弯路了（谁敢说我小气，我跟他急^_^）。&lt;/p&gt;
&lt;p&gt;引用一段和菜头的话：&lt;strong&gt;上网以后，我们把信息当做了知识，把收藏当做了学习，把阅读当做了思考，把储存当做了掌握。像个花栗鼠在秋天收藏坚果一样，把自己的阅读器和硬盘塞满，却依旧觉得饥渴难耐。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;言归正传了：&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;250&quot; wp-image-184=&quot;&quot; title=&quot;IMG_7704&quot; src=&quot;/uploads/allimg/100119/22334952O-0.JPG&quot; alt=&quot;颜色传感器需要的颗粒&quot; /&gt; &lt;br /&gt;
颜色传感器需要的颗粒&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;656&quot; wp-image-185=&quot;&quot; title=&quot;IMG_7706&quot; src=&quot;/uploads/allimg/100119/2233495E4-1.JPG&quot; alt=&quot;把颜色传感器安装到电机上&quot; /&gt; &lt;br /&gt;
把颜色传感器安装到电机上&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;619&quot; wp-image-186=&quot;&quot; title=&quot;IMG_8526&quot; src=&quot;/uploads/allimg/100119/2233496054-2.JPG&quot; alt=&quot;非常重要的一步！因为传感器的杆很长，需要一根橡皮筋来避免晃动。&quot; /&gt; &lt;br /&gt;
非常重要的一步！因为传感器的杆很长，需要一根橡皮筋来避免晃动。知足吧，这一根皮筋是我被折磨了一星期之后才想到的...&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;273&quot; wp-image-187=&quot;&quot; title=&quot;IMG_7707&quot; src=&quot;/uploads/allimg/100119/2233495B9-3.JPG&quot; alt=&quot;超声波测距传感器&quot; /&gt; &lt;br /&gt;
超声波测距传感器&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;439&quot; wp-image-188=&quot;&quot; title=&quot;IMG_7714&quot; src=&quot;/uploads/allimg/100119/2233496139-4.JPG&quot; alt=&quot;安装在最高点，它的作用是判断转台上有没有魔方&quot; /&gt; &lt;br /&gt;
安装在最高点，它的作用是判断转台上有没有魔方&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;358&quot; wp-image-189=&quot;&quot; title=&quot;IMG_8528&quot; src=&quot;/uploads/allimg/100119/2233493207-5.JPG&quot; alt=&quot;亮度传感器&quot; /&gt; &lt;br /&gt;
亮度传感器&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-190=&quot;&quot; title=&quot;IMG_8529&quot; src=&quot;/uploads/allimg/100119/22334914K-6.JPG&quot; alt=&quot;组装成一个奇怪的样子&quot; /&gt; &lt;br /&gt;
组装成一个奇怪的样子&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-191=&quot;&quot; title=&quot;IMG_8531&quot; src=&quot;/uploads/allimg/100119/22334a138-7.JPG&quot; alt=&quot;安装的目标是这里&quot; /&gt; &lt;br /&gt;
安装的目标是这里&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-192=&quot;&quot; title=&quot;IMG_8096&quot; src=&quot;/uploads/allimg/100119/2233491014-8.JPG&quot; alt=&quot;安装之后的效果，注意看上面的底盘，贴了一圈白纸，原因在软件部分会介绍&quot; /&gt; &lt;br /&gt;
安装之后的效果，注意看上面的底盘，贴了一圈白纸，原因在软件部分会介绍&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-193=&quot;&quot; title=&quot;IMG_8095&quot; src=&quot;/uploads/allimg/100119/2233495560-9.JPG&quot; alt=&quot;距离上需要留一个2到3毫米的间隙&quot; /&gt; &lt;br /&gt;
距离上需要留一个2到3毫米的间隙&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;538&quot; wp-image-194=&quot;&quot; title=&quot;IMG_8473&quot; src=&quot;/uploads/allimg/100119/22334952E-10.JPG&quot; alt=&quot;固定NXT主体&quot; /&gt; &lt;br /&gt;
固定NXT主体&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;376&quot; wp-image-195=&quot;&quot; title=&quot;IMG_8474&quot; src=&quot;/uploads/allimg/100119/2233491091-11.JPG&quot; alt=&quot;从另一个角度看看怎么固定&quot; /&gt; &lt;br /&gt;
从另一个角度看看怎么固定&lt;/p&gt;
&lt;p&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-196=&quot;&quot; title=&quot;IMG_8534&quot; src=&quot;/uploads/allimg/100119/2233493951-12.JPG&quot; alt=&quot;最后的一些工作：接线，贴提示的彩条，把剩余的散件用来加固，还有就是化化妆&quot; /&gt; &lt;br /&gt;
最后的一些工作：接线，贴提示的彩条，把剩余的散件用来加固，还有就是化化妆&lt;/p&gt;
&lt;p&gt;接线方式说明：&lt;/p&gt;
&lt;p&gt;电机A：爪子&lt;br /&gt;
电机B：魔方的旋转底盘&lt;br /&gt;
电机C：颜色传感器电机&lt;/p&gt;
&lt;p&gt;传感器1：超声波测距传感器&lt;br /&gt;
传感器2：亮度传感器&lt;br /&gt;
传感器3：颜色传感器&lt;br /&gt;
传感器4：按钮（这个是我调试的时候用来中断的）&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a title=&quot;Permanent Link to 解魔方的机器人攻略12 &amp;ndash; 安装传感器&quot; href=&quot;http://www.diy-robots.com/?p=183&quot;&gt;解魔方的机器人攻略12 &amp;ndash; 安装传感器&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-19</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（八）—成型图]]></title>
    <link>http://www.robotain.com/tech/diy/201001/18295.html</link>
    <description>&lt;p&gt;到此为止&amp;ldquo;瓦力&amp;rdquo;的基本部件都已安装完成，在初步测试之中，&amp;ldquo;瓦力&amp;rdquo;用&amp;ldquo;眼睛&amp;rdquo;定位障碍的初级程序表现还不错，在无任何参照下的走直线、直角、原地 旋转等动作表现也很令人满意，只是右侧马达似乎天生比左边快一点儿，距离长了之后就出弧线了，但总体来说整个&amp;ldquo;瓦力&amp;rdquo;的运行状态还是令人满意的。&lt;/p&gt;
&lt;p&gt;到本文为止《制作机器人&amp;ldquo;瓦力&amp;rdquo;》这个系列已经完成，日后这些博文会随着我对瓦力的修改和升级而同步更新。下一个和瓦力有关的系列会进入程序部分，不过这个环节比较耗时，有可能不会在近期推出并且频繁更新。&lt;/p&gt;
&lt;p&gt;最后，发一组图片：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-01.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;walle-e-01&quot; src=&quot;/uploads/allimg/100118/2212333430-0.jpg&quot; title=&quot;walle-e-01&quot; wp-image-931=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-02.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;walle-e-02&quot; src=&quot;/uploads/allimg/100118/2212335635-1.jpg&quot; title=&quot;walle-e-02&quot; wp-image-932=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-03.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;walle-e-03&quot; src=&quot;/uploads/allimg/100118/2212333592-2.jpg&quot; title=&quot;walle-e-03&quot; wp-image-933=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-04.JPG&quot;&gt;&lt;img width=&quot;225&quot; height=&quot;300&quot; alt=&quot;walle-e-04&quot; src=&quot;/uploads/allimg/100118/2212332H3-3.jpg&quot; title=&quot;walle-e-04&quot; wp-image-934=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-05.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;walle-e-05&quot; src=&quot;/uploads/allimg/100118/221233DQ-4.jpg&quot; title=&quot;walle-e-05&quot; wp-image-935=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2010/01/walle-e-06.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;walle-e-06&quot; src=&quot;/uploads/allimg/100118/2212335431-5.jpg&quot; title=&quot;walle-e-06&quot; wp-image-936=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2010/01/04/diy-wall-e-finishe/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（八）&amp;mdash;&amp;mdash;成型图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后记：至此，机器人瓦力制作教程也转载完毕，感谢作者老陈。互动交流可以去&lt;a href=&quot;http://www.p4cpu.net/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;老陈的博客&lt;/strong&gt;&lt;/a&gt;，也欢迎在此留言。&lt;/p&gt;</description>
    <pubDate>2010-01-18</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（七）—红外复眼]]></title>
    <link>http://www.robotain.com/tech/diy/201001/18294.html</link>
    <description>&lt;p&gt;&lt;strong&gt;七、红外复眼&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个传感器就不用过多的介绍了，我打算将它与一个云台结合作为火焰探头。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元件&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1. 光敏二极管 x2&lt;/p&gt;
&lt;p&gt;2. 10k电阻 x1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电路图&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector.png&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;212&quot; alt=&quot;flame-detector&quot; src=&quot;/uploads/allimg/100118/220KB610-0.png&quot; title=&quot;flame-detector&quot; wp-image-924=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF Version:&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector-doc.pdf&quot;&gt;flame-detector-pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ms10 Version:&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector-ms10.ms10&quot;&gt;flame-detector-ms10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成型图&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector-1.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;flame-detector-1&quot; src=&quot;/uploads/allimg/100118/220KBb5-1.jpg&quot; title=&quot;flame-detector-1&quot; wp-image-921=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector-2.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;flame-detector-2&quot; src=&quot;/uploads/allimg/100118/220K64F7-2.jpg&quot; title=&quot;flame-detector-2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/flame-detector-3.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;flame-detector-3&quot; src=&quot;/uploads/allimg/100118/220K62417-3.jpg&quot; title=&quot;flame-detector-3&quot; wp-image-923=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/29/diy-wall-e-seven-flame-detector/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（七）&amp;mdash;&amp;mdash;红外复眼&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-18</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程10：爪子]]></title>
    <link>http://www.robotain.com/tech/diy/201001/18293.html</link>
    <description>&lt;p&gt;这次不说废话了，直接上图，节约时间：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;262&quot; alt=&quot;一大堆散件&quot; src=&quot;/uploads/allimg/100118/22012644F-0.JPG&quot; title=&quot;IMG_7691&quot; wp-image-167=&quot;&quot; /&gt; &lt;br /&gt;
一大堆散件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;508&quot; alt=&quot;组装起来&quot; src=&quot;/uploads/allimg/100118/2201264646-1.JPG&quot; title=&quot;IMG_7693&quot; wp-image-169=&quot;&quot; /&gt; &lt;br /&gt;
组装起来&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;461&quot; alt=&quot;横杆加固，另外点缀些颜色&quot; src=&quot;/uploads/allimg/100118/22012A606-2.JPG&quot; title=&quot;IMG_7695&quot; wp-image-170=&quot;&quot; /&gt; &lt;br /&gt;
横杆加固，另外点缀些颜色&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;347&quot; alt=&quot;一组连杆，注意蓝色的那根需要磨得薄一点&quot; src=&quot;/uploads/allimg/100118/2201261W7-3.JPG&quot; title=&quot;IMG_7696&quot; wp-image-171=&quot;&quot; /&gt; &lt;br /&gt;
一组连杆，注意蓝色的那根需要磨得薄一点&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;368&quot; alt=&quot;组装好的连杆&quot; src=&quot;/uploads/allimg/100118/2201264E8-4.JPG&quot; title=&quot;IMG_7698&quot; wp-image-172=&quot;&quot; /&gt; &lt;br /&gt;
组装好的连杆&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;481&quot; alt=&quot;与悬臂的连接&quot; src=&quot;/uploads/allimg/100118/2201263R9-5.JPG&quot; title=&quot;IMG_7700&quot; wp-image-173=&quot;&quot; /&gt; &lt;br /&gt;
与悬臂的连接&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;420&quot; alt=&quot;大体框架已经搭成了！&quot; src=&quot;/uploads/allimg/100118/22012BX8-6.JPG&quot; title=&quot;IMG_7701&quot; wp-image-174=&quot;&quot; /&gt; &lt;br /&gt;
大体框架已经搭成了！&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;539&quot; alt=&quot;加个小人点缀一下&quot; src=&quot;/uploads/allimg/100118/2201261X7-7.jpg&quot; title=&quot;IMAG0026&quot; wp-image-175=&quot;&quot; /&gt; &lt;br /&gt;
加个小人点缀一下&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=168&quot; title=&quot;Permanent Link to 解魔方的机器人攻略11 &amp;ndash; 爪子&quot;&gt;解魔方的机器人攻略11 &amp;ndash; 爪子&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-18</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程9：爪子电机]]></title>
    <link>http://www.robotain.com/tech/diy/201001/18292.html</link>
    <description>&lt;p&gt;今天刚刚听说lego有一个叫做LDD的软件，可以直接生成搭建图。三人行必有我师，在这里感谢一下&lt;a target=&quot;_blank&quot; href=&quot;http://programus.blogbus.com/&quot;&gt;程序猎人&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;真是应了一句老话&amp;ldquo;独学而无友，孤陋而寡闻&amp;rdquo;。从我决定开始做魔方机器人以来，基本上都是自己闭门造车。后来为了发攻略，又重头搭建了一遍，途中拍了无数照片。早知道就不费这个牛劲了，更郁闷的是搭完以后程序员的兽性大发，改了n多地方和无数代码。。。。&lt;/p&gt;
&lt;p&gt;不过话说回来，牛劲既然已经费了，我还是坚持把这一系列照片发完，嘿嘿。大家先凑合看，如果有时间的朋友愿意帮我转成LDD的搭建图，本人将不胜感激。&lt;/p&gt;
&lt;p&gt;下面是萝卜头小爪子的驱动电机搭建过程：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;404&quot; alt=&quot;准备一个电机&quot; src=&quot;/uploads/allimg/100118/215F55H6-0.JPG&quot; title=&quot;IMG_7676&quot; wp-image-148=&quot;&quot; /&gt; &lt;br /&gt;
准备一个电机&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;332&quot; alt=&quot;连接电机轴，引出动力&quot; src=&quot;/uploads/allimg/100118/215F51342-1.JPG&quot; title=&quot;IMG_7677&quot; wp-image-149=&quot;&quot; /&gt; &lt;br /&gt;
连接电机轴，引出动力&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_150&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;273&quot; alt=&quot;几个连接件&quot; src=&quot;/uploads/allimg/100118/215F52325-2.JPG&quot; title=&quot;IMG_7678&quot; wp-image-150=&quot;&quot; /&gt; &lt;br /&gt;
几个连接件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_151&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;443&quot; alt=&quot;不知道该说啥，照葫芦画瓢吧&quot; src=&quot;/uploads/allimg/100118/215F531O-3.JPG&quot; title=&quot;IMG_7679&quot; wp-image-151=&quot;&quot; /&gt; &lt;br /&gt;
不知道该说啥，照葫芦画瓢吧&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_152&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;387&quot; alt=&quot;这是下面的支架&quot; src=&quot;/uploads/allimg/100118/215F5E17-4.JPG&quot; title=&quot;IMG_7680&quot; wp-image-152=&quot;&quot; /&gt; &lt;br /&gt;
这是下面的支架&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_153&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;404&quot; alt=&quot;和大底盘的对接过程&quot; src=&quot;/uploads/allimg/100118/215F53K2-5.JPG&quot; title=&quot;IMG_7681&quot; wp-image-153=&quot;&quot; /&gt; &lt;br /&gt;
和大底盘的对接过程&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_154&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;438&quot; alt=&quot;看！搭起来了，请注意这里的角度和距离都是计算过的，最好不要变化&quot; src=&quot;/uploads/allimg/100118/215F52560-6.JPG&quot; title=&quot;IMG_7682&quot; wp-image-154=&quot;&quot; /&gt; &lt;br /&gt;
看！搭起来了，请注意这里的角度和距离都是计算过的，最好不要变化&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_155&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;395&quot; alt=&quot;这是两个悬臂，其实一个就可以了，两个是为了结实点，也更好看&quot; src=&quot;/uploads/allimg/100118/215F540N-7.JPG&quot; title=&quot;IMG_7684&quot; wp-image-155=&quot;&quot; /&gt; &lt;br /&gt;
这是两个悬臂&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_156&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;353&quot; alt=&quot;连杆的安装位置&quot; src=&quot;/uploads/allimg/100118/215F53109-8.JPG&quot; title=&quot;IMG_7685&quot; wp-image-156=&quot;&quot; /&gt; &lt;br /&gt;
两个悬臂的安装位置&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_157&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;453&quot; alt=&quot;悬臂安装以后，为了更结实，又增加了一个&quot; src=&quot;/uploads/allimg/100118/215F56207-9.JPG&quot; title=&quot;IMG_7687&quot; wp-image-157=&quot;&quot; /&gt; &lt;br /&gt;
悬臂安装以后，为了更结实，又增加了一个&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_158&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;373&quot; alt=&quot;安装完成了&quot; src=&quot;/uploads/allimg/100118/215F54227-10.JPG&quot; title=&quot;IMG_7688&quot; wp-image-158=&quot;&quot; /&gt; &lt;br /&gt;
安装完成了&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_159&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;648&quot; alt=&quot;绕到后面看一眼&quot; src=&quot;/uploads/allimg/100118/215F51c9-11.JPG&quot; title=&quot;IMG_7689&quot; wp-image-159=&quot;&quot; /&gt; &lt;br /&gt;
绕到后面看一眼&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;这个版本的爪子电机，可以看出是由电机直接连转轴驱动的。在很多次朋友参观的过程中，这个爪子由于力气不够大，被魔方卡住了，让我感到非常没有面子（算了，萝卜头表现欠佳，归根结底还是我没培养好）&lt;br /&gt;
下面就是兽性大发的部分了：改用了一对3：1的齿轮组，把萝卜头的臂力增强了3倍，所以现在彻底解决了爪子被卡住的问题。搭建过程没有再拍照了，只能看看结果照片，大家自由发挥吧：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_160&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;538&quot; alt=&quot;添加了减速齿轮组的爪子电机&quot; src=&quot;/uploads/allimg/100118/215F51I2-12.JPG&quot; title=&quot;IMG_8473&quot; wp-image-160=&quot;&quot; /&gt; &lt;br /&gt;
添加了减速齿轮组的爪子电机&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; alignnone=&quot;&quot; id=&quot;attachment_161&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;376&quot; alt=&quot;换个角度来个特写&quot; src=&quot;/uploads/allimg/100118/215F5DS-13.JPG&quot; title=&quot;IMG_8474&quot; wp-image-161=&quot;&quot; /&gt; &lt;br /&gt;
换个角度来个特写&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=147&quot; title=&quot;Permanent Link to 解魔方的机器人攻略10 &amp;ndash; 爪子电机&quot;&gt;解魔方的机器人攻略10 &amp;ndash; 爪子电机&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-18</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[可爱的机器人模型]]></title>
    <link>http://www.robotain.com/tech/show/201001/16289.html</link>
    <description>&lt;p&gt;这些只是机器人模型，但要做出这些模型，也确实需要想象力。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人啤酒罐&quot; src=&quot;/uploads/allimg/100116/213F15I3-0.jpg&quot; alt=&quot;机器人啤酒罐&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人昆虫&quot; src=&quot;/uploads/allimg/100116/213F1H14-1.jpg&quot; alt=&quot;机器人昆虫&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人相机&quot; src=&quot;/uploads/allimg/100116/213F11253-2.jpg&quot; alt=&quot;机器人相机&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人仪表&quot; src=&quot;/uploads/allimg/100116/213F15I9-3.jpg&quot; alt=&quot;机器人仪表&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;homemade robots05 photo&quot; src=&quot;/uploads/allimg/100116/213F13326-4.jpg&quot; alt=&quot;机器人电话&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人电话&quot; src=&quot;/uploads/allimg/100116/213F12312-5.jpg&quot; alt=&quot;机器人电话&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;homemade robots&quot; src=&quot;/uploads/allimg/100116/213F1D64-6.jpg&quot; alt=&quot;homemade robots&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人水壶&quot; src=&quot;/uploads/allimg/100116/213F11J8-7.jpg&quot; alt=&quot;机器人水壶&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F13X9-8.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F11I5-9.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F11391-10.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F12E4-11.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F16096-12.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;机器人模型&quot; src=&quot;/uploads/allimg/100116/213F13637-13.jpg&quot; alt=&quot;机器人模型&quot; /&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-16</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程8：颜色传感器电机]]></title>
    <link>http://www.robotain.com/tech/diy/201001/16288.html</link>
    <description>&lt;p&gt;接下来的任务是安装驱动颜色传感器的电机。为什么我们要把这这部分安装在斜面支架上呢？因为颜色传感器是用来读魔方颜色的，按照说明书的要求，读数时必须距离2~3厘米，并垂直于目标物体的表面。所以魔方是斜的，传感器也必须是斜的。&lt;/p&gt;
&lt;p&gt;有人给我提意见，怎么每次都只更新这么一点，一次多发点吧。&lt;/p&gt;
&lt;p&gt;其实帖子就像姑娘的裙子，太短了盖不住主题，太长了又没有吸引力，差不多就行啦:)&lt;/p&gt;
&lt;p&gt;之前我试过发特别长的攻略，我家娘子打开页面的时候，被不断缩短的滚动条吓的手一哆嗦。。。。又关掉了。。。&lt;/p&gt;
&lt;p&gt;下面进入正题：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;479&quot; alt=&quot;准备一个延长杆和一个直角连杆&quot; src=&quot;/uploads/allimg/100116/2115331X7-0.JPG&quot; title=&quot;IMG_7665&quot; wp-image-123=&quot;&quot; /&gt; &lt;br /&gt;
准备一个延长杆和一个直角连杆准备好电机和一些连接件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;591&quot; alt=&quot;准备好电机和一些连接件&quot; src=&quot;/uploads/allimg/100116/21153331S-1.JPG&quot; title=&quot;IMG_7666&quot; wp-image-128=&quot;&quot; /&gt; &lt;br /&gt;
准备好电机和一些连接件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;737&quot; alt=&quot;神奇吧，电机正好连上，不过还有点晃晃悠悠的&quot; src=&quot;/uploads/allimg/100116/2115332431-2.JPG&quot; title=&quot;IMG_7667&quot; wp-image-129=&quot;&quot; /&gt; &lt;br /&gt;
神奇吧，电机正好连上，不过还有点晃晃悠悠的真是两个加固的小件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;627&quot; alt=&quot;这步有点费解，刚才的两个小件是加到了连杆的下面，另外因为件不够了，我把上面的普通横杆换成了疙里疙瘩的连杆&quot; src=&quot;/uploads/allimg/100116/2115332V6-3.JPG&quot; title=&quot;IMG_7670&quot; wp-image-131=&quot;&quot; /&gt; &lt;br /&gt;
这步有点费解，刚才的两个小件是加到了连杆的下面，另外因为件不够了，我把上面的普通横杆换成了疙里疙瘩的连杆&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;307&quot; alt=&quot;准备延长底座，一直要延伸到爪子那边&quot; src=&quot;/uploads/allimg/100116/21153330D-4.JPG&quot; title=&quot;IMG_7671&quot; wp-image-132=&quot;&quot; /&gt; &lt;br /&gt;
准备延长底座，一直要延伸到爪子那边&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;330&quot; alt=&quot;延长后的底座，正好顺路看看刚才比较费解的电机连接部分&quot; src=&quot;/uploads/allimg/100116/2115335C0-5.JPG&quot; title=&quot;IMG_7672&quot; wp-image-133=&quot;&quot; /&gt; &lt;br /&gt;
延长后的底座，正好顺路看看刚才比较费解的电机连接部分&lt;/p&gt;
&lt;p&gt;这一部分拍的照片有点少，不过乐高积木就是有这点好处，你想怎么蹂躏它都可以，只要接在一起就可以了，不一定非要完全按照我的接法。下一篇我们将要连上驱动爪子的电机！&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=120&quot; title=&quot;Permanent Link to 解魔方的机器人攻略9 &amp;ndash; 颜色传感器电机&quot;&gt;解魔方的机器人攻略9 &amp;ndash; 颜色传感器电机&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-16</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程7：底座电机]]></title>
    <link>http://www.robotain.com/tech/diy/201001/16287.html</link>
    <description>&lt;p&gt;底座完工以后，需要把它连接到电机上。需要注意的是，我们还需要把这个底座变成一个40度左右的斜坡。为什么要有坡度呢，肯定不是吃饱了撑的。因为萝卜头只有一个爪子用来翻转魔方，有了坡度以后，借助重力作用，轻轻一推就可以翻过去。&lt;/p&gt;
&lt;p&gt;经过我多次实验，坡度太大的时候魔方容易滚出台外，坡度太小了又翻不过去，这个40度左右刚刚好。&lt;/p&gt;
&lt;p&gt;说起这个，我想起前不久的老同学聚会，有些同学太&amp;ldquo;爽快&amp;rdquo;，聚会非要喝到人仰马翻为止。其实任何事物都要掌握一个度，所谓&amp;ldquo;酒饮微醉，花看半开&amp;rdquo;。不喝酒没气氛，喝多了太伤身，还鬼哭狼嚎的。。。就像这个斜坡似的，恰到好处最合适。&lt;/p&gt;
&lt;p&gt;又扯远了，先远观一下我们即将要做的部分（下图的右边部分）&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;420&quot; wp-image-100=&quot;&quot; title=&quot;IMG_7701&quot; src=&quot;/uploads/allimg/100116/210Q54612-0.JPG&quot; alt=&quot;接下来要介绍右侧的电机和斜坡支架&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来要介绍右侧的电机和斜坡支架&lt;/p&gt;
&lt;p&gt;好，接下来继续看图说话：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;768&quot; wp-image-101=&quot;&quot; title=&quot;IMG_7641&quot; src=&quot;/uploads/allimg/100116/210Q56400-1.JPG&quot; alt=&quot;在底盘背面加上四个转向固定连杆&quot; /&gt; &lt;br /&gt;
在底盘背面加上四个转向固定连杆&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;556&quot; wp-image-102=&quot;&quot; title=&quot;IMG_7642&quot; src=&quot;/uploads/allimg/100116/210Q54406-2.JPG&quot; alt=&quot;插上以后的效果&quot; /&gt; &lt;br /&gt;
插上以后的效果&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;408&quot; wp-image-103=&quot;&quot; title=&quot;IMG_7643&quot; src=&quot;/uploads/allimg/100116/210Q52622-3.JPG&quot; alt=&quot;电机连接需要的配件&quot; /&gt; &lt;br /&gt;
电机连接需要的配件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;429&quot; wp-image-104=&quot;&quot; title=&quot;IMG_7644&quot; src=&quot;/uploads/allimg/100116/210Q53338-4.JPG&quot; alt=&quot;电机连接效果&quot; /&gt; &lt;br /&gt;
电机连接效果&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; id=&quot;attachment_105&quot; alignnone=&quot;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;557&quot; wp-image-105=&quot;&quot; title=&quot;IMG_7646&quot; src=&quot;/uploads/allimg/100116/210Q5AI-5.JPG&quot; alt=&quot;后来发现那个大直角插件有问题，换成黄色的这个了，懒得再拍一遍，凑合看吧&quot; /&gt; &lt;br /&gt;
后来发现那个大直角插件有问题，换成黄色的这个了，懒得再拍一遍，凑合看吧&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;476&quot; wp-image-106=&quot;&quot; title=&quot;IMG_7647&quot; src=&quot;/uploads/allimg/100116/210Q544X-6.JPG&quot; alt=&quot;连上以后的效果，领会精神吧，自己试试&quot; /&gt; &lt;br /&gt;
连上以后的效果，领会精神吧，自己试试&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;276&quot; wp-image-107=&quot;&quot; title=&quot;IMG_7648&quot; src=&quot;/uploads/allimg/100116/210Q51J1-7.JPG&quot; alt=&quot;支架需要的配件&quot; /&gt; &lt;br /&gt;
支架需要的配件组装后的支架&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;497&quot; wp-image-111=&quot;&quot; title=&quot;IMG_7651&quot; src=&quot;/uploads/allimg/100116/210Q5OA-8.JPG&quot; alt=&quot;我最爱的转向&amp;ldquo;插销&amp;rdquo;，又结实又好用&quot; /&gt; &lt;br /&gt;
我最爱的转向&amp;ldquo;插销&amp;rdquo;，又结实又好用&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;389&quot; wp-image-112=&quot;&quot; title=&quot;IMG_7652&quot; src=&quot;/uploads/allimg/100116/210Q5LP-9.JPG&quot; alt=&quot;支架和电机连接&quot; /&gt; &lt;br /&gt;
支架和电机连接&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;461&quot; wp-image-113=&quot;&quot; title=&quot;IMG_7653&quot; src=&quot;/uploads/allimg/100116/210Q54606-10.JPG&quot; alt=&quot;加一个蓝色插销加强一下&quot; /&gt; &lt;br /&gt;
加一个蓝色插销加强一下&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;412&quot; wp-image-114=&quot;&quot; title=&quot;IMG_7654&quot; src=&quot;/uploads/allimg/100116/210Q56324-11.JPG&quot; alt=&quot;连上一个大直角，这个是以后用的，先放着&quot; /&gt; &lt;br /&gt;
连上一个大直角，这个是以后用的，先放着&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;345&quot; wp-image-115=&quot;&quot; title=&quot;IMG_7655&quot; src=&quot;/uploads/allimg/100116/210Q51P2-12.JPG&quot; alt=&quot;准备做另一边的支架&quot; /&gt; &lt;br /&gt;
准备做另一边的支架&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;347&quot; wp-image-108=&quot;&quot; title=&quot;IMG_7656&quot; src=&quot;/uploads/allimg/100116/210Q544P-13.JPG&quot; alt=&quot;组装后的第二个支架&quot; /&gt; &lt;br /&gt;
组装后的第二个支架&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;538&quot; wp-image-109=&quot;&quot; title=&quot;IMG_7657&quot; src=&quot;/uploads/allimg/100116/210Q51641-14.JPG&quot; alt=&quot;支架与电机连接&quot; /&gt; &lt;br /&gt;
支架与电机连接&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;217&quot; wp-image-116=&quot;&quot; title=&quot;IMG_7658&quot; src=&quot;/uploads/allimg/100116/210Q51537-15.JPG&quot; alt=&quot;这些是固定宽度的撑杆&quot; /&gt; &lt;br /&gt;
这些是固定宽度的撑杆&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;330&quot; wp-image-122=&quot;&quot; title=&quot;IMG_7660&quot; src=&quot;/uploads/allimg/100116/210Q53552-16.JPG&quot; alt=&quot;这个支架还没有完全连起来，给它添加一个直角连接，连接的照片忘拍了，自己试试吧&quot; /&gt; &lt;br /&gt;
这个支架还没有完全连起来，给它添加一个直角连接，连接的照片忘拍了，自己试试吧&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;476&quot; wp-image-117=&quot;&quot; title=&quot;IMG_7659&quot; src=&quot;/uploads/allimg/100116/210Q52556-17.JPG&quot; alt=&quot;完工了！看看四脚朝天的效果图&quot; /&gt; &lt;br /&gt;
完工了！看看四脚朝天的效果图&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=99&quot; title=&quot;Permanent Link to 解魔方的机器人攻略8 &amp;ndash; 底座电机&quot;&gt;解魔方的机器人攻略8 &amp;ndash; 底座电机&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-16</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（六）—瓦力的眼睛]]></title>
    <link>http://www.robotain.com/tech/diy/201001/16285.html</link>
    <description>&lt;p&gt;&lt;strong&gt;六、&amp;ldquo;瓦力&amp;rdquo;的&amp;ldquo;眼睛&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;ldquo;瓦力&amp;rdquo;的眼睛是整个制作过程中最值得稍微炫耀一下的一个部件了，它由一个超声测距传感器、一个舵机、一个色标盘和一个灰度传感器组成，组装完成后酷似 &amp;ldquo;机器人瓦力&amp;rdquo;的眼睛，我的机器人也因而得名。我目前只让它扫描120度的范围，等我将基于它目前扫描范围内的壁障行走程序完成之后再考虑对它进行改进。&lt;/p&gt;
&lt;p&gt;舵机、灰度检测器和超声测距我就不用多说了，超声测距与舵机的连接部分是我用当年四驱车上的龙头、刹车器等零件拼装成的，结果达到了意想不到的既好看又好 用的效果。色标盘是我后来想到的用于限定&amp;ldquo;眼睛&amp;rdquo;扫描范围以及确定前方的方法，因为虽然舵机本身可以控制旋转的速度和角度，但在实际的连续转动中它会因为 每一次旋转的误差累计而导致长时间扫描的过程中扫描范围出现极大的误差，而且仅使用舵机很难精确的确定相对于机器人的&amp;ldquo;前方&amp;rdquo;、&amp;ldquo;左方&amp;rdquo;和&amp;ldquo;右方&amp;rdquo;，因此 我用一个半圆色标盘来标定它的&amp;ldquo;前方&amp;rdquo;和扫描范围，再辅以时间和角度的计算，理论上便可以确定前方障碍的方向了。现在我只编写了一个测试程序让它实时显示 扫描过程中的测距数值，数值看起来还是比较精确的，至少用于壁障行走应该足够了，至于确定障碍方向以及真正完整壁障行走的程序，还需要等待一些时日才能写 好，毕竟我的数学与编程能力还不是那么强。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;色标盘&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/color-panel-pic.jpg&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;184&quot; alt=&quot;color-panel-pic&quot; src=&quot;/uploads/allimg/100116/1232514530-0.jpg&quot; title=&quot;color-panel-pic&quot; wp-image-906=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;dwg version: &lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/color-panel.dwg&quot;&gt;color-panel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;灰度检测板：（原理同地面检测）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/2009/12/28/diy-wall-e-four-grey-scale-sensor/&quot;&gt;http://www.p4cpu.net/2009/12/28/diy-wall-e-four-grey-scale-sensor/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;整个机构的外形&lt;/strong&gt;：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-01.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-01&quot; src=&quot;/uploads/allimg/100116/12325143c-1.jpg&quot; title=&quot;wall-e-eye-01&quot; wp-image-907=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-02.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-02&quot; src=&quot;/uploads/allimg/100116/1232511946-2.jpg&quot; title=&quot;wall-e-eye-02&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-03.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-03&quot; src=&quot;/uploads/allimg/100116/123251BU-3.jpg&quot; title=&quot;wall-e-eye-03&quot; wp-image-909=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-04.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-04&quot; src=&quot;/uploads/allimg/100116/1232515920-4.jpg&quot; title=&quot;wall-e-eye-04&quot; wp-image-910=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-05.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-05&quot; src=&quot;/uploads/allimg/100116/12325114c-5.jpg&quot; title=&quot;wall-e-eye-05&quot; wp-image-911=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-07.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-07&quot; src=&quot;/uploads/allimg/100116/123251G46-6.jpg&quot; title=&quot;wall-e-eye-07&quot; wp-image-913=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-08.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-08&quot; src=&quot;/uploads/allimg/100116/1232511454-7.jpg&quot; title=&quot;wall-e-eye-08&quot; wp-image-914=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-09.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-09&quot; src=&quot;/uploads/allimg/100116/1232512V0-8.jpg&quot; title=&quot;wall-e-eye-09&quot; wp-image-915=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/wall-e-eye-10.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;wall-e-eye-10&quot; src=&quot;/uploads/allimg/100116/1232512926-9.jpg&quot; title=&quot;wall-e-eye-10&quot; wp-image-916=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/28/%e5%88%b6%e4%bd%9c%e6%9c%ba%e5%99%a8%e4%ba%ba%e2%80%9c%e7%93%a6%e5%8a%9b%e2%80%9d%ef%bc%88%e5%85%ad%ef%bc%89%e2%80%94%e2%80%94%e2%80%9c%e7%93%a6%e5%8a%9b%e2%80%9d%e7%9a%84%e2%80%9c%e7%9c%bc%e7%9d%9b/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（六）&amp;mdash;&amp;mdash;&amp;ldquo;瓦力&amp;rdquo;的&amp;ldquo;眼睛&amp;rdquo;&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-16</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（五）—转速检测器]]></title>
    <link>http://www.robotain.com/tech/diy/201001/16284.html</link>
    <description>&lt;p&gt;&lt;strong&gt;五、转速检测器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里用到的转速检测器其实就是两只槽式光电开关，搭配RP5底盘上提供的带孔齿轮做测速用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元件&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1. 槽式光电开关 x2&lt;/p&gt;
&lt;p&gt;2. 1K，10K电阻分别 x2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电路图&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/Photoelectric-switch.png&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;212&quot; alt=&quot;Photoelectric-switch&quot; src=&quot;/uploads/allimg/100116/12291544E-0.png&quot; title=&quot;Photoelectric-switch&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF Version:&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/Photoelectric-switch.pdf&quot;&gt;Photoelectric-switch.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ms10 Version:&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/photoelectric-switch-ms10.ms10&quot;&gt;photoelectric-switch-ms10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际效果图&lt;/strong&gt;：（无奈我已经将它装在了&amp;ldquo;瓦力&amp;rdquo;身上，所以不太便于拍摄）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/photoelectronic-switch-real.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;photoelectronic-switch-real&quot; src=&quot;/uploads/allimg/100116/1229156328-1.jpg&quot; title=&quot;photoelectronic-switch-real&quot; wp-image-899=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/28/diy-wall-e-five-photoelectronic-switch/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（五）&amp;mdash;&amp;mdash;转速检测器&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-16</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程6：底座]]></title>
    <link>http://www.robotain.com/tech/diy/201001/15283.html</link>
    <description>&lt;p&gt;接下来的几篇攻略会以图片为主，基本上每个步骤都加上了下一个步骤需要的颗粒，相信聪明的你肯定能理解。&lt;br /&gt;
首先要制作的是魔方的底座，就是下面这个东东：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; id=&quot;attachment_77&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;456&quot; wp-image-77=&quot;&quot; title=&quot;RotateBase&quot; src=&quot;/uploads/allimg/100115/2236343U8-0.JPG&quot; alt=&quot;可选择的魔方底座&quot; /&gt;&lt;br /&gt;
可旋转的魔方底座&lt;/p&gt;
&lt;p&gt;（我家娘子看了上面这张图，第一反应是&amp;ldquo;结婚戒指呢？&amp;rdquo;。哭，好不容易找的角度，居然被慧眼如炬的识破了&amp;hellip;&amp;hellip;:)&lt;br /&gt;
下面是看图说话环节：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;438&quot; wp-image-78=&quot;&quot; title=&quot;IMG_7624&quot; src=&quot;/uploads/allimg/100115/223634Lc-1.JPG&quot; alt=&quot;双层的齿轮盘+两个连杆&quot; /&gt;&lt;br /&gt;
双层的齿轮盘+两个连杆&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;438&quot; wp-image-79=&quot;&quot; title=&quot;IMG_7626&quot; src=&quot;/uploads/allimg/100115/2236345Z0-2.JPG&quot; alt=&quot;这个是背面，接上转向连接件&quot; /&gt;&lt;br /&gt;
这个是背面，接上转向连接件&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;415&quot; wp-image-80=&quot;&quot; title=&quot;IMG_7627&quot; src=&quot;/uploads/allimg/100115/2236342643-3.JPG&quot; alt=&quot;没啥好说的&quot; /&gt;&lt;br /&gt;
没啥好说的&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;584&quot; wp-image-81=&quot;&quot; title=&quot;IMG_7629&quot; src=&quot;/uploads/allimg/100115/223634H52-4.JPG&quot; alt=&quot;装上了&amp;ldquo;擂台的四个柱子&amp;rdquo;&quot; /&gt;&lt;br /&gt;
装上了&amp;ldquo;擂台的四个柱子&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;258&quot; wp-image-82=&quot;&quot; title=&quot;IMG_7630&quot; src=&quot;/uploads/allimg/100115/2236341214-5.JPG&quot; alt=&quot;这些将是&amp;ldquo;擂台的围栏&amp;rdquo;&quot; /&gt;&lt;br /&gt;
这些将是&amp;ldquo;擂台的围栏&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;466&quot; wp-image-84=&quot;&quot; title=&quot;IMG_7631&quot; src=&quot;/uploads/allimg/100115/2236344252-6.JPG&quot; alt=&quot;两个围栏的最后合影，从此天各一方&quot; /&gt;&lt;br /&gt;
两个围栏的最后合影，从此天各一方&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;435&quot; wp-image-85=&quot;&quot; title=&quot;IMG_7632&quot; src=&quot;/uploads/allimg/100115/223634I16-7.JPG&quot; alt=&quot;另外两个围栏&quot; /&gt;&lt;br /&gt;
另外两个围栏&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;583&quot; wp-image-86=&quot;&quot; title=&quot;IMG_7633&quot; src=&quot;/uploads/allimg/100115/22363454H-8.JPG&quot; alt=&quot;四面围栏搞定，准备开始铺地砖&quot; /&gt;&lt;br /&gt;
四面围栏搞定，准备开始铺地砖&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;544&quot; wp-image-87=&quot;&quot; title=&quot;IMG_7634&quot; src=&quot;/uploads/allimg/100115/2236345218-9.JPG&quot; alt=&quot;定位销钉&quot; /&gt;&lt;br /&gt;
定位销钉&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;588&quot; wp-image-88=&quot;&quot; title=&quot;IMG_7635&quot; src=&quot;/uploads/allimg/100115/2236341Z1-10.JPG&quot; alt=&quot;这是几块&amp;ldquo;地砖&amp;rdquo;&quot; /&gt;&lt;br /&gt;
这是几块&amp;ldquo;地砖&amp;rdquo;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;558&quot; wp-image-89=&quot;&quot; title=&quot;IMG_7637&quot; src=&quot;/uploads/allimg/100115/223634L11-11.JPG&quot; alt=&quot;继续铺地砖&quot; /&gt;&lt;br /&gt;
继续铺地砖&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;299&quot; wp-image-90=&quot;&quot; title=&quot;IMG_7638&quot; src=&quot;/uploads/allimg/100115/223634NT-12.JPG&quot; alt=&quot;地砖安装前&quot; /&gt;&lt;br /&gt;
地砖安装前&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;502&quot; wp-image-91=&quot;&quot; title=&quot;IMG_7639&quot; src=&quot;/uploads/allimg/100115/2236343310-13.JPG&quot; alt=&quot;大功告成，看看效果&quot; /&gt;&lt;br /&gt;
大功告成，看看效果&lt;/p&gt;
&lt;p&gt;两点说明：&lt;br /&gt;
1，这样装完的底盘是有沟壑的，翻转魔方的时候会有很大摩擦力，需要铺上一层光滑的纸或塑料；我从零食盒上剪了一块方形的塑料贴上了。&lt;br /&gt;
2，就在我制作的过程中，国甲魔方出了第二代，比标准的魔方小一点，为56mm（标准Rubik&amp;rsquo;s是57.15mm）。因为这一点点误差，萝卜头回国以后一直水土不服，直到我把四周的护栏缩小了一圈。各位同学到时候请根据自己买的魔方来做相应调整。&lt;/p&gt;
&lt;p&gt;这是最近的样子：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; id=&quot;attachment_94&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;505&quot; wp-image-94=&quot;&quot; title=&quot;IMG_8469&quot; src=&quot;/uploads/allimg/100115/2236346105-14.JPG&quot; alt=&quot;调整后最新的样子&quot; /&gt;&lt;br /&gt;
调整后最新的样子&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=76&quot; title=&quot;Permanent Link to 解魔方的机器人攻略7 &amp;ndash; 底座&quot;&gt;解魔方的机器人攻略7 &amp;ndash; 底座&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-15</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程5：结构设计]]></title>
    <link>http://www.robotain.com/tech/diy/201001/15282.html</link>
    <description>&lt;p&gt;接下来我会给大家介绍如何搭建萝卜头的结构。事先需要说明以下几点：&lt;br /&gt;
1，搭建好的萝卜头是不能动的，只有烧入程序以后，它才开始有思考能力&lt;br /&gt;
2，所有照片都是我在搭建过程中拍的，许多地方后来都做了修改&lt;br /&gt;
3，如果你完全按照我的攻略，肯定可以复制出一个萝卜头，这叫&amp;ldquo;抄作业&amp;rdquo;&lt;br /&gt;
4，如果你参考我的攻略，领会精神，也可以做出自己的窝窝头或其他什么头，这叫&amp;ldquo;做作业&amp;rdquo;&lt;/p&gt;
&lt;p&gt;凡事预则立，不预则废。开始动手之前，在脑子里要先有大致上的构思。&lt;br /&gt;
NXT套装一共有三个电机，四个传感器（声音，距离，亮度和接触），另外有个单独的颜色传感器。&lt;br /&gt;
颜色传感器每次只能读一个点的颜色，为了扫描整个魔方，必须用一个电机带动它来读取不同的位置。&lt;br /&gt;
剩下的两个电机，一个用来&amp;ldquo;转&amp;rdquo;，一个用来&amp;ldquo;翻&amp;rdquo;和&amp;ldquo;抓&amp;rdquo;，这样才能切换到不同的面并进行操作。&lt;br /&gt;
有了大概的方向以后，就可以按照这个思路来搭建了。乐高有个巨大的优点就是积木式的设计，你可以随意调整它的结构。&lt;br /&gt;
我目前的这个方案也是经过了许多次的尝试，搭了又拆，拆了又搭，等大拇指上磨出一层茧的时候就差不多了。&lt;/p&gt;
&lt;p&gt;在我的设计里，后来陆陆续续加了一些功能，其中影响到结构的包括：&lt;br /&gt;
1，增加了距离传感器，用来判断底盘上是否放上了魔方。&lt;br /&gt;
2，增加了亮度传感器，用来修正底盘旋转角度的误差。&lt;br /&gt;
3，为机械臂增加了一组减速齿轮，用以增加臂力，避免脱臼和骨折的发生。&lt;/p&gt;
&lt;p&gt;由于这些原因，加上我也懒得拆开重新拍一遍，所以你看到的照片和最终的成品会有一些不同。&lt;br /&gt;
从另一个角度来说，结构设计并没有标准答案，你可以发挥想象力，做出更个性的机器人！&lt;br /&gt;
（呼呼，又说了很多废话，下面正式开始上图）&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=72&quot; title=&quot;Permanent Link to 解魔方的机器人攻略6 &amp;ndash; 结构设计&quot;&gt;解魔方的机器人攻略6 &amp;ndash; 结构设计&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-15</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（四）—地面灰度传感]]></title>
    <link>http://www.robotain.com/tech/diy/201001/15281.html</link>
    <description>&lt;p&gt;&lt;strong&gt;四 地面灰度传感器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个地面灰度传感器十分容易制作，只要将它做的稍微好看一些就行了。&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;元件&lt;/strong&gt;：（一组传感器）&lt;/p&gt;
&lt;p&gt;1. 1K可调电阻&lt;/p&gt;
&lt;p&gt;2. 光敏电阻&lt;/p&gt;
&lt;p&gt;3. 红色发光二极管&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电路图&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/grey-scale.png&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;212&quot; alt=&quot;grey-scale&quot; src=&quot;/uploads/allimg/100115/113940FI-0.png&quot; title=&quot;grey-scale&quot; wp-image-891=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF Version:&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/grey-scale.pdf&quot;&gt;grey-scale.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成型后的效果&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/grey-scale-sensor-1.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;grey-scale-sensor-1&quot; src=&quot;/uploads/allimg/100115/1139401X0-1.jpg&quot; title=&quot;grey-scale-sensor-1&quot; wp-image-889=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/grey-scale-sensor-2.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;grey-scale-sensor-2&quot; src=&quot;/uploads/allimg/100115/11394044X-2.jpg&quot; title=&quot;grey-scale-sensor-2&quot; wp-image-890=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注：其实元件里的1K可调电阻完全可以只使用1K电阻替代，我用可调电阻是为了能对二极管的亮度进行一下微调，消除一下因每个传感器个体差异导致的读取值的差异，在后来的编程序时能方便一些。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/28/diy-wall-e-four-grey-scale-sensor/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（四）&amp;mdash;&amp;mdash;地面灰度传感器&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-15</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（三）—DIY Handy Board]]></title>
    <link>http://www.robotain.com/tech/diy/201001/15280.html</link>
    <description>&lt;p&gt;其实这个本不应该属于&amp;ldquo;瓦力&amp;rdquo;的制作范畴，但是Handy Board附带的原生Serial Interface实在让人头疼，硕大一个板子不说，接口还非得一头是DB9 to DB25，另一头是RJ12，然后还多余的附带一个充电电路。为了能让它便于安装到&amp;ldquo;瓦力&amp;rdquo;身上，我做了一个缩小版的Serial Interface（制作过程中参考了&lt;a href=&quot;http://schuyler.cn/94&quot;&gt;这里&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原版&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/original-si-1.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;original-si-1&quot; src=&quot;/uploads/allimg/100115/113634E20-0.jpg&quot; title=&quot;original-si-1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/original-si-2.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;original-si-2&quot; src=&quot;/uploads/allimg/100115/1136341U4-1.jpg&quot; title=&quot;original-si-2&quot; wp-image-874=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缩小版&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/new-si-1.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;new-si-1&quot; src=&quot;/uploads/allimg/100115/1136341W6-2.jpg&quot; title=&quot;new-si-1&quot; wp-image-871=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/new-si-2.JPG&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; alt=&quot;new-si-2&quot; src=&quot;/uploads/allimg/100115/1136345H6-3.jpg&quot; title=&quot;new-si-2&quot; wp-image-872=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其实这次我并没能将 Serial Interface 做的足够小，其中一个很大的原因是自己多年未焊接电路板，所以脑袋和手都不太灵活，元件的位置和接口安排不太合理不说，背面的引线也很混乱，还忘记了做开关和5V扩展接头。在这里我先将它的制作过程简单写一下，并发布已经修改好的电路图，过阵子我重新做了新板子会更新本文的图片。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所需元件&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;1. 25V，10uF 电容 x4&lt;/p&gt;
&lt;p&gt;2. MAX232 x1&lt;/p&gt;
&lt;p&gt;3. 0.1uF 陶瓷电容&lt;/p&gt;
&lt;p&gt;4. 红色、绿色发光二极管各一个&lt;/p&gt;
&lt;p&gt;5. 2.2K，1K电阻各一个&lt;/p&gt;
&lt;p&gt;6. LM7805 x1&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;电路图&lt;/strong&gt;：（如有错误或不明确指出请指出）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/Serial-Interface.png&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;212&quot; alt=&quot;Serial Interface&quot; src=&quot;/uploads/allimg/100115/1136342608-4.png&quot; title=&quot;Serial Interface&quot; wp-image-876=&quot;&quot; size-medium=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF Version：&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/Serial-Interface.pdf&quot;&gt;Serial Interface.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ms10 Version：&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/Serial-Interface.ms10&quot;&gt;Serial Interface.ms10&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是改进后的电路图，我想在这个新的板子上，RJ12端用一个USB Female Connector、DB9端用一个3.5mm Female Jack来做，5V以2 Jumper Pin引出，然后分别做一根RJ12 to USB和一个DB9 to 3.5mm Male的线即可，这样Serial Interface无论与电脑端还是Handy Board端的连接都很方便了。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/27/diy-handy-board-serial-interface/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（三）&amp;mdash;&amp;mdash;DIY Handy Board Serial Interface&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-15</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程4：自制电源]]></title>
    <link>http://www.robotain.com/tech/diy/201001/14278.html</link>
    <description>&lt;p&gt;之前说了，9797搭配销售的有一块锂电池，但是没有充电器。而8527更是连锂电都没有。&lt;/p&gt;
&lt;p&gt;NXT需要9V电压，共计六节电池，说实话每次充电真是烦死我了（我的充电器是4口的，总过需要30小时充电！）。 如果你想单独购买充电套装，对不起，大概需要700块钱！&lt;/p&gt;
&lt;p&gt;好吧，忍无可忍了，下面看看我用废纸，铁钉，电线和直流变压器做成的电源：&lt;br /&gt;
1，找两根铁钉，长一点的，需要跟电池差不多长&lt;br /&gt;
2，在铁定上绕上两根电线，注意用红线连接正极，黑线连接负极&lt;br /&gt;
3，用白纸把铁钉裹住，裹成差不多跟电池一样大&lt;br /&gt;
4，买一个圆口的9V电源，额定电流要大，如果需要给锂电池充电的话，最好电流在800mA以上&lt;br /&gt;
5，买一个圆口的小插座，用来连接铁钉和电源&lt;br /&gt;
算一算成本，小插座2元，9V电源15元，其他的铁钉电线啥的从平时收集宝贝的箱子里翻翻就有了（也有人称之为叫垃圾箱，玩机器人的兄弟，平时需要养成收破烂的习惯）&lt;/p&gt;
&lt;p&gt;看看效果吧：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;二十元的电源套装&quot; src=&quot;/uploads/allimg/100114/2051191X1-0.jpg&quot; title=&quot;IMAG0030&quot; /&gt;&lt;br /&gt;
二十元的电源套装&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;9V直流电源&quot; src=&quot;/uploads/allimg/100114/2051191H0-1.jpg&quot; title=&quot;IMAG0032&quot; /&gt; &lt;br /&gt;
9V直流电源&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;铁钉做成的&amp;ldquo;假电池&amp;rdquo;，正好可以放进电池盒&quot; src=&quot;/uploads/allimg/100114/20511935U-2.jpg&quot; title=&quot;IMAG0035&quot; /&gt;&lt;br /&gt;
铁钉做成的&amp;ldquo;假电池&amp;rdquo;，正好可以放进电池盒&lt;/p&gt;
&lt;p&gt;好了，所有需要的材料都已经列出来了，大概只需要2700~3000元左右。接下来咱们就可以动手开工了！&lt;/p&gt;
&lt;p&gt;PS：应程序猎人的要求，我再贴两张清晰一点的接口图片.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;550&quot; height=&quot;513&quot; alt=&quot;电源插口&quot; src=&quot;/uploads/allimg/100114/20511a032-3.JPG&quot; title=&quot;IMG_8519&quot; wp-image-164=&quot;&quot; /&gt;&lt;br /&gt;
电源插口&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;546&quot; height=&quot;452&quot; alt=&quot;后面的三个焊脚，用万用表量，两个连通的是地，另一端是正&quot; src=&quot;/uploads/allimg/100114/20511a241-4.JPG&quot; title=&quot;IMG_8520&quot; wp-image-165=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后面的三个焊脚，用万用表量，两个连通的是地，另一端是正。至于插口的大小，带上你的变压器，在电子市场试一下就知道啦！&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.diy-robots.com/?p=59&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link to 解魔方的机器人攻略5 &amp;ndash; 自制电源&quot;&gt;解魔方的机器人攻略5 &amp;ndash; 自制电源&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-14</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程3：购买器件]]></title>
    <link>http://www.robotain.com/tech/diy/201001/14277.html</link>
    <description>&lt;p&gt;原文分成上下两篇，这里我们合成一篇文章。&lt;/p&gt;
&lt;p&gt;决心开始你的机器人之旅了吗？好，是时候从钱包里掏点诚意出来了！ 那些从电路开始做起的爱好者们，他们买器件就像是软刀子割肉，今天几十大洋，明天一百大洋，最后都不知道花了多少钱。&lt;/p&gt;
&lt;p&gt;幸运的是咱们这个项目，完全就是一锤子买卖，总价三千以内，买完就不用再花钱了。 下面从最贵的家伙开始介绍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一，乐高（lego）NXT Mindstorm机器人套装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还不知道乐高机器人的同学，请先Bing一下&lt;a href=&quot;http://cn.bing.com/search?q=%E4%B9%90%E9%AB%98+nxt+mindstorm+%E4%BB%8B%E7%BB%8D&amp;amp;form=QBRE&amp;amp;filt=all&amp;amp;qs=n&quot; target=&quot;_blank&quot;&gt;乐高+nxt+mindstorm+介绍&lt;/a&gt;。 我看完介绍，流的口水差点把键盘短路了。先别猴急，买东西一定要货比三家，毕竟咱们的银子也不是天上掉下来的。 NXT有两种版本，一种是教育版（型号是9797），一种是玩具版（型号是8527）&lt;/p&gt;
&lt;p&gt;感谢热心网友&lt;a rel=&quot;external nofollow&quot; href=&quot;http://www.freemindworld.com/&quot;&gt;Li Fanxi&lt;/a&gt;和inshua的线报： &lt;strong&gt;目前8527已经被8547替代，套装中已经包含了颜色传感器，暂时不包括锂电池。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对萝卜头来说，两种版本都可以用，下面是一些对比： # 9797比8527贵400块左右 # 9797比8527多一个锂电池（奸商没有配充电器，稍后我会介绍如何用20元DIY一个电源） # 9797比8527多一个触觉传感器（其实就是一个按钮） # 9797比8527多一个收纳盒，这个盒子真是个好东西，不过自己买一个也很便宜 # 两者的零件组合稍有差别，总数量上差不多 总结：不差钱就买9797，节约点就买8527。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;562&quot; height=&quot;442&quot; title=&quot;8527-1&quot; src=&quot;/uploads/allimg/100114/2043401340-0.jpg&quot; alt=&quot;NXT 9797玩具版&quot; /&gt; &lt;br /&gt;
NXT 8527玩具版&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;500&quot; height=&quot;325&quot; title=&quot;XL_9797KITHORIZ&quot; src=&quot;/uploads/allimg/100114/204340K24-1.jpg&quot; alt=&quot;NXT 9797教育版&quot; /&gt; &lt;br /&gt;
NXT 9797教育版&lt;/p&gt;
&lt;p&gt;8527在乐高的官方网站上售价是250美元，约合我朝1700大洋。遗憾的是送货地址只有欧美的几个国家，而中国的总代理西觅亚报价是3000大洋！&lt;/p&gt;
&lt;p&gt;因为这个事情，我曾用蹩脚的英文给乐高客服发了封强烈谴责的邮件，客服小mm服务态度还挺好，很快就回了封邮件（假设对方是小mm有助于缓解愤怒情绪）。大意是由于贵国征收了较高的关税，所以我们也无可奈何云云。&lt;/p&gt;
&lt;p&gt;有道理啊！想我泱泱大国，天朝上邦，自然物价要高一点才能体现出那啥主义的优越性。你看咱们的汽车比美国贵，房价比美国贵，玩具比美国贵。&lt;/p&gt;
&lt;p&gt;扯远了，其实你可以直接在淘宝搜索，价格便宜好多，这里我不就不做广告了。（感谢淘宝，感谢马云及其十八辈祖宗！）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二，颜色传感器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;身价第二高的同学隆重登场了。想玩魔方，当然要先能看到魔方，并且识别它的颜色。&lt;/p&gt;
&lt;p&gt;NXT套装里自带一个亮度传感器（Light Sensor），我曾经打算用它来读取魔方的颜色。&lt;/p&gt;
&lt;p&gt;后来发现这个亮度传感器只能读出灰度值，就跟个色盲似的，让它寻个线还凑合，让它看魔方简直就是杀牛用鸡刀。 没办法，只好再买一个专用的颜色传感器吧！&lt;/p&gt;
&lt;p&gt;照样上淘宝买吧，价格500元左右。&lt;/p&gt;
&lt;p&gt;需要注意的是，这个传感器虽然价格很贵，但是性能却没有想象的那么好。 它能以RGB的形式返回颜色值，但是误差是相当的大，后面我会专门介绍一下怎么在巨大的误差下判断颜色。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;NXT 颜色传感器&quot; src=&quot;/uploads/allimg/100114/2043404053-2.jpg&quot; title=&quot;8527-0000-xx-13-1&quot; /&gt; &lt;br /&gt;
NXT 颜色传感器&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三，魔方&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;魔方是制作萝卜头过程中非常关键的一环（废话）。问题在于，你不能随便在街头买个烂魔方，然后交给萝卜头。 因为萝卜头身体比较单薄，大刀耍不动的结果是把自己玩残了。&lt;/p&gt;
&lt;p&gt;我的第一个魔方就是街头花10块买的，当时还觉得相当贵，想当年好像只用了一块钱。&lt;/p&gt;
&lt;p&gt;结果很明显，魔方转到一半，萝卜头的胳膊飞出来了。&lt;/p&gt;
&lt;p&gt;后来我分别买过Rubik牌和国甲牌，价格都是50左右，质量上还是咱们国产的好！ 所以这里强烈推荐国甲，另外再强烈推荐个淘宝店叫魔方小站，自己搜一下吧：）&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;425&quot; height=&quot;418&quot; alt=&quot;国甲魔方&quot; src=&quot;/uploads/allimg/100114/20434032W-3.jpg&quot; title=&quot;jabailogo&quot; /&gt; &lt;br /&gt;
国甲魔方&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;四，乐高配件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;乐高公司真是一个伟大的奸商。它的产品很好，但是零件总是不够用。当你差几个连杆的时候，就会发现这玩意儿真是贵的惊人。我建议不用专门去买连杆或者销钉这样的小件。可以直接去买个乐高小车或者推土机这样的套装，反正多出来的也没损失。&lt;/p&gt;
&lt;p&gt;让人欢欣鼓舞的是，乐高颗粒有很多山寨的，尺寸完全一样，质量稍差一点，但是价格只有四分之一。 （一分钱一分货，乐高原装颗粒都是无毒的塑料，如果给孩子玩的话最好买原装的）&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img width=&quot;632&quot; height=&quot;551&quot; alt=&quot;乐高铲车&quot; src=&quot;/uploads/allimg/100114/2043401J5-4.jpg&quot; title=&quot;1255153346887&quot; /&gt; &lt;br /&gt;
乐高铲车&lt;/p&gt;
&lt;p&gt;原文链接：&lt;br /&gt;
&lt;a title=&quot;解魔方的机器人攻略3 &amp;ndash; 购买器件(上）&quot; href=&quot;http://www.diy-robots.com/?p=55&quot;&gt;解魔方的机器人攻略3 &amp;ndash; 购买器件(上） &lt;/a&gt;&lt;br /&gt;
&lt;a title=&quot;解魔方的机器人攻略4 &amp;ndash; 购买器件(下）&quot; href=&quot;http://www.diy-robots.com/?p=57&quot;&gt;解魔方的机器人攻略4 &amp;ndash; 购买器件(下） &lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-14</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（一）—车身板材]]></title>
    <link>http://www.robotain.com/tech/diy/201001/14274.html</link>
    <description>&lt;p&gt;&lt;strong&gt;二、车身板材&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;起初仅在脑海里构思&amp;ldquo;瓦力&amp;rdquo;的造型的时候，为它设计了三层的结构：第一层为主板、电池和几个传感器；第二层为超声测距；第三层为指南针、接口板、LCD和 红外复眼。可是在后来的实际安装中，由于一些传感器暂时缺乏或无法应用，所以现在成型的&amp;ldquo;瓦力&amp;rdquo;有两层：第一层为主板、电池、超声测距；第二层为LCD和 红外复眼；地面灰度传感器直接安装在坦克底盘上。下面是现有两层有机玻璃板的图纸，已经修正并添加了一些尺寸标注，将本文末尾提供的dwg文件下载后直接 在AutoCAD中打印在A4纸上，剪下后附在切割好的120mm x 180mm x 5mm有机玻璃板上即可打孔，有条件的最好将四角倒成圆角。&lt;/p&gt;
&lt;p&gt;第一层：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;img title=&quot;New.First.Floor&quot; src=&quot;/uploads/allimg/100114/1143552147-0.jpg&quot; alt=&quot;New.First.Floor&quot; /&gt;&lt;/p&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;p&gt;1. 40&amp;times;20,82.5&amp;times;110.5和171&amp;times;79的矩形范围分别表示DG04NF舵机（装有超声测距）、Handy Board和RP5底盘的位置，其内部包含的R1.5孔用于固定它们。&lt;/p&gt;
&lt;p&gt;2. 中间部位的R10孔用于引出电机和转速检测传感器的接线。&lt;/p&gt;
&lt;p&gt;3. 剩余的外围六个R1.5孔用于连接上层，可以根据传感器位置的需要来选择不同的孔。&lt;/p&gt;
&lt;p&gt;第二层：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img title=&quot;New.Second.Floor&quot; src=&quot;/uploads/allimg/100114/114355F26-1.jpg&quot; alt=&quot;New.Second.Floor&quot; /&gt;&lt;/p&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;p&gt;1. 中间40&amp;times;20的矩形和其前方R10的孔为舵机（红外复眼装于其上）及其引线孔。&lt;/p&gt;
&lt;p&gt;2. 36&amp;times;80的矩形和其前方5个孔为LCD及其引线孔。&lt;/p&gt;
&lt;p&gt;dwg文件下载：&lt;/p&gt;
&lt;p&gt;第一层：&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/New.First.Floor.dwg&quot;&gt;first-floor.dwg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;第二层：&lt;a href=&quot;http://www.p4cpu.net/wp-content/uploads/2009/12/New.Second.Floor.dwg&quot;&gt;second-floor.dwg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注：&lt;/p&gt;
&lt;p&gt;本文所给出的尺寸可能因为RP5底盘的个体差异而使得底盘上的孔与第一层板上对应的四个连接孔位置略有差异。&lt;/p&gt;
&lt;p&gt;我本次提供的图中所做的尺寸标注还不是很完善，最近我会继续完善标注并更新本文。&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/27/diy-wall-e-two/&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（二）&amp;mdash;&amp;mdash;车身板材&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-14</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[机器人“瓦力”制作教程（一）—配件]]></title>
    <link>http://www.robotain.com/tech/diy/201001/14273.html</link>
    <description>&lt;p&gt;经&lt;a href=&quot;http://www.p4cpu.net&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;老陈&lt;/strong&gt;&lt;/a&gt;许可，机器人智能网今天开始转载机器人&amp;ldquo;瓦力&amp;rdquo;制作教程，这是第一篇。&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力&quot; src=&quot;/uploads/allimg/100114/113S523U-0.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在高中的时候自己曾经做过一阵机器人，与&lt;a href=&quot;http://schuyler.cn/&quot;&gt;Schuler&lt;/a&gt;一人买了一个&lt;a href=&quot;http://www.handyboard.com/&quot;&gt;Handy Board&lt;/a&gt;，可是一直以来自己并没将它装备成一个成型的设备，所以在大多时候我那Handy Board都是躺在抽屉里度日的，偶尔被我拿出来插上电池编个小程序玩玩。在今年年初的时候，我已经产生了制作一个智能车的想法，可惜在&lt;a href=&quot;http://www.taobao.com/&quot;&gt;淘宝&lt;/a&gt;上选好了配件之后发现价钱太贵，所以计划又被搁置了，最近好容易腾出一些钱，所以就赶紧购置了合适的配件，开始着手制作机器人。&lt;/p&gt;
&lt;p&gt;在我写这篇文章的时候，我的机器人的机械部分已经组装完成了。之所以现在才开始写博文，是因为前阵子制作传感器、组装车身等繁琐的工作忙得我不亦乐乎，而 且身边几乎除了走路的地方外其他地方都被各种零件、工具和元件占满了，实在没腾出时间和空间来边做边写。至于机器人名字的由来，是在我用一系列四驱车配件 将超声测距传感器与舵机组装到一起之后，发现其样子酷似&lt;a href=&quot;http://images.google.com/images?hl=en&amp;amp;um=1&amp;amp;newwindow=1&amp;amp;sa=1&amp;amp;q=wall-e&amp;amp;aq=7&amp;amp;oq=wall&amp;amp;aqi=g10&amp;amp;start=0&quot;&gt;瓦力&lt;/a&gt;的眼睛，而且恰好我用的又是坦克底盘，所以就借用了&amp;ldquo;瓦力&amp;rdquo;二字。好了，我就不交代那么多前言了，现在开始分篇章切入主题。&lt;/p&gt;
&lt;p&gt;一、配件及工具(括号里是该配件的淘宝地址)&lt;/p&gt;
&lt;p&gt;1. Handy Board with Expansion Board&lt;/p&gt;
&lt;p&gt;2. RP5坦克车底盘 (&lt;a href=&quot;http://item.taobao.com/auction/item_detail.jhtml?item_id=c68ea1d8fc0d02ea6be2050f662238cf&amp;amp;x_id=0db1&quot;&gt;http://item.taobao.com/auction/item_detail.jhtml?item_id=c68ea1d8fc0d02ea6be2050f662238cf&amp;amp;x_id=0db1&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;3. 超声测距传感器 (&lt;a href=&quot;http://item.taobao.com/auction/item_detail-0db2-966629de40b9eccb1e71dbd88c1faeb5.jhtml&quot;&gt;http://item.taobao.com/auction/item_detail-0db2-966629de40b9eccb1e71dbd88c1faeb5.jhtml&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;4. 大谷DG04NF舵机4枚/舵机固定架若干 (&lt;a href=&quot;http://item.taobao.com/auction/item_detail.jhtml?item_id=71632fbbda158133d267b862a99d6d73&amp;amp;x_id=0db2&quot;&gt;http://item.taobao.com/auction/item_detail.jhtml?item_id=71632fbbda158133d267b862a99d6d73&amp;amp;x_id=0db2&lt;/a&gt;&amp;nbsp;，&lt;a href=&quot;http://item.taobao.com/auction/item_detail.jhtml?item_id=b1bc27f61ec1415e23ea11c145d54db3&amp;amp;x_id=0db2&quot;&gt;http://item.taobao.com/auction/item_detail.jhtml?item_id=b1bc27f61ec1415e23ea11c145d54db3&amp;amp;x_id=0db2&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;5.槽式光电开关2枚 (&lt;a href=&quot;http://item.taobao.com/auction/item_detail.jhtml?item_id=5441759bb2077952ef9e845c04626e18&amp;amp;x_id=0db1&quot;&gt;http://item.taobao.com/auction/item_detail.jhtml?item_id=5441759bb2077952ef9e845c04626e18&amp;amp;x_id=0db1&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;6. 两组7.2V锂电池&lt;/p&gt;
&lt;p&gt;7. 5mm厚有机玻璃板&lt;/p&gt;
&lt;p&gt;8. 发光二极管、光敏电阻、各种阻值的电阻、导线、螺钉等若干&lt;/p&gt;
&lt;p&gt;9. 为了钻小孔，以及切割和打磨相应的部件，我购置了一套电磨 (&lt;a href=&quot;http://item.taobao.com/auction/item_detail.jhtml?item_id=f2be712b7968bcdb66c9c82705ed8289&amp;amp;x_id=0db1&quot;&gt;http://item.taobao.com/auction/item_detail.jhtml?item_id=f2be712b7968bcdb66c9c82705ed8289&amp;amp;x_id=0db1&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;10. 烙铁、钳子等各种常规工具&amp;hellip;&amp;hellip;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a href=&quot;http://www.p4cpu.net/2009/12/27/diy-wall-e-one/&quot; target=&quot;_blank&quot;&gt;制作机器人&amp;ldquo;瓦力&amp;rdquo;（一）&amp;mdash;&amp;mdash;配件&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-14</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>老陈的博客</comments>
</item>
<item>
    <title><![CDATA[老陈：制作机器人“瓦力”]]></title>
    <link>http://www.robotain.com/tech/show/201001/13272.html</link>
    <description>&lt;p&gt;我们一直非常关注国内机器人爱好者的作品，前几天刚介绍了动力老男孩（&lt;a href=&quot;http://www.diy-robots.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;DIY-ROBOTS&lt;/u&gt;&lt;/a&gt;）的&lt;a href=&quot;http://www.robotain.com/tech/diy/200912/30210.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;解魔方机器人教程&lt;/u&gt;&lt;/a&gt;，该教程也正在机器人智能网上连载。我们又看到了老陈（&lt;a href=&quot;http://www.p4cpu.net&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;p4cpu.net&lt;/u&gt;&lt;/a&gt;）制作的&lt;a href=&quot;http://www.p4cpu.net/category/robotelectronics/wall-e/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;机器人&amp;rdquo;瓦力&amp;ldquo;&lt;/u&gt;&lt;/a&gt;，非常酷。老陈已经许可机器人智能网转载这个教程，不过今天先介绍一下老陈和他的机器人，明天开始具体转载教程。&lt;/p&gt;
&lt;p&gt;和&lt;a href=&quot;http://www.diy-robots.com/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;DIY-ROBOTS&lt;/u&gt;&lt;/a&gt;一样，老陈的这些文章也发表在自己的博客（&lt;a href=&quot;http://www.p4cpu.net&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;p4cpu.net&lt;/u&gt;&lt;/a&gt;）上。老陈在博客上的自我介绍是：&lt;u&gt;博主俗称老陈，又称p4cpu，现为一名大学生，多出没于北京、大连两地。我的博客主要产出有关外语学习、电脑应用技巧和读书心得的文章，有时也会发表些想法、收录些杂七杂八的内容。&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;从这里看出，老陈其实不老 ^_^&amp;nbsp; 老陈从高中时就开始捣鼓机器人，在09年初开始制作智能车，在年底的时候已经将机械部分组装完毕，然后写下了这个机器人&amp;rdquo;瓦力&amp;ldquo;系列教程。&lt;/p&gt;
&lt;p&gt;关于机器人的名字&amp;rdquo;瓦力&amp;ldquo;，是因为老陈用一系列四驱车配件将超声测距传感器与舵机组装到一起之后，发现其样子酷似瓦力的眼睛，而且恰好用的又是坦克底盘，所以称之为&amp;rdquo;瓦力&amp;ldquo;。机器人&amp;rdquo;瓦力&amp;ldquo;的成型图如下：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的前面&quot; src=&quot;/uploads/allimg/100113/22294Bb9-0.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的前面&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的前面&quot; src=&quot;/uploads/allimg/100113/2229463025-1.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的前面&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的前面&quot; src=&quot;/uploads/allimg/100113/22294A047-2.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的前面&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的正面&quot; src=&quot;/uploads/allimg/100113/2229461034-3.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的正面&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的侧面&quot; src=&quot;/uploads/allimg/100113/22294BH9-4.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的侧面&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;机器人瓦力的侧面&quot; src=&quot;/uploads/allimg/100113/2229462N4-5.jpg&quot; /&gt;&lt;br /&gt;
机器人瓦力的侧面&lt;/p&gt;
&lt;p&gt;好了，无需再多介绍，喜欢的朋友直接访问&lt;a target=&quot;_blank&quot; href=&quot;http://www.p4cpu.net/&quot;&gt;&lt;strong&gt;老陈的博客&lt;/strong&gt;&lt;/a&gt;，也可以关注我们明天的转载。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后话&lt;/strong&gt;：我是机器人智能网的Michael，看到解魔方机器人和机器人瓦力后，真的非常高兴，非常高兴看到这样的机器人作品，非常高兴能认识动力老男孩和老陈。虽然我们在不同的城市，但我们有共同的爱好，几句话，一封Email，让我感到我并不孤独。非常希望结识各地的爱好者们，一起交流学习。在2010年，我也准备做一个智能小车，或者直接购买相关套件，学习电子和编程。因为以前在校做机器人时，我只制作机械结构部分，电路和编程一直是弱项。欢迎爱好者们给我指点迷津。&lt;/p&gt;</description>
    <pubDate>2010-01-13</pubDate>
    <category>制作展示</category>
    <author>robotain</author>
    <comments>机器人智能网</comments>
</item>
<item>
    <title><![CDATA[解魔方机器人教程2：选择方案]]></title>
    <link>http://www.robotain.com/tech/diy/201001/13271.html</link>
    <description>&lt;p&gt;这是解魔方机器人的第二篇攻略，得到作者许可，转载如下。与作者交流，请访问 &lt;a href=&quot;http://www.diy-robots.com/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;diy-robots.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有了想法，接下来该怎么行动呢？我建议的方式是：&lt;br /&gt;
考查 -&amp;gt; 确定方案 -&amp;gt; 架构 -&amp;gt; 实现 -&amp;gt; 改进&lt;/p&gt;
&lt;p&gt;我们先开始考查，随便Bing一下 rubik+cube+robot 。你可以找到各种奇奇怪怪的魔方机器人，例如：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;/uploads/allimg/100113/213520E63-0.jpg&quot; alt=&quot;解魔方机器人&quot; /&gt;&lt;br /&gt;
各种神奇的魔方机器人(无聊的人还真不少)&lt;/p&gt;
&lt;p&gt;需要链接的请点这里：&lt;br /&gt;
http://www.switched.com/2009/09/17/teens-rubiks-cube-robot-solves-classic-puzzle/&lt;br /&gt;
http://video.google.com/videoplay?docid=-2084071621500271233#&lt;br /&gt;
http://www.youtube.com/watch?v=jkft2qaKv_o&lt;br /&gt;
http://www.engadget.com/2007/12/17/kawasaki-robot-solves-rubiks-cube-in-six-seconds-flat/&lt;br /&gt;
http://tiltedtwister.com/&lt;/p&gt;
&lt;p&gt;我决定参考（请注意是参考而不是抄袭）图中左下的方案，该方案基于Lego公司的NXT Mindstorm机器人套装制作，有以下优点：&lt;br /&gt;
1，成熟产品，无需设计电路和焊接&lt;br /&gt;
2，积木式设计，扩展性超强&lt;br /&gt;
3，三组电机，多种传感器，蓝牙连接，功能很完善&lt;br /&gt;
4，有很多第三方的开发包，编写代码很方便&lt;br /&gt;
5，价格可以承受(2k左右)&lt;/p&gt;
&lt;p&gt;它的缺点：&lt;br /&gt;
1，个头小，功率不高，转魔方没问题，干重体力活就不行了&lt;br /&gt;
2，塑料连接件，容易出现误差&lt;br /&gt;
3，想进一步扩展电子设备较困难&lt;/p&gt;
&lt;p&gt;万丈高楼平地起，确定方案就是迈出了第一步！请注意：貌似最轻松的这一步恰恰是最关键的，因为它会影响到之后的所有工作。这个考查阶段，我大概用了一星期的时间查阅资料，对比和估算了各种方案需要的时间和经费；另外还需要一个大概的可行性分析，确定这个方案可以行的通。&lt;/p&gt;
&lt;p&gt;现在回过头来看，可行性分析非常重要但也不要钻牛角尖，因为做一件事很少能一帆风顺，总会遇到各种出乎意料的问题。只要不轻言放弃，开发人员永远都可以兵来将挡，水来土掩。&lt;/p&gt;
&lt;p&gt;接下来就准备掏银子采购吧，像泡妞一样，该出手时就出手！ &amp;nbsp;&lt;/p&gt;
&lt;p&gt;原文链接：&lt;a title=&quot;Permanent Link to 解魔方的机器人攻略2 &amp;ndash; 选择方案&quot; href=&quot;http://www.diy-robots.com/?p=51&quot;&gt;解魔方的机器人攻略2 &amp;ndash; 选择方案&lt;/a&gt;&lt;/p&gt;</description>
    <pubDate>2010-01-13</pubDate>
    <category>机器人制作</category>
    <author>robotain</author>
    <comments>做做AI，造造人</comments>
</item>

</channel>
</rss>
