BodyIoRTCのコントローラオプション


#1

独自の BodyIoRTCを作っているのですが,BodyIoRTCを継承したクラスの
bool initializeSimulation(ControllerIO* io)においてio->optionString()の返す値が,そのモジュールを読み込んでいるBodyIoRTCItemのプロパティのコントローラオプションではなく,AGXSimulatorのプロパティのコントローラオプションに設定したものになってしまいます.

BodyIoRTCItemのコントローラオプションを読みだすにはどのようにすればいいのでしょうか?


#2

問題を再現するできるだけ簡単な例を作ってみました.
cnoidファイルとRTCモジュールのソースコードを含むzipファイルを添付します.
TestBodyIoRTC.zip (3.7 KB)


#3

本件症状を確認しました。不具合が多くて申し訳ありません。
現在修正中で、もう少しでアップできると思いますので、今しばらくお待ちください。


#4

遅くなってしまいすみません、不具合の修正をしましたので、最新版に更新して試してみてください。


#5

対応ありがとうございます.
シミュレータのコントローラオプションに「zzzzz」と設定し,BodyIoRTCのコントローラオプションに「aaaaa」と設定すると, io->optionString()の返す値は「zzzzz aaaaa」になりました.このような仕様になると,単純に文字列を==で比較する方法は使えませんね.例えば,制御則を「position」か「velocity」と「torque」の文字列で指定するとして,両方のアイテムのコントローオプションで値を設定した場合を想定すると処理がややこしくないですか?


#6

正直に申し上げて、この機能はやっつけで暫定的に作ったものです。ただ、コントローラにオプションを与えて挙動を変えられるとよいというところはありますので、無いよりはマシかなということで。
また、シミュレータアイテムとコントローラアイテムの両方からオプションを設定できるというのは、シミュレータアイテムの種類や設定に対してひとつのコントローラを使いまわせるようにするためのもので、その意図を踏まえて使い分けていただければと思います。
実際問題これはコマンドラインオプションだと思って頂ければ、コマンドラインオプションに対して特に劣っているところはなく、同様のことができます。コマンドラインオプションを処理するライブラリも様々なものがありますので、そのようなものを活用することで、複雑な設定も処理できるかと思います。サンプルにおいて==の比較だけでやっているのは、サンプルとしてはシンプルに記述する必要があるからです。

さらに、上記踏まえた上で、やはり使い勝手が悪いところもありますので、コントローラ側のオプションをアイテムのプロパティに統合するような仕組みを作れないか、考えております。


#7

実際に,sample/WRS2018/AGXSimulator.cnoidでは

        controllerOptions: "velocity"

になっているので,チームが用意するcnoidファイルのBodyIoRTCの中でコントローラオプションによる場合分けに注意しなけれればいけないですね.


#8

文字列の中の単語を前から順番に読んでいくというような処理にすればいいですね.そうします.


#9

これもあくまでWRSのサンプルを簡潔にまとめるためのものです。複数のロボットやシミュレータアイテム、制御指令値などをサンプルとして提示しつつ、それらの組み合わせの問題でプロジェクトファイルの数が膨大にならないよう、やむを得ずこのようにしています。

チームに用意して頂くものはAGXSimulator以外のシミュレータアイテムを使ったり、制御指令値のモードを複数用意したりといったことは必要ないかと思いますので、サンプルにはあまり引きずられずに、チームで必要な設定は各チームごとのプロジェクトファイルとして簡潔にまとめていただければと思います。