ユーチューブ
https://www.youtube.com/watch?v=dEOLhvVMcUgでルービックキューブソルバーロボットを見つけましたので、
自分でも作ってみることにしました。
アンドレア氏の作成したこのロボットは、kociembaソルバーを使用し、他と比べて低価格(サーボは2個しか使っていません)
であり、素晴らしいアイデアのある簡易な構造になっています。
少ないデメリットですが、この構造だとPi Cameraの撮影範囲が広範囲になり、ロボットの接地面の状況に左右されるので、
均一な色のテーブル上に設置して可動することが必要なことです。
それと、ロボットに使われているRasberry Pi Zero 2 W が半導体供給不足状態で手に入らないことです。2,700円程の価格が
3~5倍の価格になって販売されています。したがって手持ちのRasberry Pi 3 B+ を使って作成することにしました。
製作過程の全てが、次のホームページに掲載されています。
https://www.instructables.com/CUBOTino-Autonomous-Small-3D-Printed-Rubiks-Cube-R/?utm_source=newsletter&utm_medium=email
この中で私が製作の参考にしたのは、「How_to_make_CUBOTino_autonomous_robot_20220713」(PDF 2022年7月版、現在は削除)で、
現在ではバージョンアップされて、「How_to_make_CUBOTino_autonomous_robot_20220821」(PDF 2022年8月版)
となりプログラム等も少し変更されています。
以後、私のページでは7月版と8月版の共通部分と製作順を記載して忘備録とします。詳細は上記ホームページを参照してください。
ともあれ、プログラム(Python)の勉強になり、特にPi Camera を扱うOpenCVの勉強にもなりました。
アンドレア氏に感謝します。
次の写真は、キューブソルバーロボットの完成写真です。右側は、Rasberry Pi 3 B+です。
次の動画は、キューブソルバーロボットを起動している動画です。途中から4倍速にしています。
このロボッで、ルービックキューブの解決方法に使用されているソルバーは、H.Kociemba氏が開発したソルバーの中の
「RubiksCube-TwophaseSolver」を使用しています。
このソルバーは、「対称性の縮小と異なるCube方向の並列探索を備えた完全に開発された形式で
2フェーズアルゴリズム」を実装し、Pythonでルービックキューブを解決します。
1.「TwophaseSolver」のインストール
パッケージはPyPlで公開されており、次の方法でインストールできます。
$ pip install RubikTwoPhase ①
インストールしたら、モジュールtwophase.solverをコードにインポートできます。
>>> import twophase.solver as sv ②
最初の実行時には、テーブルを作成するので約30分ほどかかります。
2.使用方法
(1)Cubeの状態は、下図のように各面をU R F D L B の記号を使って表記します。
U(up) = 上面
R(right) = 右側面
F(flont) = 正面
D(downward) = 下面
L(left) = 左側面
B(back) = 背面
(2)Cubeの面は、URFDLBの順序に従い、各フェースレットは、下図のようにその順序に従って番号が付けられます。
(3)Cubeをどのように回転しても、各面の中心のフェースレットは動かないことを念頭に置いて、
各面の呼称は中心のフェースレットの色で表します。
面の中心のフェースレットの色を指定することによって、どの面かを表すことができます。
例えば、Cubeが次の図のような状態の場合
上面の中心のフェースレットの色が黄色なので、黄色をUで表します。同様にすると以下のようになります。
黄=U 緑=R 赤=F 白=D 青=L 橙=B となります。
これを使って(2)のフェースレットの順番に従ってCubeの状態をキューブ定義文字列として表記します。
上図では、0→白→D,1→青→L、2→緑→R、3→緑→R、 4→黄→U、5→黄→U、
6→白→D、7→赤→F、8→白→D、9→橙→B、10→→橙→B、・・・・・・・・ となります。
したがって、上図のCubeの場合キューブ定義文字列は、次のようになります。
DLRRUUDFDBBBDRBLLBRRLFFBRFDFUFDDULULFDBBLDFLUUFRLBRURU
このキューブ定義文字列をPythonで②のコードの次に
>>> cubestring = 'DLRRUUDFDBBBDRBLLBRRLFFBRFDFUFDDULULFDBBLDFLUUFRLBRURU'
と入力し、
>>> sv.solve(cubestring,19,2)
と入力することにより定義文字列によって記述されたCubeの最短の解が出力されます。
出力された解は、F2 D2 B3 L1 F2 U1 D1 F1 U2 L1 D3 R2 B3 D2 R2 F3 D2 R2 F2 B1 (20f)となります。
ここで、数字の1,2,3は、対応する面の時計回りの90度、180度、270度の回転を示しています。
例えば、F2は正面を180度回転し、次のD2は下面を180度回転し、次のB3は背面を270度回転するということです。
この解によりCubeの各面の色を揃えることができます。
この「RubiksCube-TwophaseSolver」をルービックキューブソルバーロボットに使用しています。