![見出し画像](https://assets.st-note.com/production/uploads/images/76104452/rectangle_large_type_2_8a87a5996742abe271400613c2c58233.png?width=1200)
【研究発表】Python × ルービックキューブ = 練習サポートツール
こんばんは。
自立に向けてとにかく手を動かしたいとっとです。
わが家の長男(小2)のルービックキューブ熱が少し落ち着いてきたものの、とっとのPython熱が冷めやらず(最近なんだかんだでPythonのプログラミングをしていないせいでしょうかw)、
Python × ルービックキューブ
をテーマに、ルービックキューブの解法練習をサポートするツールをつくってみました。
着想からしばらくは手がつかず、3/25に着手→4/9にひと通り完成しました。
やってて少し学生時代を思い出したので、齢40を目前にしたおっさんが、15年ほど昔をおもいだしながら大学生の研究論文っぽくご紹介してみたいとおもいます。
それではどうぞ。(3,500文字弱あります)
Abstract(概要)
ルービックキューブという立体パズルは、1970年代にハンガリーの建築学者によって考案されたもので、各面異なる色で計6色に配色された立方体を基本形としている。本立方体は各面が3×3の9マスに分割され、分割面を境に3軸に駆動させることでマスごとに配色を変えることができる。
ルービックキューブは、配色が変わった各面の色を、分割面を駆動させることで面ごとに同色にそろえることを主たる目的としている。
ルービックキューブの配色パターンは4325京を超え、その中の任意の配色パターンから各面の色が同一に揃ったパターンまでの駆動手順として、いくつかの解法があることが知られている。
本研究では、そのなかでもポピュラーなCFOP手順におけるOLLステップの学習をサポートするツールを開発した。
Introduction(導入)
CFOPとは
CFOPとは、Cross → F2L → OLL → PLL の4つのステップの頭文字をとったもので、比較的ポピュラーな解法として知られている。以下に各ステップを説明する。
Cross
図1のように、中心のマスが白の面を底面にし、クロスに揃える。
![](https://assets.st-note.com/img/1649512370667-4jXGEE3S1D.png)
F2L(First 2 Layer)
Cross完了後、下側の2段を揃える。
![](https://assets.st-note.com/img/1649512385449-wnBiq3tfhX.png)
OLL(Orientation of Last Layer)
F2L完了後、上面の黄色マスを揃える。
![](https://assets.st-note.com/img/1649512408124-C8Cr37JJZJ.png?width=1200)
前のF2Lが完了した時点で、上段の上面および上段の側面の黄色マスの配置パターンが57パターン存在する。各57のパターンに応じ、次に実施すべき手順が決まっており、OLLとして57種の手順がパターン化されている。
PLL(Permutation of Last Layer)
上段の側面を揃える。
![](https://assets.st-note.com/img/1649512421242-lnl3DLpItV.png?width=1200)
前のOLLが完了した時点で、上段側面の各マスの色位置が21パターン存在する。そのため、PLLとして21種の手順がパターン化されている。
スコープ
現在わが家の長男(小学校2年生)は、上述のCFOPによる解法について学習を進めている。現時点の習得状況を以下に示す。
Cross:習得済。
F2L :習得済。
OLL :57ケース中、20ケース習得済。
PLL :21ケース中、21ケース全て習得済。
本状況より、もっぱらOLLの未習得ケースを学習中である。
学習方法としては、以下のようなF2L完了後の上段の黄色マス配色と、それに対応したOLL手順のペアを、全57ケース分について紙で印刷して用意しておく。
![](https://assets.st-note.com/img/1649513763954-8sJLU8Zy1R.png)
左側の黄色配置の場合には、右側の手順を実施する、といった見方をする。このような組み合わせが57ケースある。なお、ここでは右側の手順を示す記号の見方については割愛するものとし、詳細は以下を参照されたい。
https://tribox.com/3x3x3/solution/notation/
F2Lが完了した時点のルービックキューブ上段の黄色配置から、OLL57パターンのどれに該当するかを紙をめくって照合し、該当する手順を実施しながら学習する、というスタイルを導入している。
そこで本研究では、上記紙を用いた学習の効率を向上させるためのコンピュータ支援についてフォーカスした。
Purpose(目的)
紙をめくってOLLパタンを検索する場合、検索に時間がかかること、また紙がボロボロになってきていることなどを鑑み、この点を改善する。
本論文では、F2L完了後のルービックキューブ上段の様子をカメラで撮影し、コンピュータに照合させることで、即座に次に実施すべきOLL手順を検索してユーザに知らせ、学習効率を高めることを目的とする。
※ルービックキューブを解くことが目的ではない。
Specification(仕様)
今回開発したOLL手順学習サポートツールの仕様を以下にまとめる。
・スマホのカメラでF2L完成後のルービックキューブを撮影し、色配置を画像認識させる。
・カメラ画像内に検出範囲枠を設け、ルービックキューブをその範囲に映すようにする。つまり、物体検出によるルービックキューブ自体の検出は本研究の対象外とする。
・OLL手順の判別には、キューブ上段の上面と側面にある黄色マスの組み合わせが必要であるが、上面(正面)のみの黄色マス検出に絞ることとする。
・検出範囲内を9マスに等分割し、各マス内の画素のbgr値から黄色マス部分を判定する。
・OLL57ケースに対応した黄色マスの配置については、全57ケースについてデータベースとして予め用意しておく。
・カメラに写したキューブ上面の黄色マス配置から、データベースに合致するパタンがあれば、そのパタンに対応した次に実施すべきOLL手順を表示する。
・上記一連の判定を毎フレーム処理することで、リアルタイムにカメラに映したルービックキューブの状態判定を行うものとする。
Production(制作物)
上述の仕様に基づいて開発したOLL手順学習サポートツールの主要諸元を以下に列挙する。
■開発環境
パソコン :Windows機
開発言語 :Python
カメラ :使わなくなった古いスマホ
カメラアプリ:iVCam
画面構成
PythonのKivyというライブラリを用いて画面を構築したので、以下に示す。
![](https://assets.st-note.com/img/1649514905075-h6CmGspL2F.png?width=1200)
左側のスマホ画面の赤枠内に、F2Lが完了したルービックキューブの上面を映すことで、黄色マスの判定が行われる。その結果をもとに、OLL57手順のうちどの手順に該当するかを即座に判断し、結果を右側の白いエリアに表示する。
判定結果例
実際に判定させてみた結果を以下に示す。
![](https://assets.st-note.com/img/1649514916800-64yBThSDaL.png?width=1200)
上記の例では、カメラに映したルービックキューブの中段一列が黄色マスであることを正しく判定し、OLL手順に該当があるか照合した結果についても右側に正しく表示されていることが分かる。
判定の様子
ツールに判定させている様子を動画に撮ったので、参照されたい。
詳細説明
本ツールの詳細な判定ロジックについては以下の文献にまとめた。細部が気になる際はこちらを参照されたい。
Conclusion(結論)
ルービックキューブのOLL手順学習に際し、これまで紙をめくって検索していた点について、本研究では学習効率を高めることを目的に、コンピュータによる画像処理を用いたツールを制作し、検索速度を向上させた。
今後の課題および展望を以下に述べる。
・実際にわが家の長男に使用いただき、紙で探す場合と比してどれだけ効率が向上しているか定量的な評価を行う。
・赤枠内にルービックキューブを映すのではなく、機械学習等の活用によるルービックキューブの動的な物体検出を導入することで、ユーザ側の操作負担を軽減する。
・F2L完了後の上段側面の黄色マス認識の追加。
Acknowledgements(謝辞)
本研究を進めるにあたり、日々根気強くご指導いただいたGoogle教授、またわたしが本活動に注力するにあたって、双子の面倒を常に見ていただいているかっか、さらには本テーマを提供してくださったわが家の長男に、深い感謝の意を示します。ありがとうございました。
・・・いかがでしたでしょうか?
たしか論文ってこんな感じだったかなぁ・・と思い出しながら、楽しく記事を書かせていただきました。
ちょっとマニアックですが、素人研究、ぜひ自前ブログの方も見に来ていただけるとうれしいです。
最後まで読んでいただき、ありがとうございました!
独学中のPythonプログラミング体験記です。もしお時間ありましたら、ぜひこちらも覗いてやってください!