|
本帖最后由 rainjoe 于 2009-3-11 13:19 编辑
首先看一段源程序
以下为预处理部分:
// Power of tilt
#define TILTPOWER1 50
#define TILTPOWER2 100
// Angles of power1 and power2 TILTANGLE1 + TILTANGLE2 = 63
#define TILTANGLE1 35
#define TILTANGLE2 28
// Power of returning tilterarm
#define TILTRETURNPOWER1 100
#define TILTRETURNPOWER2 20
// Angles of power1 and power2 TILTRETURNANGLE1 + TILTRETURNANGLE2 = -63
#define TILTRETURNANGLE1 -33
#define TILTRETURNANGLE2 -30
// Time (ms) to rest before return tilterarm
#define TILTREST 200
以下函数中红色标记的部分为机械手推动魔方的具体代码:
void Tilt()
{
CheckCube();
RotateMotorEx(OUT_B,TILTPOWER1,TILTANGLE1,0,false,false);
RotateMotorEx(OUT_B,TILTPOWER2,TILTANGLE2,0,false,false);
RotateMotorEx(OUT_B,50,-1,0,false,false);
RotateMotorEx(OUT_B,100,1,0,false,true);
Wait(TILTREST);
RotateMotorEx(OUT_B,TILTRETURNPOWER1,TILTRETURNANGLE1,0,false,false);
RotateMotor(OUT_B,TILTRETURNPOWER2,TILTRETURNANGLE2);
char uf=faces[UPPERFACE];
faces[UPPERFACE]=faces[LEFTFACE];
faces[LEFTFACE]=faces[DOWNFACE];
faces[DOWNFACE]=faces[RIGHTFACE];
faces[RIGHTFACE]=uf;
}
为了大家更好理解,将预处理部分的具体数值代入函数中
RotateMotorEx(OUT_B, 50,35,0,false,false);//A
RotateMotorEx(OUT_B,100,28,0,false,false);//A
RotateMotorEx(OUT_B,50,-1,0,false,false);//B
RotateMotorEx(OUT_B,100,1,0,false,true);//B
Wait(200);//C
RotateMotorEx(OUT_B,100,-33,0,false,false);//D
RotateMotor(OUT_B,20,-30);//D
应用函数RotateMotorEx参数的具体意义参考NXC_Guide,视觉上一个连续的推动过程被大师分解成了四个部分,A部分首先让机械手以50的速度启动向前运动35(实际上是转动35度,在此用向前运动表示),两个原因:1、慢速(50)启动的好处是让系统平稳,不然你拿QQ四挡启动试试?2、向前35的效果是让机械手刚好接触到魔方,50的速度接触魔方的又一好处就是可以不让魔方在转台上跳动,而后B部分让机械手以100的速度推动魔方向前28,这里不用解释了吧,用最大的力去推动魔方让其翻转,但是在这里要说明一下的是A部分为什么不以更低的速度启动机械手,原因就是你用QQ拉个卡车试试?-1档都启动不了,那为什么又不高一点呢,60之类的,除了前面两个原因应该还有一个叫冲量定理的东西(貌似高中学过),Ft=m(v2-v1),即速度在瞬间差量越大提供的冲击力越大,在机械手接触到魔方的一刹那,即刚开始可以翻转魔方的一刹那,推力较大,以此保证的魔方的顺利到位,C部分这个来回抖动一下的作用其实是整个里面最巧妙的,为的是利用机械结构的压力和重力(惯性)使得魔方推动到位,注意C部分中第二句的最后一个参数为什么要设置为true,为的就是利用电机骤停加大机械手的惯性,使得机械手能够下压魔方,并在D部分加了一个小延时200ms,目的就是利用机械手的重力下压一下魔方(时间比较短,貌似用作用甚微),并在前后动作中稍微停顿,法拉利飙到最高时速后然后倒车能不停吗?后面的D部分应该不难理解了,以最快的速度离开魔方的原因是为了避免静摩擦力带动魔方向后运动,即把魔方回扯,被罪恶之手带走了?一旦速度快,动摩擦力小于静摩擦力,貌似高中物理知识用上不少,然后以较低速度停住,这个原因不用解释吧,毕竟世界上以最高时速停车的男人都称之为赛车手。
预告:
我把Hans Andersson的程序分成了关键的几个部分:
1、机械手推动精确控制
2、转台转动的精确控制
3、魔方解法算法
4、一些貌似微不足道的妙笔
今天先写第一部分了,为的是支持站长糖伯虎同志,感谢本站站长的资料,让我有机会复原大师的杰作,在此再次申明大师的魔方机器人叫Tilted Twister,在此注明以示尊重,记得藤子不二雄死前告诉他儿子,要让全世界的人们记得小叮当只有一个名字叫做哆啦A梦,不叫机器猫。 |
|