-
Notifications
You must be signed in to change notification settings - Fork 52
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
[HrpsysSeqStateROSBridge.cpp] set body to reference angle when Goal comes #1103
[HrpsysSeqStateROSBridge.cpp] set body to reference angle when Goal comes #1103
Conversation
@kindsenior start-jsk/rtmros_choreonoid#362 で、一度ロボットに このPullRequestを使うと、意図せずに動いてしまう挙動がなくなりました。 (執筆 Naoki-Hiraoka) |
@Naoki-Hiraoka
|
1つめの質問に関してですが、もしかして、根本の問題は、hrpsysにおける関節数と、robot-interfaceにおける関節数が違っていて、その場合には必ず、:angle-vectorから送られない関節が出てくるので、僕の指摘に従うと必ずエラーが出てしまうということでしょうか。 |
hrpsysにおける関節数と、robot-interfaceにおける関節数が違う例として、次の2つがあります. (どちらも僕自身はあまり使っていません)
僕が当時このPullRequestを出したときには、HRP2JSKNTSの全身行動制御用のc++の独自のfullbody_controllerのclientを使っていて、当時つま先関節をうまく扱えなかったため、つま先関節がhrpsysでは含まれているがclient側には含まれていませんでした。 そのため、あらゆるロボットのrobot-interfaceの通常使用でこの問題が起こるわけではありませんが、あらゆるロボットでちょっとallow_partial_joints_goalの機能を利用して動かしたいというケースはあるのかなと思います。 僕自身は、allow_partial_joints_goalをROS paramから受け取れるようにしてrosの標準に合わせれば良いと思いますが、今既にmasterにmergeされているhttps://github.com/start-jsk/rtmros_choreonoid/tree/master/hrpsys_choreonoid_tutorials のJAXON_JVRC が今のHrpsysSeqStateROBBridgeのエラーを返さない仕様を利用してしまっているように、後方互換性を失い既存のコードが動かなくなる可能性があります。hrpsys_ros_bridge.launchに引数を追加するプログラム作業自体は簡単ですが、後方互換性を確保するまでの開発制度が難しそうに思います。 そのため、エラーを返さない仕様のままでいいかなと思っています。後方互換性のために徐々にrosの標準からかけ離れていって使いにくさが閾値を超えたら、新しく別のHrpsyqStateROSBridgeを作れば良いと思います。
少なくとも今よりも悪化することはほぼ無いと思います。 このPull Requestでは、goalに含まれていない関節の指令値は現在のStateHolderのqOutの値になるように更新します。
したがって、指令関節角度を送ったときに、HrpsysSeqStateROSBridgeにStateHolderのqOutが届いていなかったり、変な値になっていると、危険ということになります。しかし、もともとのhrpsysの仕様として、指令関節角度を送ったときに、SequencePlayerにStateHolderのqOutが届いていなかったり、変な値になっていると危険な処理が既に存在します。 具体的には、もともとのhrpsysで、HrpsysSeqStateROSBridgeに指令関節角度が送られると、SeqencePlayerの rtmros_common/hrpsys_ros_bridge/src/HrpsysSeqStateROSBridge.cpp Lines 217 to 227 in 07f7e19
https://github.com/fkanehiro/hrpsys-base/blob/72af4f664a426c581924228d94fd98babe0e6723/rtc/SequencePlayer/SequencePlayer.cpp#L421 https://github.com/fkanehiro/hrpsys-base/blob/72af4f664a426c581924228d94fd98babe0e6723/rtc/SequencePlayer/SequencePlayer.cpp#L754 https://github.com/fkanehiro/hrpsys-base/blob/72af4f664a426c581924228d94fd98babe0e6723/rtc/SequencePlayer/SequencePlayer.cpp#L765 https://github.com/fkanehiro/hrpsys-base/blob/72af4f664a426c581924228d94fd98babe0e6723/python/hrpsys_config.py#L375 SequencePlayerとStateHolderは同一プロセスで立ち上げることが多いですが、HrpsysSeqStateROSBridgeとStateHolderは別プロセス、場合によっては別PCで立ち上げるため、通信の信頼度が違うということは言えますが、気にする程では無いのでは無いかと思います。 |
なるほど、choreonoid上でハンドを動かせるモデルを用意した場合には、hrpsysにハンド関節を含まざるを得ず、ros_bridge以上のレイヤは実機と同じにしたいので、hrpsysとrobot-interfaceと関節数が異なってくることをすっかり忘れていました。
@Naoki-Hiraoka のシステムではまだこの問題は残っていますか? また、@Masanori-Konishi の車輪付きロボットで起こる不具合を読んであれっと思ったのですが、AutoBalancerによる関節角度変更ってStateHolderのqOutには反映されないんでしょうか。
を読むと、angle-vectorに含まれている関節でも、急に動く動きが出てきてもおかしくなさそうな感じですが・・・。 起動直後とか、非常停止から復帰した直後とかに部分的な指令が送られた場合であっても、危険性が悪化するわけではない、ということは理解しました、詳しく説明してくれてありがとうございます。 |
かたい位置制御のロボットであっても、指令角度が現在角度で上書きされると外力の方向にわずかに動いてしまうため、何度もangle-vectorを送っているとそれが蓄積し大きな動きになってしまいます。 また、AutoBalancerといったStateHolderの先のrtcによって指令関節角度が上書きされている場合、指令角度が現在角度で上書きされると、StateHolderの指令関節角度が大きく変化してしまいます。その結果、AutoBalancerといったStateHolderの先のrtcの挙動にも予期せぬ影響を与えます。悪影響が出ないような実装をされているrtcもあれば、出るような実装をされているrtcもあります。
おっしゃっている方法も含めこの問題の解決方法はいろいろあるので、この問題は今は残っていません。そのため、まあいいかと2020年にこのPull Requestを出してから放置してきました。が、今回再び@Masanori-Konishi がこのバグで困っていたため、やっぱりこのバグを直しておくべきだと思った次第です。
恐らく同じだと思います。
反映されません。 AutoBalancerを切った段階で、全関節はqOutの位置まで勝手に動きます。 余談ですが、このへんの仕様については、各自の研究で都合のようにカスタマイズするべきところですが、カスタマイズするための方法として、従来のstart-jskの標準システムはhrpsysのhrpsys_config.pyという一つのファイルに対してみんなでブランチを切って編集するという方法をとってきました。そのため、コンフリクトしたり、各自の個人の研究のための部分とみんなで共有する部分の切り分けが困難だったりと、とても不便でした。僕の自分の研究では、hrpsys_config.pyを使っていません。
基本的には前回の周期のSeqencePlayerの出力がStateHolderのqOutに入っているため、問題ありません。 servoOn時にStateHolderでgoActualしたときの姿勢をSeqencePlayerに反映するために、StateHolderのqOutを読む仕様になっているのだと思います。 |
ありがとうございます、理解しました。 多分このPRの内容で大丈夫だとは思うのですが、動かしたくない関節への指令値どうするか問題では何度か痛い目を見ていて不安が拭えないので、週明けにHiroで実験してみたいと思います。 |
こちらのPRを適用して、Hiroで以下のようなテストコードを実行してみました。
|
このPRを適用しない状態だと、適用した場合と比べて大きなdiffが出ることを確認しました。
|
@pazeshun ご確認ありがとうございました。 @Masanori-Konishi @kindsenior その後wheelは問題なく動いていますか? |
二週間程度がっつり動かしていますが、当該の問題点は解消していて、その後も特に問題は起きていないです。 |
ありがとうございます。 @k-okada こちらのmergeをお願いできますでしょうか。 |
ありがとうございます。 |
fullbody_controller/follow_joint_trajectory_action/goalに届いたgoalに、ロボットの全関節の名前が含まれていない場合に、含まれていない関節が意図せずに動いてしまうバグを直すPullRequestです。
rosの標準的なjoint_trajectory_controllerは、goalにロボットの全関節の名前が含まれていない場合、エラーを返すか、含まれている関節の指令値だけを更新します。(http://wiki.ros.org/joint_trajectory_controller のallow_partial_joints_goal)
HrpsysSeqStateROSBridgeは、hrpsysのSetJointAnglesインタフェースが一部の関節の指令値だけを更新する機能に対応していないので、goalに含まれている関節の指令値はgoalの角度に、含まれていない関節の指令値は現在のactualの角度に、なるように更新しています。actualの角度は現在の指令値とは異なるので、goal含まれていない関節の指令値が意図せずに変化してしまっていました。
このPull Requestでは、goalに含まれていない関節の指令値は現在の指令値になるように更新するようにしました。