お疲れ様です。秋並です。
Pybullet公式gitリポジトリのサンプルコードを解説するシリーズです(一覧はこちら)。
今回は、commandLogAndPlayback.pyを解説します。(コードのリンクはこちら)
本コードを実行すると、シミュレーションをログファイルに保存されます。その後、保存したログファイルを読み込むことでシミュレーションが再度実行されます。
使用している機能
本コードは、以下の機能を使用して「シミュレーションをログに保存したのち、ログから再度シミュレーションを実行」しています。
- シミュレーションのログの保存
- シミュレーションのログの読み込み
シミュレーションのログの保存
pybulletでは、startStateLogging
関数を使用することで「シミュレーションのログ記録の開始」することができます。
logId = pybullet.startStateLogging(logMode, logFile)
-
logMode
:モードを指定-
pybullet.STATE_LOGGING_ALL_COMMANDS
:すべてのコマンドを記録するモード -
logFile
:保存するログのファイル名
-
次に、stopStateLogging
関数を使用することで「シミュレーションのログ記録の停止」をすることができます。
pybullet.stopStateLogging(logId)
-
logId
:ログのID
シミュレーションのログの読み込み
startStateLogging
関数を使用することで「ログを読み込み、シミュレーションを実行」することができます(ログの記録の時と同じ関数を使用します)。
logId = pybullet.startStateLogging(logMode, logFile)
-
logMode
:モードを指定-
pybullet.STATE_REPLAY_ALL_COMMANDS
:すべてのコマンドを再生するモード -
logFile
:保存するログのファイル名
-
コメントをつけたサンプルコード
サンプルコードにコメントをつけたものが以下になります(もともとあった不要と思われるコメント等については削除しています)
import pybullet as p
import time
import pybullet_data
# PybulletをGUIモードで接続
p.connect(p.GUI)
# Pybulletに関するデータのパスを取得
p.setAdditionalSearchPath(pybullet_data.getDataPath())
# ログの記録を開始する
logId = p.startStateLogging(p.STATE_LOGGING_ALL_COMMANDS, "commandLog.bin")
# 床とr2d2を生成
p.loadURDF("plane.urdf")
p.loadURDF("r2d2.urdf", [0, 0, 1])
# ログの記録を停止
p.stopStateLogging(logId)
# シミュレーション空間をリセット
p.resetSimulation()
# ログを読み込みシミュレーションを実行
logId = p.startStateLogging(p.STATE_REPLAY_ALL_COMMANDS, "commandLog.bin")
# Pybulletに接続されている間ループを継続
while (p.isConnected()):
time.sleep(1. / 240.)