Minimahack

ミニマル・シンプル・ナチュラルに個人と社会の課題解決に貢献

ROS2 x Docker関係の知識をアップデート

個人勉強のログです.

前回のこちらの記事に続き,技術系の記事を執筆.

minimahack.jp

実行環境

# 端末
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) とは、ロボット用のソフトウェアプラットフォームである。

引用:https://ja.wikipedia.org/wiki/Robot_Operating_System

これまで研究用途で活用していた ROS を商用利用しようということで,一からアーキテクチャを見直して作り直したものが ROS2. ROS の課題を解決しつつ,商用利用に必要な機能が盛り込まれている.

index.ros.org

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:どの方式のハートビートを使うか
    • 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を送受する)
  • ライブラリアーキテクチャの更新
  • 全スタックがリアルタイム可能
  • ノードライフサイクル
    • ノードの実行が管理可能
    • 決定的実行は可能
  • 認証可能なROSへ
    • 開発プロセスの追跡可能性により
    • MISRA-Cに合致(C言語のコーディング・ガイドライン)
    • セキュリティはDDS-Security規格
  • マルチプラットフォーム化
  • Actions
    • サービス通信に近い
    • 返り値が返ってくるまでフィードバックを受け取れる.
    • 返り値が返ってくる前にキャンセル可能.
  • Intra-Process Comm.
    • 複数ノードを1プロセスとして動作
    • プロセス内のPub/Sub通信が高速かつ軽量
    • ROS2プログラミングスタイルのベストプラクティス

Docker 経由で ROS2 を触る

シンプルな talker と listener

イメージタグはこちらを参照.

hub.docker.com

# 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 を活用した勉強だけでなく,書籍による勉強も平行している.

ROS2ではじめよう 次世代ロボットプログラミング

ROS2ではじめよう 次世代ロボットプログラミング

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