OGIMOノート ~家族のためのモノづくり~

8歳の娘と、6歳の息子(脳性麻痺)を持った父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具/ロボット関係の製作記録、勉強記録を残していきます

ROS2 crystalをUbuntu16.04にインストールして動かしてみた

f:id:motokiinfinity8:20190518103128j:plain

はじめに

ロボット向けミドルウェアROS(Robot OS)。
複数センサー/デバイスを分散処理しやすい、センサー可視化ツールが豊富、オープンソースで利用者が多い等、現在ロボットソフトのデファクトスタンダードになっているソフトウェアです。個人でも、業務でも、ROSを使った開発をする機会も増えてきています。ロボットは関連技術分野が広く、すべてを自分で作るのは本当に大変なので、この様なオープンソースパッケージを活用して簡単に自立移動が実装できるため、個人開発/研究用途に非常便利です。

ROS2は、ROSの思想を汲みながら、ROSの課題であるコンポーネント間通信の改善(リアルタイム性、信頼性)を行ったものになるそうです。
特に、ロボットを展示会・研究の世界から、実用の世界に持っていくのにここは重要と思ったので、ちょうどROS Japan主催の勉強会に参加してきたので、勉強メモがてらに残したいと思います。

rosjp.connpass.com

ROS2について

撮影した写真をいくつか抜粋
f:id:motokiinfinity8:20190519211835j:plainf:id:motokiinfinity8:20190519211906j:plain
f:id:motokiinfinity8:20190519211921j:plain

ROS2の特徴は
①新しい通信プロトコル(Data Distribution Service)
  - ROS Masterがいらない、信頼性が高い、速度アップ
  - 様々なベンダー実装品と入れ替え可能

②リアルタイム性の管理
 - ノードの実行順も管理可能

③組み込み機器/Ubuntu以外のOSもサポート

だそうです。

ROSだと、リアルタイム性が保証できていない点や、通信信頼性が低い点もあり、なかなか導入に踏み切れないのが現状なのかなぁ、と。
ROSを導入するとしても、結局自前で信頼性を上げる様に時間と人をかけて独自カスタマイズしたり、じっくり検証せざるを得なくなり、開発費がかさみ事業性が悪くなってしまう(=普及を阻害する要因になる)んですよね…
せっかくのオープンソースなのに勿体ない…

という訳で、ロボットの社会実装を目指す上でROS2の考え方は個人的には良さそうに感じました。

ROS2の現状

ディストリビューションとしては、2017/12に最初のリリース版Ardent、2018/6に2nd版 Bouncy、2018/12に3rd版 Crystal と更新されている様です。本記事記載時ではCrystalが最新版なのですが、2週間後(2019/5/31)には 4th版 dashingがリリースされる様です。
ちなみに、Dashingは2年サポートなので、今後ROS2を触ってみるなら Dasingの方がよいかも

なので、現時点でのCrystal版の記載内容がどこまで今後役に立つか分かりませんが(笑)、ROS2のイメージを学ぶにはちょうど良いかと。

2019/5/18時点でのROS2の稼働状況ですが
 ・メッセージ、サービス : 一通りばっちり動いている状況
 ・アクション通信 : 動いているがAPIはDasingで変更になる模様(何!?)
 ・Launchファイル : 大変更(xmlpython)の影響でまだ未実装
 ・Rviz : 一部機能のみ
上記以外のROSで愛用されてきたNavigationなどの汎用パッケージもどこまで動くかは不明なので、正直なところ、ROS同等の機能を実現するまではあと2,3年かかりそうな印象ですね。


とはいえ、2,3年したらROS2移行の流れになりそうな印象なので、今のうちから少しずつ情報キャッチしていくのが良いかも。

インストール

環境

私の開発環境に合わせて以下を入れました
 ・開発PC : Intel Core i5-8250U 1.8GHz
 ・開発OS : Ubuntu16.04 LTS
 ・導入ROS2 : ROS2 crystal

手順

Ubuntu18.04だとaptから入る様ですが、残念ながらUbuntu16.04だとcrystalはaptで入らない様なので、
ソースからビルドする形で立ち上げます。以下のサイトを参考にしました。

gbiggs.github.io
qiita.com

①PC設定変更
ROS 1が起動中の環境(source /opt/ros/kinetic/setup.bash等を実行した環境)でROS 2をインストールするとビルドでコケるっぽいので、まずは .bashrc から ROS1関連のファイルをコメントアウトして再起動しておきます。

②パッケージのインストール

$ sudo apt update
$ sudo apt install curl gnupg2 lsb-release
$ curl http://repo.ros2.org/repos.key | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'

③ツールのインストール

udo apt update && sudo apt install -y build-essential cmake git python3-colcon-common-extensions python3-pip python-rosdep python3-vcstool wget
$ sudo -H python3 -m pip install -U argcomplete flake8 flake8-blind-except flake8-builtins flake8-class-newline flake8-comprehensions flake8-deprecated flake8-docstrings flake8-import-order flake8-quotes git+https://github.com/lark-parser/lark.git@0.7b pytest-repeat pytest-rerunfailures pytest pytest-cov pytest-runner setuptools
$ sudo apt install --no-install-recommends -y libasio-dev libtinyxml2-dev

④ROS2コードの取得

$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ wget https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
$ vcs import src < ros2.repos

⑤依存関係インストール

$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro bouncy -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 python3-lark-parser rti-connext-dds-5.3.1 urdfdom_headers"

⑥ビルド

colcon build --symlink-install --packages-ignore qt_gui_cpp rqt_gui_cpp

最後のビルドが時間かかって、だいたい1時間くらいかかりました。

⑦.bashrcへ設定追加
ROS1同様にパス設定が必要なので、.bashrcに追加します。

source /opt/ros/crystal/setup.bash

上記をホームディレクトリ内の.bashrcに追加すればOK

ROS2の動かし方

ROS2に関しては、現時点ではまだ参考書・書籍がありません。なので、勉強する場合は以下のサイトを活用すればよさそうです。
講習会でも、以下のサイトを使って演習を行いました。

gbiggs.github.io

インストール確認

サンプルデモソフトがあるので、そちらを使って動作確認します。

■1つ目のターミナルで以下を入力

ros2 run demo_nodes_cpp talker

すると、以下の様に1秒ごとにメッセージがpublish(送信)されます。

[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [talker]: Publishing: 'Hello World: 3'
[INFO] [talker]: Publishing: 'Hello World: 4'

■2つ目のターミナルで以下を入力

ros2 run demo_nodes_cpp listener

すると、以下の様に1秒ごとにメッセージがsubscribe(受信)できればOKです。

[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]
[INFO] [listener]: I heard: [Hello World: 3]
[INFO] [listener]: I heard: [Hello World: 4]

ちなみに、ros core(Master)設定は不要です。また同じWifi環境で複数PCで同時に実行すると当然ながら混信するので、混信を避けるには以下のコマンドでID設定を変える必要がある

export ROS_DOMAIN_ID=xxx
ROS2ワークスペースの作り方 & ビルドの仕方

インストール時にビルドして作成したので、実は実行済でした。ポイントとしては、
・ パッケージ単位で管理 (package.xmlがあるフォルダがパッケージとして扱われる)
・パッケージ内に必要なファイル(CMakeLIsts.txt)やディレクトリ構成はROS1とあまり変わらない。
 (記載の仕方は異なっているが)
・ colcon でパッケージビルド
 colcon build
・ビルドし直すたびにアクティベートしなおさないといけない(忘れると更新されないのでハマる)
 source install/local_setup.bash

ROS2 ノードの記載方法

・ノードの実装はヘッダーファイルとソースファイルの2つのファイルにある
・ノードの実装をネームスペースに置く記載の仕方をしている
・独自メッセージ、独自サービスの作成イメージは ROS1と同じイメージ
・ROS2の新機能として、ノードのコンポジションがある。ノードの実行順番を厳密に守ることができる。
executorというオブジェクトの中で実行されるタイマーイベント、データ受信コールバック、サービス等の実行は必ずexecutorが管理できるらしい

ROS2サービスの定義と利用

・サービスのイメージはROS1と変わらない

ROS2アクションの定義と利用

・考え方はROS1と同じ。サービスと違って、アクションは必ず非同期に実行
・記載の仕方は非常に複雑だが、DasingでAPIが変更になるので、ここでは雰囲気を掴んでおく程度でよさそう

ROS2コマンド

msg/srv/node/pkg/run が使えるので基本はROS1と同じ(作法が違うのみ)

launchファイル

ROS 2のシステム起動するツールはROS 1のroslaunchとかなり違うことになるらしい。ROS 2のlaunchフィあるはXMLではなくてPythonで記述される予定だが、まだ未実装なのでここは保留

ROS 1とROS 2のメッセージ通信

ROS 1とROS 2の環境を有効にして、ros1_bridgeパッケージ内のdynamic_bridgeノードを起動する。dynamic_bridgeは定期的にROS 1側とROS 2側に利用中のトピックを探す。 トピックがあったら、そのトピックで流れているデータを反対側で送信するらしい。
どの程度使えるのかはまだ未知数ですが、ROS1での開発資産が活用できる観点では期待したいところですね。

最後に

数カ月前までは 「ROS2とROS1は非互換で全く別ものだ」という噂を聞いていてドキドキしてましたが、いざ勉強してみるとROS1の思想がそのまま継承されているので、ROS1経験者は素直に移行できそうな雰囲気を感じました。
まだ開発途上のROS2ですが、日常世界にロボットを展開していく上では必要なアップデートだと思うので、引き続き情報キャッチしていきたいと思います。

ひとまず、Dasingがリリースされたら再度遊んでみたいと思います