euslisp / jskeus

This repository contains EusLisp software developed and used by JSK at The University of Tokyo
23 stars 55 forks source link

min-max-tableのある関節を:inverse-kinematicsすると、各イテレーションごとに:angle-vectorがわずかに振動する. #624

Open Naoki-Hiraoka opened 2 years ago

Naoki-Hiraoka commented 2 years ago

情報共有のためのissueです.

min-max-tableのある関節を:inverse-kinematicsすると、:inverse-kinematicsの各イテレーションごとに:angle-vectorがわずかに振動します. そのため、操縦などで、数十~数百Hzで:inverse-kinematicsを解き直して短い補間時間で:angle-vectorを実機に逐次的に指令するような用途で使う場合には、注意が必要です.

関節角度上下限は不等式制約ですが、sr-inverseに基づく逆運動学は不等式制約が扱えないので、:inverse-kinematicsでは前回のイテレーションで関節角度がlimitに近づいたならば、その関節のweightを大きくして動かしにくくする、というアプローチがとられています. https://github.com/euslisp/jskeus/blob/3040a1aa1cce1326c2e79890111d099b07207479/irteus/irtmodel.l#L1577-L1603

しかし、min-max-tableのある関節ではlimitの側も動くためか、関節角度がlimitに近づくのと遠ざかるのを交互にくり返す現象が発生することがあり、関節のweightが各イテレーションで急激に変動することで解の:angle-vectorが振動してしまうようです。

「前回のイテレーションで関節角度がlimitに近づいたならば、その関節のweightを大きくして動かしにくくする」機能を削除すると、振動しなくなりました。

自分はirteusでこの現象に遭遇したのではなく、同じアルゴリズムが採用されている別の逆運動学ソルバでこの現象に遭遇したのですが、同じアルゴリズムを使っているのでirteusでもこの現象が発生するだろうと思いこちらに共有させていただきました。