解魔方机器人[四]-建立模型(下)

4.3 调整顺序

虽然魔方每个面都扫描完了,但是有没有发现什么问题?没错,色块的顺序有点乱,通常我们习惯下面这种顺序来表示:

                   +--5--+
                   |0 1 2|
                   |3 4 5|
                   |6 7 8|
 +--0--+--1--+--2--+--3--+
 |0 1 2|0 1 2|0 1 2|0 1 2|
 |3 4 5|3 4 5|3 4 5|3 4 5|
 |6 7 8|6 7 8|6 7 8|6 7 8|
 +-----+-----+-----+--4--+
                   |0 1 2|
                   |3 4 5|
                   |6 7 8|
                   +-----+

调整顺序其实就是某两个色块进行对调,同样并没有什么难度,需要的只是耐心和细心。

程序设计

# 输入未排序的魔方
def scan_reshape(orignal):
  result = np.zeros((6,9), np.uint8)
  for i in range(6):
    if i < 4:
      result[i,0] = orignal[i,4]
      result[i,1] = orignal[i,1]
      result[i,2] = orignal[i,2]
      result[i,3] = orignal[i,0]
      result[i,4] = orignal[i,3]
      result[i,5] = orignal[i,6]
      result[i,6] = orignal[i,7]
      result[i,7] = orignal[i,8]
      result[i,8] = orignal[i,5]
    else:
      result[i,0] = orignal[i,4]
      result[i,1] = orignal[i,8]
      result[i,2] = orignal[i,5]
      result[i,3] = orignal[i,2]
      result[i,4] = orignal[i,1]
      result[i,5] = orignal[i,0]
      result[i,6] = orignal[i,3]
      result[i,7] = orignal[i,6]
      result[i,8] = orignal[i,7]

  # 返回排好顺序的魔方
  return result

4.4 建立模型程序设计

# 扫描3遍取平均值作为扫描结果,按照顺序建立魔方模型
def buildup_cube_module():
  for i in range(3):
    ev3_tmp = scan_every_side()
    ev3_arr_rgb += ev3_tmp/3

  # RGB转HSV
  ev3_arr_hsv = cv2.cvtColor(ev3_arr_rgb, cv2.COLOR_RGB2HSV)

  # 取H值作为颜色区分的特征值
  ev3_arr_h = ev3_arr_hsv[:,:,0]
  h = ev3_arr_h.reshape(6*9)

  # 按照H值所处排序位置,确定色块的颜色类别
  pos = sort_pos(h).reshape(6, 9)

  # 9种颜色分别用0-8的数字表示
  for i in range(6):
    for j in range(9):
      h[pos[i,j]] = i
  ev3_arr_h = h.reshape(6, 9)
  ev3_cube = scan_reshape(ev3_arr_h)

  # 返回魔方模型
  return ev3_cube

4.5 引申阅读

下面这种方法通过RGB颜色空间进行色块划分,虽然我并没有采用,但从理论上我觉得是说得通的,感兴趣的同学可以看看并试验。

由于魔方需要识别的颜色和色块(点)也较少,因此可以考虑直接采用与每个面中心点的RGB值比较的方式进行归类。

当魔方转动时,其6个面中心点的绝对位置其实是不发生变化的。如果你把魔方安装下面这个方向放置,会发现无论怎样转动上面(UP)的中心点永远是白色、前面(FRONT)的中心点永远是绿色……

还原状态

还原状态

而RGB值的色彩空间模型实际上是一个以R、G、B为坐标轴值的一个正方体。这样可以想象6个面中心点的颜色也就分布在这个正方体的6个位置。

RGB模型

RGB模型

其余的48个色块所对应的RGB值,应该与各中心点之一的值接进,比如:所有白色色块的RGB值与上面(UP)中心点的值基本接近、所有绿色色块的RGB值与前面(FRONT)中心点的值基本接近……这种颜色的接近反映在RGB空间模型上,可以很好的理解为正方体上面有6×8个点分别与此前6个点的距离比较近。而这个距离又可以理解为三维空间的欧几里得距离,通过公式容易计算得出:

颜色差异 =  √((色块R值-中心R值)^2 + (色块G值-中心G值)^2 + (色块G值-中心G值)^2)

再对这48个差异值从小到大排序,前8位的色块就是与该中心点颜色相同的色块。

写在本章最后

如果你分步骤的执行程序会发现一个问题,就是色彩传感器经常无法对准每一个魔方色块,这也就直接导致了无法准确扫描到该色块的颜色,造成识别误差。这个问题目前还没有更好的解决办法,即使采用原作者的程序解开的成功率也并不高,原因就在于此。可以使用的办法就是多扫描几遍,或者在扫描时多取几个扫描点,最终取平均值作为扫描结果。

发表评论

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