見出し画像

pixiでROS環境を構築する(インストール編)

チームでロボット開発をしていると各自の計算機環境を合わせるのが難しくなります。
仮想環境(VMwareやVirtualbox)やAWS, Googlecolab, Docker、condaなど多種多様なサービスがありますが、どれも双刃の剣というか一長一短で決定打にはなりませんでした。

ここでは2024年12月時点で最強と思われるpixiの使い方を紹介します。

パッケージマネージャー

これまでプラットフォームや言語によらないパッケージマネージャーとしてはcondaが有名でした。
pixiはパッケージ管理の課題を解決する新しい選択肢として提案され、prefix.dev というドイツのベルリンに本拠地を持つスタートアップにより開発されています。

conda と pixiの大きな違いは下記のとおりです。

  1. micromamba よりも約 3 倍、conda よりも 10 倍以上高速

  2. PyPI とのスムーズな統合

  3. グローバルインストールが可能(pixi global install git)

  4. ネイティブなロックファイル pixi.lock サポートにより再現性の高い環境を実現

$$
\begin{array}{|c|c|c|} \hline
ツール & pixi & pip & conda \\ \hline
速度 & 高速& 遅い & 遅い\\ \hline
安全性 & 正確 & まあまあ & 正確\\ \hline
セットアップ & 簡単 & 簡単 & 面倒 \\ \hline
\end{array}
$$

試した環境

MacBook Pro 15インチ, 2023

  • チップ:Apple M2 Max

  • メモリ:96 GB

  • macOS:macOS Sequoia バージョン15.1

pixiのインストール

公式サイト(https://pixi.sh/latest/)を参考に、下記のコマンドでpixiをインストールします。

curl -fsSL https://pixi.sh/install.sh | bash

このスクリプトを実行すると、最新バージョンのpixiが自動的にダウンロードされ、解凍されたpixiバイナリが~/.pixi/binにコピーされます。このディレクトリがまだ存在しない場合は、スクリプトが作成します。

このスクリプトはまた、~/.bash_profileを更新して、~/.pixi/binをPATHに含めるので、どこからでもpixiコマンドを起動できるようになります。

PyPIからのパッケージのインストール

Python Package Index(略称 PyPI)は、プログラミング言語Pythonの、サードパーティーソフトウェアリポジトリです。
PyPI パッケージをインストールしたい場合は、、 --pypi フラグを付けると、conda ではなく PyPI から取得してくれます。

$ pixi add --pypi pandas
✔ Added pandas >=2.2.3, <3
Added these as pypi-dependencies.

実行後の pixi.toml を見ると [dependencies] ではなく [pypi-dependencies] の中に追加されているのが確認できます。

[dependencies]
ros-humble-desktop = ">=0.10.0,<0.11"
ros-humble-turtlesim = ">=1.4.2,<2"
colcon-common-extensions = ">=0.3.0,<0.4"
setuptools = "<=58.2.0"

[pypi-dependencies]
numpy = "*"
pandas = ">=2.2.3, <3"

ROS2プロジェクトの作成

pixiのインストールが成功したら、続いて、下記のようにpixiのROS2プロジェクトを作成します。

pixi init ros2 -c robostack-staging -c conda-forge

ここで、-c は --channel の短縮形で、依存パッケージを取得する先のリポジトリを登録します。
ROS 関係のパッケージは robostack-staging から、Python 関係のパッケージは conda-forgeからインストールするという意味です。

https://prefix.dev/channels を確認すると、他に、 nvidia 、 pytorch などが Official の Channel として登録されています。

ROS2プロジェクトの作成が成功すると、カレントディレクトリにros2というディレクトリが作られるので、下記のコマンドで 生成されたpixi.tomlファイルの中身を確認しましょう。

cd ros2 && cat pixi.toml
[project]  
authors = ["Hiroyuki Okada <hiroyuki.okada@****>"] 
channels = ["robostack-staging", "conda-forge"] 
description = "Add a short description here" 
name = "ros2" 
platforms = ["osx-arm64"] 
version = "0.1.0"  

[tasks]

[dependencies]

これでROS2のプロジェクトが作成されました。次に、ROS2のパッケージを追加してみましょう。

ROS 2の依存関係を追加する

必要な依存関係はすべてpixiを通してpixi add コマンドで追加する必要があります。

2027/5 までサポートされるROS2のディストリビューションであるROS2 Humbleをインストールします。
同時に移動する亀のサンプルとして有名なturtlesimを追加しておきます。

cd ~/ros2
pixi add ros-humble-desktop ros-humble-turtlesim

ROS2ノードの実行

インストールが正常に終了したら、サンプルノードのturtlesimを実行してみます。
下記にノードを実行する2つの方法を紹介しますが、いずれも下記のような画面が表示されれば成功です。

turtlesimの実行画面

pixi run コマンドで直接、ROS2のノードを起動する

pixi run ros2 run turtlesim turtlesim_node

pixiシェルからROS2のノードを起動する

pixi shell
ros2 run turtlesim turtlesim_node

自作のPythonノードの作成

空のPythonパッケージの作成

pkg create コマンドで my_node my_package という名前でパッケージを作成します。

pixi run ros2 pkg create --build-type ament_python --destination-directory src --node-name my_node my_package

必要な依存関係の追加

パッケージをビルドするのに必要な依存関係を追加します。
colcon は robostack-staging から、setuptools は conda-forge から追加されます。

pixi add colcon-common-extensions "setuptools<=58.2.0"

パッケージビルドの実行

pixi run colcon build

パッケージのビルドが成功すると、install 、 build 、 log の三つのフォルダが生成されます。
install フォルダ内には作成した自作の Python ノードを実行するためのスクリプトが格納されます

通常、このスクリプトは.bashrcに追加しますが、代わりにpixi.tomlに以下を追加して、pixiにこのスクリプトを使うように指示します。

[activation]

scripts = ["install/setup.sh"]

Pythonノードの実行

下記のようにPythonノードを実行します

pixi run ros2 run my_package my_node

ROS2環境のカスタマイズ

pixiにはタスクという機能があり、マニフェストファイルにタスクを定義し、簡単なコマンドで実行することができます。turtlesimサンプルと自作Pythonノードを実行するタスクや開発時によく使うコマンドを追加してみましょう。

pixi task add sim "ros2 run turtlesim turtlesim_node"

pixi task add build "colcon build --symlink-install"

pixi task add hello "ros2 run my_package my_node"

カスタマイズしたタスクは、次のように実行します。

pixi run sim

pixi run build

pixi run hello

タスクはpixiの強力な機能です。

  • タスクにdepends-onを追加して、タスクチェーンを作ることができます。

  • タスクに cwd を追加して、プロジェクトのルートとは別のディレクトリでタスクを実行できます。

  • タスクにインプットとアウトプットを追加して、インプットが変更されたときだけ実行されるタスクを作成することができます。

  • ターゲット構文を使うと、特定のマシンで特定のタスクを実行することができます。

タスクのカスタマイズはpixi.tomlを編集することで実現します。

[tasks]
sim = "ros2 run turtlesim turtlesim_node"
build = {cmd = "colcon build --symlink-install", inputs = ["src"]}
hello = { cmd = "ros2 run my_package my_node", depends-on = ["build"] }



いいなと思ったら応援しよう!