Rust 製の超高速パッケージマネージャ pixi で ROS 2 に入門する
はじめに
この記事は CyberAgent AI Lab Advent Calendar 2024 の 14 日目の記事です。
サイバーエージェント AI Lab Agent Development チームの星牟禮です。普段は対話エージェントの開発や運用に関する研究開発に従事しています。
動機: macOS でも ROS 2 開発がしたい!
サイバーエージェントの AI Lab では、ROSCon JP 2023 や 2024 のスポンサーを務めるなど、対話ロボットや移動ロボット開発のために ROS を使う開発者が多いです。私は普段 ROS 2 をメインで使う開発者ではないのですが、他の人の書いた ROS 2 のコードをちょっとだけ動かしたい場合があります。そのような場合に、普段私が使用している macOS で、ローカルでサクッと ROS 2 環境を構築できるとかなりありがたいです。今回、macOS (Apple Silicon) のローカル環境に ROS 2 を環境構築しようと思ったときに、あまり情報がなかったので今回投稿してみることにしました。この記事が、これから ROS 2 に入門したい開発者や学生に届けば幸いです。
pixi とは?
pixi はクロスプラットフォームかつ多プログラミング言語に対応したパッケージマネージャで、prefix.dev というドイツのベルリンに本拠地を持つスタートアップにより開発されています。GitHub のスター数も 2023 年の 6 月 9 日に v0.0.1 がリリースされてから、約 1 年半で 3.5k を超えているなど、開発者からの注目を集めています。
prefix.dev について詳しく調べてみると、CEO の Wolf は mamba(高速化した conda の再実装)の開発者および conda-forge のコアメンバーかつ、RoboStack プロジェクトの創設者であり、またチームメンバーにもロボティクスのバックグラウンドを持つメンバーが多く集まっているようです。
prefix.dev のチームメンバー
また、彼らはPackagingCon と呼ばれるパッケージ管理のカンファレンスを開催しています。Homebrew, WinGet, Chocolatey といった普段触れている様々なパッケージマネージャの裏話が聞けるので、興味のある方はぜひ覗いてみると面白いと思います。
- How fast can we brew? – Max McDonnell
- WinGet and Chocolatey: A Real-World Look at Package Management Tools on Windows
- Bzlmod: the package manager for Bazel – Yun Peng
余談: conda と pixi との違いは?
conda と pixi の違いについては、prefix.dev の開発者ブログで Wolf が語っていますが、主な違いとしては以下が挙げられています。
- micromamba よりも約 3 倍、conda よりも 10 倍以上高速
- PyPI とのスムーズな統合(内部で
uv
を使って Rust でパッケージ解決を行っているそう) - Miniconda 環境が不要 → 面倒な基本設定が不要
- グローバルインストール可能(
pixi global install git
) -
conda activate / deactivate
→pixi shell
- タスク定義が可能であり、開発者間の共同作業が用意
- ネイティブなロックファイル
pixi.lock
サポートにより再現性の高い環境を実現
pixi で ROS 2 開発環境構築
それでは、実際に pixi を使って macOS (Apple Silicon) に ROS 2 をインストールしていきます。
pixi が公式で公開している ROS 2 の環境構築チュートリアルがあるので、基本的にはそれに従えば大丈夫です。
検証端末
検証した端末のマシンスペックは以下です。
- MacBook Pro 2023 model
- チップ: Apple M2 Max
- メモリ: 64GB
- macOS: 14.6.1 (23G93)
pixi のインストール
まず、下記のコマンドで pixi をインストールします(macOS および Linux の場合)。
curl -fsSL https://pixi.sh/install.sh | bash
公式の Installation によると、Homebrew でのインストールや Cargo でソースからビルドすることも可能です。
クロスプラットフォーム対応しているので Windows でも下記のコマンドでインストールすることができます。
iwr -useb https://pixi.sh/install.ps1 | iex
pixi プロジェクトの作成
pixi がインストール出来たら、以下のコマンドで pixi のプロジェクトを作成します。
pixi init ros2 -c robostack-staging -c conda-forge
conda を普段から使う人には慣れているかもしれませんが、-c
は --channel
の短縮形で、依存パッケージを取得する先のリポジトリを登録することができます。
The
channels
you added to theinit
command are repositories of packages, you can search in these repositories through our prefix.dev website.
利用可能な Channel の一覧は https://prefix.dev/channels から確認することができます。ROS 関係のパッケージは robostack-staging
から、Python 関係のパッケージは conda-forge
からインストールするということを実現できます。他にも nvidia
、 pytorch
などが Official の Channel として登録されていました。
cd ros2 && cat pixi.toml
ros2
ディレクトリが生成され、その中に pixi.toml
ファイルが生成されています。
[project]
authors = ["Hoshi Kenya <hoshimure.47@gmail.com>"]
channels = ["robostack-staging", "conda-forge"]
description = "Add a short description here"
name = "ros2"
platforms = ["osx-arm64"]
version = "0.1.0"
[tasks]
[dependencies]
ROS 2 の依存関係の追加
pixi add
コマンドを利用して、 ROS 2 Humble を追加してみます。pixi run
で実行すると、すぐに亀が確認できます。
pixi add ros-humble-desktop ros-humble-turtlesim
pixi run ros2 run turtlesim turtlesim_node
もしくは pixi shell
コマンドで、仮想環境を有効化することで、
pixi run
コマンドを使用することなく ros2
コマンドが使えるようになります。
pixi shell
ros2 run turtlesim turtlesim_node
Rviz も動きます。
pixi run rviz2
カスタム Python ノードを作ってみる。
それでは、自作の Python の ROS 2 ノードを作ってみます。
ros2 pkg create --build-type ament_python --destination-directory src --node-name my_node my_pkg
ビルドのために colcon と setuptools の依存関係を追加します。pixi のおかげで colcon は robostack-staging からで、setuptools は conda-forge から追加するみたいなことができるようになっているんですね。
pixi add colcon-common-extensions "setuptools<=58.2.0"
pixi run colcon build
ビルドが完了すると install
、 build
、 log
フォルダが生成されます。 install
フォルダ内に作成したカスタムの Python ノードを使用するためのスクリプトが格納されます。通常の ROS 2 を使った開発では、 .bashrc
に記述しますが、pixi が Python ノードを使えるように pixi.toml
に追記します。
[activation]
scripts = ["install/setup.sh"]
以下のようにカスタムの Python ノードを実行することができました。
pixi run ros2 run my_pkg my_node
# Hi from my_pkg.
よく使うコマンドをタスクとして登録しておく
開発中やリリース時などによく使うコマンドのシーケンスを、タスクとして登録しておくことができます。開発者間で、複雑なビルドやテストのコマンドや手順などを容易に共有することが可能です。
pixi task add build "colcon build --symlink"
pixi task add hello "ros2 run my_pkg my_node"
pixi run build
pixi run hello
PyPI パッケージのインストール
ちなみに、PyPI パッケージをインストールする場合には、、 —pypi
フラグを付けると、conda ではなく PyPI から取得してくれます。実行後の pixi.toml
を見ると [dependencies]
ではなく [pypi-dependencies]
の中に追加されていることが分かります。
pixi add --pypi pyaudio
終わりに
pixi で ROS 2 環境を macOS に構築する手順について説明しました。使ってみた感想として、Rust 製のため動作もかなり高速で、かなり開発者体験も良かったです。コミュニティも活発で、ぜひ群雄割拠のパッケージ管理世界の覇権を取ってほしいなと期待しています。
最後に、AI Lab では、リサーチサイエンティストやリサーチエンジニアを募集しています。ご興味のある方はお気軽にぜひご応募ください!
Discussion