当利用可执行文件处理打乱的魔方,会得到一串类似F1U2B1D3……的字符,这些字符代表了还原魔方的动作,了解他们的具体含义就是最后我们需要解决的问题,而这个问题跟前面的比起来要简单得多。
6.1 动作表示
魔方一共有6个面,针对某1个面我们来拧他,分解后实际会得到3个基本动作:顺时针90度、顺时针180度、逆时针90度。看到这些有没有觉得亲切?这与之前我们分解EV3底座动作很类似。
对这3种动作用1 2 3来表示:
- 1:顺时针90度
- 2:顺时针180度
- 3:逆时针90度
结合6个面的表示法U F R B L D,就可以完成每个面的动作表示。比如:F1表示F面顺时针90度、R2表示R面顺时针180度……
最后就是对这些魔方动作,结合EV3机器人的动作,完成程序设计。
6.2 程序设计
# 转魔方的机器人马达指令 # U面旋转 def twist_u_clockwise(): base_anticlockwise() hand_turn() hand_press() base_anticlockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_clockwise() def twist_u_anticlockwise(): base_anticlockwise() hand_turn() hand_press() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_clockwise() def twist_u_reverse(): base_anticlockwise() hand_turn() hand_press() base_clockwise() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_clockwise() # D面旋转 def twist_d_clockwise(): base_clockwise() hand_turn() hand_press() base_anticlockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_anticlockwise() def twist_d_anticlockwise(): base_clockwise() hand_turn() hand_press() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_anticlockwise() def twist_d_reverse(): base_clockwise() hand_turn() hand_press() base_clockwise() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() base_anticlockwise() # F面旋转 def twist_f_clockwise(): hand_turn() hand_turn() hand_press() base_anticlockwise() hand_raise() hand_turn() hand_turn() hand_raise() def twist_f_anticlockwise(): hand_turn() hand_turn() hand_press() base_clockwise() hand_raise() hand_turn() hand_turn() hand_raise() def twist_f_reverse(): hand_turn() hand_turn() hand_press() base_clockwise() base_clockwise() hand_raise() hand_turn() hand_turn() hand_raise() # B面旋转 def twist_b_clockwise(): hand_press() base_anticlockwise() hand_raise() def twist_b_anticlockwise(): hand_press() base_clockwise() hand_raise() def twist_b_reverse(): hand_press() base_clockwise() base_clockwise() hand_raise() # L面旋转 def twist_l_clockwise(): hand_turn() hand_press() base_anticlockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() def twist_l_anticlockwise(): hand_turn() hand_press() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() def twist_l_reverse(): hand_turn() hand_press() base_clockwise() base_clockwise() hand_raise() hand_turn() hand_turn() hand_turn() hand_raise() # R面旋转 def twist_r_clockwise(): hand_turn() hand_turn() hand_turn() hand_press() base_anticlockwise() hand_raise() hand_turn() hand_raise() def twist_r_anticlockwise(): hand_turn() hand_turn() hand_turn() hand_press() base_clockwise() hand_raise() hand_turn() hand_raise() def twist_r_reverse(): hand_turn() hand_turn() hand_turn() hand_press() base_clockwise() base_clockwise() hand_raise() hand_turn() hand_raise() # 动作对应关系 move_step = { "U1":twist_u_clockwise, "U2":twist_u_reverse, "U3":twist_u_anticlockwise, "D1":twist_d_clockwise, "D2":twist_d_reverse, "D3":twist_d_anticlockwise, "F1":twist_f_clockwise, "F2":twist_f_reverse, "F3":twist_f_anticlockwise, "B1":twist_b_clockwise, "B2":twist_b_reverse, "B3":twist_b_anticlockwise, "L1":twist_l_clockwise, "L2":twist_l_reverse, "L3":twist_l_anticlockwise, "R1":twist_r_clockwise, "R2":twist_r_reverse, "R3":twist_r_anticlockwise } ###==================================================### ###=================MAIN FUNCTION====================### def main(): # 扫描魔方 cube_scan = buildup_cube_module() # 建立模型 cube_module = cvt2reid(cube_scan) # 植入算法 cube_solved = cube_algorithm(cube_module) # 分解动作 for i in range(len(cube_solved)/2): solve_step = cube_solved[i*2]+cube_solved[i*2+1] # 执行动作 move_step[solve_step] # 结束任务 end_of_mission() if __name__ == '__main__': main() ###=====================EOF==========================###
写在最后
从打算做这个项目到最后完成,前后用了大约2个月的时间。不得不说,在程序设计和实验的过程中遇到了在做之前没有想到的困难。也许这个系列的文章中简单的一段话,在实际做的过程中却是经过了很长时间多次的学习、研究才完成的。
本来是想每年用LEGO完成一个项目,定的计划也是2015年完成数字识别机器人、2016年完成解魔方机器人,但随着自己对EV3各类传感器、马达以及ev3dev系统和Python语言的不断熟悉,今年的任务也就提前完成了。
整理文字的过程是一个很枯燥繁琐的过程,同样也是一个总结和分享的过程。不得不说,在写这段文字的时候还是很开心的。接下来做什么样的项目还没有想好,也许会跟网络编程或者物联网开放平台相关。
如果你对我关注的东西也感兴趣,欢迎共同探讨。