Choreonoidでは、ロボットの制御方法として、各関節軸に与える指令値として、
- トルク
- 速度
- 位置
のいずれかが使えるようになっています。
産総研エンジン(AISTSimulator)では、通常トルク指令を使用しますが、物理エンジンによっては速度や位置で指令値を与えることで、より安定なシミュレーションを行うことができます。AGXSimulatorについては速度や位置での指令を推奨しておりまして、WRSにおいてもそのようにしてもらうことになっています。
https://discourse2.choreonoid.org/t/wrs/126
この速度指令、位置指令に関して、コントローラや指令値の入出力を行う際に、Choreonoidの内部的にはこれまでLinkクラスのq()、dq()というアクセス関数を使用していました。これはそれぞれ関節位置(変位)、関節速度に対応します。
しかしそれらの変数は元々ロボットの「現在の状態」を格納するための変数で、これを指令値と共有してしまっていたため、指令値と現在の値に差異がある場合に、それをうまくやりとりできない状態となっていました。つまり、指令値によって現在値が上書きされ、現在値を正確に取得することができませんでした。
今回位置・速度による制御方法を整備するにあたって、この問題に気がついたため、指令値を格納する変数を新たに追加しました。それらは、q_target()、dq_target() というアクセス関数が対応します。
まとめると、関節変位、速度について、以下のようになります。
- Link::q() 関節変位の「現在値」
- Link::q_target() 関節変位の「指令値」
- Link::dq() 関節速度の「現在値」
- Link::dq_target() 関節速度の「指令値」
これにともない、Choreonoidのサンプルでも指令値変数の置き換えを行いました。
つきましては、Choreonoidの最新版へのアップデートをする際に、皆様が自前で開発しているコントローラや、サンプルを改良したコントローラなどがありましたら、上記の変更と同様に、指令値に対応する変数を _target() の付いた名前に変更していただけますでしょうか。
ただし、「現在値」を取得している箇所については、そのままにしておいてください。
それか、移行措置として、シンプルコントローラに関しては、コントローラのプロパティに「旧指令値変数モード」という項目を追加しています。これをtrueにすると、従来のコードが動くようになります。
ただし今後のため、なるべく変数の置き換えを行っていただければと思います。
以上大変お手数をおかけしますが、ご対応のほどよろしくお願いいたします。