找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 10799|回复: 2

解魔方机器人[三]-魔方扫描

[复制链接]
发表于 2016-8-30 16:14:42 | 显示全部楼层 |阅读模式
本帖最后由 xvholly 于 2016-8-30 16:18 编辑

拥有了基本动作这些工具之后,回想最开始的方案设计,我们现在该着手解决系统中的“输入”了。输入即EV3对魔方进行扫描,通过计算机语言数字化的对魔方进行表示。仍然本着任务分解的思路,我们将扫描魔方这个任务继续分解为更小的任务:扫描色块、扫描单面、扫描六面。

3.1 扫描色块

上一章已经介绍,扫描魔方时色彩传感器为RGB模式,因此在扫描后会得到R、G、B值,每个色块的颜色就需要采用包含3个值的数组来存储。例如:color[0]=R、color[1]=G、color[2]=B。

程序设计
  1. # 这个示例仅为说明RGB采集,并非实际应用于机器人中的程序
  2. for i in range(3):
  3.   color = cs.value(i)
复制代码

3.2 扫描单面

EV3每次扫描最上面的面,我们按照先中间再四周的顺序进行扫描,单面一共9个色块,扫描流程为:

  • 扫描中间块
  • 顺时针转45度
  • 扫描角块
  • 顺时针转45度
  • 扫描边块
  • 顺时针转45度
  • 扫描角块
  • 顺时针转45度
  • 扫描边块
  • 顺时针转45度
  • 扫描角块
  • 顺时针转45度
  • 扫描边块
  • 顺时针转45度
  • 扫描角块
  • 顺时针转45度
  • 扫描边块
  • 探头收回

从机器人的正面俯视,容易知道每个色块的扫描顺序。

  1. ======+-----+  +-----+
  2.               [          ]  |3 2 1|    +=============
  3.         hand motor       ]  |4 0 8|   [X]color sensor
  4.               [          ]  |5 6 7|    +=============
  5. ======+-----+  +-----+
复制代码

程序设计

  1. # 扫描魔方单面
  2. def scan_one_side():
  3.   # 定义一个9x3的二维数组,存放9个色块的RGB值
  4.   ev3_scan_side = np.zeros((9,3), np.uint8)
  5.   # 扫描中间块
  6.   head_center()
  7.   for i in range(3):
  8.     cv = cs.value(i)
  9.       if cv<=255:
  10.         ev3_scan_side[0,i] = cv
  11.       else:
  12.         ev3_scan_side[0,i] = 255
  13.   # 扫描四周
  14.   for j in range(8):
  15.     base_step()
  16.     if j%2 == 0:
  17.       head_side_coner()
  18.     else:
  19.       head_side_edge()
  20.     for i in range(3):
  21.       cv = cs.value(i)
  22.       if cv<=255:
  23.         ev3_scan_side[j+1,i] = cv
  24.       else:
  25.         ev3_scan_side[j+1,i] = 255
复制代码

3.3 扫描六面


扫描六面基本思想就是扫描完一面后,将魔方翻转,再扫描另一面。需要注意的是:面向机器人的魔方正面和背面在扫描的时候,需要先进行底座旋转,并且此时扫描后得到的色块顺序相对于其他面也是不一样的。尤其是色块顺序,在之后对魔方进行建模时非常重要,其实也并不难,只是需要足够的耐心来认真确认。扫描流程:

  • 扫描单面
  • 翻动魔方
  • 扫描单面
  • 翻动魔方
  • 扫描单面
  • 翻动魔方
  • 扫描单面
  • 底座逆时针转90度
  • 翻动魔方
  • 扫描单面
  • 翻动魔方
  • 翻动魔方
  • 扫描单面
  • 底座顺时针转90度
  • 翻动魔方
  • 底座顺时针转90度

定义从机器人的正面俯视魔方的面为第1个面,得到魔方各个面及色块的扫描顺序:

  1.                   +--5--+
  2.                   |5 4 3|
  3.                   |6 0 2|
  4.                   |7 8 1|
  5. +--0--+--1--+--2--+--3--+
  6. |3 2 1|3 2 1|3 2 1|3 2 1|
  7. |4 0 8|4 0 8|4 0 8|4 0 8|
  8. |5 6 7|5 6 7|5 6 7|5 6 7|
  9. +-----+-----+-----+--4--+
  10.                   |5 4 3|
  11.                   |6 0 2|
  12.                   |7 8 1|
  13.                   +-----+
复制代码

程序设计

  1. def scan_every_side():
  2.   #定义一个6x9x3的三维数组保存魔方6个面每个面9个色块的RGB值
  3.   ev3_every_side = np.zeros((6,9,3), np.uint8)
  4.   for i in range(6):

  5.   # 扫描第1个面
  6.   if i==0:
  7.     ev3_every_side[i,:] = scan_one_side()

  8.   # 扫描第2-4个面
  9.   elif i>0 and i< 4:
  10.     hand_turn()
  11.     hand_raise()
  12.     ev3_every_side[i,:] = scan_one_side()

  13.   # 扫描第5个面
  14.   elif i==4:
  15.     base_anticlockwise()
  16.     hand_turn()
  17.     hand_raise()
  18.     ev3_every_side[i,:] = scan_one_side()

  19.   # 扫描第6个面
  20.   elif i==5:
  21.     hand_turn()
  22.     hand_turn()
  23.     hand_raise()
  24.     ev3_every_side[i,:] = scan_one_side()
  25.     base_clockwise()
  26.     hand_turn()
  27.     hand_raise()
  28.     base_clockwise()

  29.   # 返回保存扫描结果的三维数组
  30.   return ev3_every_side
复制代码


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2016-9-3 09:50:26 | 显示全部楼层
我的魔方机器人一直无法识别,显示scan error 。魔方也换了,还是不行
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-9-5 17:10:17 | 显示全部楼层
jiang903354196 发表于 2016-9-3 09:50
我的魔方机器人一直无法识别,显示scan error 。魔方也换了,还是不行

这种情况很正常,因为色彩传感器探头并不能非常准确的扫描到魔方上的色块,比如受扫描的位置、外界光线等影响。所以解出来的情况,只能是多试试。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-23 16:24 , Processed in 0.109346 second(s), 21 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表