ControllerItemがLink->contactPointsを取得するタイミングについて

現象
AISTSimulatorItemでシミュレーションを行い、ControllerItemでLink->contactPointsを取得して使用させていただいているのですが、正常に取得できる周期とできない周期がありました。

原因
AISTSimulatorItemは毎周期、

  1. Link->contactPointsを全削除する
    choreonoid/src/Body/ConstraintForceSolver.cpp at 4ed77b902c9a86dd740b7b0eac5683a36c3076e1 · choreonoid/choreonoid · GitHub

  2. シミュレーション演算を行う

  3. Link->contactPointsを書き込む
    choreonoid/src/Body/ConstraintForceSolver.cpp at 4ed77b902c9a86dd740b7b0eac5683a36c3076e1 · choreonoid/choreonoid · GitHub

という手順で処理を行うため、1と3の間のタイミングでControllerItemが実行されるとLink->contactPointsが空になってしまうことが原因でした。

解決法
ControllerItemをisNoDelayMode: trueに設定したり、SimulatorItemをcontrollerThreads: falseに設定したりして、AISTSimulatorItemとControllerItemが並列で実行されることがないようにすると、毎周期正常に取得できるようになります。

同様の現象に遭遇して困った方の参考になれば幸いです。

また、ConstraintForceSolverの実装を変更し上記1と2の処理の実行順序を入れ替えることができると、AISTSimulatorItemとControllerItemを並列で実行してもこの現象がほぼ発生しなくなると思うのですが、可能でしょうか。

ごめんなさい、私の勘違いでした。

ControllerItem::control()関数中でLink->contactPointsを取得していたのが原因でした。

ControllerItem::input()関数中で取得するようにしたところ、正常に取得できました。

お騒がせしました。