関節の位置指令、速度指令を格納する変数の変更について


#1

Choreonoidでは、ロボットの制御方法として、各関節軸に与える指令値として、

  • トルク
  • 速度
  • 位置

のいずれかが使えるようになっています。

産総研エンジン(AISTSimulator)では、通常トルク指令を使用しますが、物理エンジンによっては速度や位置で指令値を与えることで、より安定なシミュレーションを行うことができます。AGXSimulatorについては速度や位置での指令を推奨しておりまして、WRSにおいてもそのようにしてもらうことになっています。
https://discourse.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にすると、従来のコードが動くようになります。

ただし今後のため、なるべく変数の置き換えを行っていただければと思います。

以上大変お手数をおかけしますが、ご対応のほどよろしくお願いいたします。


BodyMotionController