Pythonによる物理シミュレーション『PyBullet』の導入と基本

シミュレーション

はじめに

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)

コメント

タイトルとURLをコピーしました