💻

ROS 2+apptainerで仮想環境生活

2023/12/09に公開

はじめに

こんにちは,永遠の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の削除の方法は以下のとおりです.

  1. goのあるフォルダのPath確認
which go
  1. フォルダの削除
sudo rm -rf /usr/local/go
sudo rm /etc/paths.d/go
  1. 再度,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を対応するものに書き換えて下さい.

~/ros2_ws
apptainer build ros2_foxy docker://osrf/ros:foxy-desktop

余談ですが,ローカルのイメージを使うことも可能です.

apptainer build --sandbox [sandbox_name] docker-daemon://(image_name):latest

Sandboxの編集

Sandboxを作成したら,いよいよコンテナ内に入っていきます.
--fakerootをオプションとして付与することで,sudoに入っていないユーザでもコンテナ内でroot権限を行使できるようになります.感動的だ.
また,オプションに追加で--writableを付与することで,コンテナ内の書き込みが可能となります.

~/ros2_ws
apptainer shell --fakeroot --writable ros2_foxy

これでコンテナ内に入ることができました,ようこそ仮想環境へ.

コンテナ初回起動時には,以下のコマンドを実行してパッケージを最新に.
なお,--fakerootを付けているのでコマンド実行時にsudoはつける必要ありません

コンテナ内
apt update
apt upgrade -y #必要であれば

また,rosdepも忘れずにアップデート

コンテナ内
rosdep update

ではでは,いよいよ環境を整えていきます.
まずは,作業フォルダに移動.

コンテナ内
cd ~/ros2_ws/foxy_ws/src

必要なリポジトリをクローン,ワークスペースをビルド.

~/ros2_ws/foxy_ws(コンテナ内)
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