トップ > 技術ナレッジのアーカイブ > ARブロック崩しを別の方法で作ってみた

2025.02.20

ARブロック崩しを別の方法で作ってみた

#電子工作 #OpenCV #Python #raspberry pi #Youtube

テクノプロ・デザイン社のYoutubeチャンネルに「ロボット×ゲームでARブロック崩し作ってみた」が公開されました。今回は別のアプローチで自分なりに作成してみました。

筆者紹介

type11

2013年にテクノプロ・デザイン社に中途入社。
POSレジシステムの開発・保守を約4年、WiFiとBluetooth制御ICチップを検査する専用ソフトウェアの開発・保守を2年経験。 その後、約4カ月のDST研修と2カ月OJT期間を経て現在のデータサイエンス業務に配属。 主にPoC実装・分析業務を担当。
趣味はRaspberry Pi、パン作り。


システム構成

システム構成

ARブロック崩しにおいて何が重要かというと私は移動体の位置をどうやって2D上でとらえるかにあると考えています。そのため、オリジナルの構成から以下の内容に変更しました。

・移動体の位置検出のためにARマーカーを採用(移動体の位置をそのままバーとして利用できる)
・移動体のモーター制御をraspberry pi Zeroからraspberry pi pico wに変更(WiFiのみ利用)
・OpenCVのみでブロック崩しを再現(合成プログラムなし)

プログラミング

各プログラムの動作です。

Pythonの説明

Cpythonの説明

1. 初期化フェーズ:
- モーターのピン設定
- PWM周波数の設定
- Wi-Fi接続処理

2. サーバーセットアップ:
- Webサーバーの設定
- ソケットのバインドと接続待ち開始

3. メインループ:
- クライアントからの接続受付
- リクエストの解析と処理
- モーター制御(前進/後進/停止)
- レスポンス送信

4. モーター制御関数:
- 各モーター制御コマンドの詳細な処理
- PWM制御の設定

5. エラー処理:
- 例外発生時の処理
- 接続のクリーンアップ

メインプログラム

メインプログラムは以下の内容で動作しています。

初期化フェーズ:
- カメラの初期化
- ウィンドウの作成と設定

メインループ:
- フレームのキャプチャ
- ボールとブロックの処理
- ARマーカーの検出と処理

ARマーカー検出後の分岐:
- マーカーが検出された場合:新しい位置で四角形(棒)を描画
- マーカーが検出されない場合:前回の位置情報があれば使用

共通処理:
- エフェクトの更新と描画
- フレーム表示
- 終了判定

メインプログラム

移動体の制作

市販のものをそのまま利用して制作します。
以下のものを用意しました。

・タミヤ タンク工作基本セット
・モータードライバ(TB6612FNG)

これらを組み立ててモーターをはんだ付けしてモータードライバと接続します。 モーターを動かす電源は手持ちの単3電池ボックスを使い、pico wの電源はモバイルバッテリーを使います。

各々の部品をジャンパワイヤに繋げたら移動体は完成です。 最後にpico wにモーター制御用の操作画面をWebページでアクセスできるようにしました。

この操作画面を使い移動体を動かします。以下はテスト動画です

次に移動体の位置を検出するためのARマーカーを搭載します。今回は旗みたいに挿しておきました。このARマーカーをPC側のカメラで読み取ります。Youtube動画では移動体とPC間はBluetoothで通信していましたが、本作では通信が発生しません。

これとメインプログラムを合わせるとARブロック崩しが完成しました。

ついでにブロックが壊れたエフェクトを追加しました。壊れた感があっていいですね。
下記画像はARブロック崩しの環境です。画面を通してみないと結構シュールな絵です。

3D化の難しさについて

3D化について検証してみました。3D化について難しいこととして以下の三つがあげられます。

・カメラキャリブレーション
・マーカー検出と姿勢推定
・3D描画

カメラキャリブレーションの精度は、ARシステムの根幹を成す重要な要素です。キャリブレーションでは、レンズの歪みや焦点距離などの内部パラメータを正確に測定する必要があります。不正確なキャリブレーションは3Dオブジェクトの位置ずれや歪みを引き起こし、特にWebカメラでは製品による品質のばらつきが大きいため、適切な補正が必須となります。
また、マーカー検出と姿勢推定も重大な課題です。照明条件やマーカーの角度、距離によって検出精度が変化し、一部が隠れた際の対応も必要です。検出したマーカーから3D空間での位置と向きを推定する際は、PnP問題を解く必要があり、推定値のノイズ除去も重要になります。
3D描画では、リアルタイム性を保ちながら品質の高い表示を実現する必要があります。OpenGLなどのグラフィックスライブラリを使用して、3D空間のどのカメラ視点で立体物を描画するか、カメラ画像への正確な重ね合わせと座標変換を行いつつ、処理の最適化が求められます。

3D化の難しさについて

閉じる