🤖

Facebook製物理シミュレータ: pybulletX

2021/09/22に公開

先日PyBulletの調査記事を書き(かけ)ましたが、そのPyBulletを使いやすくした薄い wrapper ライブラリ pybulletX をFacebook Research が公開していました。

https://github.com/facebookresearch/pybulletX

この記事を書いた時点では、バージョンが 0.4.1 です。
特に記載はありませんでしたが、バージョン番号的には、まだ開発中というフェーズかもしれません。

1. インストール

PyPIに公開されているので、pipでインストール可能です。

pip install pybulletX

2. 使い方

pybulletXの利点と使い方は、サンプルコードとして配布されているpybulletXの有無による違いを見るのが最もわかりやすいです。

examples/with_pybulletx.py(抜粋)
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を使わない場合
examples/without_pybulletx.py(抜粋)
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 の読み解きを早くすすめないと。。。)

おまけ

と、記事を書いていたところ友人からさらに別の物理シミュレータの紹介がありました。
(こちらもそのうち調査して、まとめたい。)
https://sapien.ucsd.edu/
https://github.com/haosulab/SAPIEN-Release

Discussion