ルービックキューブのパターン生成

ルービックキューブのパターン生成

自動でルービックキューブを揃えるロボットによるパターン生成をしました。

ルービックキューブを揃えるロボットの製作の続編です。以下を参考にしています。

ルービックキューブを解くプログラムを書いてみよう(前編:キューブを操る実装)

ルービックキューブを解くプログラムを書いてみよう(中編:IDA*探索)

ルービックキューブを解くプログラムを書いてみよう(後編:状態のindex化, Two-Phase-Algorithm)

1. もとのアルゴリズム

ルービックキューブを揃えるアルゴリズムでは,状態をコーナーとエッジの位置・向きで表現していました。 例えば,完成状態を以下のsolvedとして定義しています。

solved = State(
    [0, 1, 2, 3, 4, 5, 6, 7],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
)

上からコーナーの位置,向き,エッジの位置,向きです。 この状態を目標としてアルゴリズムを解いていました。

2. パターン生成

2.1 色情報の付与

まず,ルービックキューブの情報を色で扱いたかったので,クラスを作成しました。 後々,カメラでルービックキューブの状態を取得する際にも使うためです。

color_state = ColorState(
    [['','',''], ['','',''], ['','',''], ['','',''], ['','',''], ['','',''], ['','',''], ['','','']],
    [['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['',''], ['','']]
)

次に,パターンの状態を色情報で与えていきます。 例えば,各面が1色のみで構成される状態をnormal_color_state, キューブの中に小さいキューブがある状態をcubeincube_color_stateとします。

WはWhite,OはOrenge,BはBlue,RはRed,GはGreen,YはYellowです。

normal_color_state = detect_color.ColorState(
    [['W','O','B'], ['W','B','R'], ['W','R','G'], ['W','G','O'], ['Y','B','O'], ['Y','R','B'], ['Y','G','R'], ['Y','O','G']],
    [['B','O'], ['B','R'], ['G','R'], ['G','O'], ['W','B'], ['W','R'], ['W','G'], ['W','O'], ['Y','B'], ['Y','R'], ['Y','G'], ['Y','O']]
)

cubeincube_color_state = detect_color.ColorState(
    [['R','G','W'], ['W','B','R'], ['R','B','Y'], ['R','Y','G'], ['O','W','G'], ['O','B','W'], ['O','Y','B'], ['Y','O','G']],
    [['W','G'], ['B','R'], ['Y','B'], ['G','O'], ['W','B'], ['W','R'], ['R','Y'], ['R','G'], ['O','W'], ['O','B'], ['Y','G'], ['Y','O']]
)

このリストにも,コーナーの位置,向き,エッジの位置,向きの情報が含まれています。

2.2 パターンから見た現在の状態を表現

これまでは,各面が1色のみで構成される状態を完成状態solvedとしました。 ルービックキューブを解くアルゴリズムをそのままに,所望のパターンをsolvedとして扱い,そのパターンから見た現在の状態を表現してあげるだけです。

ColorStateにおける色情報を1つ1つ比較し,Stateで表現します。 例えば,キューブの中に小さいキューブがあるような状態cubeincube_color_stateからみた各面が1色のみで構成される状態normal_color_stateは以下のようになります。

initial = State(
[5, 1, 0, 4, 6, 2, 3, 7],
[1, 0, 1, 2, 2, 1, 2, 0],
[9, 1, 7, 3, 4, 5, 0, 8, 2, 6, 10, 11],
[1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0],
)

3 .結果

以下のように遷移させてみました。

  1. 各面が1色のみで構成される状態

  2. H字

  3. 縦縞

  4. 中心のみ色が異なる状態

  5. キューブの中に小さいキューブがあるような状態

  6. キューブの中にさらに小さいキューブがあるような状態

  7. T字

  8. 各面が1色のみで構成される状態