1. はじめに
訳あってAutowareを扱うことになりました。
(Autowareは日本発のオープンソースな自動運転ソフトウェアで、自動運転の世界シェア1位なんだって。すごいね!)
Autowareを扱うにはベースになっているROSを理解しないと話にならないので、まずはWindows11にWSL2でUbuntu20.04の環境を構築して、@srsさんの ROS講座00 目次 を頭から順番に始めて、 ROS講座07 joyプログラム までこなしました。
なんで素のUbuntuをインストールしないのかというと、普段使いのPCが1台しかないのでWindowsとUbuntuのデュアルブートやわざわざ新規にUbuntuのPCを用意したくないという理由だけです。
(2023.03現在、N100の小型PCが2万円程度で購入できるのでUbuntu専用にしてしまってもいいのですが…)
ここまでで自分への備忘録も兼ねて手順を残しておきます。
ちなみに前提として環境は
-
Windows11 home 23H2
CPU: AMD Ryzen7 7735U 2.7GHz
SSD: 512GB
RAM: 16GB
joypad: Microsoft Corp. Xbox360 Controller (ID 045e:028e)
↑こんな古いコントローラ使ってる人少ないと思いますが、これが後のハマりポイントでした… -
WSL2 - Ubuntu20.04
-
ROS(1) Noetic
です。
2. WSL2でUbuntu20.04のセットアップ
ぶっちゃけ、microsoftの公式ドキュメントを見るのが一番確実で間違いがないです。
Linux 用 Windows サブシステム で Linux GUI アプリを実行する
気を付けるべきは、ROSのバージョンによって推奨されるUbuntuのバージョンがあるということです。
ROS NoeticはUbuntu 20.04を対象にしているので、素直にUbuntu 20.04をセットアップすべきでしょう。
まずは
> wsl --set-default-version 2
で既定のWSL バージョンをWSL2に設定します。
そのあとにUbuntuをインストールしますが、
> wsl --update
ではなく、
> wsl --update --distribution Ubuntu-20.04
とディストリビューションを指定して実行するか、Microsoft Storeで Ubuntu 20.04.6 LTSをインストールします。
あとは
$ sudo apt-get update
$ sudo apt update
$ sudo apt install x11-apps -y
でパッケージの更新とX11アプリをインストールし、GUIアプリのxeyesが動作確認できればとりあえずはOKです。
日本語化
自分の場合はわかりやすいように Win11のWSL2 (WSLg)を日本語化 & Mozcで日本語入力 をそのまま実施して日本語化しています。
3. ROSのインストール
ROS講座02 インストール を順番にこなします。
記事作成時にROS KineticだったところをNoeticに修正されているので、一部修正漏れの部分があります。
#!/bin/sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt install ros-noetic-desktop-full
apt search ros-noetic
- sudo apt-get install python-rosdep
+ sudo apt-get install python3-rosdep
sudo rosdep init
rosdep update
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
source /opt/ros/noetic/setup.bash
- sudo apt-get -y install python-rosinstall
+ sudo apt-get -y install python3-rosinstall
sudo apt-get install -y python3-catkin-tools
+ mkdir -p ~/catkin_ws/src
+ cd ~/catkin_ws/src
+ catkin init
+ cd ~/catkin_ws
+ catkin build
+ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
+ source ~/.bashrc
cd ~/catkin_ws/src
catkin_create_pkg rospackage_test roscpp rospy std_msgs tf
- sudo apt-get install -y ros-kinetic-joystick-drivers
- sudo apt-get install -y ros-kinetic-jsk-visualizationフォルダ
- sudo apt-get install -y ros-kinetic-image-proc
+ sudo apt-get install -y ros-noetic-joy
+ sudo apt-get install -y ros-noetic-jsk-visualization
+ sudo apt-get install -y ros-noetic-image-proc
+ sudo apt-get install -y git
+ sudo apt-get install -y vim
+ sudo apt-get install -y nano
4. 課題をこなす
基本的には講座の順番通りやっていけば食い違いはないですが、 ROS講座11 gitリポジトリ を先に実施しておけばサンプルコードを取得できるので楽です。
5. Xbox360 コントローラのセットアップ(ハマりポイント)
ROS講座07 joyプログラム でPS3のコントローラでウインドウ上の亀さんを動かします。
自分の場合は昔買ったXbox360のUSB接続のコントローラがあったのでこれを使ったのですが、最初はUbuntuで認識されず4時間ほど格闘する羽目になったので、手順を書き残しておきます。
5.1. Ubuntuのカーネルに手を加える
最終的に解決したのは
Gamepad support in WSL2 (/dev/jsx) のフォーラムを見つけたのがきっかけでした。
まずは一旦、WSL2を終了します。
> wsl --shutdown
https://github.com/microsoft/WSL/files/10098043/kernel-xpad.zip をダウンロードし解凍します。
解凍してできたbzImageとconfig-wslの2つのファイルはwindowsの%UserProfile%フォルダに移動しておきましょう。
bzImageへのパスは.wslconfigファイルに記述します。なければこのタイミングで作ります。
ついでに .wslconfig で WSL2 が使用するCPU/メモリを制限する を参考に、CPUのコア数・メモリ使用量を制限してもいいと思います。
[wsl2]
memory=8GB
kernel=C:\\Users\\ユーザー名\\bzImage
最終的にフォルダ構成はこのようになります。
C:
└── Users
└── ユーザー名
├── .wslconfig
├── bzImage
└── config-wsl
ここまでできたらWSL2を起動してもいいです。
5.2. Xbox360コントローラをUbuntuにマウントする
USB デバイスを接続する
が参考になりますが、一部コマンドが変わる部分があります。
まずはusbipd-winプロジェクトをインストールします。
> winget install --interactive --exact dorssel.usbipd-win
インストールできたらusbipd list
コマンドでデバイスとバスIDを確認します。
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-3 04f2:b760 HP Wide Vision HD Camera, Camera DFU Device Not shared
1-4 04f3:0c00 ELAN WBF Fingerprint Sensor Not shared
2-1 045e:028e XBOX 360 Controller For Windows Not shared
2-3 0489:e0f2 MediaTek Bluetooth Adapter Not shared
XBOX 360 Controllerは認識されていますが、STATEがNot sharedなのでWSL2とは共有もしくはアクセス権を渡せていない状態です。
なので、WSL2が起動した状態でusbipd bind --busid [バスID]
コマンドでデバイスを共有します。
多くの記事では
> usbipd bind --busid 2-1
usbipd: warning: A reboot may be required before the changes take effect.
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-3 04f2:b760 HP Wide Vision HD Camera, Camera DFU Device Not shared
1-4 04f3:0c00 ELAN WBF Fingerprint Sensor Not shared
2-1 045e:028e XBOX 360 Controller For Windows Shared
2-3 0489:e0f2 MediaTek Bluetooth Adapter Not shared
にすればUbuntu側でも使用できるような記述でしたが、自分の環境ではusbipd bind
コマンドに--force
オプションを追加してホストからアクセス不可にしないとUbuntu側で認識できませんでした。
※なお、usbipd list
コマンドは記事上でステータスの確認のために記述しているので、毎回実施する必要はないです。
> usbipd bind --force --busid 2-1
usbipd: warning: A reboot may be required before the changes take effect.
> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-3 04f2:b760 HP Wide Vision HD Camera, Camera DFU Device Not shared
1-4 04f3:0c00 ELAN WBF Fingerprint Sensor Not shared
2-1 045e:028e XBOX 360 Controller For Windows Shared (forced)
2-3 0489:e0f2 MediaTek Bluetooth Adapter Not shared
ここまで実施できれば、WSL2のUbuntuでlsusb
コマンドを実行すればデバイスが認識できているのが確認できると思います。
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 045e:028e Microsoft Corp. Xbox360 Controller
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
5.3. Xbox360コントローラのドライバをセットアップする
Making an Xbox Controller work on Ubuntu! というそのものずばりなタイトルのフォーラムの内容を実施します。
まずはxboxdrv(Linux 用のXbox/Xbox360コントローラドライバ)をインストールします。
ついでに、joystick の動作確認ができるGUIソフトのjstest-gtkもインストールしましょう。
sudo apt-get install xboxdrv jstest-gtk
xboxdrv を動作させるには毎回 xpad を削除する必要があるそうです。
sudo rmmod xpad
これを回避するためにはblacklist xpad
の一文をブラックリストの末尾に追記します。
(編集にはroot権限が必要です)
+ blacklist xpad
これで xboxdrv を実行できるようになり、sudo xboxdrv
コマンドを実行するとコントローラにキーマップの割り当てられ、さらにjstest-gtk
を実行するとボタン・ジョイスティックの状態をGUIで確認できます。
なお、sudo xboxdrv
のsudo
を回避するには、/etc/udev/rules.d
ディレクトリ内にルールファイルを作ればよいみたいです。
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="028e", GROUP="plugdev", MODE="660"
KERNEL=="uinput", MODE="0666"
5.4. ROS講座07の完走
これでようやく、ROS講座07 joyプログラム をWSL2のUbuntu上でXbox360コントローラを使って完走できます・
お疲れさまでした。
6. 参考資料