スマホ操作ロボット~実動作確認~

3DCADによるメカ設計に続き、スマホ操作ロボットの制作を行いました。
メカ設計からパズドラをプレイするプログラム作成まで一通りを自作し、動作確認まで一通り完了いたしましたので、報告いたします。
f:id:mou-tsukareta:20190616003221j:plain

実際の動作


パズドラのドロップをカメラ画像から認識し、ルート解析結果に従ってアクチュエータ制御を行ってドロップ操作してます。

メカ設計

Fusion360で設計を行いました。
動作機構はコチラの動画を参考にさせていただきました。
www.youtube.com

ざっくり書くと、ラックアンドピニオン動作のために2個のステッピングモーター、タップ用の直動動作のためにソレノイドを取り付けています。
金属部品は全てボール盤で穴あけ加工、タップ切り、仕上げまで行っています。
詳細は以前の記事で書いてます。


今回加工時にタップを何本か折ってしまったのですが、ボール盤のチャックにタップを固定して、手で回しながらクレ556をいれつつ作業するととてもきれいに仕上がりました。
仕上げには水やすり(240→400→600→1000→1500の順に使用)、ピカール剤を使いました。
f:id:mou-tsukareta:20190616003515j:plain


また、タップ部分にはソレノイドの先端にタッチペンの先を付けていたのですが、認識してくれませんでした。
そこで、100均の吸振素材にアルミホイルを巻き付けたものを取り付け、更にクリップ付きのジャンパ線をソレノイドの鉄心に取り付けたところ、うまくいきました。
f:id:mou-tsukareta:20190616003116j:plain
f:id:mou-tsukareta:20190616003139j:plain

なお、シャフト、シャフトホルダ、スライドユニットはAmazonの激安品を使ってますが、動作させるだけなら問題なさそうです。
今は少し振動が大きいですが、この辺の部品をもっと高価なものに変えたらよりスムーズに動くような気がします。

エレキ設計

以前の記事ステッピングモーターの駆動回路を紹介しましたが、これをもう一軸増やしてます。ソレノイドに関しては、5Vレギュレータから電源を供給し、ステッピングモータと同様にトランジスタ(2SD1415)で駆動してます。
f:id:mou-tsukareta:20190616003212j:plain

制御設計

以前の記事では回転角度で制御してましたが、今回はパルス数(各層への電流の切り替え回数で制御してます。
ステッピングモーターがある任意の位置にいるときを0パルス位置(原点位置)として、そこから何パルス動作させたかによって位置を相対的に制御しています。
また、タップ時にはソレノイドの機械的な遅れがあるため、ソレノイドに電圧印加後少しスリープ待ちさせて位置決めしてます。

画像処理

あらかじめ各色ドロップがどれくらいのRGB値を持つのかを記録しておき、これを用いたしきい値判定により、ドロップ色の認識を行っています(実際はキャリブレーション用のプログラム・画像を用意して、自動でしきい値用のRGB値をcsvファイルに取得・記録するようにしてます)。
パズドラ特有の問題として、ドロップの背景まで含めてしまうとキャリブレーションがうまくいかないため、ドロップの中心からある一定の幅の画素だけしか認識に使わないようにしています。
f:id:mou-tsukareta:20190616003204j:plain

ルート解析

Pythonなので想像よりもかなり楽に実装できました(逆に思いもよらないバグもありましたが、、、)。
解析アルゴリズムとしてはビームサーチというのを実装してみました。
リファクタリングはかなりしましたが、ラズパイの限界なのか計算速度が遅く、現状演算に数秒~十数秒かかってしまってます。
また、コンボ数ではなく消えるドロップ数を評価値にしてるため、コンボは少し少な目になってしまってます。
言葉で説明するのがめんどくさいので、実装アルゴリズムの超概要を図で示します。
f:id:mou-tsukareta:20190616003154j:plain


また、同一の盤面状況を無駄に繰り返さないよう、ゾブリストハッシュで取り除いてます。
具体的なアルゴリズムは、
①オフラインでハッシュ値を用意する。
 ハッシュ値の種類としては、あるマスにあるドロップ色があった場合のハッシュ値(つまり30マス×6色=300通りのハッシュ)と、操作位置に対応するハッシュ値を用意する(30マス=30通り)。
②ある盤面状況のハッシュ値は、全マスのドロップ色に対応する30個のハッシュ値と現在操作位置に対応するハッシュ値、計31個のハッシュ値をXORすることで得られる
③ある盤面からある操作によって盤面が変化したときのハッシュ値は、移動先・移動元の2つのマスについて移動前後に存在するドロップ色のハッシュ値(計4個)を元の盤面ハッシュにXORし、さらに移動前後の操作位置のハッシュ値(計2個)をXORすることで得られる。

感想とまとめ

想像してたよりすんなり動いてくれました。
確実に動くので作ってて楽しいです。