C++で作ったROS 1のパッケージをROS 2に移植するときのつまづきポイント ―RVizのゴールの出力について
Sat May 4 18:36:33 JST 2024 (modified: Sat May 4 20:10:37 JST 2024)
views: 2149, keywords:ROS 2
https://github.com/ryuichiueda/value_iteration を https://github.com/ryuichiueda/value_iteration2 に移植中です(おわらねー)。今日は「ナビゲーションのコードを自前で書きたいのにRVizがゴールをトピックに吐いてくれない」という謎現象を解決しました。
この記事の結論は「ROS 2でもActionを使わずに、設定次第でゴールをトピックからサブスクライブして/cmd_vel
に出力してナビゲーションを試すことができる」です。ROS 2を教えるときにいきなり複雑な仕組みを学生さんに触ってもらうくらいなら、最初はこっちのほうがいいと思います。ROS 1はアクションはトピックを束ねたものでシェルから見えましたが、ROS 2では「ある種の潔癖さ」でそうではないようです。
なにがどうしてどうなった
RVizの画面の「ゴールを矢印を引いて指定するやつ」の出力を扱う正しい方法を探していたところ、「nav2_utilでActionサーバーを作れ(あるいはSimpleActionServerなしで自分で作れ)」とのこと。ただ、それだとNav2にいろいろ縛られるのでやだなと思って、RVizからトピックをとって勝手にやろうと思いました。が、RVizがトピックを出している形跡がありません。
で、何時間かいろいろ調べたんですが、たどり着いたのは、私の環境ではRVizにNav2用のプラグインが使われてて、それがトピックを出さないということでした。たどり着いたのは、中国語のサイトでした。英訳して読みました。
ROS 2のRVizがトピックにゴールを出さない件、中国のページに助けられた。助かった・・・あざす!https://t.co/w9VhK93SP1
— 上田隆一 (@ryuichiueda) May 4, 2024
理屈の説明は上のページ(の翻訳)に譲るとして、とりあえずRVizのconfigファイルをRVizから保存して、次のように書き換えるとトピックを吐くようになりました(当該の箇所)。
# - Class: nav2_rviz_plugins/GoalTool #これコメントアウト
- Class: rviz_default_plugins/SetGoal #この2行追加
Topic: /goal_pose
なるほど。
余計な一言
ROS 2、必要以上にややこしくなっているのは学術的にというより政治的に、という感じなので、この先どうなるのかちょっと見ものかなと思います。もっとシンプルな代替のものが出てくるかもしれません。
みんなのために仕組みを作ってたら、強権な独裁者になったり、あるいは代替わりしてしきたりだらけの貴族だらけになっていた、ということは歴史的によくあることなので、避けてほしい(し、第三者は従順にならずにいてほしい)なと草葉の陰から思いました。(直接関係ないですけど)某社も「evilになるな」とか言ってたんですけど今はあんな感じですし。
RoboCupなどでちょっとやったり散々やられたりしましたが「みんなのため」を演説で主張して自分に利益を引っ張るのは国際的にはオッケーなやりかたなので、見かけのスマートさを盲信するの避けたいものです。
現場からは以上です。