1. はじめに
この記事は Ubuntu 22.04 までしかサポートしていない ROS2 humble 環境を lxc で構築する手順メモです。
昔 ROS2 dashing を構築した際のローカルメモ(下書き)よりもより良い記事があったため参考にさせていただきました。
構成は下記の通り。
項目 | |
---|---|
機種名 | HP Pavilion Aero 13-bg |
CPU | AMD Ryzen 7 8840U |
GPU | Radeon 780M |
RAM | 16 GB |
SWAP | 16 GB |
Host OS | Kubuntu 24.04 |
Host OS 側ユーザー名 | user |
Guest OS | Ubuntu 22.04 |
Guest OS 側ユーザー名 | ubuntu (デフォルト&変更可) |
ROS2 | humble |
2. 作業の流れ
3. lxd / lxc の準備
3.1. lxd / lxc のインストール
3.2. lxc の設定
3.3. GUI / Sound の共有
3.4. ディレクトリの共有(任意)
3.5. 設定の確認
4. コンテナ内環境構築
4.1. 基本パッケージ(日本語含む)のインストール
4.2. ssh の有効化
4.3. IP アドレスの固定
5. ROS2 Humble インストール
6. MoveIt2 インストール
3. lxd / lxc の準備
コンテナ名を適宜決めて、一時的なシェル変数に設定
LXCNAME=ros2-humble
3.1. lxd / lxc のインストール
今は lxd は snap 側で管理されているため、snap によるインストール&初期設定。
lxd init での設定は、基本的にすべて default でも問題なし(好みで変更)
sudo snap install lxd
sudo lxd init
コンテナの作成(初回はダウンロードで少し時間がかかります)
sudo lxc launch ubuntu:22.04 $LXCNAME
3.2. lxc の設定
Host 側の UID/GID と共通化
(現在のアカウント以外と共通化する場合は適宜変更)
sudo lxc config set $LXCNAME raw.idmap "both $(id -u) $(id -g)"
3.3. GUI / Audio の共有
GUI, Audio の作業ディレクトリを Host 側と bind して共有
sudo lxc config device add $LXCNAME audio disk source=/run/user/1000/pulse/native path=/tmp/.pulse-native
sudo lxc config device add $LXCNAME xorg disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0
video グループの GID を gpu に割り当てて共有
sudo lxc config device add $LXCNAME gpu gpu gid=`getent group video | cut -d: -f3`
3.4. ディレクトリの共有(任意)
その他、Host 側とディレクトリを共有したい場合は適宜下記コマンドで追加
(e.g. Host 側 /home/user/Downloads, Guest 側 /home/ubuntu/Downloads を共有する場合)
sudo lxc config device add $LXCNAME share disk source=/home/user/Downloads path=/home/ubuntu/Downloads
3.5. 設定の確認
以下で設定を確認できます。
both 1000 1000, audio, xorg, gpu など追加されていることが確認できます。
sudo lxc config show $LXCNAME
4. コンテナ内環境構築
コンテナ内で作業するため、bash を実行
(ログアウトするまでroot権限なので注意)
sudo lxc exec $LXCNAME /bin/bash
4.1. 基本パッケージ(日本語含む)のインストール
まずは最新の環境にまで upgrade
apt update && apt full-upgrade -y && apt autoremove -y
基本的なパッケージのインストール
apt install -y x11-apps pulseaudio dbus-x11 language-pack-ja fonts-noto-cjk-extra task-japanese-gnome-desktop language-pack-gnome-ja-base language-pack-gnome-ja gnome-user-docs-ja gnome-control-center fonts-noto-color-emoji manpages-ja fcitx5-mozc ibus-mozc
サウンドの設定
sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf
日本語設定/ロケール設定
update-locale LANG=ja_JP.UTF-8
timedatectl set-timezone Asia/Tokyo
localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
localectl set-x11-keymap jp jp106
source /etc/default/locale
dbus-uuidgen > /var/lib/dbus/machine-id
ubuntu ユーザーに切り替えて、ユーザー個別の設定
su - ubuntu
im-config -n fcitx5
source /etc/default/locale
下記コマンドで ~/.profile に追記
cat << 'EOF' >> ~/profile
export PULSE_SERVER=unix:/tmp/.pulse-native
export LANG=ja_JP.UTF8
export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS=@im=fcitx5
export DefaultIMModule=fcitx5
if [ \$SHLVL = 1 ] ; then
(fcitx5 > /dev/null 2>&1 &)
xset -r 49 > /dev/null 2>&1
fi
EOF
ここまでの作業を確実に反映させるためコンテナの再起動
(Host 側に戻ります)
sudo reboot
4.2. ssh の有効化
ホストからゲストに ssh でログインするための鍵を作成
(すべて未指定の改行のみでもOKですが、気になる方は適宜指定を)
また、ここで作成された公開鍵(ros2-humble.pub)の中身を後で使うので、画面上に表示やメモ帳などにコピーしておく
ssh-keygen -f ~/.ssh/${LXCNAME}
cat ~/.ssh/${LXCNAME}.pub
ssh-ed25519 ABCDEFG...(略) user@host
Guest 側に移行
sudo lxc exec $LXCNAME /bin/bash
Guest 側に ssh をインストール
apt install ssh
鍵による認証を有効にするため /etc/ssh/sshd_config
の PubkeyAuthentication
を yes
に変更
nano /etc/ssh/sshd_config
#PubkeyAuthentication no
↓
PubkeyAuthentication yes
ユーザーを ubuntu
に切り替えた後、先程作成した公開鍵を ~/.ssh/authorized_keys
に保存する。
(先述の ssh-ed25519 ABCDEFG...(略) user@host
をそのまま ~/.ssh/authorized_keys
に書き込みでOK)
su - ubuntu
nano ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
ssh-ed25519 ABCDEFG...(略) user@host
権限の設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4.3. IP アドレスの固定
事前に lxdbr0 のネットワークアドレスを把握しておく。
ip a |grep lxdbr0 | grep inet
手元では出力結果が 10.169.78.1/24 でした。
inet 10.169.78.1/24 scope global lxdbr0
下記コマンドで IP アドレスの固定化を行う。
IP は先程確認したネットワークアドレス内で決める(今回は 10.169.78.100
とした)。
その後再起動。
sudo lxc network attach lxdbr0 ${LXCNAME} eth0 eth0
sudo lxc config device set ${LXCNAME} eth0 ipv4.address 10.169.78.100
sudo lxc restart ${LXCNAME}
コンテナにアクセスしやすいように、固定化したIPアドレスを登録させておく
echo "10.169.78.100 ${LXCNAME}" | sudo tee -a /etc/hosts > /dev/null
Host 側のユーザーで、ssh で Guest 側にアクセスする際の設定を行う。
~/.ssh/config をエディタで開き、下記を追記
(-X オプションをデフォルトで有効にするため ForwardX11 yes
を指定)
Host ros2-humble
HostName ros2-humble
ForwardX11 yes
User user
IdentityFile ~/.ssh/ros2-humble
ssh 接続テスト
ssh ros2-humble
正常に接続できたn、以降の作業はすべてこの ssh 越しで作業を行います。
5. ROS2 Humble インストール
以降の手順は公式との差異はありません。
universe リポジトリを有効化
sudo apt install software-properties-common
sudo add-apt-repository universe
GPG key の取得
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
ROS2 humble のリポジトリを追加
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
リポジトリの反映と必要パッケージのインストール
sudo apt update && sudo apt upgrade
sudo apt install ros-humble-desktop
sudo apt install ros-dev-tools
サンプルテスト
下記コマンドで受信待ち
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
もう一つのコンソールを立ち上げ、ssh ros2-humble にログインし、
下記コマンドで listener を起動し、受信待ちの listener へ通知が届けばOK
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
6. MoveIt2 インストール
こちらも同様に ssh ros2-humble でログインして作業を行います。
手順も下記公式の通りです。
下記で moveit をインストール
sudo apt install ros-humble-moveit
デモを起動
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=panda_moveit_config_demo_empty.rviz
7. まとめ
まだ環境を構築したばかりで、lxc ならではのトラブルは未検証です。
これから tutorial を含めて色々触っていく中で、解消できた項目などは随時反映させていきたいとおもいます。