Python ROS2 プログラム 高専4年生

【ROS2講座⑧】SLAMとNavigation2【Python】

前回はROS2のRVisとGazeboについて学びました。

今回はSLAMとNavigationについて学んでゆきます。

SLAMとは

SLAM(スラム)= Simultaneous Localization And Mapping
直訳すると「自己位置推定(Localization)地図作成(Mapping)を同時に行う」技術です。

ロボットは知らない環境の中で、いま自分がどこにいるか(自己位置)を推定しながら、周囲の障害物や壁の配置(地図)を作ります。

それを逐次(リアルタイム)で行うのがSLAMです。

SLAMは大きく2つの入力を使います。

  • 移動の手がかり(動きの予測)
    エンコーダからのオドメトリ /odom や、IMU、車輪モデルなど。
    長く動くと**少しずつ誤差が増える(ドリフト)**のが弱点。
  • 見えたもの(観測)
    LIDAR の /scan(レーザー距離)やカメラ画像(Visual SLAM)など。
    壁や特徴点を観測して地図を描き、自己位置を修正します。

SLAMはこの2つを同時に融合します。
さらに、同じ場所を再び通ったとき「ここ前にも来たね!」と気づく処理(ループ閉じ)で地図全体のゆがみをギュッと正してくれます。

フレーム(座標系)の役割

RViz2でよく出てくる座標系の役割を整理します。

  • base_link:ロボット本体の原点(車体の中心)
  • odom:オドメトリの世界。連続でなめらかだが、長期的にずれが積もる
  • map:SLAMが作る地図の座標系。地図上の位置を安定的に表す
  • tf:座標系どうしの関係(変換)を配信するメカニズム

RViz2でFixed Frameを map にすると、地図が揺れずに見えます。

SLAMの代表的な方式

  • LIDAR SLAM(本章の体験):レーザー距離(/scan)+オドメトリ。屋内の2D地図に強い
  • Visual SLAM:カメラ画像から特徴点を追いかける(ORB-SLAM など)。カメラだけでも可
  • Graph-based / Pose Graph:ロボットの姿勢をノード、観測をエッジとして最適化
  • フィルタ系(EKF/UKF など):逐次推定の数理。SLAM内部で使われることがある

本章で使う slam_toolbox は2D LIDARベースのポーズグラフSLAM実装で、ROS2で定番です。

SLAMの体験

今回は元々用意されているGazeboのワールド”で TurtleBot3 を動かし、slam_toolbox で地図を作ります。

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

sudo apt update
sudo apt install -y \
  ros-humble-turtlebot3-gazebo \
  ros-humble-turtlebot3-teleop \
  ros-humble-slam-toolbox \
  ros-humble-rviz2 \
  ros-humble-nav2-map-server

Gazeboを起動します。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
  • Gazeboの世界に TurtleBot3(LIDAR付き)が出現します。
  • LIDARは /scan、里程計は /odom を配信します。

別のターミナルでロボットをキーボード操作するプログラムを実行します

export TURTLEBOT3_MODEL=burger
ros2 run turtlebot3_teleop teleop_keyboard

WASDXキーでロボットが動きます。

SLAMを起動します。

ros2 launch slam_toolbox online_async_launch.py
  • /scan/odom を入力に /map を出します。
  • 進むほど地図が更新されます(黒=障害物、白=空間、灰=未確定)。

この状態でRViz2で可視化します。

ros2 run rviz2 rviz2

設定:

  1. 左下 Global Options → Fixed Framemap
  2. Add → Map(Topic: /map
  3. Add → TFRobotModel(姿勢・座標確認)

壁沿いにゆっくり走らせると、地図がみるみる塗られていくのが見えます。
同じ場所を一周し、ループ閉じが起きると、地図の歪みがグッと整います。

十分に走らせたら、作成できた地図を保存します。

ros2 run nav2_map_server map_saver_cli -f my_world_map

my_world_map.pgm / my_world_map.yaml が生成されます。

  • .pgm:白黒画像(占有格子地図)
  • .yaml:解像度・原点などのメタ情報(Nav2で再利用)

課題11

SLAMが「Localization」と「Mapping」を同時に行う理由を、ドリフト観測のバランスという観点から説明してください。

Navigation2とは

Nav2(Navigation2) は ROS2 の「自律走行システム」です。
SLAMで作成した地図を使い、ロボットがゴール地点まで自分で経路を計画し、安全に移動します。

主な機能

機能役割
Localization既存の地図上で自分の位置を推定(AMCL)
Path Planningゴールまでの最短経路を計算
Path Following経路に沿って動作し、障害物を回避
Recovery Behavior壁にぶつかったり迷った時に復帰動作を行う

Nav2 は「SLAMで地図を作る」→「AMCLで自己位置推定」→「Nav2で経路計画」という流れで構成されています。

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

sudo apt update
sudo apt install -y \
  ros-humble-turtlebot3-navigation2 \
  ros-humble-turtlebot3-gazebo \
  ros-humble-turtlebot3-slam-toolbox

SLAMと同じく、壁付きワールドを使います。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

別のターミナルで地図を読み込んでNav2起動します。

SLAMで保存した地図(例:my_world_map.yaml)を使います。
次のコマンドを実行します。

export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_navigation2 navigation2.launch.py \
  use_sim_time:=True \
  map:=/home/ubuntu/ros2_ws/my_world_map.yaml

起動したRViz2上の地図でざっくりと現在ロボットがどこの位置にいるのか指定します。

RViz 上部の「2D Pose Estimate」ツールをクリックし、現在ロボット位置を設定します。

すると以下のようにロボットの位置が修正されます。

これでNavigationが使える状態になりましたので、ゴールを位置の情報を送ってみます。

Nav2Goalをクリックし、先ほどと同じ要領で目標位置を設定します。

ロボットが自動で目標位置まで動きます。

課題12

ゴールを設定する作業を何回か繰り返し、ロボットがどのように経路を設定しているか観察してください。

経路の形が障害物回避を考慮して変化していることを確認し、考察してください。

次回はこちら

Comming soon

Follow me!

-Python, ROS2, プログラム, 高専4年生
-, , , ,

PAGE TOP