ROS2はじめてみた
今回は以下を実施します。
- ROS2のインストール
- TutorialsのAbout ROS2を読む
- 気になったところはメモ書きを残す
最終目標
ROS2 でロボカップSSLロボット( or grSim)を動かす
環境
$ uname -a Linux akshota-System-Product-Name 4.15.0-33-generic #36-Ubuntu SMP Wed Aug 15 16:00:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
Installation
ここを参考にしました。バイナリパッケージをインストールします。
Linux Install Debians · ros2/ros2 Wiki · GitHub
※困ることがない限り、インストール手順はこの記事に書きません。
追記2018/09/01
後のTutorialでソースからビルドしろと書かれていたため、バイナリパッケージをアンインストールします。
アンインストールの方法はこの記事の一番下に追記しました。
Install ROS 2 packages
Desktopかros-baseを選択します。 今回はDesktopをインストールします。
$ sudo apt install ros-$ROS_DISTRO-desktop
Environment setup
argcompleteのインストールは任意です。自分はインスールしました。
Sourcing the setup script
自分はzshを使っているのでコマンドを変更しました。 また、.zshrcにコマンドを追加しておきました。
$ source /opt/ros/$ROS_DISTRO/setup.zsh
Installing additional RMW implementations
RMWはROS Middleware interface の略です。 ROS2の特徴であるDDSライブラリが実装されているみたいです。
DDS and ROS middleware implementations · ros2/ros2 Wiki · GitHub
デフォルトではFast RTPSが使えますが、 RTI ConnextやPrism Tech Openspliceもインストールできるようです。
環境変数RMW_IMPLEMENTATIONを変更すれば、 使用するRMWを変更できます。
今回はデフォルトのFast RTPSを使いたいため、何も変更しません。
Additional packages using ROS 1 packages
ROS 1とのブリッジは、今は必要ないので何もしません。
インストールは以上です。
Tutorial
このページのTutorialをやっていきます。
Tutorials · ros2/ros2 Wiki · GitHub
Overview of ROS 2 concepts
- ROS2システムの心臓部はROSグラフ
- ノードはROSグラフに属す
- クライアントライブラリはrclcppとrclpyがある
- クライアントライブラリは他の言語にも対応する
- ノードの発見(Discovery)は自動的に行われる
- Example
DDS and ROS middleware implementations
- ROS2で採用したDDSの概要
- DDSを採用したより詳しい理由はここに書いてある
- ROS on DDS
- ROS2では複数のDDS/RTPSの実装をサポートしてる
- ROS2でDDS/RTPS を使うときはRMW (ROS Middleware interface)を使う
- 複数のRMWを実装/実行する方法はここに書いてある
- Working with multiple RMW implementations · ros2/ros2 Wiki · GitHub
ROS 2 Client Libraries
- ROSコード(ノードとかトピックとか)を書くときはClient librariesを使う
- 違うClient librariesで書かれたノード同士も通信できる
- 好きなノードを好きな言語で実装できる
- 他にもClient librariesにはNames, Time, Parameters, (以下略)などの機能がある
- C++のclient library (rclcpp)と、pythonのclient library (rclpy)は共通のRCL機能を使う
- 共通のRCL機能(Common RCL functionality)はC言語で書かれている
- それをwrapすることで、C++やpythonのclient libraryを実装できる
- RCL APIのドキュメントはここに書かれている
- rcl: rcl: Common functionality for other ROS Client Libraries
- Client librarのコンセプトは、言語固有の機能を実装しないこと
- ROS1はclient librariesを"基礎から"作ってる
About ROS Interfaces
- ROSのアプリケーションはmessagesもしくはservicesを使って通信する
- ROS1と同じく、msg/srvが使える
Message Description Specification
※ROS1から変更なさそう
- Field Nameは命名ルールがあるので注意(小文字とアンダースコアを組み合わせる)
- デフォルト値を設定できる。
- 今の所、文字配列(string arrays)と複雑な(complex)型は対応してない
- 例:
uint8 x 42
- 定数を設定できる
- 定数はUPPERCASEで記述すること
- 例:
int32 X=123
Service Description Specification
※ROS1から変更なさそう
- サービスファイル(.srv)はrequestとresponse msg で構成される
- requestとresponseは'---'を記述して区別する
About Quality of Service Settings
- ROSではノード間の通信にQuality of Service (QoS) policiesが取り入れられる
- QoS profile (QoS policiesの集合)を使って、各ノードのQoSを設定する
- ROS2では、いくつかのQoS profileが用意されている。(例: sensor data)
QoS policies
- History(データをどれくらい保持するか): Keep last(Depthの設定値) or Keep all(全部)
- Depth(データの保持数)
- Reliability(通信の信頼性): Best effort or Reliable
- Durability(通信の永続性):
- Transient local(subscriberが遅れてきてもok)
- Volatile(送信データはすぐ消える)
ROS1と比較して
- historyとdepthは、ROS1のqueue sizeと同じ機能
- reliabilityは、ROS1のUDPROSとTCPROS
QoS profiles
QoS profilesを使えば、QoSの複雑な設定に悩まなくて良くなる。 状況に合わせて必要なQoS pofilesを選ぶ。
現在のQoS profilesは以下のものがある。
- Default QoS settings for publishers and subscribers
- ROS1との通信用
- History: Keep last
- Reliablity: Reliable
- Durability: Volatile
- Services
- Pub/Subと同様にReliable
- 特に、Serviceではvolitile durabilityが重要 (読んだけどよくわかりませんでした)
- Sensor data
- 全データ受信を保証することより、より最新のデータを受け取ることが重要
- best effort reliabilityとsmall queue depth
- Parameters
- Servicesをベースに構築
- 違いはqueue depthが大きいこと(設定値を取り逃したら良くない)
- System defulat
- 全policiesがデフォルト値になる
各profilesの設定はここから確認できる。
rmw/qos_profiles.h at release-latest · ros2/rmw · GitHub
QoS compatibilities
- QoS profiles はPublisherとSubscriberとで別々に設定する。
- PublisherとSubscriberのQoSに互換性があるときに通信ができる
- 通信互換性はRequest vs Offererモデルに従う
- SubscriberのpolicyがPublisherのより厳しくなければ通信できる
- DurabilityとReliabilityに対して互換性チェックが行われる
- 例: Pub: Transient local、Sub: Volatileなら、Volatileで通信される
ここまで読んで
ROS Masterがなくなったことと、DDSはロボカップ小型リーグに役立ちそう。
まだ手を動かせていないので、ROS 2 Tutorialsに進みたい。
ROS 2 Tutorialsについては別記事で。
追記:バイナリパッケージのアンインストールとソースビルド
colconのTutorialでROSをソースからビルドしろと書かれていたので、 バイナリパッケージをアンインストールしソースからビルドします。
パッケージのアンインストール
$ sudo apt remove ros-$ROS_DISTRO-desktop $ sudo apt autoremove # 削除されたか念の為確認 $ dpkg -l | grep ros-$ROS_DISTRO
ソースビルド
このページを参考に実施します。
Linux Development Setup · ros2/ros2 Wiki · GitHub
System Requirements
LocaleがUTF-8をサポートしていること。念の為$ locale
で確認します。
Get ROS 2.0 code
最新のパッケージが欲しければ・・・と注記がありますが、とりあえず何もしません。
パッケージの更新方法はこのページが参考になります。
Maintaining a Source Checkout · ros2/ros2 Wiki · GitHub
Install more DDS implementations (Optional)
まずはデフォルトのFast RTPSを使って見るので、何もしません。
Build the code in the workspace
Connext関連でstderrが出たけど気にしない。
Try some examples
zshを使ってるのでコマンドを少し変更します。
$ . ~/ros2_ws/install/local_setup.zsh
$ ros2 run demo_nodes_cpp talker
talkerとlistenerのデモが動いたので、インストール終了。