Raspberry Pi 3 B+


Raspberry Pi 3 +Bを使ってルービックキューブソルバーロボットの製作

ルービックキューブソルバーロボットを製作しました。(2022/08~)



 ユーチューブ 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倍速にしています。




  kociembaソルバーについて


ルービックキューブの解決方法に使用されたソルバー「RubiksCube-TwophaseSolver」について

このロボッで、ルービックキューブの解決方法に使用されているソルバーは、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→白→,1→青→、2→緑→、3→緑→、 4→黄→、5→黄→
6→白→、7→赤→、8→白→、9→橙→、10→→橙→、・・・・・・・・ となります。

したがって、上図の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」をルービックキューブソルバーロボットに使用しています。