ROS 2+apptainerで仮想環境生活
はじめに
こんにちは,永遠のROS 2初心者 兼 永遠の仮想環境初心者のざきまつです.
本記事は,ROS 2 Advent Calendar 2023 9日目の記事になります
ROS 2 Advent Calendar 2023
ざっくり言うと,以下のZenn記事をもとにROS 2の環境構築を行ったものになります.
ROS+Singularity(Apptainer)入門 - Zenn
以前に似た内容の記事を作成しましたが,内容がないようだ かなりテキトーだったので削除し,内容をアップデート+加筆したものになります.
アドバイスや指摘等ありましたら気軽にコメント or Twitter X:@santana_hammer までお知らせください.
色んなディストリビューションを扱いたいですよね?
もしよければ,Apptainer(Singularity)も視野に入れてくれると,僕は喜びます.
あと,haganeさん(ROS+Singularity(Apptainer)入門の執筆者)も多分喜びます.
事の発端
- 研究室でROS 2を使って実験システムを構築することになった
- ワークステーションにUbuntu22.04+ROS 2 Humbleの環境を作った
- 使いたいPackageがFoxy-develになってて,Humbleに対応しているかわからない
- え,OS入れ直し...?
- せや!!Hibikino-Musashi@Homeで使ってたSingularityもといApptainerを使うか!!
Why Apptainer?
SingularityもといApptainerは,ハイパフォーマンスコンピューティング(HPC)向けのコンテナ技術です.
大学・研究所等,複数ユーザがスパコンを利用するような環境で導入されています.
ここまで書くと,「え,個人使用のワイらには要らんくね?」と思うかもしれませんが,こいつには以下のような利点があります.
- sudo権限が不要なため、一般ユーザアカウントでコンテナを起動・停止が可能
- Dockerで作成されているコンテナイメージがそのまま使用可能
- 実行ユーザアカウントの権限をそのままコンテナに引き継ぎ可能
- コンテナ起動時にオプションを付与すれば,GPUが使用可能
- デフォルトでホストの
$HOME
下をコンテナに共有
まぁ、僕自身よくわかってないですが,ローカルと同じ使用感で使えるといったところでしょうか(超ざっくり)
Dockerはコンテナがローカルから独立したもので,コンテナ外のリソースを参照するのが少しめんどくさいです.
しかし,Appptainerはローカルのリソースを直接参照することが可能であり,コンテナ外に容易にアクセスできるという利点があります.
さらにさらに,コンテナ内を好きに書き換えることも可能です.すばらい.
作業環境
Linux Ubuntu 22.04
Apptainer(Singularity)の導入
公式ドキュメントであるInstalling Apptainer - GitHubに従って導入してください.
URLが皆さんの導入するバージョンにあっていない可能性もあるので,しっかりとバージョンを確認してください.
まず,開発ツールとライブラリをホストにインストール.
sudo apt-get update
sudo apt-get install -y \
build-essential \
libseccomp-dev \
pkg-config \
uidmap \
squashfs-tools \
squashfuse \
fuse2fs \
fuse-overlayfs \
fakeroot \
cryptsetup \
curl wget git
次に,Goのインストール
export GOVERSION=1.19.6 OS=linux ARCH=amd64 # change this as you need
wget -O /tmp/go${GOVERSION}.${OS}-${ARCH}.tar.gz \
https://dl.google.com/go/go${GOVERSION}.${OS}-${ARCH}.tar.gz
sudo tar -C /usr/local -xzf /tmp/go${GOVERSION}.${OS}-${ARCH}.tar.gz
PATH環境変数に/usr/local/go/binを追加.
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
次に,gitでApptainerのリポジトリをクローン.
git clone https://github.com/apptainer/apptainer.git
cd apptainer
今回はバージョン1.2.3を入れるので,以下を実行.
git checkout v1.2.3
そして,Apptainerをコンパイル.
./mconfig
cd ./builddir
make
sudo make install
最後に,バージョンを確認して導入されたかを確認.
apptainer --version
導入時の注意点
Goが指定のバージョン出ない場合,途中でエラーが発生して導入できません.
多分,コンパイルするときにmake:***
というエラーが出ると思います.
Goを完全に削除してから,再度導入を行ってください.
Goの削除の方法は以下のとおりです.
- goのあるフォルダのPath確認
which go
- フォルダの削除
sudo rm -rf /usr/local/go
sudo rm /etc/paths.d/go
- 再度,goのあるフォルダのPath確認
which go
これで,何も表示されなければ削除完了です.
再度,ドキュメント指定のバージョンを入れてあげましょう.
Sandboxの作成
コンテナを作成する前に,自分の好きな環境を作成するためにまずSandboxを作成します.
Sandboxを利用することで,いわゆるコンテナ内の環境を好きに編集することが可能になります.
とりあえず,まずはROS 2用のワークスペースを作成します.
mkdir -p ~/ros2_ws/foxy_ws/src
cd ~/ros2_ws/
ROSを触る際の通過儀礼みたいなものですね,簡単です.
Singularityは,DockerHubにあるイメージを使ってコンテナ(Sandbox)を作成することが可能です.
なので,ここはビルド済みのイメージを使って行きましょう.
以下のコマンドで,Sandboxを作成します.
今回導入したROS 2のディストリビューションはFoxy
です.
他のディストリビューションを使いたいときは,適宜Foxy
を対応するものに書き換えて下さい.
apptainer build --sandbox ros2_foxy docker://osrf/ros:foxy-desktop
余談ですが,ローカルのイメージを使うことも可能です.
apptainer build --sandbox [sandbox_name] docker-daemon://(image_name):latest
Sandboxの編集
Sandboxを作成したら,いよいよコンテナ内に入っていきます.
--fakeroot
をオプションとして付与することで,sudoに入っていないユーザでもコンテナ内でroot権限を行使できるようになります.感動的だ.
また,オプションに追加で--writable
を付与することで,コンテナ内の書き込みが可能となります.
apptainer shell --fakeroot --writable ros2_foxy
これでコンテナ内に入ることができました,ようこそ仮想環境へ.
コンテナ初回起動時には,以下のコマンドを実行してパッケージを最新に.
なお,--fakeroot
を付けているのでコマンド実行時にsudo
はつける必要ありません
apt update
apt upgrade -y #必要であれば
また,rosdepも忘れずにアップデート
rosdep update
ではでは,いよいよ環境を整えていきます.
まずは,作業フォルダに移動.
cd ~/ros2_ws/foxy_ws/src
必要なリポジトリをクローン,ワークスペースをビルド.
source /opt/ros/foxy/setup.bash
colcon build --symlink-install
これで環境構築を行うことができました,あとはいつも通りに使用することが可能です.
注意点
多分,ローカルで構築するときに楽したい人は以下のコマンドを実行して,~/.bashrc
に書き込みをすると思います.
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
これすると,特定のディストリビューションしか動かなくなっちゃうので,やらないようにしてください.
めんどくさいですが,毎回source /opt/ros/[dist_name]/setup.bash
を実行しましょう.
おわりに
仮想環境というと,どうしてもDocker一強になってしまう印象です.
しかし,今回紹介したApptainerはローカルマシンと同じ環境を使用することができ,かつコンテナ内に書き込むことが可能,GPUも簡単に仕様可能です.
「Humble入れたのにPackageがHumbleに対応していない!」
「Foxy使ってるのにPackageがHumbleからしかない!」
というとき,環境を作り直さなければならないというやばい事態を回避することができます.
また,初心者の方でもローカルの環境を破壊することなく,色々と練習できるのではないでしょうか.
他のネタを一応考えてはいたのですが,かなり特殊な環境の内容だったのでボツになりました
それでは皆様,良い仮想環境生活をお送りください.
ざきまつ
Discussion