C言語用ROS2クライアントライブラリrclcのmacOS Montereyビルド
ROS Advent Calendar 2021の10日目の記事を担当します。 約1年ぶりのブログ投稿となりました。
rclc
ROS2のC++言語用クライアントライブラリrclcpp
、Python言語用クライアントライブラリrclpy
はみなさんご存知ですよね。 rclc
というのは、つまりC言語用クライアントライブラリのことです。
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を動かしてみたくなりますよね。
待ちに待った新型MacBook Proが届いた🎉 https://t.co/LalnRTxoTR pic.twitter.com/BlcxyRF5d1
— youtalk #ROS2ではじめよう (@youtalk) December 2, 2021
x86_64アーキテクチャのIntelプロセッサではなく、aarch64アーキテクチャのAppleシリコンで動いており、OSも最新のmacOS Montereyです。 ビルドは以前よりさらに難しくなっていることが予想されましたが、一日二日頑張ってみたら、テストを無効化して
rclc
CycloneDDS
ros2cli
に限定して試行錯誤すると上手くビルドできて、動作確認も取れました。
事前準備
https://docs.ros.org/en/galactic/Installation/macOS-Development-Setup.html#install-prerequisites
に従ってbrew
やpip
を使って必要なライブラリやツールなどをインストールしてきます。
このとき、僕はRViz
やrqt
をインストールするつもりはなかったので、それに関連するセットアップは省きました。
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
手順途中の注意点は以下の通りです。
- exportコマンドで
CycloneDDS
のインストール先を教える。 - ビルドに失敗するため、
rclc
のデモ実装example_pingpong
のビルドを行わない。 rclcpp
の依存が発生するため、ros2cli
のテストフィクスチャのビルドを行わない。- テスト依存パッケージのビルドに失敗するため、テストはビルドしない。
特に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で再度挑戦してみます。
Comments powered by Disqus.