Facebook製物理シミュレータ: pybulletX
先日PyBulletの調査記事を書き(かけ)ましたが、そのPyBulletを使いやすくした薄い wrapper ライブラリ pybulletX をFacebook Research が公開していました。
この記事を書いた時点では、バージョンが 0.4.1 です。
特に記載はありませんでしたが、バージョン番号的には、まだ開発中というフェーズかもしれません。
1. インストール
PyPIに公開されているので、pipでインストール可能です。
pip install pybulletX
2. 使い方
pybulletXの利点と使い方は、サンプルコードとして配布されているpybulletXの有無による違いを見るのが最もわかりやすいです。
def main():
px.init()
robot = px.Robot("kuka_iiwa/model.urdf", use_fixed_base=True)
robot.torque_control = True
while True:
time.sleep(0.01)
error = desired_joint_positions - robot.get_states().joint_position
actions = robot.action_space.new()
actions.joint_torque = error * P_GAIN
robot.set_actions(actions)
p.stepSimulation()
pybulletXを使わない場合
def main():
p.connect(p.GUI)
p.setAdditionalSearchPath(pybullet_data.getDataPath())
p.loadURDF("plane.urdf")
robot_id = p.loadURDF("kuka_iiwa/model.urdf", useFixedBase=True)
num_dofs = 7
joint_indices = range(num_dofs)
# The magic that enables torque control
p.setJointMotorControlArray(
bodyIndex=robot_id,
jointIndices=joint_indices,
controlMode=p.VELOCITY_CONTROL,
forces=np.zeros(num_dofs),
)
while True:
time.sleep(0.01)
joint_states = p.getJointStates(robot_id, joint_indices)
joint_positions = np.array([j[0] for j in joint_states])
error = desired_joint_positions - joint_positions
torque = error * P_GAIN
p.setJointMotorControlArray(
bodyIndex=robot_id,
jointIndices=joint_indices,
controlMode=p.TORQUE_CONTROL,
forces=torque,
)
p.stepSimulation()
素のPyBulletだと全てのAPIが、モジュール直下のフリー関数として提供されていて、IDやら制御方式やらを逐一指定する必要があります。
一方、pybulletX を利用することで、Robot
オブジェクトの中に設定を保持しています。制御方式についても、メンバー変数 torque_control
に真偽値を代入することで変えることができ、その状態に応じて、メンバー関数 set_actions
が、トルク制御と位置制御を適切に振り分けて実行してくれます。
3. 制約
URDF形式のファイルを読み込んで利用することが前提の設計であり、0からモデルを構築する機能は提供されていませんし、PyBulletが対応している他の形式のファイルを読み込むこともできません。
一応、読み込んだモデル同士を attach
することで、固定の結合としてつなぎ合わせることはできるようです。
4. まとめ
既存のURDF形式のモデルを利用して、物理シミュレーションのある強化学習を行いたいというコンテキストでは、pybulletX は記載コード量を減らせるため非常に有用に感じました。
また、その実装を読むことにより PyBullet 自体の理解を深められそうです。
(途中になっている PyBullet の読み解きを早くすすめないと。。。)
おまけ
と、記事を書いていたところ友人からさらに別の物理シミュレータの紹介がありました。
(こちらもそのうち調査して、まとめたい。)
Discussion