ROS2次世代ロボットプログラミング
3.1-3.5まとめ
九州工業大学 大学院 生命体工学研究科
人間知能システム工学専攻
田向研究室
三井 悠也
目次
1
1. 自己紹介
2. ROS1とROS2の違い
3. ROS1との
アーキテクチャ比較
4. Data Distribution Service
5. ROS2のフロントエンドツール
6. ROS1/2パッケージ
ビルドツール“colcon”
ROS1とROS2の違い
2
3
ロボットの同時利用数
ROS
Master
ROS
ノード
ROS
ノード
ロボットAかPC1
ROS
ノード
ROS
ノード
ROS
ノード
ロボットBかPC2 ロボットCかPC3
Subscriber
Publisher
msg
Subscriber
msg
ROS1
msg
Pub Sub
4
ロボットの同時利用数
ROS
ノード
ROS
ノード
ロボットAかPC1
ROS
ノード
ROS
ノード
ROS
ノード
ロボットBかPC2 ロボットCかPC3
Subscriber
Publisher
msg
Subscriber
msg
ROS2
msg
Pub Sub
別ノードからの制御
→障害復帰の容易化
ロボットBかPC2ロボットAかPC1
5
計算資源
ROS1○構成要素の核がC++
ROS
ノード
ROS
ノード
message
XML-RPCが必要
C言語環境の
マイコンでは
動作が困難
ロボットBかPC2ロボットAかPC1
6
計算資源
ROS2○構成要素の核がC言語
ROS
ノード
ROS
ノード
message
7
リアルタイム制御
ロボットBかPC2ロボットAかPC1
ROS1○リアルタイム性は考慮なし
→ros_controlを使う必要あり
ROS
ノード
ROS
ノード
Message(TCP通信)
→通信終了
タイミングが不明
なぜか?
8
リアルタイム制御
ロボットBかPC2ロボットAかPC1
ROS2
○リアルタイム性は考慮
ROS
ノード
ROS
ノード
Message(UDP通信)
通信の再送は無い
→通信信頼性は低下
※ROS1でもUDPROS使えばUDP通信可能
9
ネットワーク品質
ROS
ノード
ROS
ノード
Message(UDP通信)
ROS
ノード
ROS
ノード
○UDP通信のためマルチキャストに対応
→1対多通信に親和性あり
Publisher
Subscriber
Subscriber
SubscriberPub,Sub通信との
高い親和性
Wifiなどの不具合
→QoS*で対応
*Quality of Service
UDP通信+QoSで頑健なネットワーク
→構築が困難なためDDS**で対応
*Data Distribution Service
10
プログラミング形式
ROS2ROS1
プログラミング形式は自由
○mainループの廃止
→ROS2クライアントライブラリ
の提供手順に沿って開発
○ノード現在状況の把握機能
「ライフサイクル」が容易
11
アプリケーション
ROS2ROS1
○研究目的など
プロトタイプ作成を想定
ロボット開発の
デファクトスタンダード化
→比較検討や他人の
アルゴリズムの利用が容易化
○独自開発のTCPROSを使用
○プロトタイプの成果を
製品化することも想定
→多数の企業を巻き込んで検討
○DDS/RTPS*を使用
→信頼性の向上
*Real-Time Publish-Subscribe
ROS1とのアーキテクチャ比較
12
ROS
マスタ
ユーザ
ノード
ユーザ
ノード
ユーザ
ノード
…C++
クライアント
ライブラリ
roscpp
Python
クライアント
ライブラリ
rospy
EusLisp
クライアント
ライブラリ
roseus
TCPROS
ハードウェア
13
ROS1の内部アーキテクチャ
roscoreの一部
×TCPROSは厳格な仕様が決定していない独自通信プロトコル
×スクラッチによる実装
ユーザ
ノード
ユーザ
ノード
ユーザ
ノード
…C++
クライアント
ライブラリ
rclcpp
Python
クライアント
ライブラリ
rclpy
Java
クライアント
ライブラリ
rcljava
クライアントライブラリ API
rcl
通信ミドルウェア API
rmv
DOS ベンダ A
実装
DOS ベンダ B
実装
DOS ベンダ C
実装
…
ハードウェア
14
ROS2の内部アーキテクチャ
再利用性の高い
C言語で構成
15
rcl:クライアントライブラリAPI
○ROS2の基盤ソフトを実装する上で
各言語用クライアントライブラリに
共通する機能を提供するAPI
○rmwより上位に存在するため通信を意識しなくてよい
○名前空間のロギング,時刻管理などが実装される
○C言語で実装されている
→呼び出しやすく,改変も楽
16
rmw:通信ミドルウェアAPI
○ROS2の基盤ソフトと通信機能を分けるためのAPI
○DDSに基づいてQoSを考慮したPub/Sub通信,
リクエスト・レスポンス通信を基本とする
○プラグインのようにコンパイル時ではなく実行時に変更
→オープンソース利用で初期費用低下
→出荷時にサポート充実な商業ソフト化
○計算資源の限られる環境で動作可能な通信ミドルウェア実装
Data Distribution Service
17
18
何故DDSになったのか
DDSの特徴
○エンドーツーエンドの通信ミドルウェア
利点
○ROS2のメンテコード削減
○厳格な仕様の明確化
○システムレベルも明確
・サードパーティのレビュー
・監査可能
・高い互換性で実装
欠点
○ROS2の設計がつられる
○ROSのユースケースに
合わない場合は再設計
→エンドツーエンドの
通信ミドルウェアは
その設計思想に
合わせる必要あり
19
DDSとは
○DDSはROS1における
Pub/Subとよく似たデータ転送
○送信元と受信先の発見メカニズムは
分散化されている
→単一障害点の除去
以下のような場所でDDSは利用される
・戦艦
・金融システム
・宇宙,航空システム
20
DDSとは
○DDS-RTPS*は組み込み機器の
リアルタイムアプリにも統合可能
○UDPを使うことで信頼のある転送や
通信ハードウェアを必要としない
○DDSはTCPも使うことができる
*Real-Time Publish-Subscribe
21
DDSのインターフェース記述言語
○ROS1のmsgやサービス同様のIDL*が存在
→DDSのIDLを対応させてROS1のIFを維持
○DDSのIDLはCORBA*と同じ仕様
・CORBA:サーバ・クライアント通信方式
・Pub/Sub通信方式
流れるデータ定義は共通
*Interface Description Language
22
DDSの通信インターフェースRTPS
DDS:Pub/Sub通信の
仕様の名称
RTPS:配信プロトコル
OSI参照モデルで表すと…
アプリケーション層
(HTTP,IMAPなど)
トランスポート層
(TCP,UDPなど)
RTPSの特徴
○リアルタイムアプリ用の最適効率化と高信頼Pub/Sub通信
○フォールトトレランス性を有する
○後方互換性と相互接続性を失わずに通信プロトコルを拡張可能
○プラグアンドプレイの接続性にて新しいアプリを自動発見,参加,辞退可能
○構成変更が柔軟で高信頼データ通信や正確な時系列データの通信要件を有す
○通信プロトコルにモジュール性があり,RTPSのサブセットを実装した機器もネット参加可能
○数千のSubを持つようなシステムにも適用できるスケーラビリティを有す
○IDLを使った安全設計によりプログラミングエラーを防ぐ
ROS2のフロントエンドツール
23
24
ros2の使い方
ROS2のコマンドラインインターフェースの
エントリポイントは「ros2」
ROS1 ROS2
roslaunch ros2 launch
rosrun ros2 run
Rostopic ros2 ropic
● ros2 action
アクション関連のサブコマンド
● ros2 component
コンポーネント関連のサブコマンド
● ros2 daemon
ノード発見デーモン関連のサブコマンド
● ros2 launch
Launch システム関連のサブコマンド
● ros2 lifecycle
ライフサイクル関連のサブコマンド
● ros2 msg
msg ファイル関連のサブコマンド
● ros2 multicast
UDP マルチキャスト関連のサブコマンド
● ros2 node
ノード関連のサブコマンド
● ros2 param
パラメータ関連のサブコマンド
● ros2 run
ノード実行関連のサブコマンド
● ros2 security
セキュリティ設定関連のサブコマンド
● ros2 service
サービス関連のサブコマンド
● ros2 srv
srv ファイル関連のサブコマンド
● ros2 topic
トピック関連のサブコマンド
25
ros2サブコマンドの実行例
典型的なtalker/listener の例をコマンドラインインターフェースだけを使って再現できる
メッセージ通信の送信:ros2 topic pub
メッセージの受信と標準出力:ros2 topic echo
➡ROS1のrostopic pub,rostopic echoを使ったことがある方にはなじみやすい!
$ ros2 topic pub /chatter std_msgs/String “{data: Hello world!}”
publisher: beginning loop
publishing std_msgs.msg.String(data=‘Hello world!’)
publishing std_msgs.msg.String(data=‘Hello world!’)
$ ros2 topic echo /chatter
data: Hello world!
Data: Hello world!
ターミナル1
ターミナル2
簡単なメッセージのテストがコマンドラインインターフェースだけで
完結するのはデバッグの面で非常に便利!
26
ノード発見デーモン
ROS2は互いのノードを分散処理で発見する
→ROSマスタのような中央集権的な気候を廃止するため
⇒デメリットとして発見に要する時間がかかる
クエリにより早く応答するため「デーモン」を用いる
デーモンがOFF→分散発見
デーモンがON→デーモンを参照して
高速検索
● ros2 daemon start
デーモンの起動
● ros2 daemon status
デーモンの現在状態の標準出力
● ros2 daemon stop
起動済みのデーモンの停止
ROS1/2パッケージ
ビルドツール“colcon”
27
28
ビルドツールの変遷
● rosbuild
ROS1 Fuerte まで現役だったビルドツールです.
独自の Python スクリプトを 組み合わせて
ROS1 パッケージをビルドすることができました.
● catkin_make
上記の Python スクリプトでは OS 依存性が高く,
Ubuntu 以外の Linux プラットフォームや macOS
などに対応することが難しかったため,純粋な
CMake 拡張である catkin_make が登場します.
Windows/macOS/Linuxに対応している
CMake を基にすることで,マルチプラットフォーム
対応が行いやすくなりました.非公式ではありますが,
このころから macOS でも徐々に ROS1 が動くように
なっていきます. その後, catkin_make_isolated
という改善版ツールがリリースされました.
catkin_make では純粋な CMake プログラムや
CMake 以外のビルドツールを使ったプログラムを
ビルドすることができませんでしたが,
catkin_make_ isolated はそれらを含めて
ビルドできます.さらに,パッケージごとに
ビルド処理が隔離された場所で行われるため,
パッケージ間の依存関係を疎に保ちながら
ビルドできるようになりました.
● catkin
catkin_make_isolated は残念ながら並列ビルドができません.
そのため,ビルド時間が著しく遅くなります.
そこで,並列ビルドに対応した catkin 25 が生まれました.
catkin は catkin build のようにサブコマンドの形で実行でき,
オプション引数なども豊富に用意され、コマンドラインツール
としての使いやすさが大幅に向上しました.
● ament
モノリシックを2に設計された catkin をプラグイン構造に再設計し,
ROS2 パッケージをビルドできるようにしたものが ament です.
ament プラグインを追加することで,CMakeLists.txt プロジェクトの
C/C++ プログラムや setup.py しかない Python スクリプトを
そのまま ROS2 パッケージとしてビルドできるようになりました.
プラグインを新しく追加すれば,その他のプログラミング言語の
プログラムのビルドにも対応できます.
● colcon
上記の ament は ROS2 パッケージのビルドのみを扱っており,
ROS1 パッケージを扱うことができません.そこで登場したのが
colcon です. colcon では,ROS1 パッケージには catkin を,
ROS2 パッケージには ament を 呼び出すことで,両バージョンが
混在したワークスペースを作成できます. ROS1/2だけではなく,
Gazebo Ignition ライブラリ (Gazebo用のソフトウェ アライブラリ)
も colcon でビルドできます. colcon 自体は Python で実装されており,
rosbuild の二の舞にならないか心配ですが,これまでのところ,
マルチプラットフォーム展開はうまくいっている ようです。
29
colconの使い方
colcon の使い方はまだ情報が少ないですが,以下の文書にまとめられています.
https://colcon.readthedocs.io/en/latest/
https://github.com/ros2/ros2/wiki/Colcon-Tutorial
http://design.ros2.org/articles/build_tool.html
一番網羅的なのは readthedocs の文書です.
https://colcon.readthedocs.io/en/latest/user/quick-start.html
基本的な使い方は以下のとおりです.
$ mkdir -p /tmp/workspace/src # /tmp/workspaceをワークスペースにします。
$ cd /tmp/workspace #ワークスペースに移動します。
$ cd src; git clone ***; cd .. # srcディレクトリ以下にROSパッケージをご設置します。
$ colcon list –g # 全パッケージをリストアップします。
$ colcon build # 全パッケージをビルドします。
$ colcon test # 全パッケージのテストを実行します。
$ colcon test-result --all # テストの実行結果をbuildディレクトリ以下に列挙します。
$ . install/local_setup.bash #パッケージのセットアップスクリプトを実行します。
$ ros2 run *** を実行します。 #ROS2フロントエンドツールを使ってノードを実行します。
30
colconの使い方
catkin や ament を使ったことがある方なら,ほとんど同じように使えるはずです.
ちなみにこれまでのほかのビルドツールと同様に,ソースコードのクローンや
依存ライブラリのインストール,インストールパッケージ化といった処理は
ビルドツールは担当しません.それぞれ別のコマンドが用意されています.
● vcstool
ソースコードレポジトリの管理ツール
● rosdep
パッケージの依存解決ツール(ROS1同様)
● bloom
パッケージのリリースツール(ROS1 同様)
http://www.brain.kyutech.ac.jp/~tamukoh/

02 第3.1節-第3.5節 ROS2の基本機能(1/2) ROS2勉強合宿 @別府温泉