ルービックキューブのパターン生成
自動でルービックキューブを揃えるロボットによるパターン生成をしました。
ルービックキューブを揃えるロボットの製作の続編です。以下を参考にしています。
ルービックキューブを解くプログラムを書いてみよう(前編:キューブを操る実装)
ルービックキューブを解くプログラムを書いてみよう(中編: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色のみで構成される状態
H字
縦縞
中心のみ色が異なる状態
キューブの中に小さいキューブがあるような状態
キューブの中にさらに小さいキューブがあるような状態
T字
各面が1色のみで構成される状態