Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

足のないロボットで euscollada で dae からeusモデルを作ると fullbody-inverse-kinematics でエラーがでる。 #65

Open
s-noda opened this issue Oct 22, 2014 · 4 comments

Comments

@s-noda
Copy link

s-noda commented Oct 22, 2014

see jsk_control #103 (jsk-ros-pkg/jsk_control#103)
エラーのでるサンプル

roseus hrp2w.l

(setq a (hrp2w))

(let* ((mt (list (send a :rarm :end-coords)
                 (send a :larm :end-coords)))
       (tc (send-all mt :copy-worldcoords))
       (ll (mapcar
            #'(lambda (mt) (send a :link-list (send mt :parent)))
            mt)))
  (send a :fullbody-inverse-kinematics
        tc
        :move-target mt
        :link-list ll
        :target-centroid-pos nil
        :debug-view :no-message
        ))

(send a :inverse-kinematics
      (send a :rarm :end-coords :copy-worldcoords)
      :move-target (send a :rarm :end-coords)
      :link-list (send a :link-list (send a :rarm :end-coords :parent))
      :debug-view :no-message
      )

多分原因は

euscollada-robot.l とかの

 (:fullbody-inverse-kinematics
   (target-coords &rest args &key (stop 250) (cog-gain 2.0) (additional-weight-\
list) &allow-other-keys)
   (let* ((leg-ul (send self :calc-union-link-list (send self :legs :links))))
     (send self :reset-joint-angle-limit-weight-old leg-ul)
     (send-message* self robot-model :fullbody-inverse-kinematics
                    target-coords
                    :stop stop :cog-gain cog-gain
                    :additional-weight-list
                    (append
                     additional-weight-list
                     (list
                      (list (car (send self :links))
                            #'(lambda ()
                                ;; set root-link 6dof-joint's weight based on l\
egs' joint limit                                                                
                                (let* ((min-weight
                                        (reduce #'(lambda (x y) (min x y))
                                                (coerce (send self :calc-invers\
e-kinematics-weight-from-link-list
                                                              leg-ul :union-lin\
k-list leg-ul) cons))))
                                  (fill (instantiate float-vector 6) min-weight\
)))
                            )
                      ))
                    args)
     ))

で、

>>> (let* ((leg-ul (send self :calc-union-link-list (send self :legs :links))))
>>>  (coerce (send self :calc-inverse-kinematics-weight-from-link-list leg-ul :union-link-list leg-ul) cons))))

してるからだと思います。

@snozawa
Copy link
Contributor

snozawa commented Oct 22, 2014

これはfullbody-inverse-kinematicsの箇所でエラーがでるということでしょうか?

fullbody-inverse-kinemacitsをhrp2wで呼ぶ必要がありますか?
なければ、:fullbody-inverse-kinematicsはそもそも足のあるロボットで呼ぶことを想定しているので、
足のないロボットは:inverse-kinemaitcsを使ってください。

また、
http://euslisp.github.io/jskeus/jmanual-node170.html
にも"for legged robot"との説明がありますので、ぜひご参照ください。

@s-noda
Copy link
Author

s-noda commented Oct 22, 2014

これはfullbody-inverse-kinematicsの箇所でエラーがでるということでしょうか?

はい。

fullbody-inverse-kinemacitsをhrp2wで呼ぶ必要がありますか?

需要があるかはわかりませんが、台車ロボットをベースリンクの動きを考慮してIKを解きたい場合もあるのではないかと思います。例えば冷蔵庫に手を伸ばすときに、ベース固定だと距離によってはIKが解けませんが、ベースのxy並進移動とz軸回り回転を許すようにすればリーチング時の立ち位置も一緒に計算できます。

IKサーバ内のIKはなるべく広い用途に使えるよう fullbody-inverse-kinematics を使っています。

なければ、:fullbody-inverse-kinematicsはそもそも足のあるロボットで呼ぶことを想定しているので、
足のないロボットは:inverse-kinemaitcsを使ってください。

euslisp の irtrobot.l の :fullbody-inverse-kinematics は ベースリンクに6dofジョイント を加えただけのものだと思っていて、これは足の有無は特に関係ないのではないかと思います。
私が使いたいのもこれなのですが、今後、:fullbody-inverse-kinematics に足のあるロボット特有の機能を足す可能性がありうるということでしょうか?
なぜ euscollada のつくるロボットモデルは :fullbody-inverse-kinematics がうわ書かれるのでしょう?

@snozawa
Copy link
Contributor

snozawa commented Oct 22, 2014

fullbody-inverse-kinemacitsをhrp2wで呼ぶ必要がありますか?
需要があるかはわかりませんが、台車ロボットをベースリンクの動きを考慮してIKを解きたい場合もあるのではないかと思います。例えば冷蔵庫に手を伸ばすときに、ベース固定だと距離によってはIKが解けませんが、ベースのxy並進移動とz軸回り回転を許すようにすればリーチング時の立ち位置も一緒に計算できます。

台車ロボットのベースリンクの動きをやるものは、具体的な需要がでてきたら考えましょう。

PR2では、pr2eus/pr2-utils.lで:inverse-kinematicsを上がいています。
このなかで、:use-base tにすると
https://github.com/jsk-ros-pkg/jsk_pr2eus/blob/master/pr2eus/pr2-utils.l#L24
仮想ジョイントをくっつけてIKをといてくれます。

なぜ euscollada のつくるロボットモデルは :fullbody-inverse-kinematics がうわ書かれるのでしょう?

すいません、これはそのうちなくなる予定です(今諸々確認不足)

euslisp の irtrobot.l の :fullbody-inverse-kinematics は ベースリンクに6dofジョイント を加えただけのものだと思っていて、これは足の有無は特に関係ないのではないかと思います。
私が使いたいのもこれなのですが、今後、:fullbody-inverse-kinematics に足のあるロボット特有の機能を足す可能性がありうるということでしょうか?

:fullbody-inverse-kinematicsは出来上がった当初から今までも、足のロボットを対象としています。
脚型ロボットが全体重心を動かしたり腰高さ・腰姿勢をかえたりする目的で、6dof-jointをつけているイメージです。
(例えば、:move-centroid-on-footするために、6dof-jointの特に並進xy成分が必要になってる、など)

そのため、target-centroid-posなどバランスに関係する
:fullbody-inverse-kinematicsのように引数がそのままかいてあったりします。

このときの仮想ジョイントも
https://github.com/euslisp/jskeus/blob/master/irteus/irtrobot.l#L390
のように6dof-joint限定になってますし、他の仮想ジョイントがはいることは想定してません。

それと、台車のベースリンクIKのようなものは、ロボットの立ち位置決めIKに相当すると思います。
これは台車ロボットだけでなく脚型ロボットでもあっていいように思います。
つまり、

  • 台車ロボットの立ち位置決め全身IKでは、全身ジョイント+台車原点を動かすための仮想ジョイントを使う

でやっていますが、同様に脚型ロボットで同じような挙動のプログラムが

  • 脚型ロボットの立ち位置決め全身IKでは、全身ジョイント+move-centroid-on-foot用仮想6dof-joint+立ち位置(foot-midcoords)を動かすための仮想ジョイントを使う

となっていて、現状の:fullbody-inverse-kinematicsでサポートしている、バランスをとる、腰高さ姿勢を変える
目的の仮想ジョイントとは別途、仮想ジョイントをつけてあげる必要があります。

最後に、:fullbody-inverse-kinematicsで上記のような立ち位置IKをいれてサポートしてくかというと、
今のところそれはなしでいいのかと思いますがいかがでしょうか。

つまり、全体の方向性として、

  1. 特殊IKを:inverse-kinematicsと別メソッドで用意する。:fullbody-inverse-kinematicsや、:use-base-inverse-kinematicsのようなものを作る(or :fulbody-inverse-kinematicsにその機能をいれてく)
  2. :inverse-kinematicsで特殊IKも呼べるようにする。:use-torso, :use-base, :use-fullbodyのようなイメージ

があるとして、個人的には2の方が、ユーザが使うべきIKメソッドが:inverse-kinematics一個になるので、
わかりやすいのかなぁとおもいました。
これに関しては、別途issueがあります。
euslisp/jskeus#137

@s-noda
Copy link
Author

s-noda commented Oct 23, 2014

@snozawa さん。詳しくありがとうございます。

2.の方針に賛成です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants