10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

今回の記事では、WSL(Windows Subsystem for Linux)を使用して、Windows端末に ROS 2 の開発環境をインストール方法について記載します。
シミュレータを使用する場合、CPU負荷が高くなり利用は難しかったのですが、WSL2でもCUDAを使用できるようになったことで、仮想環境で ROS 2 を動かしやすくなりました。
仮想環境であれば、開発・動作確認はもちろん、比較的簡単に初期状態からの環境構築確認も行うことができ便利です。
Ubuntuネイティブ環境で開発を行う場合は、「ROS 2 のインストール」記事を参照してください。

この記事はROSに関する投稿の一部です。
目次はこちら

対象読者

  • ROS 2 の開発を始めようとしているエンジニア

前提条件

  • 本記事を書くにあたり、使用したハードウェアになります。
環境
メモリー 32GB
CPU Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz
GPU(内蔵ディスプレイ用) Intel(R) UHD Graphics
GPU NVIDIA GeForce RTX 3070 Laptop GPU
GPU専用メモリー 8GB
  • 本記事を書くにあたり、使用したソフトウェアになります。
バージョン
ホストOS Windows10 22H2 (OSビルド 19045.3570)
NVIDIAドライバ Game Ready 546.17
CUDA on WSL 12.3
WSLディストリビューションベース Ubuntu 22.04
ROS 2 ROS 2 humble
シミュレータ Gazebo Classic 11
開発ツール Visual Studio Code(vscode)
  • 本記事での ROS 2 用WSLディストリビューション環境
内容
ディストリビューション名 ros2
ディストリビューション作成ディレクトリ D:\develop\wsl\ros2
ユーザー名 kccs
ROS 2 開発用ディレクトリ /home/kccs/ros2_ws
  • コマンドの記述
プレフィックス 環境
PS > PowerShell 又は コマンドプロンプト
root #
kccs $
WSLディストリビューションのターミナル

NVIDIAドライバインストール

NVIDIAドライバインストール

NVIDIAドライバが未インストールの場合は、NVIDIAのサイトなどを参考に、NVIDIAドライバのインストールを行います。

vscodeインストール

IDEとして、vscodeを使用します。

vscodeインストール

Microsoftのサイトなどを参考に、vscodeのインストールを行います。

日本語化

日本語化する場合は、拡張機能の「Japanese Language Pack for Visual Studio Code」をインストールします。

PS > code --install-extension ms-ceintl.vscode-language-pack-ja

リモート環境利用設定

WSLリモート環境が使用できるように、拡張機能の「Remote Development」をインストールします。

PS > code --install-extension ms-vscode-remote.vscode-remote-extensionpack

WSL2インストール

WSL2インストール

Microsoftのサイトなどを参考に、WSL2のインストールを行います。

ここでは、「WSL コマンドのインストール」部分のWSL2本体のみをインストールします。
ディストリビューションのインストールなどは、この後実施します。

WSL環境設定

「%userprofile%.wslconfig」ファイルを作成します。
ROSシミュレーション環境は、使用するメモリが多くなりがちなため、WSLに割り当てる最大メモリとスワップサイズを設定します。
今回使用したマシンは32GBのメモリがあるので、物理メモリの1/4を割り当てて、スワップには割り当てたメモリの4倍を設定しています。

%userprofile%.wslconfig
[WSL2]
memory=8GB
swap=32GB

ディストリビューション準備

ロボット毎に環境を分けたり、やり直しを容易にするために、初期インストールされたディストリビューションから、ROS 2 用のディストリビューションを作成します。

インストール済みディストリビューションの確認

PS > wsl -l -v

リストに「Ubuntu-22.04」が表示された場合は、ディストリビューション初期化を実行し、表示されていない場合は、ディストリビューション追加を実行してください。

ディストリビューション初期化

この操作は、ディストリビューションの内容(データ)が消えます。
残したい場合は、事前にexport importで別のディストリビューションとして移行するか、この作業を飛ばして、ディストリビューション追加に進んでください。

理想的には、初期状態のUbuntu22.04ディストリビューションからの作成をお薦めします。

PS > wsl --unregister Ubuntu-22.04

ディストリビューション追加

Ubuntu22.04のディストリビューションをインストールします。

PS > wsl --install -d Ubuntu-22.04

image.png

別ディストリビューションとして使いたいので、ユーザー名の入力に対して、Ctrl + Cキーを押して、ユーザー登録せずに終了します。

ROS 2 用ディストリビューション作成

Ubuntu22.04のディストリビューションをエクスポートして、新しいディストリビューションとしてインポートします。

PS > D:
PS > cd D:\develop\wsl
PS > wsl --export Ubuntu-22.04 Ubuntu-22.04.tar
PS > wsl --import ros2 ros2 Ubuntu-22.04.tar

ディストリビューション実行(ターミナル起動)

PS > wsl -d ros2

ログインユーザー作成

作成したディストリビューションに接続して、作業用ユーザーを作成します。
(本記事では、「kccs」とします。)

root # adduser kccs
New password: ←パスワードを入力(sudoするときに入力するパスワードになります)
Retype new password: ←上で入力したパスワードと同じものを再入力
Changing the user information for kccs
Enter the new value, or press ENTER for the default
        Full Name []: ←そのままエンターでOK(入力したければユーザー名を入力)
        Room Number []: ←そのままエンターでOK
        Work Phone []: ←そのままエンターでOK
        Home Phone []: ←そのままエンターでOK
        Other []: ←そのままエンターでOK
Is the information correct? [Y/n] ←エンター

sudoersに登録

作成したユーザーがroot権限の処理ができるようにsudersに登録します。

root # gpasswd -a kccs sudo

image.png

ディストリビューション起動時の初期設定

WSLでsystemdを有効にし、起動時の既定ユーザーを作成したログインユーザーにします。/etc/wsl.conf ファイルを新規に作成します。

root # vi /etc/wsl.conf

開いたエディタに以下の内容をコピー&ペーストします。

/etc/wsl.conf
[boot]
systemd=true

[user]
default=kccs

image.png

「ESC」キー「:wq」エンターでファイルを保存します。

ターミナル終了

一度、ディストリビューションのターミナルを終了します。

root # exit

ディストリビューション終了

起動時設定を有効にするために、ディストリビューションを終了します。

PS > wsl -t ros2

起動確認

再度ディストリビューションを実行し、初期設定が有効になっていることを確認します。

PS > wsl -d ros2

起動時のユーザーが「kccs」になっていればOKです。

image.png

CUDAインストール

NVIDIAのサイトなどを参考に、WSLディストリビューションにCUDAをインストールします。

通常のCUDAではなく、CUDA Support for WSL2をインストールする必要があります。

古いGPGキー削除

kccs $ cd
kccs $ sudo apt-key del 7fa2af80

CUDA Toolkit インストール

CUDAダウンロードページにて、Distributionに「WSL-Ubuntu」を選択します。
サイズが大きいのでネットワークが不安定な場合は、Install Typeに「deb(local)」を選択した方が失敗が少ないと思います。
表示されたコマンドをもとに、CUDA Toolkitをインストールします。

kccs $ wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
kccs $ sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
kccs $ wget https://developer.download.nvidia.com/compute/cuda/12.3.1/local_installers/cuda-repo-wsl-ubuntu-12-3-local_12.3.1-1_amd64.deb
kccs $ sudo dpkg -i cuda-repo-wsl-ubuntu-12-3-local_12.3.1-1_amd64.deb
kccs $ sudo cp /var/cuda-repo-wsl-ubuntu-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
kccs $ sudo apt-get update
kccs $ sudo apt-get -y install cuda-toolkit-12-3

インストール確認

NVIDIAドライバ及びCUDA Toolkitがインストールされ、WSL2のWSLgでNVIDIA GPUが使用されていることを確認します。

kccs $ nvidia-smi

image.png

右上の「CUDA Version」は、インストールされているNVIDIAドライバで対応可能な最大CUDAバージョンになります。
今回、12.3をインストールしますので、ここが12.3未満の場合は、より新しいNVIDIAドライバをインストールしてください。
ProcessesにXwaylandが表示されればOKです。

ROS 2 Humbleインストール

ROS 2 Humbleのサイトなどを参考に、ROS 2 をインストールします。

ロケール設定

日本語ロケールのja_JP.UTF-8に設定します。

kccs $ sudo apt install -y language-pack-ja
kccs $ sudo localectl set-locale LANG=ja_JP.UTF-8
kccs $ export LANG=ja_JP.UTF-8

Ubuntu Universe Repository有効化

kccs $ sudo apt install -y software-properties-common
kccs $ sudo add-apt-repository universe

GPGキー追加

kccs $ sudo apt update && sudo apt install -y curl
kccs $ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

ソースリストにリポジトリを追加

kccs $ 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

リポジトリキャッシュ最新化&アップグレード

kccs $ sudo apt update
kccs $ sudo apt upgrade -y

ROS 2インストール

RVizなどを含むデスクトップ版をインストールします。

kccs $ sudo apt install -y ros-humble-desktop

ROS 2 開発用ツールインストール

開発に必要な、cmake,git,python3,python3-setuptools,python3-bloom,python3-colcon-common-extensions,python3-rosdep,python3-vcstool,wgetをインストールします。

kccs $ sudo apt install -y ros-dev-tools

Gazeboインストール

Gazebo Classicのサイトなどを参考に、Gazeboをインストールします。

Gazebo Classic 11インストール

kccs $ sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
kccs $ wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
kccs $ sudo apt update
kccs $ sudo apt install -y gazebo
kccs $ sudo apt install -y libgazebo-dev

Gazebo ROSインストール

kccs $ sudo apt install -y ros-humble-gazebo-* ros-humble-joint-state-publisher

OpenGL環境確認ツールインストール

Gazeboそのものには不要ですが、OpenGLの環境を確認するためにツールをインストールします。

kccs $ sudo apt install -y mesa-utils

レンダリングデバイス確認

kccs $ glxinfo -B

表示された情報の中で、赤枠で囲った部分が、INTELになっている場合は、OpenGLで使用するデバイスをNVIDIAにするために、MESA_D3D12_DEFAULT_ADAPTER_NAME環境変数を設定します。

image.png

  • 環境変数
export MESA_D3D12_DEFAULT_ADAPTER_NAME="NVIDIA"
  • 再起動後も有効になるように、.bashrcに追記します。
kccs $ echo 'export MESA_D3D12_DEFAULT_ADAPTER_NAME="NVIDIA"' >> ~/.bashr

Gazebo起動確認

kccs $ gazebo

GPU使用確認

kccs $ nvidia-smi

Processに「gzserver」「gzclient」が表示されれば、GPUレンダリングが使用されています。
image.png

その他パッケージインストール

分析ツールパッケージ

kccs $ sudo apt install ros-humble-rqt-*

開発用ソースディレクトリ作成

開発に使用するワークスペースを準備します。

ディレクトリ作成

kccs $ cd
kccs $ mkdir -p ros2_ws/src
kccs $ cd ros2_ws

依存関係ツール初期化

kccs $ sudo rosdep init
kccs $ rosdep update

ビルド環境初期構築

kccs $ source /opt/ros/humble/setup.bash
kccs $ colcon build

環境変数設定

~/.bashrcに環境変数を追記し、ターミナル起動でHumbleが使用できるようにします。

CUDA関係追加

kccs $ echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc
kccs $ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
kccs $ echo 'export PATH=/usr/local/cuda/bin:${PATH}' >> ~/.bashrc

ROS 2 関係追加

今回は、ローカル環境のみでの開発を想定して、ローカルのみの設定にします。ローカル以外では、ROS_DOMAIN_IDが同一の場合、同一実行環境として扱われるため、同一ネットワークの端末間で干渉させたくない場合は、端末毎に値を変えます。

kccs $ echo "export ROS_DOMAIN_ID=0" >> ~/.bashrc
kccs $ echo "export ROS_LOCALHOST_ONLY=1" >> ~/.bashrc
kccs $ echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

再起動

環境変数などの設定を有効にするために、ディストリビューションを再起動します。

ターミナル終了

kccs $ exit

ターミナル開始

PS > wsl -d ros2

vscode設定

vscodeでROS開発を行うための準備を行います。

vscode起動

kccs $ cd ~/ros2_ws
kccs $ code .

初回はディストリビューション内へのインストールが実行されます。

image.png

信頼確認

vscodeが起動すると、作成者の信頼確認画面が表示されます。
「はい、作成者を信頼します」を選択します。

image.png

vscode終了

起動したvscodeを一旦終了します。

ROS操作、Python、C++の開発&ビルドに必要な拡張機能インストール

kccs $ code --install-extension ms-vscode.cpptools-extension-pack
kccs $ code --install-extension ms-python.python
kccs $ code --install-extension ms-python.flake8
kccs $ code --install-extension ms-python.autopep8
kccs $ code --install-extension njpwerner.autodocstring
kccs $ code --install-extension ms-iot.vscode-ros
kccs $ code --install-extension mhutchie.git-graph

ワークスペース開発設定

ワークスペースでvscodeを使用してC++,Pythonの開発を行うための設定をします。

vscode起動

Windowsメニューから「Visual Studio Code」を選択し起動します。

image.png

起動場所確認

前回起動したワークスペースが開くので、WSL:ros2で開かれていることを確認します。

image.png

もし、異なる場所で起動している場合は、ワークスペースを開きなおします。「メニュー」「ファイル」「最近使用した項目を開く」の順に選択します。

image.png

[WSL:ros2]を選択してフォルダーを開きます。

image.png

linter / formatterなどの設定

エクスプローラーパネルの空いているところで右クリックし、「新しいフォルダー…」を選択します。

image.png

「.vscode」と入力し、フォルダーを作成します。

image.png

「.vscode」の上で右クリックし、「新しいファイル…」を選択し、以下の2ファイルを作成します。

image.png

c_cpp_properties.json
{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "${default}",
                "limitSymbolsToIncludedHeaders": false
            },
            "includePath": [
                "${workspaceFolder}/src/**",
                "/opt/ros/humble/include/**",
                "/usr/include/**"
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "c++14"
        }
    ],
    "version": 4
}
settings.json
{
    "python.analysis.extraPaths": [
        "/opt/ros/humble/lib/python3.10/site-packages",
        "/opt/ros/humble/local/lib/python3.10/dist-packages"
    ],
    "python.autoComplete.extraPaths": [
        "/opt/ros/humble/lib/python3.10/site-packages",
        "/opt/ros/humble/local/lib/python3.10/dist-packages"
    ],
    "C_Cpp.clang_format_style": "Google",
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
    "[cpp]": {
        "editor.tabSize": 2,
    },
    "files.associations": {
        "*.ipp": "cpp",
        "array": "cpp",
        "atomic": "cpp",
        "complex": "cpp",
        "any": "cpp",
        "chrono": "cpp",
        "ratio": "cpp",
        "string_view": "cpp",
        "system_error": "cpp",
        "type_traits": "cpp",
        "fstream": "cpp",
        "functional": "cpp",
        "istream": "cpp",
        "ostream": "cpp",
        "sstream": "cpp",
        "streambuf": "cpp",
        "valarray": "cpp",
        "iosfwd": "cpp"
    },
    "[python]": {
        "editor.defaultFormatter": "ms-python.autopep8",
        "editor.formatOnSave": true
    },
    "autopep8.args": [
        "--max-line-length=120"
    ],
    "flake8.args": [
        "--max-line-length=120",
        "--max-complexity=10"
    ],
    "C_Cpp.intelliSenseEngineFallback": "disabled",
    "C_Cpp.default.compilerPath": "/usr/bin/gcc",
    "ros.distro": "humble"
}

ディストリビューション退避

環境が壊れた場合のリセットや、別の開発環境をすぐに構築するために、各種設定が終わった現時点のディストリビューションをエクスポートして保存しておきます。

エクスポート

PS > D:
PS > cd D:\develop\wsl
PS > wsl --export ros2 ros2.tar

出力したtarファイルをインポートすることで、別環境の構築に利用することができます。

参考文献

  • NVIDIAドライバダウンロードサイト

  • Visual Studio Code

  • WSL を使用して Windows に Linux をインストールする方法

  • CUDA on WSL User Guide

  • CUDA Toolkit 12.3 Update 1 Downloads

  • ROS 2 Documentation: Humble

  • Install Gazebo using Ubuntu packages

おわりに

以上が ROS 2 humble を使用しWSL上で開発を行うための基本的な環境作成になります。

次回以降では、ノード作成など実際の開発に関する記事を投稿していく予定ですので、お楽しみに!

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?