0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows 11 + WSL2でROS 2 Jazzy + Gazebo + TurtleBot3を実機なしで動かしてみる

0
Last updated at Posted at 2026-08-25

はじめに

ROS 2を勉強していて、

「TurtleBot3の実機を持っていなくても、ROS 2やSLAMの勉強はできるのか?」

という疑問がありました。

結論から言うと、

実機がなくても大丈夫でした。

今回はWindows 11のPCにWSL2 + Ubuntu 24.04を用意して、

Windows 11
    ↓
WSL2
    ↓
Ubuntu 24.04
    ↓
ROS 2 Jazzy
    ↓
Gazebo
    ↓
TurtleBot3 Waffle Pi

という環境を構築します。

最終的にはGazebo上のTurtleBot3を、

キーボード
    ↓
ROS 2
    ↓
/cmd_vel
    ↓
Gazebo
    ↓
TurtleBot3

という流れで実際に走らせます。

今回はここまでをゴールにします。

今回のゴール

最終的に、次の状態を作ります。

Windows 11
│
└── WSL2
     │
     └── Ubuntu 24.04
          │
          ├── ROS 2 Jazzy
          │
          ├── Gazebo
          │
          └── TurtleBot3 Waffle Pi
               ├── Motor
               ├── LiDAR
               ├── IMU
               └── Camera

さらに、

ros2 run turtlebot3_teleop teleop_keyboard

を使って、キーボードからTurtleBot3を操作します。

動作動画

動画では、以下のような動作を確認できるようにします。

Gazebo上でTurtleBot3を起動

w キーで前進
x キーで減速・後退
a / d キーで旋回
s または Space で停止

環境

今回使用したPCは以下です。

項目 環境
OS Windows 11 Home
CPU Intel Core i7-1360P
メモリ 32GB
Linux Ubuntu 24.04
仮想Linux環境 WSL2
ROS ROS 2 Jazzy
Simulator Gazebo
Robot TurtleBot3 Waffle Pi

1. WSL2の確認

PowerShellを開いて、以下を実行します。

wsl -l -v

自分の環境では次のようになっていました。

NAME              STATE     VERSION
* Ubuntu          Stopped   2
  docker-desktop  Stopped   2
  Ubuntu-24.04    Stopped   2

今回使用したいのは、

Ubuntu-24.04

です。

VERSION が、

2

になっていればWSL2です。

2. Ubuntu 24.04をデフォルトにする

自分の環境では複数のUbuntuが入っていたため、Ubuntu 24.04をデフォルトに設定しました。

PowerShellで以下を実行します。

wsl --set-default Ubuntu-24.04

確認します。

wsl -l -v

Ubuntu 24.04に * が付けばOKです。

NAME
* Ubuntu-24.04
  Ubuntu
  docker-desktop

Ubuntuを起動します。

wsl

または、明示的にUbuntu 24.04を指定して起動します。

wsl -d Ubuntu-24.04

3. Ubuntuのバージョン確認

WSL側で以下を実行します。

lsb_release -a

Ubuntu 24.04であることを確認します。

Description: Ubuntu 24.04 LTS
Release: 24.04
Codename: noble

4. Ubuntuを更新

まずUbuntuを最新状態にします。

sudo apt update
sudo apt upgrade -y

5. ROS 2 Jazzyをインストール

ROS 2 Jazzyの環境を構築します。

まず必要なパッケージをインストールします。

sudo apt install locales software-properties-common curl -y

Localeを設定します。

sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

Universe repositoryを有効にします。

sudo add-apt-repository universe

ROS 2のAPT sourceを追加します。

sudo apt update
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F'"' '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb \
"https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb

ROS 2 Jazzy Desktopをインストールします。

sudo apt update
sudo apt install ros-jazzy-desktop -y

開発ツールもインストールします。

sudo apt install ros-dev-tools python3-colcon-common-extensions git -y

6. ROS 2環境を読み込む

ROS 2の環境を現在のターミナルに読み込みます。

source /opt/ros/jazzy/setup.bash

毎回入力しなくて済むように .bashrc に追加します。

echo 'source /opt/ros/jazzy/setup.bash' >> ~/.bashrc
source ~/.bashrc

ROS 2が認識されているか確認します。

ros2 --help

ROS 2のコマンド一覧が表示されればOKです。

7. ROS 2のPublisher / Subscriberを確認

ROS 2が正常に通信できるか確認します。

まずターミナル1で以下を実行します。

ros2 run demo_nodes_cpp talker

以下のような出力が表示されます。

Publishing: 'Hello World: 1'
Publishing: 'Hello World: 2'
Publishing: 'Hello World: 3'

このターミナルは停止せず、そのまま起動しておきます。

次にターミナル2を開きます。 (別タブでターミナルを開いて、 wsl へ入る)

ros2 run demo_nodes_py listener

以下のようになれば通信成功です。

I heard: [Hello World: 1]
I heard: [Hello World: 2]
I heard: [Hello World: 3]

構成としては、次のようになっています。

talker
   │
   │ Publish
   ↓
ROS 2 Topic
   │
   │ Subscribe
   ↓
listener

ハマったポイント:listenerが何も表示しない

最初、

ros2 run demo_nodes_py listener

を実行しても何も表示されませんでした。

原因は、talker を先に Ctrl + C で終了していたためでした。

listener はデータを受信する側なので、

talker 停止
    ↓
送信データなし
    ↓
listener
    ↓
受信待ち
    ↓
何も表示されない

という状態になります。

2つのターミナルで、talker と listener を同時に起動する必要があります。

8. Gazeboをインストール

ROS 2とGazeboを連携させるパッケージをインストールします。

sudo apt update
sudo apt install ros-jazzy-ros-gz -y

インストール後、ROS 2の環境を読み込み直します。

source /opt/ros/jazzy/setup.bash

9. Gazebo単体の起動確認

まずGazeboだけで正常にGUIが起動するか確認します。

gz sim shapes.sdf

Gazeboのウィンドウが表示され、球や箱などの3Dオブジェクトが表示されれば成功です。

ハマったポイント:gz: command not found

最初は、

gz sim shapes.sdf

を実行すると、

gz: command not found

となりました。

今回の環境では、ROS 2の環境を読み込み直すことで解決しました。

source /opt/ros/jazzy/setup.bash

その後、

which gz

で確認します。

gz のパスが表示されたら、再度実行します。

gz sim shapes.sdf

これでGazeboが起動しました。

10. TurtleBot3用Workspaceを作る

TurtleBot3用のROS 2 Workspaceを作ります。

mkdir -p ~/turtlebot3_ws/src
cd ~/turtlebot3_ws/src

必要なリポジトリを取得します。

git clone -b jazzy https://github.com/ROBOTIS-GIT/DynamixelSDK.git
git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3.git

シミュレーション用パッケージも取得します。

git clone -b jazzy https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git

Workspaceは次のような構成になります。

~/turtlebot3_ws
│
└── src
     ├── DynamixelSDK
     ├── turtlebot3_msgs
     ├── turtlebot3
     └── turtlebot3_simulations

11. rosdepを設定

初回のみ、以下を実行します。

sudo rosdep init

自分の環境では、次のように表示されました。

Wrote /etc/ros/rosdep/sources.list.d/20-default.list
Recommended: please run

    rosdep update

これはエラーではありません。

続いて実行します。

rosdep update

Workspaceへ移動します。

cd ~/turtlebot3_ws

依存関係をインストールします。

rosdep install --from-paths src --ignore-src -r -y

12. TurtleBot3をビルド

Workspaceをビルドします。

cd ~/turtlebot3_ws
colcon build --symlink-install

ビルドが正常に完了したら、ビルドしたWorkspaceを読み込みます。

source ~/turtlebot3_ws/install/setup.bash

毎回入力しなくて済むように .bashrc に追加します。

echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc

13. TurtleBot3が認識されているか確認

TurtleBot3関連のROS 2パッケージを確認します。

ros2 pkg list | grep turtlebot3

例えば次のようなパッケージが表示されます。

turtlebot3
turtlebot3_bringup
turtlebot3_description
turtlebot3_gazebo
turtlebot3_msgs
turtlebot3_teleop

turtlebot3_gazebo が表示されていれば、シミュレーション環境も認識されています。

14. TurtleBot3のモデルを指定

今回は Waffle Pi を使用しました。

export TURTLEBOT3_MODEL=waffle_pi

毎回設定しなくて済むように .bashrc に追加します。

echo 'export TURTLEBOT3_MODEL=waffle_pi' >> ~/.bashrc
source ~/.bashrc

確認します。

echo $TURTLEBOT3_MODEL

以下のように表示されればOKです。

waffle_pi

15. Gazebo + TurtleBot3を起動

いよいよTurtleBot3をGazebo上で起動します。

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

Gazeboが起動し、3D空間にTurtleBot3が表示されました。

ROS 2
   ↓
turtlebot3_gazebo
   ↓
Gazebo
   ↓
TurtleBot3 Waffle Pi

ここまで、TurtleBot3の実機は一切使用していません。

16. ROS 2とGazeboの通信

TurtleBot3を起動した際のログを見ると、

cmd_vel
imu
scan
camera_info

などのデータがROS 2とGazeboの間でBridgeされていました。

ロボットを動かす側は、概念的には次のようになります。

キーボード
    ↓
turtlebot3_teleop
    ↓
/cmd_vel
    ↓
ROS 2
    ↓
ros_gz_bridge
    ↓
Gazebo
    ↓
TurtleBot3

逆に、センサーのデータは次の方向で流れます。

TurtleBot3
    ↓
LiDAR / IMU / Camera
    ↓
Gazebo
    ↓
ros_gz_bridge
    ↓
ROS 2
    ↓
/scan / imu / camera系Topic

これを見ると、

「ROS 2が直接モーターを回している」

というより、

ROS 2
    ↓
Topic
    ↓
Gazebo
    ↓
仮想ロボット

という構成で動いていることが分かります。

17. キーボードからTurtleBot3を操作

Gazeboは起動したままにして、新しいターミナルを開きます。

ros2 run turtlebot3_teleop teleop_keyboard

操作画面が表示されます。

Control Your TurtleBot3!!

Moving around:
        w
   a    s    d
        x

主なキーは以下です。

キー	操作
w	前進速度を上げる
x	前進速度を下げる / 後退
a	左旋回方向へ角速度を変化
d	右旋回方向へ角速度を変化
s	停止
Space	停止

18. 前進させる

w キーを押すと、Linear Velocityが少しずつ増えていきます。

linear velocity 0.01
linear velocity 0.02
linear velocity 0.03

処理の流れは次のようになります。

wキー
   ↓
turtlebot3_teleop
   ↓
Linear Velocityを増加
   ↓
/cmd_vel
   ↓
Gazebo
   ↓
TurtleBot3が前進

19. 後退させる

最初に少し分かりにくかったのが後退操作でした。

後退するときは x キーを押します。

ただし、いきなり後退するわけではありません。

例えば現在の速度が、

0.03

だった場合、x を押すことで、

0.03
 ↓
0.02
 ↓
0.01
 ↓
0.00
 ↓
-0.01
 ↓
-0.02

と変化します。

Linear Velocityがマイナスになると後退します。

つまり、

w
↓
前方向へ加速

x
↓
前進速度を下げる
↓
0
↓
マイナス速度
↓
後退

という動きになっています。

20. ROS 2のTopicを確認する

別ターミナルを開いて、Topic一覧を確認します。

ros2 topic list

例えば次のようなTopicが確認できます。

/cmd_vel
/odom
/scan
/tf
/tf_static

ここで、

/cmd_vel

はロボットの速度指令、

/scan

はLiDAR、

/odom

はOdometry、

/tf

は座標系の関係を扱っています。

21. LiDARのデータを確認

TurtleBot3には仮想LiDARが搭載されています。

LiDARのTopicを確認します。

ros2 topic echo /scan --once

例えば次のようなデータが取得できます。

angle_min:
angle_max:
range_min:
range_max:
ranges:
  - 0.82
  - 0.81
  - 0.83
  ...

データの流れは、

Gazebo
   ↓
仮想LiDAR
   ↓
ros_gz_bridge
   ↓
/scan
   ↓
ROS 2

となります。

これが取得できれば、次にSLAMを使うための重要なセンサーデータがROS 2側まで届いていることになります。

実際に触って理解できたこと

今回実際に動かしてみて、一番理解しやすかったのはROS 2のTopicを使った通信です。

TurtleBot3を動かす場合は、

キーボード
    ↓
turtlebot3_teleop
    ↓
/cmd_vel
    ↓
ros_gz_bridge
    ↓
Gazebo
    ↓
TurtleBot3

という流れになります。

LiDARなどのセンサーは逆方向です。

TurtleBot3
    ↓
LiDAR
    ↓
Gazebo
    ↓
ros_gz_bridge
    ↓
/scan
    ↓
ROS 2 Node

実機がなくても、

ROS 2
Node
Publisher / Subscriber
Topic
Gazebo
LiDAR
Odometry
TF
SLAM
Navigation2

などを学習できることが分かりました。

次にやりたいこと

今回は、

Windows 11
    ↓
WSL2
    ↓
Ubuntu 24.04
    ↓
ROS 2 Jazzy
    ↓
Gazebo
    ↓
TurtleBot3
    ↓
キーボード操作

までできました。

次は、TurtleBot3の仮想LiDARを使ってSLAMを試したいと思います。

目標は、

TurtleBot3
    ↓
LiDAR
    ↓
/scan
    ↓
SLAM
    ↓
2D地図作成
    ↓
Nav2
    ↓
目的地指定
    ↓
自律走行

最終的には、

仮想工場
   ↓
TurtleBot3 / AMR
   ↓
SLAM
   ↓
Nav2
   ↓
Mission Controller
   ↓
複数工程の自動搬送

のような構成まで試してみたいと思っています。

まとめ

Windows 11でもWSL2を利用することで、TurtleBot3の実機を購入せずにROS 2 + Gazeboの学習環境を構築できました。

今回動作確認できた構成は、

Windows 11
    ↓
WSL2
    ↓
Ubuntu 24.04
    ↓
ROS 2 Jazzy
    ↓
Gazebo
    ↓
TurtleBot3 Waffle Pi
    ↓
turtlebot3_teleop

です。

実際にTurtleBot3を動かしてみることで、

Node
 ↓
Topic
 ↓
Bridge
 ↓
Simulator
 ↓
Robot

というROS 2の基本的な流れも少しずつ見えるようになりました。

ROS 2を勉強するときに、いきなり実機を購入するのではなく、

まずGazeboでロボット・Topic・センサーの関係を理解してから実機へ進む

という学習方法もかなり良さそうです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?