ハードウェアからサーバ・アプリまでワンストップで開発

前回、ROSを使うということにしたので、ROSのインストールから行います。

最近のROSは「ディストリビューション」から入れるということになっているようですが、あまり使われていないであろうOrange Pi 5の上であるということと、ソースが手元にあるのが気が楽だということ、もしかしたら自分でいじるかも知れないということから、ソースから入れることにします。

環境について

今回のプロジェクトでは、Orange Pi 5にゲームコントローラを接続して操作のベースとし、Stereo Piにルンバをつないで台車とすることにします。

そこでそれぞれの環境にROSを入れます。今回使うROSはROS2のIron Irwiniです。

Docker等は使いません。

環境の準備

手順はIron Irwiniのソースからのインストール手順に従います。

Orange Pi 5にはUbuntuをインストールしてあります。バージョンは22系です。去年の版ですが、それより後のものは公式には存在していないので、このまま行きます。

まず、universeが使えるようになっているか確認し、なければ使うように設定します。

# apt install software-properties-common
# add-apt-repository universe

ROSリポジトリを使えるようにします。

# apt update && sudo apt install curl -y
# 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 update

この辺はありがちの手順ですね。apt updateをすると、使えるようになります。

次に開発ツールをインストールします。

# sudo apt install -y \
  python3-flake8-docstrings \
  python3-pip \
  python3-pytest-cov \
  python3-flake8-blind-except \
  python3-flake8-builtins \
  python3-flake8-class-newline \
  python3-flake8-comprehensions \
  python3-flake8-deprecated \
  python3-flake8-import-order \
  python3-flake8-quotes \
  python3-pytest-repeat \
  python3-pytest-rerunfailures \
  ros-dev-tools

いろいろROS固有のツールがバイナリで入るのですが、これはツールだということで割り切って下さい。この辺のツールの中身を見る必要は、多分ないでしょう。

これで構築環境が出来ました。

ROSの構築

ROSの構築を行います。

ROSは「OS」とはついていますが、いわゆるOSではありません。また、自分でソースからbuildする場合であっても、UbuntuのOS領域である/usrとかにインストールするわけでもありません。バイナリインストールした場合だと/optを作ってそこに置くようです。マイコンのSDKにありがちの、「自分で掘ったディレクトリの下にソースが展開されてそこで何でもやる」というタイプのものです。ROS2はROSと異なりdaemon的なものが動いたりもしませんので、いわゆる「マイコン開発環境」みたいなものが作られるだけと思って良いでしょう。

というわけで、まずはそれ用のディレクトリを作ります。ここからは一般ユーザです(プロンプトに注目)

$ mkdir -p ~/ros2_iron/src

ここの/ros2_ironとあるのは、別に何でも構いません。以後の説明を読み換えれば良いだけです。ただ、構造として<どこか>/srcというように、そのディレクトリの下には自分でsrcというディレクトリも作ります。ソースはこの下に置かれます。

ソースを落とします。

$ cd ~/ros2_iron
$ vcs import --input https://raw.githubusercontent.com/ros2/ros2/iron/ros2.repos src

srcの上の階層でsrcにソースを落とすようにします。

vcsという見慣れないコマンドがありますね。gitみたいなバージョン管理システムです。リポジトリもみんな大好きGitHubでもGitLabでもありませんね。ここは深くつっこまないで、「まぁそんなもの」と思っておきましょう。

依存関係をインストールします。

$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"

buildします。

$ cd ~/ros2_iron/
$ colcon build --symlink-install

特に問題なく終了しました。つまり、Orange Pi 5でも、ROS2が入れられたわけです。

動作確認

あまりにすんなり入ってしまったので、ちゃんと動くかどうか心配になりました。

とりあえずいくつかのサンプルを試してみます。

talker, listner

まずはHello World的なものを動かしてみます。

$ . ~/ros2_iron/install/local_setup.bash
$ ros2 run demo_nodes_cpp talker

起動すると、

$ ros2 run demo_nodes_py talker
[INFO] [1702277195.729647111] [talker]: Publishing: "Hello World: 0"
[INFO] [1702277196.691776264] [talker]: Publishing: "Hello World: 1"
[INFO] [1702277197.690202689] [talker]: Publishing: "Hello World: 2"
[INFO] [1702277198.691791350] [talker]: Publishing: "Hello World: 3"
[INFO] [1702277199.691811414] [talker]: Publishing: "Hello World: 4"

こんな感じにメッセージが出ます。

これをとりあえず殺して(Ctrl-Cで死にます)、

$ ros2 run demo_nodes_py listener

としてやると、

何も表示されません。そこで、他のコンソールで

$ . ~/ros2_iron/install/local_setup.bash
$ ros2 run demo_nodes_cpp talker

としてから起動すると、

$ ros2 run demo_nodes_py listener
[INFO] [1702277559.079434486] [listener]: I heard: [Hello World: 0]
[INFO] [1702277559.979663902] [listener]: I heard: [Hello World: 1]
[INFO] [1702277560.979753632] [listener]: I heard: [Hello World: 2]
[INFO] [1702277561.979762904] [listener]: I heard: [Hello World: 3]
[INFO] [1702277562.979766885] [listener]: I heard: [Hello World: 4]
[INFO] [1702277563.978541971] [listener]: I heard: [Hello World: 5]
[INFO] [1702277564.991179020] [listener]: I heard: [Hello World: 6]
[INFO] [1702277565.990728051] [listener]: I heard: [Hello World: 7]

こんな感じで表示されます。つまり、talkerから送られたメッセージをlistnerが表示してくれているわけですね。これで一番基本的な部分が動いたことがわかりました。

せっかくなので、もっと面白いデモを動かしましょう。

$ . ~/ros2_iron/install/local_setup.bash
$ ros2 run turtlesim turtlesim_node

おなじみの「亀」が出ます。

これを動かしてみましょう。

別のコンソールで、

$ . ~/ros2_iron/install/local_setup.bash
$ ros2 run turtlesim turtle_teleop_key

と入れると、

$ ros2 run turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
Use G|B|V|C|D|E|R|T keys to rotate to absolute orientations. 'F' to cancel a rotation.
'Q' to quit.

と出て来ます。

書いてあるとおりのキーかカーソルキーを入れると亀が動きます。

まとめ

Orange Pi 5にROS2という、多分世の中ではあまり試されていない環境でしたが、特に問題となることもなくサクっと動いてくれました。昔、いろいろ苦労したような記憶もあるんですが何だったのでしょう。

とりあえず動いてくれたので、次回はゲームコントローラで亀を動かすところまでやってみましょう。

最近のエントリー

会計システム「Hieronymus」の現状

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)