-
Notifications
You must be signed in to change notification settings - Fork 0
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
waypointが更新されない #25
Comments
@AriYu ゴール判定のロジックを見ると、たしかに停止することがゴール到達条件になっているようですね。 障害物が出現→ロボットが停止→ゴール判定となってしまう が成り立ってしまいそうです。 move_base
あくまで予想ですが、下記の類の現象が発生しているように思われます。
あるいは、厳密にはこれと違ったとしても、waypointにある程度接近した状態で突然停止すると、プランナー側がゴールと認識してしまうロジックが入り込んでいるのでしょう。 もしその仕様が「真」であった場合、 どうでしょうか^^; |
こんばんは。
恐らくご存知のことと思いますが、 actionlib Documentation の Communication Protocol にあるようにActionには豊富なステータスがあり、これを用いればResultが得られたかどうか、あるいはそれ以上の有容な情報を得ることができるのではないかと思います。 この件が Actionlib と全く関係のない話題であれば、場違いな発言をお許しください。 |
@MoriKen254 @forno |
http://docs.ros.org/api/actionlib_msgs/html/msg/GoalStatus.html |
Communication Protocol にある説明からすると。
LOSTかABORTEDあたりが使えそうな香りがします。 |
けれど、 |
@AriYu @forno そうですね, SUCCEEDED
ABORTED
PREEMPTD
小生では,上記以外は見つけられませんでした^^; 気になるのが つまり,コードのロジック上,"Goal reached."かつ 実挙動時の値も見てみないことには確証は持てませんが,原因追求の参考になれば. |
すみません,これもご存知と思いますが, rosservice call /move_base/set_logger_level ros.move_base DEBUG |
仮に真にゴールだと |
ソースコードの調査、帰ってくるステータスの確認を行っていただき大変ありがとうございます。 関数でステータスを割り振っているのを見逃していた事がよくわかりました。 |
ところで、これは少々主題とはズレますが、ROSの |
@forno |
@AriYu 私の方ではStatusの移行についてはまだ若干の調べ不足があります。 |
@forno |
前々から気になっていた、Action処理中に追加のゴールを送った時の動作についての文章を見つけた気がします。報告まで。 actionlib/DetailedDescription Multiple Goal Policy に書いてある内容を読むと、新しくゴールを送った場合、以前送信されたゴールは参照できなくなるが、キャンセルはされないと書いてあります。 これはSimple Action Serverの記述ですがmove_baseの実装はきちんとsimple_action_serverとなっています。参照 現在のwaypoint_navigatorは動作をキャンセルしていないため、 少々Issue違いですが、ご容赦ください。 さらに言えば、目標を発見した時にcancelGoal()しますが、これは新しく送信した方のGoalの取り下げであり、Current Goalを取り下げることはできず、そのため停止しないのではないかと考えます。 |
@forno
確かにwikiによればそのような動作になりそうですね…ということは毎回 |
先ほどの文章を再度引用します。
つまり、新しいPending Goalを設定したSimple Action Client は Current Goal を参照することができなくなります。 |
追記: |
@forno |
@AriYu
ということでしょうか |
@forno |
@forno |
そうでしたね。 ありがとうございます。 |
大体の流れがわかってきたので確認も兼ねて流れを追いたいと思います。 まず、 Server State Machine より、サーバは目標を入手するとステートマシンを作成します。 個々のステートマシンはsimple_action_serverのコンストラクタで指定されたコールバック関数 executeCb を実行します。 今回該当する処理ですが、move_base.cpp 663, 664行目 がそれであると思います。 つまり、 この動作を行うと、ステートマシンのGoalが置き換わり、新しいGoalの動作が始まります。 |
@MoriKen254 特に矛盾なく考えられますが、最後のGoalが置き換わらないという点が気になります。
を引き起こしているのではないかと思います。 追記:タイプミスがあったので少し修正しました。 |
こんばんは。すこし落ち着きました。 |
なお、私の案が成り立つのは、例えばWaypointを壁に埋め込んで停止した際にmove_baseがGoal reachedと吐く場合です。 そのあたりの検証もできれば待っています。 |
@MoriKen254 @forno ここで、障害物上にゴールが設定されてしまった場合でもローカルプランナーができるだけ近づくようなプランニングを行い、実際障害物はそれほど大きくないため、ある程度近づくとwaypointが更新されます。 ここまでを考えると、 |
carrot plannerのwikiにある 障害物上にゴールを設定した場合には、 |
@forno @AriYu
了解いたしました。
|
デフォルトのグローバルプランナーが http://wiki.ros.org/global_planner だったとすると、default_tolerance パラメータを設定しない限りは指定した地点へズレのないGoalが設定されるものだと思われますが、いかがでしょうか。 |
@forno |
@MoriKen254 |
@AriYu |
@AriYu まず、通常運転中は、 現在、30秒ごとに経過時間を出力していると思いますが、あそこの分岐に入れ込むのは悪くないかもしれませんね。 |
@MoriKen254 @forno
なども含めて実装後、実験を行ってみたいと思います。 |
障害物が近くに来て止まった場合に、
move_base
がreached_goal
という出力を出してゴールに到達したことになり、止まってしまいます。しかしながら、当然ながら
move_base
で設定したしきい値よりもロボットはゴールから離れており、waypoint_navigator
のしきい値よりも離れているためwaypointの更新が行われません。move_base
のしきい値 <waypoint_navigator
のしきい値です。
ただし、90[s]間ロボットが動いていないと判断されれば
waypoint_navigator
は次のwaypointを送るため、つくばチャレンジ2016本番では致命的な問題にはなりませんでした。The text was updated successfully, but these errors were encountered: