AI作者が「ルービックキューブソルバーロボ」を魔改造してみた

改造ほど楽しいことはありませんね。何かのキットを買ったら、一度は売り手の意向に従って組み上げるのですが、一度完成してしまえばもう満足です。あとは自分の思うように改造します。

このたび、縁あってトイザらスオリジナル「ルービックキューブソルバーロボ」というロボット教材の開発に関わりました。詳細はこちら。

https://www.toysrus.co.jp/s/dsg-739421700

私自身はこちらの商品のAI部分、つまりルービックキューブの解法探索部分で主に関わりました。

今回は、そんな商品を私が好き勝手魔改造するという内容です。

最初にビフォーアフターをご覧ください。左が製品版、そして右が私の魔改造版です。

![DSC_0744.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/7217f5fc-9e5b-3189-3b0c-038fb411913f.jpeg)

そして、魔改造後の動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/dRP_v130jLI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 開発のきっかけ
2020年まで遡ります。当時、私はルービックキューブを解くロボットを好んで作っておりました。これが一つのきっかけです。

私は人力でもルービックキューブを揃えるので、当然、ロボットにもやらせたくなりますよね。そうして作ったのがこのようなロボットでした。

2x2x2のパズルを解くロボットや4x4x4を解くロボット、さらには「ルービッククロック」を解くものまで作りました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/Fok7bAn-NSs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/a2EKRblF6is" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/jc3e5xadDao" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


そしてもう一つのきっかけが、私の過去にあります。私が中学1年生だった頃、今は休刊してしまっていますが、ロボコンマガジンという雑誌をよく読んでおりました。ロボコンマガジンには毎号懸賞があり、それに応募したら当選したのです。それでいただいたのが、Artec社が作るStuduinoというボードでした。これはArduinoの互換機なのですが、当時の私はArduinoに3000円使うことさえ躊躇する懐事情でしたので、これによって私の本格的なロボット製作への道が開けました。

![IMG_5509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/292e7b57-c987-153f-207a-5e92e4e96cb9.jpeg)

このことを大学1年生になった2020年にTwitterでつぶやいてみたところ、Studuinoアカウントの方から反応をいただき、せっかくなのでArtecブロックとStuduino、さらにはeduコン(中身はラズパイで、タッチパネルなどがついています)をいただき、ルービックキューブを解くロボットを作ってみました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/ETX0saH9TMM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

![DSC_0452.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/b885d188-840f-9476-a411-7fcb8e81e777.jpeg)

Artecブロックは人生で初めて使ったので、少しまどろっこしい構造になってしまいましたが、なんとかルービックキューブを解くことができました。

上部のWebカメラをeduコンにつないで、画像認識でステッカーの色を判定します。そして、eduコンで自作のソルバーを動かして解法を見つけ、あとはそれをStuduinoを経由してロボットで動かすだけです。

このロボットは、ルービックキューブを揃えるというインパクトもあってかウケが良く、Artecの参加する様々な展示会で展示していただきました。

# 商品化と改善したい欲求
この作品を商品化するという話がありました。ただ、私のオリジナルのロボットはモータの数も多く、カメラとeduコンも使うのでかなり大掛かりなものでした。ですので、Artec社内で簡略化したハードウェアを製作し、それを商品化することになりました。

しかし、ルービックキューブを解くアルゴリズムの部分については私のオリジナルのコードを使用するということで、この点において私は開発に関わったということです。ちなみに、商品の中には私のインタビュー記事も入っています。

![DSC_0176_light.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/8765fc5d-a508-ec21-fcbf-3a6c95906ab3.jpeg)

念押しなのですが、私が関わったのはソルバー部分だけです。ハードウェアやロボットの制御ソフトウェア、Webアプリには関わっていません。ということで、商品化されたキットを組み立ててみると、私の目線からは若干の改善の余地を見つけました。

* 状態認識を自動化したいな～(商品化にあたって大胆に状態認識部分を簡略化したようです)
* ロボットの制御アルゴリズムをエレガントに書き直したいな～
* せっかくなら常時稼働できるようにしたいな～

商品バージョンにはルービックキューブの状態を認識する機能はついていないのですが、商品化という目標を考えればもちろんこの意味は大いに推測できます。ですが、もはや私は今、開発者の一人ではなく、ただこのおもちゃで遊びたい人です。

# 魔改造
いざ、魔改造です。3つの改善項目に分けて軽く書きます。

## 1. 状態認識の自動化
これには色々な手法を考えました。まず、カラーセンサを使うのかカメラを使うのかという点です。これについては、カラーセンサを選びました。理由は、オリジナルのロボットでカメラを使った画像認識をしたら思いの外面倒だったからです。Artecにはロボット向けのカラーセンサがあります。せっかくですので、改造についてもArtec製品縛りでやってみようという気持ちになりました。

ArtecのカラーセンサはI2C接続だそうです。ですので、私はカラーセンサを大量に使って爆速で状態を認識しようと思いました。しかし、なんと、Artecのカラーセンサに限らず、世のI2Cカラーセンサはことごとくアドレスが固定だったのです。なぜなのでしょうか…悲しくなってきました…。アドレスをユーザが設定できるカラーセンサがあったら教えてください。

まあこうなったからには仕方がありません。一時は2つのカラーセンサを使って、1つはStuduino経由、もう1つはeduコンから直接扱おうとしたのですが、結局これも断念してカラーセンサ1つで頑張ることにしました。

カラーセンサ1つでは、カラーセンサ自体を動かさないと一部のステッカーを確認することができません。ですので、サーボを1つ追加し、適当に直動機構を作って対処しました。ここで、鋭い指摘をいただくかもしれません。「真ん中のステッカーが見られないじゃないか」と。実は、ルービックキューブはその構造によって、真ん中のステッカーの位置関係はどれだけ回しても変化しません。ですので、最初にロボットにパズルを置く向きさえ予め固定してしまえば、真ん中のステッカーを確認する必要はありません。

![DSC_0839.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/d9681fb3-fd51-eb6b-2541-a1735467bc45.jpeg)

![DSC_0840.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/a1bad280-e11e-56dd-5a29-b945f6a34977.jpeg)

色自体の判定には制限をつけたk-meansのようなアルゴリズムを使いました。カラーセンサなので外乱を受けにくく、認識精度はとても良いです。


## 2. 制御アルゴリズムをエレガントに
このロボットの下部には、光センサによってテーブルの回転を検知できる簡易的なエンコーダがついています。製品版のロボットを動かしてみると、もっと効果的にこのエンコーダを利用できるような気がしましたので、まるっきり自分でコードを書き換えてみました。

![DSC_0838_mod.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/1f54b992-6f08-0760-139c-9b15fecaa22b.jpeg)


まず、製品版では180度回転を90度回転を2回に分けてやっていますが、これは微妙な気がしました。簡単な処理を入れれば180度一気に回すことができます。

そして、正確に90度ずつ回す処理も、上の写真の光センサの位置と水色のブロックの位置をよく見れば、エレガントに書けそうな気がします。

さらに、製品版ではこの光センサのキャリブレーションを人力で行うようになっていますが、これは完全に自動化できそうでした。

これらを私の好きなように改善することで、私は満足しました。

## 3. 常時稼働させたい
このロボットが発売された直後、去年からお世話になっているクマ財団の事務局スペースにロボット(魔改造前)を置かせていただきました。ですが、動かないロボットなどというのはほとんどただのガラクタだと私は思う(もちろんロボット自体に価値があるなどの場合は別でしょうが)ので、何とかしてこのスペースで私がいないときも動いてほしいと思いました。

https://kuma-foundation.org/

このロボットはルービックキューブを解くアルゴリズムを動かさなければいけないので、Studuinoの他に何らかの高速な計算機が必要です。常時稼働させるのでしたらラズパイなどが良いでしょう。と、そこで、家にArtecのeduコンがあることに気づいたのです。これは中身がラズパイですし、タッチパネルもついているので便利です。ロボット本体とeduコンだけで常時稼働できそうです。

![DSC_0836_mod.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/3f8ab480-9041-a4aa-7cac-0e6cdfdb7a0c.jpeg)

ということで、この上なく適当にPythonでGUIを作って、こんな感じでeduコンをロボット制御用コンピュータとして使うことにしました。

さらに、常時稼働を念頭に置いて電源をAC100Vから取るようにして、さらにロボットのモータへの電源は安全のために適宜自動でオフにするようにしました。

# 魔改造完了
1週間程度で無事魔改造が完了したので、クマ財団の事務局スペースに設置させていただきました！

![DSC_0842.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494375/68b47746-f35f-3bbe-e2ae-f4c1b2a3ee7a.jpeg)

これで、もし唐突にルービックキューブが揃う様子を見たくなったときには誰でもその欲求を叶えられるようになりました！！！！！めでたしめでたし！！！！！！

※クマ財団事務局スペースは基本的にクマ財団関係者しか入れません…