-
Notifications
You must be signed in to change notification settings - Fork 55
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
両手先にcubeをassocしてcubeの姿勢変化についてIKをときたい #582
Comments
ちなみにこんな感じでできないかな、と書いてみたのですができなかったです。 1.irteusgl$ (send *pr2* :inverse-kinematics (send (send (send *cube* :worldcoords) :copy-worldcoords) :rotate 0.78 :z) :move-target (send *cube* :worldcoords) :link-list (append (send *pr2* :link-list (send (send *pr2* :larm :end-coords) :parent)) *cube*) :rotation-axis t)
Call Stack (max depth: 20):
0: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
1: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
2: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
3: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
4: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
5: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
6: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
7: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
8: at (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
9: at (send-super* :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)
10: at (cond (use-base (setq diff-pos-rot (concatenate float-vector (send start-coords :difference-position self) (send start-coords :difference-rotation self))) (send self :move-to start-coords :world) (with-append-root-joint (ll self link-list :joint-class omniwheel-joint :joint-args base-range) (send (caar ll) :joint :joint-angle (float-vector (elt diff-pos-rot 0) (elt diff-pos-rot 1) (rad2deg (elt diff-pos-rot 5)))) (send-super* :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (append (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005)) (list (car (send self :links)) (if (eq use-base t) 0.1 use-base))) additional-weight-list) :link-list ll :move-target move-target args))) (t (send-super* :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args)))
11: at (let (diff-pos-rot) (unless move-arm (setq move-arm (send self :select-target-arm target-coords))) (unless move-target (if (consp move-arm) (setq move-target (mapcar #'(lambda (arm) (send self arm :end-coords)) move-arm)) (setq move-target (send self move-arm :end-coords)))) (unless link-list (setq link-list (if (consp target-coords) (mapcar #'(lambda (target) (let ((l target) move-arm) (while l (cond ((memq l (send self :larm)) (setq move-arm :larm)) ((memq l (send self :rarm)) (setq move-arm :rarm))) (setq l (send l :parent))) (send self :link-list (send target :parent) (unless use-torso (car (send self move-arm)))))) move-target) (send self :link-list (send move-target :parent) (unless use-torso (car (send self move-arm))))))) (cond (use-base (setq diff-pos-rot (concatenate float-vector (send start-coords :difference-position self) (send start-coords :difference-rotation self))) (send self :move-to start-coords :world) (with-append-root-joint (ll self link-list :joint-class omniwheel-joint :joint-args base-range) (send (caar ll) :joint :joint-angle (float-vector (elt diff-pos-rot 0) (elt diff-pos-rot 1) (rad2deg (elt diff-pos-rot 5)))) (send-super* :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (append (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005)) (list (car (send self :links)) (if (eq use-base t) 0.1 use-base))) additional-weight-list) :link-list ll :move-target move-target args))) (t (send-super* :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args))))
12: at (send *pr2* :inverse-kinematics (send (send (send *cube* :worldcoords) :copy-worldcoords) :rotate 0.78 :z) :move-target (send *cube* :worldcoords) :link-list (append (send *pr2* :link-list (send (send *pr2* :larm :end-coords) :parent)) *cube*) :rotation-axis t)
13: at #<compiled-code #X598f278>
/opt/ros/kinetic/share/euslisp/jskeus/eus/Linux64/bin/irteusgl 0 error: cannot find method :parent in (apply #'send-message self (class . super) :inverse-kinematics target-coords :rthre rthre :thre thre :stop stop :additional-weight-list (list (list (send self :torso_lift_joint :child-link) (if (numberp use-torso) use-torso 0.005))) :link-list link-list :move-target move-target args) |
ちなみにですが、cube側に:handleのようにcas-coordsをassocして回転させて、そこに対してIKを解く、という方法で北川はやっています。 |
以下のコードで可能です.
|
ありがとう
伝わりにくくてごめんなさい 例えば (send *cube* :put :end-coords
(make-cascoords
:coords (send (send *cube* :copy-worldcoords) :translate #F(0 0 150))
:parent *cube*)) とか消せないかと思っています。 (load "package://pr2eus/pr2-interface.l")
(setq *robot* (pr2))
(send *robot* :reset-pose)
(setq *cube* (make-cube 300 300 300))
(send *cube* :translate #f(500 0 800))
(send *robot* :larm :inverse-kinematics
(make-coords :pos #f(500 0 950)) :rotation-axis :z)
(send *robot* :rarm :inverse-kinematics
(make-coords :pos #f(500 0 650)) :rotation-axis :z)
(send *robot* :larm :end-coords :assoc *cube*)
(setq *target-coords* (make-coords :pos #f(500 0 900)))
(objects (list *robot* *cube*))
(send *robot* :inverse-kinematics *target-coords*
:move-target (send *cube* :worldcoords)
:link-list (append (send *robot* :link-list (send (send *robot* :larm :end-coords) :parent))
(list *cube*))
:rotation-axis t
:debug-view t) |
添付していただいたコードの最後の逆運動学を解く部分を,
とすれば解けると思います. この書き方は |
お、できました、ありがとう (load "package://pr2eus/pr2-interface.l")
(setq *robot* (pr2))
(send *robot* :reset-pose)
(setq *cube* (make-cube 300 300 300))
(send *cube* :translate #f(500 0 800))
(send *robot* :larm :inverse-kinematics
(make-coords :pos #f(500 0 950)) :rotation-axis :z)
(send *robot* :rarm :inverse-kinematics
(make-coords :pos #f(500 0 650)) :rotation-axis :z)
(send *robot* :larm :end-coords :assoc *cube*)
(setq *target-coords* (make-coords :pos #f(500 0 900) :rpy #f(45 0 0)))
(objects (list *robot* *cube*))
(send *robot* :inverse-kinematics *target-coords*
:move-target *cube*
:link-list (send *robot* :link-list (send (send *robot* :larm :end-coords) :parent))
:rotation-axis t
:debug-view t) |
:assocで閉リンクを作ることはできませんが,
という2つの要素に対応する必要があり,
となっています. |
IKを制約付きの問題として考えて、制約式を書く方式はやっぱり玄人向けじゃないかな、とおもう。 具体的には擬似コードですが (load "package://pr2eus/pr2-interface.l")
(setq *robot* (pr2))
(send *robot* :reset-pose)
(setq *cube* (make-cube 300 300 300))
(send *cube* :translate #f(500 0 800))
(objects (list *robot* *cube*))
(send *robot* :larm :inverse-kinematics
(make-coords :pos #f(500 0 950)) :rotation-axis :z)
(send *robot* :rarm :inverse-kinematics
(make-coords :pos #f(500 0 650)) :rotation-axis :z)
;; ここで制約式をかいていることになる + IRTViewer内でも拘束される
(send *robot* :larm :end-coords :contact *cube*)
(send *robot* :rarm :end-coords :contact *cube*)
;; あとは何も考えずにIKをとく
(send *robot* :inverse-kinematics *target-coords*
:move-target *cube*
:rotation-axis t
:debug-view t) |
あと少し気になったのですが、 |
確かにこのように扱えると便利ですね.
|
https://github.com/euslisp/jskeus/blob/4ffcc5344fb006890f86ae024a5ec7a1bb20eb79/irteus/demo/dual-manip-ik.l
がvirtual jointに対応している?また,これ 1 に対応していないのかな.両手先とも同時に動いていたんじゃないかと思うんだけど. は良いのでPR送りましょう.タイトルに[WIP]と書けばマージしないでね,という意味になります. ⊿θ = J# ⊿d → で,11cm は ⊿d の話だよね?で実際には思ったとおり動かないから,J⊿θを計算すると左手は10cm動いて右手は1cmでした,というのを |
このコードの存在は把握していませんでした.ありがとうございます.
送りました.jsk-ros-pkg/jsk_control#751
なので,それらをそれぞれ
優先度付き逆運動学だと,左手と右手の相対位置を守った上で可能な限り左手を上に上げるので, |
virtual-jointは存在は知っていましたが、使ったことがありませんでした。
よくわかってないですが、目標座標に到達できないのであれば動かなくていいわけではないのですね |
ベストエフォートで行いたいときです.例えば,
などがあると思います. |
あ,でも落ち着いて考えてみると, 手先ではなく膝をつくような自由度の少ない閉リンクになると,「目標座標に到達できないのであれば動かない」というアプローチだと |
サンプルプログラム見たらいいんかもしれないけど,優先度はどうやってあたえるのかな? 絶対満たしたければtrue,
可能だったら満たして欲しい,とかだったらfalse とか,2値であたえるのかな?あるいは,可能だったら,,にはレベル付出来るのかな.
として,エラーが0:11となります
なるほど,で,revert-if-fail のときに問題がある,という話になるのか.
でも,priotarized-inverse-kinematics
とよんでいるのは,いわゆる微分逆運動学とよんでいるものではなくて,一発でQPかなんかの中で解くんじゃないだっけ?そのなかで両手の⊿が同じに成るような制約を入れているんだっけ?
あるいはあくまでも微分逆運動学の枠組みで,毎回QPしている.つまり,現在位置ー目標位置間の移動ベクトルを10分割とかして,毎回IKがexactに解けるかをやっているから,そこで,溶けなくなった段階でrevert-if-fail
するというはなしかな?
jskeusの方法は擬似逆行列を用いるので,計算コストは先に挙げた手法の中で最小なのですが,関節角度上下限や干渉回避といった不等式制約の扱いが苦手なので制約付近の動作が作りにくく,自分はあまり使いません...
これは重みをセットできて,0にしたら思ったとおりの挙動になるんじゃないかな.とおもう一方で,逆に,優先度付きIKの嬉しさは,まさにこういうところなので,これの扱いに慣れるのは必要不可欠だよね,という話と,結局実際にロボットを動かすときはIKが解けるとかだけでなくて,この辺がポイントだよね,とは思うよね,と思います.
で,そもそも作ったものは「優先度付き逆運動学」でいいのかな.Contributionの内容は幾つかに分けられると思うんだけど,
上に書いたみたいに,微分逆運動学で,解き方にヤコビ行列ではなくてQPかなんかを持ち込んだ,と成ると,この部分では現状のプログラムの計算部分を書き換える事が可能に成る(理屈上は)
次に今のIKもなんちゃって優先度は干渉回避とか関節リミット回避で入れているんだけど,これはあくまでも零空間の中の話で,手先の位置+手先の位置の同期(両手の⊿が同じという制約)はマストとして入れて,追加で関節回避が入れられるのがメリットなのかな.
この辺はいまは #108
みたいな汚いコードで実現されちゃうんだけど,そうでへあなくて形式がきまっているんだっけ?
手先ではなく膝をつくような自由度の少ない閉リンクになると,「目標座標に到達できないのであれば動かない」というアプローチだと:rotation-axis :translation-axisをチューンしても殆ど到達できないので動くことができず,優先度が必要になるのですが,自分はそのイメージに引っ張られすぎていたかもしれません.
みたいな話だと,そもそも目標位置に到達する,という制約自体を,可能だったら満たして欲しい,にしているのかな.
みたいな感じで,どれどれどういう部分が一緒で,どこか違って,その違いを最も有効に活用できる例はどういうことか,という風に整理して,
で,今ある方法に対して,インタフェースは買えずに中身だけ変更できるのか,あるいは,新しいインタフェースを追加したら出来て,それを使わなければいあまで通りなのか,
あるいは,インタフェースのあり方を変えようと提案しているものなのか,みたいなことを整理しておくのは,プログラム的な上でも論文的な上でも重要ですね.
…--
◉ Kei Okada
--
◉ Kei Okada
2020年8月12日(水) 11:18 Naoki Hiraoka <[email protected]>:
あ,でも落ち着いて考えてみると,
「両手先にcubeをassocしてcubeの姿勢変化についてIKを解きたい」
という問題の場合,
逆運動学が解きやすい位置であれば普通に解けますし,
やや解きにくい位置でも:rotation-axis :translation-axisを指定すれば大体解けると考えると,
わざわざ優先度をつける必要は無く,
優先度の話と両手先にassocする話は別の話かもしれません.
手先ではなく膝をつくような自由度の少ない閉リンクになると,「目標座標に到達できないのであれば動かない」というアプローチだと:rotation-axis :translation-axisをチューンしても殆ど到達できないので動くことができず,優先度が必要になるのですが,自分はそのイメージに引っ張られすぎていたかもしれません.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or unsubscribe.
|
euslispに詳しくないのですが、
下のようにassocされたcubeを手先座標にみたててIKをとくのは、どのようにみなさんは解いていますか?
:move-targetや:link-listにcubeを追加して解くことはできますか?
cubeは:larmにassocされています。
The text was updated successfully, but these errors were encountered: