個人勉強のログです.
前回のこちらの記事に続き,技術系の記事を執筆.
実行環境
# 端末 ProductName: Mac OS X ProductVersion: 10.15.6 BuildVersion: 19G2021 # docker Docker version 19.03.12, build 48a66213fe docker-compose version 1.26.2, build eefe0d31
ROS2 とは
Robot Operating System (ROS) とは、ロボット用のソフトウェアプラットフォームである。
これまで研究用途で活用していた ROS を商用利用しようということで,一からアーキテクチャを見直して作り直したものが ROS2. ROS の課題を解決しつつ,商用利用に必要な機能が盛り込まれている.
ROS / ROS2 の違い
- 新しい通信プロトコル
- Data Distribution Service (DDS)
- Real-Time Publish-Subscribe (RTPS)
- QoS (Quality of Service) が管理可能 (コードネーム:Eloquentにて更に機能追加)
- 設定可能な QoS の種類
- History + depth
- キュー制御: キュー内の優先度があるかは不明
- Reliability
- Best effort: データが配信されることは保証しない.
- Reliable: データが配信されることを保証する.ただし,複数回リトライが発生する可能性あり.
- Durability
- Transient local:最後のデータをキャッシュとして保持.
- Volatile:キャッシュとして保持しない.
- Lifespan:未送信メッセージの維持期間
- Deadline:守るべき最小周期
- Liveliness:どの方式のハートビートを使うか
- History + depth
- QoS プロファイル:上記を個別に設定しなくてもユースケースに合わせたデフォルト値がある.
- Default:ROS1と同じで QoS はなし
- Services:データの持続性が小さい
- Sensor data:Best effort + 小さいキューサイズで送られる.
- 特徴
- Pub. >= Sub. の QoS プロファイルにしないといけない
- 参考:MQTT の QoS
- QoS 0:最大で1回送る
- QoS 1:最低でも1回はメッセージを届ける(PUBBACKを受け取るまで再送する)
- QoS 2:正確に1回メッセージを届ける(PUBREC, PUBREL, PUBCOMPを送受する)
- 設定可能な QoS の種類
- ライブラリアーキテクチャの更新
- 全スタックがリアルタイム可能
- ノードライフサイクル
- ノードの実行が管理可能
- 決定的実行は可能
- 認証可能なROSへ
- 開発プロセスの追跡可能性により
- MISRA-Cに合致(C言語のコーディング・ガイドライン)
- セキュリティは
DDS-Security
規格
- マルチプラットフォーム化
- Actions
- サービス通信に近い
- 返り値が返ってくるまでフィードバックを受け取れる.
- 返り値が返ってくる前にキャンセル可能.
- Intra-Process Comm.
- 複数ノードを1プロセスとして動作
- プロセス内のPub/Sub通信が高速かつ軽量
- ROS2プログラミングスタイルのベストプラクティス
Docker 経由で ROS2 を触る
シンプルな talker と listener
イメージタグはこちらを参照.
# terminal 1 docker run -it --rm osrf/ros2:nightly /bin/bash ros2 run demo_nodes_cpp listener # terminal 2 docker run -it --rm osrf/ros2:nightly /bin/bash ros2 run demo_nodes_cpp talker
ROS2 x Docker-compose
プロセスが異常終了しても自動起動するように,Dockerの設定を変更する.また,自分でイメージの中身を変更できるようにDockerfile, docker-compose.yml
を作成しておく.
なお,Macの場合はcat <file name> | pbcopy
することでファイルの中身がクリップボードに保存されるので,あとはCmd + v
でブログに貼り付けられる.
Dockerfile
ip a
するために,iproute2
をインストール.
FROM osrf/ros2:nightly RUN apt-get update && apt-get install -y --no-install-recommends iproute2 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/ CMD ["/bin/bash"]
docker-compose
restart: on-failure
を設定することで,プロセスが異常終了するたびに自動起動する.command
で10秒おきに異常終了させている.
version: '3' services: ros-listener: build: context: . dockerfile: Dockerfile container_name: listener network_mode: "host" environment: - TZ=Asia/Tokyo command: /bin/bash -c 'ros2 run demo_nodes_cpp listener & sleep 10 ; exit 1' tty: True restart: on-failure ros-talker: build: context: . dockerfile: Dockerfile container_name: talker network_mode: "host" environment: - TZ=Asia/Tokyo command: ros2 run demo_nodes_cpp talker tty: True restart: on-failure
Docker 実行環境のメンテナンス
docker image の作成・実行を繰り返していくうちに,不要なコンテナが残ってくる.それらを定期的に削除するためのコマンドリスト.
# コンテナの停止 # -q = --quiet: 出力量を減らすときによく使われる docker stop $(docker ps -q) # コンテナの削除 # -a = --all: 出力可能なものをすべて出すときによく使われる docker rm $(docker ps -aq)
書籍
Web を活用した勉強だけでなく,書籍による勉強も平行している.

- 作者:近藤 豊
- 発売日: 2019/08/13
- メディア: Kindle版