-
Notifications
You must be signed in to change notification settings - Fork 88
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
Add "emergency freeze" feature #215
Comments
サーボ偏差が大きくなった時や、力センサに過大な力が作用した時にサーボをOFFにする機能は現状RobotHardware RTCに実装されていますが、外部からの指令を受けて関節を固定する機能はないですね。 |
+1 とても欲しい機能です。
これは、今のCollisionDetectorの実装では
一般的な動作停止が必要か否か、必要であれば |
その時にやり方として、
|
個人的には1が良いように思います。 一方、RobotHardwareにその機能があると良いかといわれると、動作停止機能のみをもつ |
+1
私の日本語がまずいですね.正しくは,"下流で衝突検知した時に,hrpsys に動き停止を指示したい" です.
ここは私は hrpsys の RTC 群の設計を未だよく理解できていないので,意見ありません. |
RobotHardwareに停止する機能をつける場合、停止させるのは簡単なのですが、再開できる必要はありますでしょうか? |
はい,私は再開は出来て欲しいと思います.一番最初に私が書いた案では,"解除されるまで関節への指示を受け付けない." としていまして,"一時停止"のようなものを想定しています.(よく理解できておらず何か間違っていたら指摘頂きたいですが) サーボ off にするわけでは無く同じ姿勢をキープし続ける実装だとすると,不連続かどうか問題にならなかったりするでしょうか? |
私も、動作停止+再開ができる機能が必要に思います。 CollisionDetectorのコードですと、 |
確かにRobotHardwareに停止機能をつけてしまうと、シミュレーション時に使えなくなってしまうので、独立したRTCとするのが良さそうですね。そして、そのような機能が既にCollisionDetectorにあるのであれば、CollisionDetectorを干渉の発生を予測する部分と、動作を一時停止/再開する部分(RTC)とに分けるのがよいのではないでしょうか。 |
確かに、hrpsys-simulatorのことを考えるとRobotHadwareだと難しいですね。 少し話がそれますが、停止機能が作動中はビープ音で知らせてくれるとわかりやすいと思いました。 |
これ,sequence player側でも止める必要はないでしょうか?つまり,sequnce playerでなんかの連続の軌道を動かしているときに,ある瞬間にとまってもらって,また,そこから復帰して元の軌道列にのっかる,というのが一般には期待されている気がします. 機能停止RTCは停止をするけど,resumeするときは今の指令値に徐々に向かうように動くだけなので,最初の指令した起動は満たさないですね. |
FYI @kindsenior |
これは非常に重要な機能ですね。 悩んでいた点は、どこまでを「元の軌道」と判断するか、です。 例えば、自己干渉がおきそうでCollisionDetectorな条件で止まったということは、 一方で、SequencePlayerが補間中にロボット体外になにかおいてあって、 ここのissueで進んでいた議論(だと私が解釈しているもの)は、 CollisionDetectorの停止機能を一個のRTCとして独立しておくと、SequencePlayerをユーザが緊急停止できたりして良いですね だと思いますが、@k-okadaさんご指摘の点を踏まえると、 CollisionDetectorの停止機能はCollisionDetectorの中だけで行い、 になるのでは、と思っています。 |
なので,歩行生成器の出力がsequencer playerを経由すると,この必要は無いですね.もちろん,一周期遅れていや,という話はありますが. FYI -> @emijah |
いえ、ここではそれは関係のない話におもいます。 SequecePlayerの停止動作を外にするか中にするか、という流れで、確かに中の方が都合が良いところがおおいと思います。 端的には、どう歩行中の片足しじきで停止がくると、SequencePlayerで停止してしまうとコケるしかなくなります。 |
一段階目,緊急停止すると全身が止まる.resumeするととりあえず,そろそろと動き出す.足は地面をするかもしれないから,空中にあげておく. と考えた時に,一気にニ段階目まで作れればいいですが,いつになるの?という話なので,まずは一段階目がデキルというのはメリットでしょう. 2014-07-08 18:42 GMT+09:00 Shunichi Nozawa [email protected]:
|
遅くなりました。 歩行生成器がSequencePlayerを経由するのは個人的にはあまり得策でないように思います。
ができるのはメリットですね。 ただ、そもそも
と
はよくよく考えるとできない気がしてきたので、genericに止める機能をつくるのであれば、 まず、歩行生成器=>SequencePlayerとなっていると また、そもそもSequencePlayer自体が何かのRTCから
また、現状のAutoBalancerでは(内部のでは)緊急停止ができるので、 |
上の一段階目ですが,今持っているseqのqueueの動きを一旦止めて,resumeかかったら,今の現在位置からqueueの先頭(止まる前の指令値)まで,位置速度がつながるようにもっていって,そこで,sequencerの働きを再開するという感じですよね.そこで,もし,新しいsetJointAnglesがあったらどうするか,という問題ですが,どうするのあいいですかね.waitしているクライアントだとずっと待っている,ということになりますね.そうでないと送り続けるわけですが,それをqueueに貯めるか,捨てるか,ということでしょうか?僕は捨てるのでいいと思っていましたが,貯めたほうがいいのかな.
それは素晴らしいことですが,コードの整理(AutoBalncerが歩行生成器なんだっけ? ik周りのコードをまとめてOpenHRP3に送る,rats経由のコードをどうするか必要ならOpenHRP3側に入れる)を先にやっておかないといけない段階な気がします.このままだと,すぐに,これは汚いから触りたくないので新しいものを作ります.という人が出てきそうです. |
ちょっと問題が混ざっている気がしますので、分けさせていただいていいでしょうか。
これはおっしゃるとおりだと思います。 |
完全に話が別になっていますが,たとえば歩行生成器は今から3歩分の軌道を生成してながして, |
そうですね。
歩行生成=>SequencePlayer なシステムで、 |
この点の議論は特に進んでいない,という理解で良いでしょうか.
上に例示頂いてるように,ロボットが決めてくれて構わない場合と,人じゃないと決められない場合の二種類あると思います.その判断を受け付ける interface はどこが良いのでしょうか.停止 RTC が一括して受け,SeqPlayer 等の停止機能を持つ (ことになる) 各 RTC に送るのかなと思っていましたがそうでもないでしょうか. |
一時停止したとしてその時の時間をt0,姿勢(指令値=現在値としておく)をP(t0)とします. で,tnの時に一時停止が解除されたとします.その時の実際のロボットの姿勢はP_act(tn),一時停止前のロボットの姿勢はP(t0), もし,P_act(t1) = P_act(t2) = P(t0) ,つまり一時停止中はロボットの姿勢を動かせない,という状況であれば, もうひとつは,一時停止中の,一時停止が押されていなければ,こうなってたはずだったという姿勢をはスキップして, 一方,一旦停止中に姿勢が変わるとすると,(B)のパターンと同じ考えで P(tn+k) = (1-k)P_act(tn) + kP_ref(t1) (0 < k < 1) なんとなくですが,一般的に一時中断して復帰して下さい,といわれると,(A)または(D)をイメージしますがどうでしょうか. 一方,さて,これをどう実装しようか,と考えた時にseqで対応するから,あるいは,全ての最後に一時停止RTCをつくるか, 2014-08-14 9:22 GMT+09:00 Isaac I.Y. Saito [email protected]:
|
詳細な解説大変ありがとうございます. 少し話を整理させていただきたいのと,質問があります.
まとめますと,
(何か勘違いをしている箇所あればよろしくお願いします) |
A-Dは中断したところから再開,B-Cは今の指令値に近づいて再開,の違いでしょうか.
P(tn+k) = (1-k)P(t0) + kP_ref(tn+1) (0 < k < 1) k = 10 で上の式に入れると -9 * P(t0) + 9 * P_ref(tn+1) でおかしくならないでしょうか? tn+1 = tn秒+1秒と読んで下さい.t(n+1)秒では無いです
のタイミングは新しい目標値が与えられた時ですよね?であるとすると,ものすごく先の時刻(n+1000)の目標値が与えられて,
Bが必要な状況はどういうのがあるかな. また,RTC側を複雑にすると色々面倒では?という気がします.作るのもメンテするのも.なので, ただ,Dだとバッファを持たないといけないので,本当はBを作っておいて,なんかユーザ側で送るとDになる,というのが
|
一度整理しますと、 これまででてる例ですと、
だと思います。
すいません、こちら大変な勘違いしてました。 一点確認なのですが、2個まえくらいのコメントに書いてある
そもそもこれをRTC側でやるとすると、どうしてもかなり複雑になるのではと思っていました。 一つ前で私が書いた方法はできるだけ複雑にしないために、 こうするメリットはほぼ今の方法をかえなくてすんで、例えば
は復帰方法も改めて実装せず、SequencePlayerの補間をそのままつかえると思います。 一時停止解除時の開始姿勢をP_actかPかの違いも、 また、一時停止時に保持しておくデータは補間後の各制御刻みではなくて
は問題にならないと思います。 あと、補間のようなコードを新たに書かずにすむ他に、 ただ、もちろんシンプルさでいうと
がもっともシンプルだと思います。 |
図であっていると思います.
はいそうです.A-Dで説明したのは基本的な挙動の話でその実装の時はいろいろやり方があると思います. よくわかっていないですが,P_key()が経由点,P_ref()が出力として, P_key(t0),P_ref(t1), P_ref(t2), P_ref(t3), P_key(t4) という出力が得られるときに,P_ref(t2)で停止した場合,この瞬間に補間器に残っている経由点はP_key(t4)ですが, とまぁ,いろいろつらつらと考えていると, 結局現状のサーボオン/オフと一時停止の違いを考えてみると,ユーザからは,その違いはなくて, あるいは,今の瞬間補間器に入っている指令は再生して欲しい,かもしれなけど,あまり効果はないかな.と思うと どうでしょうか. |
SequencePlayer/interpolator.cppにすでにあるqueを使い、
すいません、ちょっとこちらのイメージしていたのが違ったようでした。 やはり
のようにシンプルなのがよさそうですね。 うまく接続する部分は、一時停止時間中に指令されてた軌道(各時刻指令値or補間経由点...etc) つまり、
|
2014-08-19 2:38 GMT+09:00 Shunichi Nozawa [email protected]:
そうすると,そのRTCからSeqplayerの補間器をクリアしなければいけなくなりませんか? 一方で,impedanceとかwalkを考えると,それらの出力を何処で止めるか,ということになるかとも あるいは,RTCでstopの状態に遷移させるとemergenceの時の挙動になるようにする,みたいな |
SequencePlayerの補間機をクリアしようとすると、そうなりますね。
の場合わけは、今の状況だと
stableRTCだけだとSequenePlayerでもよさそうですが、StateHolder以降で
その上で、停止解除時に止まってることを保証する方法は
とがありそうですが、確かにstopでできるなら新たに追加がなくてよさそうかもしれませんね。 ちなみに、内部のOpenHRP2制御系にRTCのがわをかぶせて使っていた時には、
のようなことをして、サーボONから復帰してたことがありました。 |
@fkanehiroさん 2014-08-19 16:21 GMT+09:00 Shunichi Nozawa [email protected]:
|
上の議論はあまりフォローできてないのですが、 |
これから想定していく,というのはどう思われますでしょうか? 2014-08-21 9:37 GMT+09:00 fkanehiro [email protected]:
|
はい、安全のためにはそうすべきだと思います。SequencePlayerはそうしています。 |
ImpedanceController, Stabilizer, AutoBalancerなどのフィルタ的に関節角度をうわがくRTCを、 @fkanehiro さん
こちら、stopでデータフローが止まると問題あるでしょうか。 また、stop/startされると上書きしないモードに移行するものを試していますが、 具体的には、startを呼んでも時々onActivated関数が呼ばれてないようで、start関数がかえってきません。 よろしくお願いします。 |
はい、モードの移行方法はいくつかあると思います。
これは変ですね。RTM本体の問題か、rtm.pyの問題か切り分けて頂いて、適切な場所にご報告頂ければ |
… if stop() and start() are called. This is discussed in fkanehiro#215
なるほど、そうですね。
これは、どのようにされてますでしょうか。
こちら、まだあまりわけられていませんが、少しだけ状況がわかったので別途issueにします。 |
状態遷移が完了するのを待ちたいとなると、サービスポートを使うしかないですね。 こちらでは手抜きして、コンフィギュレーション変数で状態遷移のフラグを立てて、呼出側で適当に待つ、ということをやっています。 2014-10-10 15:18 GMT+09:00 Shunichi Nozawa [email protected]:
|
なるほど、わかりました。 @k-okada さん サーボON/OFFの復帰に関して、実用上は、
などがありそうです。 |
2014-10-14 10:23 GMT+09:00 Shunichi Nozawa [email protected]:
最後はサーボOFFしたらstopの状態に入ればいいんだと思ったりするけど. |
onExecutionとonActivatedが同じスレッドで、状態によって順番によばれてくと理解しており、
サーボOFFしたら何もしてない状態に遷移する、は確かにいいですね。 |
…alizing, becaus onActivate (start) and onDeactivated (stop) may be used as servoOn/Off syncing, according to fkanehiro#215 (comment))
緊急時に対応する次の機能が欲しい (というか必要?) です.もう存在していたりするでしょうか?
Downstream の以下チケットで話題にしています:
The text was updated successfully, but these errors were encountered: