LoginSignup
3
1

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をセットアップすべきでしょう。
まずは

powershell
> wsl --set-default-version 2

で既定のWSL バージョンをWSL2に設定します。
そのあとにUbuntuをインストールしますが、

powershell
> wsl --update

ではなく、

powershell
> wsl --update --distribution Ubuntu-20.04

とディストリビューションを指定して実行するか、Microsoft Storeで Ubuntu 20.04.6 LTSをインストールします。
image.png

あとは

bash
$ sudo apt-get update
$ sudo apt update
$ sudo apt install x11-apps -y

でパッケージの更新とX11アプリをインストールし、GUIアプリのxeyesが動作確認できればとりあえずはOKです。
image.png

日本語化

自分の場合はわかりやすいように Win11のWSL2 (WSLg)を日本語化 & Mozcで日本語入力 をそのまま実施して日本語化しています。

3. ROSのインストール

ROS講座02 インストール を順番にこなします。
記事作成時にROS KineticだったところをNoeticに修正されているので、一部修正漏れの部分があります。

ros_noetic_install.sh
#!/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
make_ros_package.sh
cd ~/catkin_ws/src
catkin_create_pkg rospackage_test roscpp rospy std_msgs tf 
ros_noetic_add_packages.sh
- 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を終了します。

powershell
> wsl --shutdown

https://github.com/microsoft/WSL/files/10098043/kernel-xpad.zip をダウンロードし解凍します。
解凍してできたbzImageとconfig-wslの2つのファイルはwindowsの%UserProfile%フォルダに移動しておきましょう。
bzImageへのパスは.wslconfigファイルに記述します。なければこのタイミングで作ります。
ついでに .wslconfig で WSL2 が使用するCPU/メモリを制限する を参考に、CPUのコア数・メモリ使用量を制限してもいいと思います。

.wslconfig
[wsl2]
memory=8GB
kernel=C:\\Users\\ユーザー名\\bzImage

最終的にフォルダ構成はこのようになります。

windows11
C:
└── Users
    └── ユーザー名
        ├── .wslconfig
        ├── bzImage
        └── config-wsl

ここまでできたらWSL2を起動してもいいです。

5.2. Xbox360コントローラをUbuntuにマウントする

USB デバイスを接続する
が参考になりますが、一部コマンドが変わる部分があります。

まずはusbipd-winプロジェクトをインストールします。

powershell
> winget install --interactive --exact dorssel.usbipd-win

インストールできたらusbipd listコマンドでデバイスとバスIDを確認します。

powershell
> 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]コマンドでデバイスを共有します。
多くの記事では

powershell
> 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コマンドは記事上でステータスの確認のために記述しているので、毎回実施する必要はないです。

powershell
> 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コマンドを実行すればデバイスが認識できているのが確認できると思います。

bash
$ 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もインストールしましょう。

bash
sudo apt-get install xboxdrv jstest-gtk

xboxdrv を動作させるには毎回 xpad を削除する必要があるそうです。

bash
sudo rmmod xpad

これを回避するためにはblacklist xpadの一文をブラックリストの末尾に追記します。
(編集にはroot権限が必要です)

/etc/modprobe.d/blacklist.conf
+ blacklist xpad

これで xboxdrv を実行できるようになり、sudo xboxdrvコマンドを実行するとコントローラにキーマップの割り当てられ、さらにjstest-gtkを実行するとボタン・ジョイスティックの状態をGUIで確認できます。
image.png
image.png

なお、sudo xboxdrvsudoを回避するには、/etc/udev/rules.dディレクトリ内にルールファイルを作ればよいみたいです。

/etc/udev/rules.d/51-xboxdrvRule.rules
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コントローラを使って完走できます・
image.png

お疲れさまでした。

6. 参考資料

3
1
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
3
1