RoboTry

ROSを使ってロボットを動かすぞ

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
    • talkerノードとlistenerノード実行
    • c++で書かれたノードとpythonで書かれたノードが通信してることがわかる
    • ROS Masterが無くなったことがわかる

DDS and ROS middleware implementations

ROS 2 Client Libraries

  • ROSコード(ノードとかトピックとか)を書くときはClient librariesを使う
  • 違うClient librariesで書かれたノード同士も通信できる
    • 好きなノードを好きな言語で実装できる
  • 他にもClient librariesにはNames, Time, Parameters, (以下略)などの機能がある
  • C++のclient library (rclcpp)と、pythonのclient library (rclpy)は共通のRCL機能を使う
    • ROS2メインのclient libraries はrclcppとrclpyである
    • それ以外の言語(JVM and Android, Objective C and iOSなど)でも開発中である
  • 共通のRCL機能(Common RCL functionality)はC言語で書かれている
  • Client librarのコンセプトは、言語固有の機能を実装しないこと
  • ROS1はclient librariesを"基礎から"作ってる
    • 例えば、pythonのclient libraryはpythonに特化している(これ自体は良いこと)
    • pythonとcppとで機能の名前や振る舞いが一致してなかったり
    • バグ修正がpythonとcppとで別々に行われたりしていた

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が取り入れられる
    • TCPのように信頼性のある通信を実装できたり
    • UDPのようにできる限り最善(best-effort)な通信を実装できる
  • 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のデモが動いたので、インストール終了。