🧚

Rust 製の超高速パッケージマネージャ pixi で ROS 2 に入門する

2024/12/14に公開

はじめに

この記事は CyberAgent AI Lab Advent Calendar 2024 の 14 日目の記事です。

サイバーエージェント AI Lab Agent Development チームの星牟禮です。普段は対話エージェントの開発や運用に関する研究開発に従事しています。

https://research.cyberagent.ai/interactive-agent/

動機: macOS でも ROS 2 開発がしたい!

サイバーエージェントの AI Lab では、ROSCon JP 20232024 のスポンサーを務めるなど、対話ロボットや移動ロボット開発のために 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のチームメンバー
prefix.dev のチームメンバー

また、彼らはPackagingCon と呼ばれるパッケージ管理のカンファレンスを開催しています。Homebrew, WinGet, Chocolatey といった普段触れている様々なパッケージマネージャの裏話が聞けるので、興味のある方はぜひ覗いてみると面白いと思います。

https://www.youtube.com/playlist?list=PLl386dCR5QGTElF3MbltCJupNG1lHK4Nr

余談: conda と pixi との違いは?

conda と pixi の違いについては、prefix.dev の開発者ブログで Wolf が語っていますが、主な違いとしては以下が挙げられています。

  1. micromamba よりも約 3 倍、conda よりも 10 倍以上高速
  2. PyPI とのスムーズな統合(内部で uv を使って Rust でパッケージ解決を行っているそう)
  3. Miniconda 環境が不要 → 面倒な基本設定が不要
  4. グローバルインストール可能(pixi global install git
  5. conda activate / deactivatepixi shell
  6. タスク定義が可能であり、開発者間の共同作業が用意
  7. ネイティブなロックファイル pixi.lock サポートにより再現性の高い環境を実現

https://prefix.dev/blog/pixi_a_fast_conda_alternative

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 the init 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 からインストールするということを実現できます。他にも nvidiapytorch などが 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

ビルドが完了すると installbuildlog フォルダが生成されます。 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 では、リサーチサイエンティストやリサーチエンジニアを募集しています。ご興味のある方はお気軽にぜひご応募ください!

https://research.cyberagent.ai/interactive-agent/

Discussion