ROS2はこれからどのように開発が進んでいくのでしょうか.
2018年の9月末頃から,こちらのスレッドで,ROS1からROS2への移行計画についての議論が行われました.簡単に議論内容をまとめてみようと思います.
最初の議論の出発点は,ROS1のリリースをある年度までで辞めることにして,その間の4.5年間にコミュニティ全体でROS2への移行を進め,その後はROS2の開発に集中するというのはどうか,という提案でした.ROS1のリリースをやめる背景には,Python2からPython3への移行の問題もありました.
(… So, I’d like to know other users thoughts. Is 2023 enough time to move fully to ROS2? Do we need a LTS release in 2020? My proposal is to forgo a ROS release in 2020 and put the effort in to ROS2 instead. … by mkhansen)
これに対し,複数の賛成意見が寄せられました.
(… While no one is saying it will happen tomorrow, I’m looking forward to ramping down ROS1 development and future releases. Instead we need to focus our limited community resources on a better robotics middleware that wasn’t built in a graduate student lab in 2007. … by davetcoleman)
(… Since leaving Willow Garage in 2012, we’ve received approximately $0 directed at maintenance or improvement of ROS 1. And even if we had such funding, we’d still be limited by the number of people on our team. … by gerkey)
その一方で,ROS1からROS2への移行はもっと徐々に進めてほしいという意見もありました.
(… To me, that says that after April 2020 (only about 18 months away), it gets a lot harder to run the current ROS2 release with any ROS1 packages bridged in. Is that logic right? By releasing ROS1 on Ubuntu 20.04, you can an extra 2 years of bridge availability. by mikeferguson)
また,ROS1とROS2を共存させていくべきではないかという声もあがりました.
(… Instead of porting any package to ROS2, efforts could be spend on reducing the differences between ROS1 and ROS2 from both ends, to reduce the impact of the community split, and all costs of eventual full migration. … by tkruse)
(… As a company building solutions based on ROS 1, porting all of our code base to a new middleware would be a major effort. Our robots perform mobile picking in warehouses, where performance and reliability demands require a well-understood system. Exchanging the foundation of this very complex system and getting to a similar performance level again will not be an easy step. … I hope that we can find either a good migration path or ways for maintaining both versions for a longer time. by moritz)
やはりROS1のサポートは必要ではないか,という意見もあり,ROS1をサポートする新たな組織が必要ではないかという提案もありました.
(… I understand that OSRF cannot commit resources to ROS1 forever. But when that day comes, please let’s try to find a successor organization that takes over stewardship of ROS1…. by Martin_Guenther)
ROSのコミュニティには多様なニーズや必要性を持っている人が所属しているので,これらを可視化して,皆にとってより良い方向性を決めていくべきではないか,という意見もありました.
(… Different segments have different types of needs, requirements, costs, and constraints. Not only that, but different segments use, contribute, and maintain different types code. I think seeing a breakdown and a graph of these relationships of that would be really valuable. … by jbohren)
最後に,スレッドを立てられた方は,これまでの議論を踏まえて,ROS1からROS2移行のために必要な作業をまとめられました.
(…
Open Roboticsの方は,ROS2のこれからをこのように予想しています.
(… Given the current status and level of community contributions I expect that ROS 2 will be well-featured and very usable for a wide variety of applications long before Melodic goes EOL in 4.5 years. …
Of course, irrespective of the state of ROS 2 I expect that many many people will still be using ROS 1 in 4.5 years and even after, primarily because of a combination of familiarity and reliance on existing ROS 1 code. by gerkey)
いかがでしたでしょうか.
ROS1と比べることで,ROS2での変更点が少し探れたのではないかと考えています.また,執筆者自身は,ROS2との違いを意識することで,逆に,普段何気なくROS1を使っていることに気付かされました.ROS1の理解も少し深まった気がしています.ROS1とROS2の違いは,今回書いた点以外にもあると思いますので,皆様も是非チュートリアルを体験してみてください!
また,ROS2への移行に関する議論は,ROS1を研究で使う者として,しっかりこれからも追っていきたいです.皆様も是非ROS2を試してみてください!
それでは,早速チュートリアルを進めていきます.今回は,gbiggsさんが作成された,
ROS Japan ユーザグループ 講習会 ~ ROS 2 の紹介 ~ (https://gbiggs.github.io/rosjp_ros2_intro/index.html)
のチュートリアル資料を使わせていただきます.ROS2ならではのノードの書き方を理解し,ROS1との違いを探ることを目的とします.
Ubnutu 18.04にROS2 Bouncy をインストールします.ROS2 Bouncyのインストールはこちら (Desktop Install) を参照しました.ROS2のインストールがうまく行っているかはこちらで確認できました.
ROS 2の基本 に従ってチュートリアルを進めていきます.ROS1のチュートリアルでお馴染みの talker/ listener プログラム をROS2のノードの書き方で書いていくものです.
ROS2ならではのノードの書き方として,以下のポイントが挙げられると思います.
チュートリアルの詳細については,リンク先を参照していただきたいのですが,ここからは,チュートリアルを通して印象に残った点を挙げていきます.
1. ROS2を利用するためにインクルードするヘッダの変更(ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->ヘッダーファイル 42行目):
#include <rclcpp/rclcpp.hpp>
ROS1におけるrospyはrclpyに,roscppはrclcppに変更になっています.
2. 初期化の方法の変更(ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->スタンドアローンノードラッパーのソースファイル 7, 8行目):
rclcpp::init(argc, argv); auto greeter = std::make_shared();
ROS1では,
ros::init(argc, argv, "talker");
のようにROSの初期化に合わせてノードを初期化します.一方,ROS2では,ROSの初期化とノードの初期化が別々に分けられています.そのため,ノードを共有ライブラリとして実装すると,複数ノードを同一プロセスの中に入れられるようになります.
(詳しくはこちらのチュートリアルのmain関数4, 5行目
rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("greeter");
にも説明があります.)
すべてのノードはexecutorというオブジェクトの中で実行します.
こちらのチュートリアルの greet_and_displayer.cpp 10-18行目を抜粋します.
// タイマーコールバック,トピックコールバック等を行うexecutor rclcpp::executors::SingleThreadedExecutor exec; // Greeterコンポーネントノードのインスタンスを作成しexecutorに登録する auto greeter = std::make_shared<greeter::Greeter>(); exec.add_node(greeter); // Displayerコンポーネントノードのインスタンスを作成しexecutorに登録する auto displayer = std::make_shared<displayer::Displayer>(); exec.add_node(displayer);
3. ノードなどのインスタンス作成時のスマートポインタの使用(ROS2のAPIの基本を理解->ノードの実装 main関数5行目):
auto node = rclcpp::Node::make_shared("greeter");
ROS2はC++11/14を使っているため,autoを用い,変数のメッセージ型をコンパイラに判断してもらうようにします.コンパイラに型判断をお任せできるので,ソースコードが簡単になります.
4. ノードの制御の仕方の変更(ROS2のノードの書き方を理解->コンポーネントノードのソースを読み解く->ソースファイル 19行目):
timer_ = create_wall_timer(1s, std::bind(&Greeter::broadcast_greeting, this));
ROS1の talker/ listener プログラム のチュートリアルでは,whileループを回し,一定時間ごとにsleepすることよってノードの周期を決めていました.ROS2では,リアルタイム制御や実行時間の管理のため,タイマーイベントで制御を行うことが推奨されています.
1. ビルドシステムの変更(ROS2のノードの書き方を理解->ビルド&実行):
ROS1ではcatkinを用いたビルドを行っていました.catkinは直接cmakeのみを扱います.一方,ROS2では,colconと呼ばれるメタビルドシステムを用います.colconは依存関係を考慮してパッケージのビルド順を決め,ビルドを実行します.ビルドの方法は各パッケージに任せるので,cmakeによらず複数のビルドタイプを選択可能です.
2. ソースコード実行のために実行ファイルのインストールが必須に(ROS2のAPIの基本を理解->パッケージのコンパイル方法 CMakeLists.txt 25-29行目):
# ノードの実行ファイルをインストールする(必須) install(TARGETS greeter DESTINATION lib/${PROJECT_NAME} )
ROS1ではビルド時に,すべてのビルドされたファイルがソフトリンクされた,development space (devel space) が作られました.この開発環境を用いれば,インストールせずビルドのみで開発したソフトウェアを利用することができました.一方,ROS2のcolconビルドではdevel spaceが作られないため,開発パッケージのCMakeLists.txtに,実行ファイルのインストール先を指定する必要があります.(執筆者は,ROS1でdevel spaceを用いて自身が開発したソフトウェアを実行しており,正直に書くと,これまでインストールのことを意識していませんでした.)
colconについてはこちらのチュートリアルに詳しく紹介されています.
1. source install/local_setup.bash を使用する端末で必ず一回実行(ROS2のAPIの基本を理解->ビルド&実行):
source install/local_setup.bash
ROS1でいうところの source ~/catkin_ws/devel/setup.bash の代わりです.
2. 実行コマンドの変更 ( ros2 run greeter_ros2_style greeter )(ROS2のAPIの基本を理解->ビルド&実行):
ros2 run greeter_ros2_style greeter
ros2 run displayer displayer
ROS1でいうところの rosrun greeter_ros1_style greeter の代わりです.その他のコマンドについてはこちらのチュートリアルに紹介されています.
3. roscoreが必要なくなる(メッセージ受信ノードの作成->ビルド&実行):
データ通信方式が変更になりました.ROS1では,出版購読モデルの先駆けだったため,独自の出版購読モデルを構築していました.ROS2を開発する頃には,既存のライブラリが複数登場するようになりました.そのような経緯で,Data Distribution Service (DDS) を採用しました.これにより,マスタによるノード間接続が必要なくなり,DDSミドルウェアを介して直接ノード間で接続できるようになりました.ROSにおけるDDSは,こちらのサイトに詳しい説明があります.
執筆者が一番難しさを感じているのは,CMakeLists.txtの書き方です.これまでインストールのことを深く考えたことが無かったため,単にツケが回ってきただけだと思いますが,必要な情報についての理解がまだまだ足りていません.ヘッダーファイルのマクロの理解も追いついていません.ドキュメントを読んで,勉強していこうと思います.
さらに,これはROS1のチュートリアルを最初に勉強した時と同じ感想なのですが,talker/ listenerのプログラムの書き方が分かっても,自分が今使っているロボットをどのようにROS2で動かせば良いのかについてはまだよく分かりません.センサデータが取り扱えるパッケージなどの情報があると嬉しく思います.または,既存のROS1の認識系プログラム等をROS2用に置き換える方法が分かるとありがたいなと思いました.
また,ROS2のlaunchファイルは,xml形式からpython形式になったということです.まだ開発中ということで,これから情報が増えてくることを楽しみに待っています.
皆さんはROS2を知っていますか?
ROS2は,ROSの次世代版です.ROSは元々,ロボティクス研究用ソフトウェアプラットフォームとして開発されてきました.ROSの普及に伴い,研究開発のみの用途だけでなく,製品に活用する動きが活発になってきました.その過程の中で,ROSに対する新たなニーズが生まれ,ROSのフレームワークのみで対応するのが難しくなってきました.
そこで,ROS2が新たに生まれました.2017年12月にArdent Apaloneが,そして今年2018年7月にBouncy Bolsonがリリースされ,現在も開発が続けられています.
本ブログでは,ROS2が生まれた背景について簡単に触れながら,ROS2の日本語版チュートリアル体験を通して,ROSとROS2の違いとして印象に残った点について述べていき,ROS2のこれからに関する議論を追いかけていきます.(ROSのことは,ROS2と区別して,ROS1と記述します.)
ROS1はPR2というロボットを用いたロボティクス研究開発環境として,その開発がスタートしました.当初は以下のような用途が想定されていました:
一方で,ROS1が普及することで,PR2だけでなく様々なロボットで用いられるようになったり,学術用途から製品化に用いられるようになったりしていき,以下のような新しい用途が生まれていくようになりました:
ROS1がこれまで満たしてきたニーズを維持しつつ,このような新たなニーズも満たしていくために,ROS1と切り分ける形でROS2が生まれました.
詳しい内容は,こちらのサイトに記述されています.
先週の金曜日にWorld MoveIt! Day 2018 in 柏の葉が開催されました! 当日の様子を写真で紹介します.参加できなかった方にも雰囲気を伝えられればと思います.
ついにWorld MoveIt! Day 2018 in 柏の葉が始まりました! ハッカソンでの課題の例についての説明などがありました.
次に,会場にロボットを展示していただいた企業の方からロボットのご紹介がありました.
皆さんもくもくと作業されています.実機でプログラムを試す方もいらっしゃいました.
午前中はお疲れ様でした!お昼ご飯の時間です.
お昼ご飯を食べながらの,参加者による発表が始まりました.
WRS2018製品組立チャレンジ参加報告とオムロンサイニックエックス株式会社のご紹介をしてくださいました.
MoveIt!の新機能,Task Constructorについてご紹介してくださいました.これにより,今までできなかった,物を掴みながら移動するといった,並列タスクが可能になるそうです.
SEED-noidの実用例を,コンビニを舞台にした競技会やレストランでの実証実験のお話などを通してご紹介くださいました.
MoveIt!でロボットを動かす際,各関節の角度を知りたい時に便利なツールのご紹介です.
発表が終わったら,ハッカソンの再開です.
お疲れ様でした!ハッカソン終了です.今日一日何に取り組んだか,発表し合います.
次回参加時の参考になる取り組みがたくさんありますね!
参加者の皆さま,ありがとうございました! 来年もお会いしましょう!
皆さんはMoveIt!を知っていますか? MoveIt!とは,マニピュレータ用のプランニングフレームワークです. MoveIt!を使うことで,サーボの1つ1つを別々に制御するのではなく,一つのマニピュレータとして扱い,動かすことができます.
World MoveIt! DayはMoveIt!のコード,ドキュメント,コミュニティをますます発展させていくことを目的とした国際的なハッカソンです.今年の日本でのイベントは千葉県の柏の葉で,来週末に開催されます!
詳しい内容と参加登録はこちらのConnpassのページをご覧ください.
ハッカソンなんて敷居が高い?いえいえ,そんなことはありません.コードやドキュメントの修正案として,以下のようなものが事前に与えられています.参加する前に,ぜひ一度目を通してみて,出来そうな課題があれば,取り組んでみてください.
(公式のイベントサイトに記載されているものを簡単に和訳しました.)
例えば,このIssueでは,テストコード(ユニットテスト,インテグレーションテスト両方)がたくさん必要だと提案されています.このIssueでは,RVizのバージョンが上がった時に使用できないフォントを,MoveIt!で使わないようにしようとしています.このIssueでは,moveit_python (MoveIt!のPythonインターフェース)の中身を充実させていこうと提案がされています.このIssueでは,もっと初心者に分かりやすくなるように,RVizを使ったMoveIt!のチュートリアルの内容を整えていこうとしています.このIssueでは,SRDFの文法エラーがあったら,MoveIt!がエラーを出すようにしようと提案されています.
初学者がドキュメントを更新していくことも推奨されています.たとえばこのIssueは,既存のチュートリアルがちゃんと動くか,順を追って確認する,という内容になっています.MoveIt!初心者でも,当日チュートリアルをやりながら修正案を出していくのはできそうですね!
ぜひ一度目を通して,自分で取り組めそうなIssueがあれば,チャレンジしてみてはいかがでしょうか?その際には他の人と作業がかぶらなくてすむように,予めIssueにコメントしておきましょう.assignedタグは,その課題に取り組んでいる人が既にいるかどうかを判断するのに便利です.
参加の際はROSのKinetic LTS branch/releaseをインストールされたパソコンをお忘れなく.Kineticの入ったUbuntu16.04のVirtualBox イメージは公式イベントサイトからダウンロードできます.他のROS バージョンについては公式イベントサイトをご確認ください.
それでは,当日会場でお会いしましょう!