jsk-ros-pkg / jsk_model_tools

JSK model utilities
https://github.com/jsk-ros-pkg/jsk_model_tools
BSD 3-Clause "New" or "Revised" License
6 stars 29 forks source link

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

Open s-noda opened 9 years ago

s-noda commented 9 years ago

see jsk_control #103 (https://github.com/jsk-ros-pkg/jsk_control/issues/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 commented 9 years ago

これは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 commented 9 years ago

これは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 commented 9 years ago

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に相当すると思います。 これは台車ロボットだけでなく脚型ロボットでもあっていいように思います。 つまり、

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

となっていて、現状の: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があります。 https://github.com/euslisp/jskeus/issues/137

s-noda commented 9 years ago

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

2.の方針に賛成です。