合理主義的グルメブログ

学生起業家の日常をツラツラと書いています。主に食事情報です。

Pybulletでマルチシミュレーションを行う

深層強化学習の研究をしていると,pybulletを物理シミュレータとして,よく使います.
公式ドキュメントには,シミュレータは1つで動かすことを前提に書かれています.
しかしA3CやPPOなどのプログラムでは,複数エージェントで動かしたいことが多いと思います.

そこで今回は,pybulletでマルチシミュレーションをする方法を調べました.

解決策

解決策は,このイシューに書いてある通りです. github.com

以下のソースコードように,BulletClient関数により,複数のシミュレータを動かす事ができます.

import pybullet_utils.bullet_client as bc
import pybullet
import pybullet_data

p0 = bc.BulletClient(connection_mode=pybullet.DIRECT)
p0.setAdditionalSearchPath(pybullet_data.getDataPath())

p1 = bc.BulletClient(connection_mode=pybullet.DIRECT)
p1.setAdditionalSearchPath(pybullet_data.getDataPath())

pgui = bc.BulletClient(connection_mode=pybullet.GUI)

p0.loadURDF("r2d2.urdf")
p1.loadSDF("stadium.sdf")
print(p0._client)
print(p1._client)
print("p0.getNumBodies()=",p0.getNumBodies())
print("p1.getNumBodies()=",p1.getNumBodies())
while (1):
        p0.stepSimulation()
        p1.stepSimulation()
        pgui.stepSimulation()

注意点としては,import pybullet_utils.bullet_client as bcにしないと,bc.BulletClientが使えないことです.
多分僕のpythonに関する知識不足ですが,pybullet_utils.bullet_client.BulletClient()だと動かなかったです.