この記事では、プログラミング言語「Python」を用いて、無料で簡単に物理シミュレーションを行う方法を紹介します。
Pythonとは
Pythonとは、欧米で人気なスクリプト言語で、以下の優れた特徴を持っています。
・コードが短く、読みやすい
・科学技術計算ライブラリが豊富である(Matlab風ライブラリもある)
・無料である
・科学技術計算ライブラリが豊富である(Matlab風ライブラリもある)
・無料である
物理シミュレーションには、C++言語がよく使われていますが、Pythonには素早くコードを書けるというメリットがあります。
また、Pythonには様々なライブラリと連携しやすいため、拡張性が高いのも魅力です。
環境構築
Python環境の構築方法については下記事で解説しています。
– | 項目 |
---|---|
Pythonの導入方法① (Pythonパッケージ) |
WinPython編, Anaconda編, Python(x, y)編, |
Pythonの導入方法② (公式インストーラ) |
Python2.7編, Python3.5編 |
Pythonの基礎はこちら | Python入門 サンプル集 |
物理シミュレーション(PyODE + VPython編)
Pythonには、PyODEと呼ばれる物理演算ライブラリがあります。
これはC++の物理演算ライブラリODEのPython版です。
ここでは、「PyODE」と「VPython」(3Dグラフィックスライブラリ)を組み合わせて物理シミュレーションを行います。
– | 項目 |
---|---|
準備 | PyODEのインストール, VPythonのインストール |
基礎 | VPython入門, PyODE入門 |
物体運動 | ボールの自由落下 |
参考文献 | PyODE+VisualPythonで物理シミュレーション, 羽鼠昆奮闘記, PyODEのサンプル |
コメント
初めまして。
僕は大学院でpyodeを使って研究を始めようとしている学生で河西と申します。
pyodeでいくつかの箇所でつまずいたのですが、pyodeについて扱っている本やウェブサイトが少なく、ウェブサイトを見つけても最終更新日がかなり古いものが多く大変困っています。そのどうしようもない時にこのブログと出会いました。
現在、以下の点が不明で作業が止まってしまっています。
・pyodeでは剛接合ができないのか?
・hinge2JointやUniversalJointでそれぞれの軸の回転固さの調整はできるのか?
・シミュレーション途中にJointを一度解除し再構成できるのか?
よろしければご教示いただけると幸いです。
※河西 様
コメントありがとうございます。
私もODEやPyODEについては初学者のレベルなので
正確な回答はできませんが、ご参考程度に。
①剛接合について
C++版ODEの書籍や入門サイトでも剛接合機能についての記述はないので
無い可能性が高いと思います。
②Jointに軸の回転固さの調整はできるか
粘性摩擦のことでしょうか?
Jointに粘性摩擦を設定する機能はなかったと思うので
自分で粘性トルクや粘性摩擦力を計算して加えてやる必要があると思います。
③シミュレーション途中にJointを一度解除し再構成できる?
ジョイントの接続・解除のAPIがあるので、おそらく出来るのではないかと思います。
PyODEは情報が少ないのでC++版ODEで情報を漁ったほうがいいと思います。
C++版ODEの情報収集は出村先生のサイトがオススメです。
http://demura.net/ode_faq#b6
管理人様
ご丁寧な返信ありがとうございます。
①やはり剛接合は難しいのですね。BallJointを用いてピン接合によるトラスを作り、固定しようと思います。
②はい、粘性摩擦のことをお聞き致しました。自分で計算したうえ、AddTorque等で設定する必要があるのですね。
③おすすめして頂いたサイトを確認致しました。ジョイントの接続・解除は可能のようですね。PyODEではどのようなコマンドが対応しているのか海外サイトを含めて再度調査してみようと思います。
突然不躾に質問してしまい申し訳ないところを、ご丁寧に回答して頂き大変感謝しております。私はPyODEに関する意見をもらえる環境になく、別の物理エンジンを使おうかとも考えていました。頂いたご意見をもとにもう一度PyODEを勉強してみようと思います。
この度はありがとうございました。
※河西 様
コメントありがとうございます。
私も過去にロボットシミュレーションの研究でC++版ODE出を使ったことがあったので、
試しでPyODEも使ってみたのですが、情報が少なく四苦八苦しております。
今後は物理シミュレーションは情報が多く更新頻度の高い
「Unity+C#」か「Blender+Python」でやろうと考えています。
今後とも何かあれば気軽にご質問等ください。