はじめに
PyBulletは、物理シミュレーション、ロボティクス、機械学習などの多様な用途に使用されるオープンソースの物理エンジンです。このライブラリは、C++で書かれたBullet PhysicsエンジンをPythonで使えるようにラッピングしたものです。PyBulletは、リアルタイムシミュレーション、高度な衝突検出、ロボットの動力学計算、レンダリングなど、多くの機能を提供しています。本記事では、Pythonによる物理シミュレーション環境PyBulletのインストールから基本操作まで紹介します。
PyBulletのインストール
Pybulletのインストールは、コマンド操作によって行います。Pythonとpipがすでにインストールされている前提で進めていきます。まだPython及びpipをインストールされていない方は、Python及びpipのインストールから行ってください。
まずはコマンドプロンプトを開き、以下のコマンドを実行してください。
python -m pip install --upgrade pip
pipコマンドとは、Pip Install Packagesの略称であり、pythonに公式に登録されたパッケージをインストールするためのものです。これをアップグレードしておかないと、古いバージョンのPybulletがインストールされる可能性があります。pipコマンドをアップグレードしたら、Pybulletをインストールしましょう。
(Windowsの場合)
pip install pybullet
(Linuxの場合)
sudo pip install pybullet
“Installing collected packages: pybullet”と表示されれば、正しくインストールが開始されています。しばらく待ち、“Successfully installed pybullet-x.x.x(バージョン)”と表示されれば、インストール完了になります。
環境の設定
インストールが完了したら、実際にPybulletを利用して物理エンジンに接続していきましょう。Pythonファイルを作成します。本書ではスクリプト名を“pybullet-project.py”とします。注意点として、名前をインポートするライブラリ名と同じにすると、スクリプト実行時にエラーとなるため、作成するスクリプトに“pybullet.py”といった名前を付けることは避けましょう。
スクリプトを作成したら、さっそくコードを書いていきます。まずはPybulletライブラリを読み込みましょう。
import pybullet as p
基礎的な解説になりますが、“as”はライブラリ名を変えて利用できるようにするためのものです。“import A(ライブラリ) as B(変更名)”とすることで、AというライブラリをBという名前で使用することができるようになります。今回の場合であれば、pybulletをpという名前で利用できるようにしています。Pybulletライブラリを利用する際、毎回pybulletと打つのは大変なので、pと省略します。
次に、pybullet_dataをインポートします。
import pybullet_data
pybullet_dataには、サンプルのロボットや床など、便利なデータが入っています。
以上の2つのライブラリをインポートしたら、物理エンジンに接続するコードを書きます。また、シミュレーション時間を計測するためのtimeライブラリもインポートします。
import time
では、connect関数によって、物理エンジンに接続します。引数に“p.GUI”と入れることで、GUI (シミュレーション画面表示・キーボード操作)付きの物理エンジンに接続することができます。一方、“p.DIRECT”と入れると、GUIなしの物理エンジンに接続することができます。”p.DIRECT”は、パソコンの計算負担を減らすため、強化学習を行う際などに使用します。まずは、GUI付きの物理エンジンに接続します。
physicsClient = p.connect(p.GUI)
さきほど、pybullet_dataには様々なモデルが入っていると説明しました。しかしそのままでは、pybullet_data内のモデル使用することができません。パスを通すことで、pybullet_dataのを利用するためのコードを書きます。
p.setAdditionalSearchPath(pybullet_data.getDataPath())
パスを通したら、さっそくpybullet_dataから床のデータを利用しましょう。床のデータはURDFファイルの形式で記述されています。URDFファイルとは、ロボットなどの構造を記述するために使われるマークアップ言語(タグで囲むことで構造を表現)のことです。URDFファイルを読み込むためには、loadURDF関数を利用します。引数に読み込むファイル名を入れます。床のデータは“plane.urdf”です。
planeID = p.loadURDF(“plane.urdf”)
環境設定の仕上げに、重力をセットしましょう。setGravity関数を利用します。引数は3つであり、それぞれx、y、z方向に対応しています。1、2つ目の引数に’0’、3つ目の引数に’-9.8’と入れます。
p.setGravity(0, 0, -9.8)
以上で基本的な環境の設定は完了になります。では実際に、while文の中でstepSimulation関数を実行することで、シミュレーションを動かしてみましょう。またこのとき、while文の上でtを宣言し、timeライブラリのsleep関数を利用してシミュレーション時間を計測しておきます。
t= 0
while True:
p.stepSimulation()
time.sleep(0.01)
t += 0.01
次の画面が表示されれば成功です。
基本操作
PyBullet上における基本操作を列挙します。実際に、Pybullet画面上でそれぞれの操作を試してみてください。
- マウスホイール:視点のズームイン/アウト
- CTRL(またはAlt) + 左クリック + ドラッグ:視点を回転させる
- CTRL(またはAlt) + ホイールボタン + ドラッグ:視点を平行移動
- 左クリック + ドラッグ:物体のグリップ操作
- G key:UIを非表示
- W key:フレーム表示
- S key光効果を消す
- V key:リンクを箱として粗野化
まとめ
本記事ではPythonによる物理シミュレーションPyBulletの導入と基本操作を解説しました。ライブラリが豊富なPythonで物理シミュレーションを行うことで、少ないコーディングで多機能な制御を実施することができます。
コード全文
import pybullet as p
import pybullet_data
import time
physicsClient = p.connect(p.GUI) # 物理エンジンに接続
p.setAdditionalSearchPath(pybullet_data.getDataPath()) # パスを追加
p.setGravity(0, 0, -9.8) # 重力の設定
planeID = p.loadURDF("plane.urdf") # 床の読み込み
t = 0 # シミュレーション時間
while True:
p.stepSimulation()
t += 0.01
time.sleep(0.01)
コメント