TL;DR
- これまでROS 2のmacOSサポート状況は決して手厚いとは言えない状況でした
- pixiの登場によってmacOSでもROS 2ソフトウェア開発ができるようになってきました
- 今後のpixiの発展に期待しましょう!
1. 昨今のROS 2のサポート事情
ROS 2 Jazzy時点でmacOS(かつ、amd64)のサポートはTier3でソースビルドのみとなっています。そのため、ROS 2のmacOSサポート状況は決して手厚い状況ではありません。
※https://www.ros.org/reps/rep-2000.html#jazzy-jalisco-may-2024-may-2029より引用
2. macOS上におけるROS 2環境構築
一方、普段使い慣れているmacOSでROS 2ソフトウェア開発をしたい方も一定数居ます。macOS上におけるROS 2環境構築は以下のパターンがあります。
- ソースビルド
- Dockerコンテナ
- pixi
- pixi + Dockerコンテナ
それぞれの概要、メリット、デメリットを述べていきます。
2.1 ソースビルド
公式ドキュメントはhttps://docs.ros.org/en/jazzy/Installation/Alternatives/macOS-Development-Setup.htmlにあります。先人たちの涙ぐましい取り組みは以下にあります。
- https://roscon.jp/2023/presentations/019.pdf
- https://github.com/TakanoTaiga/ros2_m1_native
- https://www.docswell.com/s/dandelion1124/KM1PJL-2024-02-13-093736
- https://ar-ray.hatenablog.com/entry/2023/12/24/115051
「ソースビルド」におけるメリット、デメリットについては後述します。
メリット
- GPUなどの各種アクセラレータが使える
- USBカメラなどのセンサデバイスが使える
- ネイティブで動作させるため、シミュレータ環境、RViz2などが高速に動作する
デメリット
- HomebrewでROS 2関連のパッケージは管理されていないため、必要なパッケージは基本的にソースビルドが必要
- パッケージ依存解決にrosdepが使えない
- Homebrewのパッケージ更新によって頻繁にビルドできなくなるため、定期的なメンテナンスが必要
- ホスト環境が汚れる
2.2 Dockerコンテナ
macOS上のDockerコンテナ上でROS 2を動かす方法があります。CUIのみであればhttps://hub.docker.com/_/rosで十分ですが、GUIツール(Rqtツール、RViz2、Gazeboなど)を使う場合、https://github.com/Tiryoh/docker-ros2-desktop-vncで動かすのが楽ちんです。
「Dockerコンテナ」におけるメリット、デメリットについては後述します。
メリット
- apt、rosdepが使えるため、パッケージインストール、依存解決が簡単
- Ubuntuと同じ操作コマンドのため、そちらに慣れている方にはハードルが低い
- ホスト環境が汚れない
デメリット
- GPUなどの各種アクセラレータが使えない
- USBカメラなどのセンサデバイスが使えない
- GUIアプリケーション(シミュレータ環境、RViz2)をDockerコンテナ上で動かすと低速
GUIありでGazebo Fortressを起動するとCPU使用率が以下のようになります。Gazebo FortressのプロセスのCPU使用率が高くなっていることがわかります。
GUIなし(headless mode)でGazebo Fortressを起動するとCPU使用率が以下のようになります。GUIありよりもCPU使用率が下がっているものの、Gazebo FortressのプロセスのCPU使用率が高くなっていることがわかります。
2.3 pixi
クロスプラットフォーム対応のパッケージ管理システムpixiがあり、ROS 2パッケージも配布しています。対応しているパッケージが気になる方はhttps://prefix.dev/channels/robostack-stagingを読むとよいでしょう。
本記事ではpixiそのものの詳細は取り上げないので気になる方は以下のページを参照ください。
- https://pixi.sh/latest/tutorials/ros2/
- https://note.com/hiroyuki_okada/n/n619b16943f0a
- https://zenn.dev/yahooshiken/articles/getting-started-ros2-with-pixish
- https://www.docswell.com/s/zibaanyan/KWWRYD-2024-12-28-113147
「pixi」におけるメリット、デメリットについては後述します。
メリット
-
pixi add
が使えるため、パッケージインストール、依存解決が簡単 - ワークスペース単位で分離されているのでホスト環境が汚れない
デメリット
- パッケージ依存解決にrosdepが使えない
- コマンドに
pixi run
を付ける必要があるため、少し慣れが必要
2.4 pixi + Dockerコンテナ
pixiとDockerコンテナを併用することでそれぞれの欠点を補う方法です。詳細はhttps://qiita.com/dandelion1124/items/cf6399071744049b7370を参照ください。
macOSのDockerコンテナ上でIgnition Gazebo、ナビゲーションを動かし、macOSネイティブでRViz2使って可視化するという全部macOS上で動かすやつができた。これで謎のビルド修行からかなり解放される。 pic.twitter.com/4kEnhyBAio
— dandelion (@dandelion1124) June 26, 2024
「pixi + Dockerコンテナ」におけるメリット、デメリットについては後述します。
メリット
- pixi
- ワークスペース単位で分離されているのでホスト環境が汚れない
- Dockerコンテナ
- apt、rosdepが使えるため、パッケージインストール、依存解決が簡単
- ホスト環境が汚れない
デメリット
- pixi
- パッケージ依存解決にrosdepが使えない
- コマンドに
pixi run
を付ける必要があるため、少し慣れが必要
- Dockerコンテナ
- GUIアプリケーション(シミュレータ環境、RViz2)をDockerコンテナ上で動かすと低速
- 全般
- 何をpixiで動かして、何をDockerで動かすかの判断、パッケージ構成を工夫する必要がある
4. pixi上でGazebo、navigation2を動かす
pixi上でどこまでできそうかを掴むためにGazebo、navigation2を動かしてみます。
4.1 動作確認環境
今回動作確認に用いた開発環境は以下の通りです。
- MacBook Air (15インチ, M3, 2024)
- macOS Sonoma 14.4
- Docker Desktop on Mac 4.39.0
- pixi 0.45.0
4.2 GitHubリポジトリ
以下の図からpixi上でGazebo Fortressとnav2を動かせるソースコード一式を以下のリポジトリに格納しています。
https://github.com/atinfinity/pixi_ros2_gazebo_example
4.3 動作確認
pixi上でGazebo Fortressとnav2が動かせていることがわかります。
Gazebo Ignition、navigation2全部macOS上のpixiで動かすことに成功! pic.twitter.com/NVkE7sjbGe
— dandelion (@dandelion1124) April 10, 2025
また、pixi上でGUIなし(headless mode)でGazebo Fortressを起動するとCPU使用率が以下のようになります。macOSネイティブ上で実行しているため、Gazebo FortressのプロセスのCPU使用率が減っていることがわかります。
追加で3D LiDARのシミュレーションも追加してみましたが、こちらもmacOSネイティブ上で実行しているため、快適に動作しています、
macOSネイティブ実行だとGazeboの3D LiDARもさくさく動くよの図。 pic.twitter.com/hfpeYSBbu0
— dandelion (@dandelion1124) April 27, 2025
4.4 制限事項
- Gazebo FortressのGUIが使えない https://github.com/gazebosim/gz-sim/issues/2848
- macOSのpixiでOgre 2が正常に動作しないのでOgre 1にする必要があります
また、はっきりと原因を特定できていませんが、2D LRFのURDFを以下のように記述していました。
<scan>
<horizontal>
<samples>1000</samples>
<resolution>1</resolution>
<min_angle>-3.141592</min_angle>
<max_angle>3.141592</max_angle>
</horizontal>
</scan>
ただし、これをそのまま使うと以下のようになってしまいました・・・。
そのため、verticalタグを追加して回避しています。
<scan>
<horizontal>
<samples>1000</samples>
<resolution>1</resolution>
<min_angle>-3.141592</min_angle>
<max_angle>3.141592</max_angle>
</horizontal>
<vertical>
<samples>2</samples>
<resolution>0.01</resolution>
<min_angle>-0.01</min_angle>
<max_angle>0.01</max_angle>
</vertical>
</scan>