はじめに
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・センサーの関係を理解してから実機へ進む
という学習方法もかなり良さそうです。