卵型オブジェクトのPyBulletシミュレーション構築まとめ

✅ 目的

卵型オブジェクトをURDFで定義し、PyBullet上に表示・落下させるところまでを実現。


📁 フォルダ構成(プロジェクト例: egg_cracker_rl

egg_cracker_rl/
├── rl_env/               # 仮想環境(Python venv)
├── egg_env/              # 卵URDFファイル保存用
│   └── egg.urdf
├── scripts/              # Pythonコード置き場
│   └── test_egg.py

🧾 egg.urdf(カプセル型の卵)

<?xml version="1.0" ?>
<robot name="egg">
  <link name="egg_body">
    <visual>
      <geometry>
        <capsule radius="0.05" length="0.12"/>
      </geometry>
      <material name="white">
        <color rgba="1 1 1 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <capsule radius="0.05" length="0.12"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="0.05"/>
      <inertia ixx="1e-5" iyy="1e-5" izz="1e-5" ixy="0" ixz="0" iyz="0"/>
    </inertial>
  </link>
</robot>

🐍 test_egg.py(表示テスト用Pythonスクリプト)

import pybullet as p
import pybullet_data
import time
import os

# GUI起動
p.connect(p.GUI)
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 地面と重力
p.setGravity(0, 0, -9.81)
p.loadURDF("plane.urdf")

# 卵URDFの読み込み
egg_path = os.path.join(os.path.dirname(__file__), "../egg_env/egg.urdf")
egg_id = p.loadURDF(egg_path, basePosition=[0, 0, 1.0])

# 表示ループ
for _ in range(240):
    p.stepSimulation()
    time.sleep(1.0 / 60)

# オプション: 5秒間表示維持
time.sleep(5)
p.disconnect()

🔧 その他メモ

  • 仮想環境は (rl_env) 表示時のみ使用可
  • egg.urdf は拡張子が .xml のままでは不可(必ず .urdf に)
  • オブジェクトが見えないときは:
    • radiuslength を大きめにする
    • basePosition を高めに設定(例: [0, 0, 1.0]
    • カメラを回して周囲を探索

✅ 現在の状態

  • PyBullet上で卵型オブジェクトの描画・落下を確認済み
  • URDF構造・Pythonスクリプト・フォルダ構成まで完成

🔜 次のステップ候補

  1. 卵を掴むロボットアームの追加
  2. 卵をパカッと割る構造の設計(左右分割型)
  3. 強化学習タスク設計と環境整備