SimulatorItemが各ステップ単位では実時間よりも速く実行されてしまう

choreonoidとは別のプロセス(以下、制御プロセスと呼称)で500Hzで制御の計算を行い、choreonoidの物理シミュレーション(1000Hz)内のヒューマノイドを動かしています。SimulatorItemのrealtimeSyncモードの仕様で、choreonoidのシミュレーションの各ステップが実時間よりも遥かに速く実行されてしまうことがあるため、制御プロセスでの制御の計算が間に合わなくなってしまうという問題がありました。SimulatorItemのrealtimeSyncモードに、各ステップが実時間よりも速く実行されてしまうことがないようにするオプションを追加することはできますでしょうか。

SimulatorItemのソースコードの該当の箇所はこちらです https://github.com/choreonoid/choreonoid/blob/c6d0afc6f0dc677cb732488bd983e9efd004bca2/src/BodyPlugin/SimulatorItem.cpp#L2099-L2110
カメラのシミュレーションなどによって数十ステップに一回、時間がかかるステップがあると、その遅れを取り戻すためにその他のステップは可能な限り速く実行を進める、という仕様になっています。

choreonoidの物理シミュレーションが実時間よりも遅い場合には、https://github.com/choreonoid/choreonoid_ros/blob/master/src/plugin/WorldROSItem.cpp のようなプラグインを用いてchoreonoidの物理シミュレーション内の時刻を制御プロセスに渡すことで、同期をとることが可能です。

しかし、choreonoidの物理シミュレーションが実時間よりもはるかに速い場合には、制御プロセスの計算が間に合わないため、同期をとることができません。

厳密な同期をとる場合にはchoreonoidのプラグインとして制御処理を書いたり、制御プロセスから計算が終了したという信号をchoreonoidに送ったり、OpenRTMPluginのBodyRTCItemを使ったり、といった方法が考えられますが、簡単にSimulatorItemをrealtimeSyncモードに各ステップが実時間よりも速く実行されてしまうことがないようにするオプションがあれば便利だと思います。

ご検討いただけますと幸いです。

https://github.com/choreonoid/choreonoid/pull/23 にPull Requestを作成しました

ご提案ありがとうございます、本件確認が遅れておりまして大変申し訳ありません。
今週確認したいと思いますので、今しばらくお待ちいただけますでしょうか。
よろしくおねがいします。

1 Like

プルリクエストをマージしました。ご提案ありがとうございました。

モードの名称については恐縮ながら変更させていただきました。実時間同期のモードについて、“compensatory”(補償型) と “conservative” (保守的)という言い方にさせてもらいました。前者はトータルで実時間に近づけるために、あるフレームの遅れを取り戻すためにフレームごとに待ち時間を調整するという意味になります。損失を取り戻すといったときにこの言葉を使うようなので、このようにしました。二足歩行ロボットのバランス補償などでも使用することがありますね。後者はNaokiさんのご提案に対応するものですが、各フレームごとに必ずそのフレームの実時間分待つということで、より保守的な動作と言えるかなと思い、このような名称にしました。これらについて英語で違和感がないものかあまり自信はありませんが…。勝手に変えてしまい恐縮ですが、ご意見等ありましたら遠慮なくお知らせ頂ければと思います。

あと余談なのですが、ChoreonoidのYAMLファイルについて、従来lower camel caseの命名規則としていたのですが、これをsnake caseに変更したく思っていて、数年前よりその修正をしています。YAMLファイルの読み書きは広範囲に渡るので、一度に全て変更するのも現実的はないと思い、何か他の修正がある度についでに修正するようにしています。その際以前のキー名などでも読めるように後方互換性も確保するようにしています。今回もSimulatorItemの改修にあたって、SimulatorItemのプロジェクト保存のYAMLのキーについて、snake caseへの変更をしました。

このようなやり方で進めていますので、現状のChoreonoidではcamel caseとsnake caseが混じっている状況で、正直なところ格好悪いのですが、いずれは全てsnake caseに統一して、格好悪さを解消したく思っています。

要望を取り入れてくださり、また、全体と整合性がとれるよう修正してくださりありがとうございます。

今後ともよろしくお願いいたします。