[choreonoid-users-ja 00106] Re: シミュレーション中のリンクの位置データの取得について

Shin'ichiro Nakaoka s.nakaoka @ aist.go.jp
2013年 6月 20日 (木) 11:01:14 JST


チャンドラさん

産総研の中岡です。

> もともと配布されてあるコントローラアイテムの中身に,シミュレーションを行う
> 時に(AISTやODEを用いて)リアルタイムにリンクの現在位置を出せるようにしたいで
> す.

なるほど、了解です。

> もしかして,コントローラアイテムではこの動作はできないのでしょうか?

はい、結論から言うと現状ではそうなっています。

通常(実機の)ロボットのコントローラはロボットの状態に関して、ロボットが
有するセンサの情報しか得ることができません。そして、コントローラの入出力
としては、そのような情報のみを扱うことになります。例えば、関節角度のエン
コーダ情報をdoubleの配列で受け渡しを行う、といったAPIになります。

SimpleControllerについては、そのような入出力のためのデータ構造を特別に定
義せず、そのような情報の入れ物としてBodyクラスをそのまま使ってしまった
APIとなっています。それが一番シンプルと言えばシンプルですので。簡易で
データ構造的に無駄も多いAPIですが、さくっとコントローラを作って試す分に
は悪くないかと。

ただし、ここで使われているBodyオブジェクトは、シミュレーションを行なって
いるものとは別に生成されたもので、センサ情報やトルク司令といった情報のみ
をコピーして使うものとなっています。そして、現状では更新される情報は通常
の入出力としてやり取り可能なものに限定しています。ですので、関節角度や
力・加速度・ジャイロ等のセンサ値は更新されているのですが、リンク位置につ
いては更新されません。リンク位置については、そのようなセンサ(モーキャプ
等?)がなければ通常得ることは出来ないからです。

以上についてコレオノイドのページ等でちゃんとした解説がないので、分かりに
くかったかと思います。ごめんなさい。この点については今後改善したいと思い
ます。

ただし、シミュレーションのみで使う分には、そのようにリンク位置をさくっと
取得できたりすると、確かに便利だと思います。ですので、リンク位置を更新す
るかどうかをプロパティとして選択できるようにしてもよいかもしれませんね。
開発のTODOに入れておきたいと思います。

リンク位置を今すぐ取得して使いたいということであれば、ソースの
src/SimpleControllerPlugin/SimpleControllerItem.cpp のファイルをみてくだ
さい。

ここの void SimpleControllerItem::input() という関数で、コントローラへの
入力となるセンサ情報の更新を行なっています。simulationBodyというのがシ
ミュレーションしているBodyで、これのリンク位置は更新されているはずです。
そして、internalBodyの方に情報をコピーしてあげれば、コントローラから参照
できるようになります。

よろしければ、ここの部分を修正してコンパイルして、チャンドラさんのコント
ローラで試してみてください。

以上よろしくお願いします。


(06/18/13 16:08), チャンドラ ハディ wrote:
> 中岡さん,
> 
> 菅野研B4のチャンドラです.
> 
> ご返事ありがとうございます.一応中岡さんのアドバイスどおりに
> 順運動学を挟んでから現在位置を取得しようとしましたが,
> やってみても更新されていなかったみたいです.
> 
> もう少し今までやったことを説明しますと,
> 
> もともと配布されてあるコントローラアイテムの中身に,シミュレーションを行う
> 時に(AISTやODEを用いて)リアルタイムにリンクの現在位置を出せるようにしたいで
> す.
> 
> 今はうまく行ってませんので,とりあえず制御などを全部消して,自由落下シミュレーシ
> ョン(z=5)の対象になっているものに,位置情報だけを出しているコントローラ
> アイテム(SimpleController)をつけている状態になっています.
> 
> 一応そのコントローラアイテムのソースコードはここにも添付しておきます.
> 
> もしかして,コントローラアイテムではこの動作はできないのでしょうか?
> もともとの理由としては,コントローラアイテムの中には既にBody* bodyが
> 入っているので,大幅な変更をしなくても位置情報が簡単に出せるのではないかと
> 思っていましたからです.
> 
> 低いプログラミング力の故にご迷惑をかけてしまって申し訳ありませんが,
> よろしくお願いします.
> 
> 
> 引用 中岡 慎一郎 <s.nakaoka @ aist.go.jp>:
> 
>>
>> チャンドラさん
>>
>> 産総研の中岡です。
>>
>>> Link* link = body->link("LINK_NAME")->p.z
>>
>> についてですがが、これだとZ軸位置のdouble値を
>> Linkへのポインタに入れよう
>> としていて、おかしな記述になっていますね。(また、z
>> については関数なの
>> で、z() としなければいけません。)
>>
>> まず
>>
>> Link* link = body->link("LINK_NAME");
>>
>> といったかたちでLinkオブジェクトを取得して、それから
>>
>> link->p
>>
>> で位置データにアクセスするとよいかと思います。
>>
>> ただ、初期値だけが表示されているということで、上記の問題とは関係無かった
>> かもしれません。
>>
>> もし関節角を変更してその場合の位置を得たいのであれば、関節角を変更した後に、
>>
>> body->calcForwardKinematics()
>>
>> 等を行いますと、そこで順運動学が行われて、初めて位置が更新されることにな
>> ります。
>>
>>
>>
>> (06/18/13 00:24), チャンドラ ハディ wrote:
>>> 早稲田大学菅野重樹研究室,B4のチャンドラです.
>>> お世話になります.
>>>
>>> とあるリンクの位置データ(x,y,z)を取得するには
>>> どこを参照すればいいのでしょうか.
>>>
>>> 今まで自分で試した時には,勘違いして
>>>
>>> Link* link = body->link("LINK_NAME")->p.z
>>>
>>> などで取得しようとしましたが,MessageViewで
>>> その値を吐かせてみましたらどうやら
>>> 初期値だけが入力されていくようです.
>>>
>>> 一体どこを参照すればリンクの位置データ
>>> を正しく取得できるのでしょうか?
>>>
>>> 素朴の質問で申し訳ありませんが,
>>> よろしくお願いします.
>>>
>>
>>
>> -- 
>> 中岡 慎一郎 <s.nakaoka @ aist.go.jp>
>> 産業技術総合研究所 知能システム研究部門
>> ヒューマノイド研究グループ
>> Phone: 029-861-5161  Fax: 029-862-6519
>> _______________________________________________
>> choreonoid-users-ja mailing list
>> choreonoid-users-ja @ choreonoid.org
>> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
>>
> 
> 
> 
> 
> 
> 
> _______________________________________________
> choreonoid-users-ja mailing list
> choreonoid-users-ja @ choreonoid.org
> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
> 


-- 
Shin'ichiro Nakaoka <s.nakaoka @ aist.go.jp>


choreonoid-users-ja メーリングリストの案内