Post

C言語用ROS2クライアントライブラリrclcのmacOS Montereyビルド

ROS Advent Calendar 2021の10日目の記事を担当します。 約1年ぶりのブログ投稿となりました。

rclc

ROS2のC++言語用クライアントライブラリrclcpp、Python言語用クライアントライブラリrclpyはみなさんご存知ですよね。 rclcというのは、つまりC言語用クライアントライブラリのことです。

https://github.com/ros2/rclc

C言語のみを使って実装されているため、他言語やさまざまなOSへのポータビリティが非常に高いのが特徴です。 他のクライアントライブラリと同様に、クライアントライブラリ間で共通の実装を担うC言語で書かれたrclの上に実装されています。

ただ、rclだけではノードを実行する部分の実装などが足りておらず、その部分の実装をこのrclcが担っています。Executor(コンポーネント実装されたノードの実行器)の実装もあります。 ROS2クライアントライブラリが持つべき以下のような基本的な機能はすべて実装されているようです。

  • トピック
  • サービス
  • アクション
  • パラメータ
  • ライフサイクル
  • QoS
  • Executor

特にExecutorの実装はシングルスレッドで複数コンポーネントが決定的に周期動作するように実装されており、マイコン実行なども考慮されているようです。

macOS上でのrclcと最小限ROS2パッケージビルド

残念ながらROS 2 GalacticからmacOSはティア1サポートではなくなり、パッケージのバイナリ提供はなくなりました。 しかし、引き続きソースコードでのビルドは頑張ればできます。

https://docs.ros.org/en/galactic/Installation/macOS-Development-Setup.html

先日、1月以上待たされましたが、ようやく新型MacBook Proをゲットしました。 ParallelsやVMWare Fusionを使ってUbuntuでROS2を動かすことももちろんできますが、ぜひネイティブROS2を動かしてみたくなりますよね。

x86_64アーキテクチャのIntelプロセッサではなく、aarch64アーキテクチャのAppleシリコンで動いており、OSも最新のmacOS Montereyです。 ビルドは以前よりさらに難しくなっていることが予想されましたが、一日二日頑張ってみたら、テストを無効化して

  • rclc
  • CycloneDDS
  • ros2cli

に限定して試行錯誤すると上手くビルドできて、動作確認も取れました。

事前準備

https://docs.ros.org/en/galactic/Installation/macOS-Development-Setup.html#install-prerequisites

に従ってbrewpipを使って必要なライブラリやツールなどをインストールしてきます。

このとき、僕はRVizrqtをインストールするつもりはなかったので、それに関連するセットアップは省きました。

CycloneDDSインストール

ROS2 GalacticのデフォルトRMWはCycloneDDSです。

https://github.com/eclipse-cyclonedds/cyclonedds

こちらも後述するcolcon buildの手順でビルドできたら良かったのですが、ちょっと手こずって上手くいかなかったので、純粋にcmake --buildでビルドしてインストールすることにしました。

https://github.com/eclipse-cyclonedds/cyclonedds#for-application-developers

の方法に従って、いたって普通の手順でビルドするだけです。 cmake --buildだと拍子抜けするくらい何もつまづくことなく簡単にビルドできました。 インストール先は指定しないと/usr/local以下になりますので、その前提で進みます。

最小限ROS2パッケージのビルド

次にrclcとそれに付随する最小限構成のROS2パッケージをビルドしていきます。 そういったパッケージリストが公式にメンテナンスされているとありがたいのですが、どうやらありません。

ですので、全部入りパッケージリスト:

https://raw.githubusercontent.com/ros2/ros2/galactic/ros2.repos

から最小限ROS2パッケージリスト:

https://raw.githubusercontent.com/youtalk/rclc_on_macos/main/ros2.repos

を作成しました。違いは必要ないパッケージをコメントアウトしているだけです。

colcon buildの手順は以下の通りです。

1
2
3
4
5
6
7
8
9
$ mkdir -p ~/ros/galactic/src
$ cd ~/ros/galactic
$ wget https://raw.githubusercontent.com/youtalk/rclc_on_macos/main/ros2.repos
$ vcs import src < ros2.repos
$ export C_INCLUDE_PATH=/usr/local/include
$ export CPLUS_INCLUDE_PATH=/usr/local/include
$ pushd src/ros2/rclc && wget https://raw.githubusercontent.com/youtalk/rclc_on_macos/main/disable_example_pingpong.patch && patch -p1 < disable_example_pingpong.patch && popd
$ touch src/ros2/ros2cli/ros2lifecycle_test_fixtures/COLCON_IGNORE
$ colcon build --symlink-install --cmake-args -DBUILD_TESTING=OFF

手順途中の注意点は以下の通りです。

  1. exportコマンドでCycloneDDSのインストール先を教える。
  2. ビルドに失敗するため、rclcのデモ実装example_pingpongのビルドを行わない。
  3. rclcppの依存が発生するため、ros2cliのテストフィクスチャのビルドを行わない。
  4. テスト依存パッケージのビルドに失敗するため、テストはビルドしない。

特に2はソースコードを修正するとパッチが必要なくなると思うので、後ほどビルドエラーを見直してみます。

動作確認

さぁ、お待ちかねの動作確認です。ros2cliもビルドしたので、ros2コマンドが使えます。

1
2
3
$ source ~/ros/galactic/install/setup.zsh
$ ros2 run rclc_examples example_service_node
Service request value: 24 + 42
1
2
3
4
$ source ~/ros/galactic/install/setup.zsh
$ ros2 run rclc_examples example_client_node
Send service request 24 + 42.
Received service response 24 + 42 = 66.

動きました!

今後の展開

実際にはmacOSでROS2を動かしたくて始めたわけではありません。 そう、iOSでROS2を動かしたいのです。 ビルドツールや依存ライブラリ周りで再度困難が待ち受けてはいそうですが、Intel Macの時代よりは事情が単純になったはずです。 数年前に挑戦してみて諦めていましたが、AppleシリコンMacで再度挑戦してみます。

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.