PR

ロボット制御 #11 ROS2を使ってみる(Windows編)
ロボットに搭載するサーボモーターも増えてきて、モーション制御も複雑になってきたので巷で噂のROS2を使ってみた話

制御

ここまで幾つかロボット制作として動きそうなロボットを制作してきましたが、思ったよりサーボモーターやセンサーの制御に苦労しています。そこで、以前より気になっていたROS2(Robot Operating System 2)を使ってみたいと思います。
まずは、Windows11にROS2の実行環境を作ってみて試してみたいと思います。

Docker Desktop のインストール

基本的にROS2を使うためにはUbuntuを使うのが最もハードルが低いです。
Windowsでも使えるようですが、手順等が複雑で、かつ日本語の情報が少ないためWindows上にUbuntuの仮想環境を作ってその上でROS2を使うのが一般的なようです。

インストールする環境

OSWindows 11 Home 22H2
CPUAMD Ryzen™ 7 7730U 2.00GH
メモリ16GB
GPUAMD Radeon™ Graphics 2GB

Hyper-V の有効化

Docker Desktop for Windows では、Windows10以降にサポートされたハイパーバイザーベースの x64 向け仮想化システムのHyper-V を使います。そのためインストールする前にHyper-Vを有効化する必要があります。

検索ボックスに「コントロールパネル」と入力して、表示されるアプリをクリックします。

コントロールパネルの中の「プログラム」をクリックして、プログラムと機能の中の「Windows の機能の有効化または無効化」をクリックします。

表示されるリストのなかから「Windows ハイパーバイザー プラットフォーム」にチェックを付けて「OK」ボタンを押します。

Docker Desktop for Windows のダウンロード

まずは、Docker Desktop のドキュメントのサイトを開きます。
Web検索で「docker desktop for windows」を入力すれば、このページに辿り着けます。

「Windows 用 Docker デスクトップ – x86_64」ボタンを押して「Docker Desktop Installer.exe」をダウンロードします。(翻訳しなかった場合は、以下のように表示されています)

Docker Desktop for Windows のインストール

ダウンロードした「Docker Desktop Installer.exe」を実行します。

最初の画面で「OK」を押せば自動でインストールされて完了します。
Hyper-V以外にWSL2が使える場合は、オプション選択画面が表示される場合もあるようです。

Docker Desktop を起動します。
左図のようなアイコンをダブルクリックすると起動します。

起動すると以下のような画面が出るので「Accept」を次に進みます。

この画面に表示されているのは、上段が次のような内容です。
「同意を選択すると、サブスクリプション サービス契約、Docker データ処理契約、およびデータ プライバシー ポリシーに同意したことになります。」
下段が次のような内容です。
「従業員 250 名以上または年間収益 1,000 万ドル以上の企業で Docker Desktop を商用利用するには、有料サブスクリプション (Pro、Team、または Business) が必要です。サブスクリプションの詳細を見る」

上段には同意し、下段は個人使用で対象ではないので無償利用させて頂きます。

Welcom to Docker と表示されて「Work」「Personal」が表示されて、E-Mailアドレスを入れるようになっていましたが、SkipがあったのでSkipを押しました。
今後、アカウント作成の必要があれば、作成しようかと思います。

役職を聞かれましたが、あまりシックリ来るのが無かったので「Full-stack-developer」にしました。

Dockerを何に使うのか聞かれたので、以下にチェックを付けました。

  • Hobby projects … 趣味のプロジェクト
  • AI/ML … 人工知能/機械学習
  • Learning or teaching … 学習および教育

Docker Desktop が起動しました。

歯車マークを押すと設定が表示され変更することが出来ます。
とりあえずはデフォルトのまま使ってみたいと思います。

Docker を使ってみる

コマンドプロンプトを起動して「docker -v」と入力すると、以下のようにインストールしたバージョンが表示されます。

次に Docker の公式リポジトリである DockerHub に用意されているイメージを使ってみます。

何か表示されましたね。
ローカルにはhello-worldのイメージがないのでDockerHubのライブラリから引っぱってくると言っています。そして「Hello from Docker!」が表示されたら正常にインストールされました。とのことです。

リポジトリ操作

docker search <キーワード>」で DockerHub 内の docker イメージを検索します。

docker pull <イメージ名>」でイメージをローカルにダウンロードします。

イメージ操作

docker イメージとは、docker コンテナの動作環境となるテンプレートファイルです。
docker イメージを元に docker コンテナを実行します。

docker image」で Docker のイメージ操作に関するコマンドの一覧が表示されます。

docker images」でローカルに保存されている Docker イメージの一覧が表示されます。

docker image rm <イメージ名>」でローカルに保存されている Docker イメージを削除します。

ん、何かエラーが出ました。どうもコンテナから参照されているようですね。
後で出てくるコマンドですが「docker container ls -a」でコンテナの確認をしてみます。

docker image rm -f <イメージ名>」で強制的に削除することも可能です。

コンテナ操作

docker container」で Docker のコンテナ操作に関するコマンドの一覧が表示されます。

docker container ls」で Docker コンテナを一覧表示します。
上記のコマンドでは実行中のコンテナしか表示されないので、停止したコンテナも表示するためにオプション「-a」を指定します。

docker container rm <コンテナID>」でDocker コンテナを削除します。
複数のコンテナIDを指定して削除することも可能です。

docker container run <イメージ名>」で 指定された Docker イメージを基に Docker コンテナを作成し、コンテナ内でプログラムを実行します。

リファレンス

Docker.docs にリファレンスが載っているので、忘れたりオプションを調べたりするときは、こちらで確認して下さい。

これで一通り、Dockerについては準備が出来たので、次のステップに進みたいと思います。

Ubuntu イメージのインストール

まずは、DockerHub で Ubuntu の Docker イメージを探します。

Docker イメージをダウンロードします。

イメージの一覧を確認します。

ubuntu のタグは、latest

コンテナを実行します。

Ubuntu のコマンドを実行してみます。

Ubuntu のバージョンを確認してみます。
現時点の最新版「Ubuntu 24.04 Noble」ですね。

Ubuntuのバージョンと対応するROS2のディストリビューションが以下になります。

バージョンコードネーム対応するROS2
Ubuntu 18.04 LTSBionic BeaverROS 2 Eloquent Elusor
Ubuntu 18.10Cosmic Cuttlefish
Ubuntu 19.04Disco Dingo
Ubuntu 19.10Eoan Ermine
Ubuntu 20.04 LTSFocal FossaROS 2 Foxy Fitzroy
ROS 2 Galactic Geochelone
Ubuntu 20.10Groovy Gorilla
Ubuntu 21.04Hirsute Hippo
Ubuntu 21.10Impish Indri
Ubuntu 22.04 LTSJammy JellyfishROS 2 Humble Hawksbill
ROS 2 Iron Irwini
Ubuntu 22.10Kinetic Kudu
Ubuntu 23.04Lunar Lobster
Ubuntu 23.10Mantic Minotaur
Ubuntu 24.04 LTSNoble NumbatROS 2 Jazzy Jalisco
ROS 2 Rolling Ridley

Ubuntuは、基本的に半年に1回のペースでバージョンが上がっていますが、基本的に広く使われているのは、バージョンの後ろに LTS と付いているバージョンになります。LTS とは Long-Time-Support の事で、概ね2年に1回のペースでLTS版がリリースされており、ROS2もこちらをターゲットにしているようです。LTSリリースの最新版が「Ubuntu 24.04 LTS (Noble Numbat)」になります。

もし、最新版ではなく、古いイメージをダウンロードしたい場合は、タグを探す必要があります。
DockerHub で Ubuntuを検索して「Tags」ページで検索することが出来ます。

例えば「Ubuntu 22.04 LTS (Jammy)」のイメージを探す場合は、「Filter Tags」に「jammy」と入力することで探すことが出来ます。検索は小文字にしないと表示されませんので注意してください。
https://hub.docker.com/_/ubuntu/tags?page_size=&ordering=&name=jammy

最新ではないタグのイメージをダウンロードする場合には、サイトにコマンドが表示されていますが、「docker pull ubuntu:jammy」のように入れるとダウンロードできます。

さて、Ubuntu の画面に戻って、システムの最新化を行います。
root でログインしているので既にスーパーユーザでしたね。

大量にUpdateがかかりました。
これでUbuntuの環境は、整いました。

X-Window のインストール

Xmingのインストール

Docker イメージからGUIを使ったプログラムを動かすために WindowsにXmingをインストールします。以下のサイトからダウンロードします。
http://www.straightrunning.com/XmingNotes/

スクロールで少し下がるとReleasesの情報があり、そこからダウンロードできます。

ダウンロードするのは、「Xming-fonts-7-7-0-10-setup.exe」と「Xming-6-9-0-31-setup.exe」です。

全ての設問にデフォルトままで進めました。

「Xming」アイコンをダブルクリックすると裏で「Xming Server0:0」というプログラムが起動しています。まだ、何もXServer対応のプログラムを入れていないので、ウィンドウを表示することは出来ませんでした。

VcXsrvのインストール

Xmingは、最終公開版が古いのと rqt が起動しなかったのでVcXsrvに変更しました。

ダウンロードしてインストールしました。
なお、githubに移行したとありましたが、そちらからダウンロードしようとするとウィルス検出に引っかかりダウンロードできなかったので、こちらのサイトからダウンロードしました。

インストールが完了したらデスクトップにアイコンが作成されるので、起動します。

ランチャの設定は、基本的にそのままで良いですが、「Extra」設定で「Disable access control」にチェックを付けました。(付けない方が良いのかな?)

Ubuntu24.04にPython3をインストールするイメージの作成

最新のLTSイメージであるUbuntu24.04(Noble)にpython3をインストールするイメージファイルを作成します。実は、Ubuntu22.04(Jammy)とUbuntu24.04(Nobel)では、python3の環境構築方法が変わっています。

Ubuntu 24.04のpythonパッケージでは、PEP668に対応しているためpip3のインストールに失敗してしまいます。解決方法は、pipではなくpipxを使う方法が手っ取り早いです。

python3の仮想環境構築については、以下の記事で触れています。

Docker イメージを作成します。
以下のサイトを参考にさせて頂きました。

docker イメージを作成するDockerfileは、次のようにしました。

Dockerfile.py3

# Let's make a robot - Robot control #11 Let's try using ROS2
# https://gitlab.com/chikuma/ros2-jazzy
# インストール環境
#    ubuntu:24.04STL
#    Python3
#
# General guidelines and recommendations for writing 'Dockerfile':
# https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
#
# @product   Dockerfile example to install Python3 on Ubuntu 24.04
# @author    chikuma <chikuma7410@gmail.com>
# @copyright 2024 chikuma
# @license   https://www.apache.org/licenses/LICENSE-2.0 Apache-2.0

# Base image
FROM ubuntu:24.04

# user information
LABEL maintainer="chikuma <chikuma7410@gmail.com>"
SHELL ["/bin/bash", "-c"]

# Install prerequisites
RUN set -x \
    && export DEBIAN_FRONTEND=noninteractive \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        gnupg2 \
        software-properties-common \
        language-pack-ja \
        tzdata \
        curl \
        lsb-release \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

# Set locale & timezone
RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja \
    && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" > /etc/timezone

ENV LANG=ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8
ENV LC_CTYPE=ja_JP.UTF-8

# Install packages
RUN set -x \
    # 最新のPythonバージョンをインストールするために、deadsnakes PPAを追加
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        python3.12-dev \
        pipx \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

# Python / pipx
RUN ln -s $(which python3.12) /usr/bin/python
RUN pipx ensurepath
Dockerfile

Docker イメージを作成してみます。
上記のDockerfileは、「C:\Dev\ros2-jazzy\ubuntu-noble」というフォルダを作って、そこに保存しました。ご自身の端末で試す場合は、Dockerfileを保存した場所で実行してください。

これで Docker イメージが作成されました。イメージを確認してみます。

作成したイメージを実行します。
「docker run -it <イメージ名>」でコンテナを作成&実行します。

python のバージョンと pip のバージョンを調べます。

python 3.12.3 がインストールされいることを確認できました。
ちょっとだけ動かしてみます。6*3を計算しました。

Ubuntu24.04にROS2 Jazzyをインストールするイメージの作成

先ほどはPython3までを追加するイメージを作成しましたが、ついに本命のROS2 Jazzyまでを追加するイメージを作成します。以下のようなDockerfileを作成しました。

Dockerfile

# Let's make a robot - Robot control #11 Let's try using ROS2
# https://gitlab.com/chikuma/ros2-jazzy
# Installation environment
#    ubuntu:24.04STL
#    Python3
#    ROS 2 Jazzy Jalisco
#
# General guidelines and recommendations for writing 'Dockerfile':
# https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/
#
# @product   Dockerfile example to install Python3 on Ubuntu 24.04
# @author    chikuma <chikuma7410@gmail.com>
# @copyright 2024 chikuma
# @license   https://www.apache.org/licenses/LICENSE-2.0 Apache-2.0

# Base image
FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

# user information
LABEL maintainer="chikuma <chikuma7410@gmail.com>"
SHELL ["/bin/bash", "-c"]

# Install prerequisites
RUN set -x \
    && export DEBIAN_FRONTEND=noninteractive \
    && apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y --no-install-recommends \
    	bash-completion build-essential curl gnupg2 lsb-release \
        language-pack-ja software-properties-common \
        tzdata git tmux wget nano gedit x11-apps eog \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

# Set locale & timezone
RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja \
    && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" > /etc/timezone

ENV LANG=ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8
ENV LC_CTYPE=ja_JP.UTF-8

# Install python
RUN set -x \
    # Add the deadsnakes PPA to install the latest Python version.
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        python3.12-dev \
        pipx \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

RUN ln -s $(which python3.12) /usr/bin/python
RUN pipx ensurepath

# Install ROS2 jazzy Jalisco
RUN set -x \
	&& apt-get install -y software-properties-common \
	&& apt-add-repository -y universe \
	&& apt-get update && apt-get install -y curl \
	&& curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg \
	&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null \
	&& apt-get update && apt-get upgrade -y \
	&& apt-get install -y ros-dev-tools \
	&& apt-get install -y ros-jazzy-desktop \
	&& apt-get install -y ros-jazzy-ros-base

# Setting the work directory
RUN echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
RUN source /opt/ros/eloquent/setup.bash
RUN mkdir -p ~/ros2_ws/src
RUN cd ~/ros2_ws/src

# Official ROS2 Sample and Demo Downloads
RUN git clone -b jazzy https://github.com/ros2/examples ros2_examples
RUN git clone -b jazzy https://github.com/ros2/demos ros2_demos

# Run tmux when running a container
# ENTRYPOINT ["tmux"]
Dockerfile

イメージファイルをビルドしてみます。

ビルドに成功しました。
コンテナを実行してみます。この際にX-Windowサーバーに接続しますので、Xmingを起動しておきます。

GUIプログラムのxeyesも立ち上がりました。
ROS2 Jazzy Jalisco の実行環境構築が完了しました。

ROS2 Jazzy を使ってみる

それではコンテナを実行して、ROS2を使ってみたいと思います。
先ほどのコンテナの中にROS2公式のデモとサンプルプログラムを保存しています。

最初のチュートリアル

これは公式ドキュメントにも書いてある。インストール出来たかどうかの確認です。
~/ros2_ws/src/ros2_demos に移動して何がインストールされているか確認します。

コンテナを2つ起動します。

1つのコンテナでC++で作ったプログラムを実行します。
「ros2 run demo_nodes_cpp talker」を実行します。

別のコンテナでPythonで作ったプログラムを実行します。
「ros2 run demo_nodes_py listener」を実行します。

talker がメッセージを発信して、listener がメッセージを受信しています。

公式DOCのチュートリアル

ここから公式DOCのチュートリアルを進めていきます。

環境設定

ROS 2 コマンドにアクセスするには、次のように、開く新しいシェルごとにこのコマンドを実行する必要があります。

新しいシェルを開くたびにセットアップ ファイルを読み込まなくても済むようにするには (タスク 1 をスキップ)、シェルの起動スクリプトに次のコマンドを追加します。

ROS 2 セットアップ ファイルをソースすると、ROS 2 の操作に必要ないくつかの環境変数が設定されます。ROS 2 パッケージの検索や使用で問題が発生した場合は、次のコマンドを使用して環境が適切に設定されていることを確認してください。

ROS_DISTROROS_VERSIONなどの変数が設定されていることを確認します。

ROS_DOMAIN_ID 変数を設定します。
ROS 2 ノードのグループに一意の整数を決定したら、次のコマンドで環境変数を設定できます。

今回は、とりあえず「30」にしておきます。

シェル セッション間でこの設定を維持するには、シェルの起動スクリプトに次のコマンドを追加します。

初心者チュートリアル:turtlesim と ros2 rqt

Turtlesim は、ROS 2 を学習するための軽量シミュレーターです。ROS 2 の最も基本的な動作を説明し、後で実際のロボットやロボット シミュレーションで何を行うかのアイデアを提供します。

rqt は、ROS 2 用のグラフィカル ユーザー インターフェイス (GUI) ツールです。rqt で実行されるすべての操作はコマンド ラインで実行できますが、rqt は ROS 2 要素を操作するためのよりユーザーフレンドリーな方法を提供します。

このチュートリアルでは、ノード、トピック、サービスなどの ROS 2 のコア概念について触れます。これらの概念はすべて、後のチュートリアルで詳しく説明されます。今は、ツールを設定して、その使い方を体験するだけです。

turtlesim をインストールする

ROS 2 ディストリビューション用の turtlesim パッケージをインストールします。

パッケージがインストールされていることを確認します。

上記のコマンドは、turtlesim の実行可能ファイルのリストを返します。

turtlesim を起動する

turtlesim を起動するには、ターミナルで次のコマンドを入力します。

シミュレーター ウィンドウが表示され、中央にランダムなカメが表示されます。

ターミナルのコマンドの下に、ノードからのメッセージが表示されます。

そこには、デフォルトのタートルの名前と、それが出現する座標が表示されます。

turtlesim を使ってみる

新しいターミナルを開き、ROS 2を再度ソースします。
ここで、最初のノードのタートルを制御するための新しいノードを実行します。

キーボードの矢印キーを使用してカメを操作します。カメは画面上を移動し、付属の「ペン」を使用して、これまでたどってきた経路を描きます。

list のそれぞれのコマンドのサブコマンドを使用して、ノードとそれに関連付けられたトピック、サービス、アクションを表示できます。

以上です。

コメント

タイトルとURLをコピーしました