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

[AutoBalancer] Add inverse dynamics function #1110

Merged
merged 14 commits into from
Apr 3, 2017

Conversation

ishiguroJSK
Copy link
Contributor

何度か話に上がっていた逆動力学を使って詳細な多リンク系モデルのZMPを計算する関数を作りました.
恐らく正しく動いていると思います.
このPRでは呼び出し部をコメントアウトしているので,挙動には何も影響しないはずですが,

//        hrp::Vector3 f_invdyn, t_invdyn;
//        solveWholeBodyID(m_robot,f_invdyn,t_invdyn);
//        if(gg_is_walking){  // inv dyn answers jumps at the mode transition
//          ref_zmp(0) = -t_invdyn(1)/f_invdyn(2);
//          ref_zmp(1) =  t_invdyn(0)/f_invdyn(2);
//        }

呼び出し部のコメントアウトを外せば逆動力学Ver.のZMPでgoPos出来ると思います(それがいいかどうかは別として)
id_gopos

@ishiguroJSK ishiguroJSK changed the title Add inverse dynamics function [AutoBalancer] Add inverse dynamics function Mar 8, 2017
@snozawa
Copy link
Contributor

snozawa commented Mar 8, 2017

これは、OpenHPR3のinverse dynamics関数とどう違うかな?
大部分の計算をOpenHRP3のものを呼ぶようにできたりしないかな?

@ishiguroJSK
Copy link
Contributor Author

OpenHRP3のm_robot->calcInverseDynamicsを呼ぶために必要な手続きをまとめた関数なので,
OpenHRP3のものを呼んでいます.(大部分は速度,加速度などをセットしているだけです)

@snozawa
Copy link
Contributor

snozawa commented Mar 8, 2017

お、そうなんだね。
長くない?と思ったけど、そういうものなのかな。

あと、

  • 純粋に加速度など計算する箇所
  • フィルタ(LPF?)する箇所
  • calcInverseDynamicsを呼ぶ箇所

の3つに(コードの行の配置をかえて)並べ直したらまとまってみえるのかな。
あと、他のRTCでも使うかもしれないので、fkanehiro/openhrp3か
https://github.com/fkanehiro/hrpsys-base/blob/master/rtc/ImpedanceController/JointPathEx.cpp
に追加してはどうかな。
(後者は、ST, ABC, ICなどでよんでます)

@k-okada
Copy link
Contributor

k-okada commented Mar 8, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2799/

Build Log
last 10 lines

[...truncated 368.92 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@k-okada
Copy link
Contributor

k-okada commented Mar 8, 2017 via email

@ishiguroJSK
Copy link
Contributor Author

struct内で初期値を書いている部分ですね.
よくないなと思いつつWarningだったのでPR送ってしまいましたが,
Classにしてコンストラクタ書くか,onInitialize()に一行書きます.
(rtc/ImpedanceController/JointPathEx.cppに実装するのは場所的に本当に大丈夫なのでしょうか?)

@snozawa
Copy link
Contributor

snozawa commented Mar 9, 2017

(rtc/ImpedanceController/JointPathEx.cppに実装するのは場所的に本当に大丈夫なのでしょうか?)

これは、openhrp3関連のものを今おいてしまってますが、
fkanehiro/openhrp3#50
本来はupstreamに移すのが正解なのと、
コードみてみたけど

  1. qを入力にして、加速度など計算する(初期化?はまた別関数?)
  2. フィルタする
  3. calcInverseDynamicsをよぶ

の3つに分けて、3は元々のコード呼ぶだけだけど、1はこれ単独で切り分けて
openhrp3のcalcInverseDynamicsの定義されてるBody.cppあたりでutilityとして
追加させてもらうのも良い気がしました。
フィルタは現状hrpsysにおいてるので、例えば呼び出し時は、

calcAccelerationsForInverseDynamics(input_q);
passFilter(hoge);
calcInverseDynamics(hoge);

と3行くらいでよべるようになるのかな?

あと(後退)差分で加速度を求めるなら、q, qold, qoldoldを追加するのでなく、
既存のBody.cppのq, dq, ddqで計算できなかったっけ?

@k-okada
Copy link
Contributor

k-okada commented Mar 10, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2801/

Build Log
last 10 lines

[...truncated 359.73 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@ishiguroJSK
Copy link
Contributor Author

openhrp3のcalcInverseDynamicsの定義されてるBody.cppあたりでutilityとして
追加させてもらうのも良い気がしました。

ちょっとしばらくは試用期間ということでhrpsysにまとめて実装しておきたい気分ですね・・・
(加速度計算も後退差分だけでなく多項式近似などもっとエレガントな実装がある気がしますし)

と3行くらいでよべるようになるのかな?

関数を分けることは可能ですが,使う人が呼ぶべき関数と呼ぶ順番を知らないと使えない・・・という運用でも大丈夫でしょうか?実装スタイルはお任せしますが.
(クラスにまとめてsetParam()とかupdate()で呼ぶ,などもあると思いますが)

あと(後退)差分で加速度を求めるなら、q, qold, qoldoldを追加するのでなく、
既存のBody.cppのq, dq, ddqで計算できなかったっけ?

僕の感じた雰囲気だと,Bodyは過去のステートに依存するような値は持たない気がしていて,
実際dq,ddqは何もしなければ値は入っていません.

@ishiguroJSK
Copy link
Contributor Author

と思ったら最近のABCの大改造でclass SimpleFullbodyInverseKinematicsSolverとまとめられていますし,
これに倣った実装をJointPathExに書く,でいかかでしょう?

@k-okada
Copy link
Contributor

k-okada commented Mar 10, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2804/

Build Log
last 10 lines

[...truncated 298.21 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@snozawa
Copy link
Contributor

snozawa commented Mar 10, 2017

僕の感じた雰囲気だと,Bodyは過去のステートに依存するような値は持たない気がしていて,
実際dq,ddqは何もしなければ値は入っていません.

何もしなければもちろん入らないけど、何らかの計算をして値をいれるときには
一周期前といったようなことを意識した使い方をしてると思います。
https://github.com/fkanehiro/openhrp3/blob/master/hrplib/hrpModel/ForwardDynamicsCBM.cpp#L304-L305
強いてあげるなら、ForwardDynamics計算など他のdq, ddqを使う計算と混同しないように注意が必要そうだけど
(あんまりそういうニーズはなさそうだけど)、
それもドキュメントかコメントかくかすると良いと思う。
(そもそもlink->qを巧みに使い分けてる状況だとその辺も混同しなさそうかもしれないけど)

と3行くらいでよべるようになるのかな?
関数を分けることは可能ですが,使う人が呼ぶべき関数と呼ぶ順番を知らないと使えない・・・という運用でも大丈夫でしょうか?実装スタイルはお任せしますが.
(クラスにまとめてsetParam()とかupdate()で呼ぶ,などもあると思いますが)

これは、分けるとしたらドキュメントをかくんだと思います。
もともとのRTCなどでドキュメントが足りてないのでアレですが、
たとえ今の関数のように一個でまとめても、計算としては入力が新しい関節角度などだけど、
引数に関節角度あるのでなく、あらかじめrobotが持ってるqの値をセットして使う必要があるようになってると思います。
なので、3行にわけても1行でかいても、どのみち初見でも使えるようにするには、
関数名や引数などで挙動がわかるというよりは、なんかドキュメントがいりそうかな、という想定での話でした。
ちなみに、もしかしたら
void AutoBalancer::solveWholeBodyID (const hrp::BodyPtr robot, hrp::Vector3& f_ans, hrp::Vector3& t_ans)
は、関数名をかえたほうがわかりやすいかもね。
(例えば、rootLinkのforce/momentを計算する、というのが分かる漢字の名前とか)

それで、関数を分けるという点は、もちろん関数一個になってるとわかりやすいのでそれが良いですが、
今回だと

  1. qを入力にして、加速度など計算する(初期化?はまた別関数?)
  2. フィルタする
  3. calcInverseDynamicsをよぶ

の3つのうち、1,3が元々OpenHRP3にあるものそのもの、
もしくはちょっとした拡張なので、openhrp3にあってもおかしくないかなあと言うものですが、
2はそうでないので、悩ましいのかなあと思いました。

ところで

  1. qを入力にして、加速度など計算する(初期化?はまた別関数?)
  2. calcInverseDynamicsをよぶ
  3. 出力の慣性力(かZMP)をフィルタする

だと、(こちらの)1,2をまとめて1関数にしてopenhrp3にもってくのも
できそうなきがするけど、どうでしょうか。
関節空間でフィルタするのと、出力にフィルタするのと、
違いというかこだわりはあるかな?

@k-okada
Copy link
Contributor

k-okada commented Mar 10, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2805/

Build Log
last 10 lines

[...truncated 298.04 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@snozawa
Copy link
Contributor

snozawa commented Mar 10, 2017

ちょっとしばらくは試用期間ということでhrpsysにまとめて実装しておきたい気分ですね・・・
(加速度計算も後退差分だけでなく多項式近似などもっとエレガントな実装がある気がしますし)

なるほど、では一旦はJointPathExにかきましょうか。
本当は、Bodyの機能拡張なのでBodyExとかの別ファイルとしてコミットしても良いけど、
ここの対応関係はあまり綺麗にこだわるよりは、試用を終わらせて
openhrp3にいれるのを検討するのが良い気がします。

hrpsysに追加するとしても、RTCの.cppに実装するより
別になってるほうが、テストも書きやすいし他のRTCなどからも使えるようになるので、
こういった基礎的な機能は(ホントはopenhrp3が良さげだけど)まずは別ファイルに入れるのを検討しましょう。

また、JointPathExは今eusから中の関数を呼べる形にもなってて、
ZMP計算もc++実装のものを試用してみたい、というひとはいる気がします(@Tnoriaki , @terasawa)

@k-okada
Copy link
Contributor

k-okada commented Mar 10, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2806/

Build Log
last 10 lines

[...truncated 298.01 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@ishiguroJSK
Copy link
Contributor Author

void AutoBalancer::solveWholeBodyID (const hrp::BodyPtr robot, hrp::Vector3& f_ans, hrp::Vector3& t_ans)
は、関数名をかえたほうがわかりやすいかもね。
(例えば、rootLinkのforce/momentを計算する、というのが分かる漢字の名前とか)

ちなみにどうも出てくるf,tはrootlink原点ではなくWorld座標系の原点におけるものっぽいという結論になったのですが,どういった名前にしましょう・・・?

qを入力にして、加速度など計算する(初期化?はまた別関数?)
calcInverseDynamicsをよぶ
出力の慣性力(かZMP)をフィルタする
だと、(こちらの)1,2をまとめて1関数にしてopenhrp3にもってくのも
できそうなきがするけど、どうでしょうか。
関節空間でフィルタするのと、出力にフィルタするのと、
違いというかこだわりはあるかな?

そうですね・・・
一応calcInverseDynamicsに入力する諸々の加速度が理想的に綺麗な波形(不連続でもいいが,振動したり無限大に飛ばない)なら出てくるf,tも不連続なれど使える値が出てくると思っていまして,
つまり元凶はcalcInverseDynamicsに入力する時点の諸々の加速度が振動的だったり極端に大きな値が混ざる事だと言えるので,
対策すべき段階はcalcInverseDynamics入力前なのかなぁと考えています.
(それにもし将来的にLPFではなく多項式補間で加速度を綺麗にする場合もcalcInverseDynamicsの前段階のフィルタ,ということになりますし)

また、JointPathExは今eusから中の関数を呼べる形にもなってて、

eusから呼べるためにはJointPathExクラスのメンバでないといけなかったりします?

// hrplib/hrpModel/JointPath.h
namespace hrp {
    class JointPathEx : public JointPath {

@k-okada
Copy link
Contributor

k-okada commented Mar 10, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2808/
Test PASSed.

@snozawa
Copy link
Contributor

snozawa commented Mar 10, 2017

ちなみにどうも出てくるf,tはrootlink原点ではなくWorld座標系の原点におけるものっぽいという結論になったのですが,どういった名前にしましょう・・・?

calcRootLinkWrenchFromInverseDynamics
とかなのかな。
モーメントの表記がlink原点回りでなくworld原点回りというのは、
コメントかなにかに書くくらいでも良い気がします。
また、この関数を中で読んでZMPを計算する3行くらいのプログラムも
関数化しておけば、他の人からは使いやすいですね。
(あまり自分にセンスがないので同じ部屋の人に相談してみても良いかもね)

そうですね・・・
一応calcInverseDynamicsに入力する諸々の加速度が理想的に綺麗な波形(不連続でもいいが,振動したり無限大に飛ばない)なら出てくるf,tも不連続なれど使える値が出てくると思っていまして,
つまり元凶はcalcInverseDynamicsに入力する時点の諸々の加速度が振動的だったり極端に大きな値が混ざる事だと言えるので,
対策すべき段階はcalcInverseDynamics入力前なのかなぁと考えています.

原因は入力の加速度などが綺麗でないというのはそうなんだけど、
どの段階の値をフィルタするかは検討の余地がありそうな気がします。
結局このあたりの計算で、rootlinkのforce/moment (ひいてはZMP)
しか使わないのであれば、force/moment/ZMPを直接フィルタするのでも
あまり効果に違いがないと思います。
また実装上は、フィルタをかける変数がぐっと減るのと、
関数の切り分けもしやすくなるのがメリットになりそうだと思います。
また、厳密に求めたい場合はそもそもフィルタしない、という使い方もありそう。

(それにもし将来的にLPFではなく多項式補間で加速度を綺麗にする場合もcalcInverseDynamicsの前段階のフィルタ,ということになりますし)

この辺のはなしは、入力関節角度列は同じで
それらから速度加速度を計算する過程を綺麗にするという
対策のことだったのかな?
だとしたら、このやり方だとあんまりこだわっても
LPF以上の効果があるのかはちょっとわからないです。

そもそもの根本原因は、入力関節角度列自体が加速度的に
綺麗でないことが原因なので、例えばIKなどにあたる部分を
直していくしかないと思います。
加速度計算時点で直そうとしても、仮に加速度が綺麗になったとしても
元の運動と整合しにくいと思います。
(Garbedge in Garbedge out)

eusから呼べるためにはJointPathExクラスのメンバでないといけなかったりします?

c/c++のコードがeusから呼べるので、そうでなくても何でも良いです。
もちろんファイルとしてAutoBalancerから切り離されている方が
扱いやいので、今はJointPahtExにいれるのでいいかな、と思いました。

@k-okada
Copy link
Contributor

k-okada commented Mar 13, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2816/

Build Log
last 10 lines

[...truncated 340.38 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@k-okada
Copy link
Contributor

k-okada commented Mar 13, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2817/

Build Log
last 10 lines

[...truncated 346.90 KB...]
   at org.jenkinsci.plugins.ghprb.GhprbRepository.createCommitStatus(GhprbRepository.java:122)
   at org.jenkinsci.plugins.ghprb.GhprbBuilds.onCompleted(GhprbBuilds.java:118)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:27)
   at org.jenkinsci.plugins.ghprb.GhprbBuildListener.onCompleted(GhprbBuildListener.java:12)
   at hudson.model.listeners.RunListener.fireCompleted(RunListener.java:211)
   at hudson.model.Run.execute(Run.java:1773)
   at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
   at hudson.model.ResourceController.execute(ResourceController.java:98)
   at hudson.model.Executor.run(Executor.java:405)

Test FAILed.

@k-okada
Copy link
Contributor

k-okada commented Mar 13, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2818/
Test PASSed.

@ishiguroJSK
Copy link
Contributor Author

「InvDynStateBuffer」という過去のステート保存用のクラスと,4つの関数に分けました.
フィルタのセットアップの部分はIIRFilter.h or .cppに「setParameterAsBiquadButterworth」というユーティリティ(?)として置いてしまいました(カットオフ周波数だけ指定してパッと使いたい人には便利だと思います)
これでフィルタする/しない問わず呼べるようになっていますが,いかがでしょうか?

@k-okada
Copy link
Contributor

k-okada commented Mar 17, 2017

Refer to this link for build results (access rights to CI server needed):
http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2828/
Test PASSed.

@snozawa
Copy link
Contributor

snozawa commented Apr 3, 2017

非常に遅くなりましたが、LGTMです。
@fkanehiroさん、お手すきのときにmergeをご確認いただけますと幸いです。

@fkanehiro fkanehiro merged commit 4ee2bbf into fkanehiro:master Apr 3, 2017
@snozawa
Copy link
Contributor

snozawa commented Apr 3, 2017

ありがとうございました。

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

Successfully merging this pull request may close these issues.

4 participants