解魔方机器人[六]-还原动作

当利用可执行文件处理打乱的魔方,会得到一串类似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语言的不断熟悉,今年的任务也就提前完成了。

整理文字的过程是一个很枯燥繁琐的过程,同样也是一个总结和分享的过程。不得不说,在写这段文字的时候还是很开心的。接下来做什么样的项目还没有想好,也许会跟网络编程或者物联网开放平台相关。

如果你对我关注的东西也感兴趣,欢迎共同探讨。

解魔方机器人[六]-还原动作》上有3条评论

  1. 猫纪

    真是超棒的文章,系统、全面而且有针对性!我简单浏览了mindcub3r的方案,他对拼装的介绍很详细,但程序层面只有简略的指南,我没找到没有具体的编程说明和源码。我猜到解魔方肯定是用了现成的模块,但是一直很好奇接口部分的实现。通过您的文章,学到了很多,在考虑要不要买一套乐高45544了。哈哈。我还在您这个博客一样的网站上看到了python和乐高的交互方面的信息。非常棒!相比于arduino,乐高的优势就在于搭建效果好。但是不知道与python的结合是不是会很麻烦。。毕竟网上arduino的中文资料好像更多一些。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注