こんにちは.
Choreonoidのモデル定義で用いられているBodyファイルのパース方法についてお伺いしたいです.
Bodyファイルをchoreonoid外でパースしたい場合(例えば自動でURDFを作るなど),パース部分だけをincludeして使用するにはどのようにすればよろしいでしょうか?
BodyファイルからURDF等の自動生成等にはsimtransが主に用いられていると思いますが,simtransはpythonで独自にパーサーが実装されています.
もし可能なら,choreonoidで用いられているBodyファイルのパーサーをc++ライブラリもしくはPythonライブラリとして利用できればと思います.
お手数をお掛けしますが何卒よろしくお願いします.
nakaoka
2
Bodyファイルの読み込みは、src/Body/BodyLoader.h で定義されている BodyLoaderクラスを用いて行うことが可能です。
読み込んだ情報はBodyクラスのオブジェクトとして格納されます。BodyクラスはChoreonoid内部でロボットや環境モデルを格納するのに使用されている基本的なクラスです。
当然Bodyクラスのオブジェクトとして読み込まれた時点で情報は構造化されていて各種関数で取得できますので、Bodyクラス自体は必要なくても、この情報をBodyファイルをパースした情報として使用することができるかと思います。
ChoreonoidのBodyクラス(Bodyモデル)については、マニュアルの以下のあたりで説明があります。
上記ページにも説明があるように、src/Body以下のソースはビルドされるとChoreonoidの「Bodyライブラリ」となります。これはLinuxではlibCnoidBody.so という名前で、Choreonoidインストール先のlib以下にインストールされます。
また、Choreonoidのヘッダファイルはどれも
#include <cnoid/ヘッダ名>
としてインクルードして使うことが可能です。
なので
#include<cnoid/BodyLoader>
として、-lCnoidBodyみたいなリンクをしてあげれば、この機能を使うことができます。BodyクラスもこのBodyライブラリに含まれます。
Pythonについてはpybind11によるバインディングが利用可能です。Bodyライブラリのバインディングは src/Body/pybind11以下で記述されています。これをビルドすると、Pythonコードで、
import cnoid.Body
bodyLoader = cnoid.Body.BodyLoader()
body = bodyLoader.load("robot.body")
みたいな感じで使えるはずです。
ただしBodyライブラリのバインディングはまだ完全ではないので、必要なクラスや関数のバインディングが無いようでしたら、適当に追加してプルリクしてください。
ご回答ありがとうございます!
simtransのBodyファイルの読み込みをコレに変更して見たいと思います.
また,PRについても承知しました.