~PyBullet × YOLOv8 × Panda Arm による物体認識・把持・分類~
本システムでは、PyBulletの物理シミュレーション環境上において、色付きの立方体オブジェクトを自動で認識・把持・分類する分別ロボットを構築した。YOLOv8による物体検出とPandaアームの動作制御を連携し、複数の物体を連続的に処理できる自律分別システムを実現した。
主な処理は以下の通り:
- PyBulletで仮想カメラ画像を取得
- YOLOv8により物体の色と画像内位置を検出
- 世界座標へ変換し、最も近い未処理オブジェクトを選択
- Pandaアームによる把持と色に応じた分類・投下
- 処理ログをCSVに記録
+---------------------+ +-----------------------------+ +-------------------------+
| PyBullet | -----> | YOLOv8 (Ultralytics) | -----> | 推論結果 (u, v, color) |
| ・物体生成 | | ・ローカル推論 | +-----------+-------------+
| ・仮想カメラ | | ・学習済モデル(best.pt) | |
| ・Pandaアーム | +-----------------------------+ ↓
+---------+-----------+ +-------------------------+
| | アーム制御・分別処理 |
| | ・座標変換 & 逆運動学 |
+-------------------------------------------------------------> | ・把持 → 色別移動・投下 |
+-------------------------+
-
カメラ画像取得
PyBulletの
getCameraImageにより仮想カメラ画像を取得し、ファイル保存。 -
YOLOv8による物体検出
保存画像をYOLOv8(
best.pt)で推論し、色ラベルと画像内座標(u, v)を取得。 -
世界座標変換 & 物体選択
YOLO検出結果を
bbox_to_world()で世界座標に変換。未処理のオブジェクトと照合し、最もエンドエフェクタに近い物体を選択。
-
アームの逆運動学で位置制御
calculateInverseKinematics()によりアームを物体位置へ移動。 -
把持 & 判定
try_grasp_with_retries()により最大10回の把持を試行。is_grasp_successful()にてアームと物体の距離により判定。 -
色別に分類・投下
sort_object_by_color()により、色ラベルに応じて異なる分類位置へ移動 → グリッパーを開放。 -
ログ記録
sorted_log.csvに(loop_id, u, v, color_name, result)を記録。再現・評価が可能。
-
視覚座標から世界座標への変換(bbox_to_world)
YOLOで検出した物体のバウンディングボックスから中心座標を求め、仮想カメラの位置・向きに基づいて3次元の把持目標座標を計算。
-
最も近いオブジェクトの自動選択
YOLO検出結果とPyBullet上の物理オブジェクトを位置比較し、最も近い未処理物体のみを対象とした。
-
把持の再試行機能
初回の把持が失敗した場合、高さや位置を微調整して再試行する堅牢な制御ロジックを実装。
-
分別位置の色対応制御
sort_object_by_color()により、赤・青・緑の色ラベルに応じて異なるy軸方向の投下位置にアームを移動させることで「分別」を実現。 -
高い再現性と評価可能性
処理のログファイル
sorted_log.csvを出力することで、把持成功率や分類精度の分析が可能な設計にした。 -
Colab × ローカル推論の分離
学習はGoogle Colab(Ultralytics YOLOv8)、推論とロボット制御はローカルPC(PyBullet)で分担し、開発効率と実行速度を両立。
- シミュレーション: PyBullet
- Pandaアーム URDF
- 仮想カメラ・物体生成・把持制御
- 物体検出: YOLOv8(Ultralytics)
- Google Colabで学習 (
yolov8n.pt→best.pt) - ローカルで推論(学習済みモデル読み込み)
- Google Colabで学習 (
- 言語・ライブラリ:
- Python 3.x
- NumPy, OpenCV, PyBullet, Ultralytics YOLOv8
- 環境:
- Ubuntu 22.04
- ローカルGPU不要(CPUでも推論可)