
強化学習を使わない自律移動ロボットは、古典的なナビゲーション手法(SLAM+経路計画+制御)を組み合わせて実現するのが一般的です。研究・実用ロボットの多くがこの手法を使っており、ROSのナビゲーションスタック(Nav2など)もこの流れです。以下に詳しく説明します。
目次
- 1.強化学習を使わない自律移動ロボットの実現方法
- 1. 基本構成
- センサー取得(LiDAR/カメラ/IMUなど)
- 2. 各ステップの代表的手法
- 3. 実装の流れ(例:ROS Navigation Stack)
- 4. 実用的なポイント
- 1. LiDARを使った地図作成の方法(SLAM)
- 2. 実際の運用イメージ
- 3. SLAMの代表的な手法と挙動
- 4. 地図作成のためのポイント
- 5. 地図作成が終わったら
- 6. 実機運用の例
- 1. なぜ自己位置推定が必要か?
- 2. 自己位置推定の方法
- 3. SLAMでの自己位置推定の流れ
- 4. 地図作成時と地図利用時の違い
- 5. 実例:ROSのCartographerの場合
- 1. 経路計画の2層構造
- 2. 実際の処理の流れ(例:ROS Navigation Stack)
- 3. コストマップ (Costmap) の利用
- 4. 実装例:ROS1のmove_base
- 5. ポイント
- 6. イメージ図
- 1. モーション制御の役割
- 2. 差動二輪ロボット(2輪+キャスター)の例
- 3. 制御の種類
- 4. ローカルプランナーとの関係
- 5. 実例:ROSのコントローラ
- 6. まとめ
1.強化学習を使わない自律移動ロボットの実現方法
1. 基本構成
自律移動の古典的フローは以下のようになります:
2. 各ステップの代表的手法
(1) 自己位置推定 / 地図作成 (SLAM or Localization)
-
ロボットの現在位置を推定し、必要に応じて地図を作成
-
主な手法
-
LiDARベース:
-
GMapping(2Dグリッド地図)、Hector SLAM、Cartographer
-
-
視覚ベース:
-
ORB-SLAM2 / 3(モノカメラ or ステレオカメラ)
-
VINS-Fusion(カメラ+IMU)
-
-
-
実環境ではLiDAR+オドメトリが安定的
(2) 経路計画(Path Planning)
グローバルプランナー (Global planner)
-
地図全体を使ってスタート→ゴールまでの経路を作成
-
主な手法:
-
グラフ探索系: A*, D*, D* Lite
-
サンプリング系: RRT, RRT*, PRM
-
ローカルプランナー (Local planner)
-
センサで見えている範囲内で障害物を避けながら経路追従
-
主な手法:
-
Dynamic Window Approach (DWA)
-
Timed Elastic Band (TEB)
-
Pure Pursuit制御
-
(3) モーション制御
-
ロボットの車輪やアクチュエータを制御して滑らかに動かす
-
PID制御やMPC(モデル予測制御)を用いる
-
差動二輪なら「左右の目標速度」を与えるだけのケースが多い
3. 実装の流れ(例:ROS Navigation Stack)
-
地図作成(SLAM)
-
SLAMパッケージ(gmapping/cartographer/ORB-SLAM)で2D or 3D地図を作成
-
-
Localization
-
地図があればAMCL(Adaptive Monte Carlo Localization)で自己位置推定
-
-
経路計画
-
Global plannerでゴールまでの経路を決定(AやD)
-
Local planner(DWA/TEB)で障害物回避しながら走行
-
-
実機制御
-
センサデータを取り込みながら継続的に経路修正
-
4. 実用的なポイント
-
ROSのナビゲーションスタックを使うのが一番早い
-
ROS1:
move_base -
ROS2:
Nav2
-
-
実機走行までに必要な準備
-
オドメトリ(車輪のエンコーダ等)とLiDAR/カメラのキャリブレーション
-
センサーノイズ対策(EKF/UKFでのセンサ融合)
-
地図(静的 or SLAMで生成)
-
2.LiDARを使った地図作成方法
以下、LiDARを使った地図作成方法とは、のもう少し詳細説明です。
基本的には LiDARを搭載した状態でロボットを走行させ、周囲の環境データを収集して地図を作成します。
1. LiDARを使った地図作成の方法(SLAM)
LiDAR+オドメトリ(エンコーダ)+IMUを用いて、自己位置推定と地図作成を同時に行うSLAM (Simultaneous Localization and Mapping) を実行します。
-
LiDARが周囲360°の距離情報(点群)を取得
-
自己位置推定をしながら地図を更新
-
複数回のスキャン結果を統合して2D/3Dの地図を構築
2. 実際の運用イメージ
-
一度の走行でカバーできれば1回でOK
-
ロボットを操縦して、全エリアをできるだけ見通しよく回る
-
死角や細い通路などがある場合は複数回走ってデータを補完
-
-
建物が広い or 障害物が多い場合は複数回走行することもある
-
一度作った地図に追加走行のデータをマージできる(ROSのmap_mergeなど)
-
3. SLAMの代表的な手法と挙動
-
2D LiDAR用:
-
GMapping(ROSで有名)
-
Hector SLAM(オドメトリ不要)
-
Cartographer(Google開発、精度が高い)
-
-
3D LiDAR用:
-
LOAM、LeGO-LOAM
-
LIO-SAM(LiDAR+IMU)
-
👉 これらはリアルタイムに地図ができあがっていくため、作業者はPCの画面を見ながら走行させ、未カバーの領域がないように調整できます。
4. 地図作成のためのポイント
-
環境全体をカバーすること
-
LiDARは障害物で見えない部分があるため、通路や部屋の奥まで回る
-
-
ループクロージャーを活用する
-
同じ場所を通ると位置誤差を補正できる(ループを閉じる)
-
-
安定した走行
-
急加速・急旋回はLiDARのマッチングが崩れる原因になる
-
5. 地図作成が終わったら
-
保存した地図(2DならOccupancy Grid Map)を使ってAMCLなどで自己位置推定+経路計画ができる
-
環境が大きく変わったら地図を作り直すか、部分的にアップデート
6. 実機運用の例
-
ロボットを手動操縦(ジョイスティックやPCから)して建物全体を回る
-
SLAMが地図をリアルタイム表示するので、漏れがあれば補完走行
-
完成地図を保存して「この地図上で自己位置推定・ナビゲーション」を実行
3.自己位置推定
地図作成時の自己位置推定は、ロボットが「今どこにいるのか」を推定しながら、LiDARやセンサーで取得した情報を地図上に配置していく処理のことです。SLAM (Simultaneous Localization and Mapping) の「Localization」の部分にあたります。
1. なぜ自己位置推定が必要か?
-
LiDARは「ロボットからの相対的な距離」しか分かりません。
-
もしロボットが自分の位置を見失ってしまうと、
→ 障害物の位置を正しい地図座標に置けなくなり、地図が崩れてしまう。 -
そのため、移動のたびに現在位置を正確に推定する必要があるのです。
2. 自己位置推定の方法
地図作成中の自己位置推定は、複数の情報源を組み合わせて推定します。
(1) オドメトリ(車輪エンコーダやIMU)
-
車輪の回転量やIMUの加速度・角速度を積分して推定
-
メリット: 連続的で高速
-
デメリット: 誤差が累積(ドリフト)
(2) LiDARスキャンのマッチング
-
LiDARで得た点群を、直前のスキャンや現在作っている地図と照合
-
代表的な手法:
-
ICP (Iterative Closest Point):点群の形が重なるように位置を調整
-
Scan Matching (Hector SLAM):レーザースキャンの重なり具合で推定
-
-
メリット: 誤差が累積しにくい
-
デメリット: 計算量が大きい、特徴が少ない環境では不安定
(3) ループクロージャー (Loop Closure)
-
「以前通った場所と同じ場所に戻った」と検出したら、過去の位置推定誤差を一括で補正
-
Graph SLAM系(Cartographer, ORB-SLAMなど)でよく使われる
3. SLAMでの自己位置推定の流れ
-
オドメトリ情報でおおよその位置を推定
-
LiDARスキャンをマッチングして補正
-
過去の位置との関係をグラフとして保存
-
ループクロージャーを検出したらグラフ全体を最適化して位置を補正
4. 地図作成時と地図利用時の違い
-
地図作成時 (SLAM)
→ 自己位置推定と地図更新を同時に行う -
地図利用時 (Localizationのみ)
→ 作成済み地図を使って自己位置だけ推定(例: AMCL)
5. 実例:ROSのCartographerの場合
-
オドメトリ+LiDARスキャンマッチングで逐次自己位置を推定
-
同じ場所に戻るとループクロージャーを検出して地図と位置を全体的に最適化
-
RViz上で地図が歪んだり伸びたりしながら修正されていくのが見える
4.経路計画とは?
経路計画(Path Planning)は、自律移動ロボットが 現在位置からゴール位置まで衝突せずに移動する経路を決定する処理 です。強化学習を使わない従来手法では、地図上のグローバルな経路計画とローカルな障害物回避を組み合わせて行うのが一般的です。以下で詳しく説明します。
1. 経路計画の2層構造
経路計画は、グローバルプランナー (Global Planner) と ローカルプランナー (Local Planner) の2段階で行います。
(1) グローバルプランナー
-
地図全体を見て「スタートからゴールまでの大まかな経路」を作成する
-
動的障害物(歩行者、移動する台車)は考慮せず、静的な地図をベースに計画
-
主なアルゴリズム:
-
A*:最短経路探索の基本(コスト最小)
-
D*:A*の改良版、動的な地図更新に対応
-
Dijkstra:最短経路探索(重み付きグラフ)
-
(2) ローカルプランナー
-
グローバルプランナーの経路を追従しつつ、近くの障害物を避ける
-
LiDARやカメラのリアルタイム観測を考慮
-
主なアルゴリズム:
-
DWA (Dynamic Window Approach)
→ ロボットの速度・加速度制約を考慮して安全に移動 -
TEB (Timed Elastic Band)
→ 時間パラメータ付きの経路最適化、動的障害物も回避しやすい -
Pure Pursuit
→ 経路上の目標点を追従(単純だが安定)
-
2. 実際の処理の流れ(例:ROS Navigation Stack)
-
現在位置を自己位置推定 (AMCL) で取得
-
ゴール位置を設定(座標 or マップ上のポイント)
-
グローバルプランナーが地図上で経路を計算
-
AやD Liteでスタート→ゴールの最短経路を決定
-
コストマップ(障害物は高コスト)を使う
-
-
ローカルプランナーが近傍の障害物を避けつつ経路を追従
-
DWAやTEBで速度コマンドを生成
-
-
動的障害物があれば再計画
-
経路が塞がれたら、再度グローバルプランナーを走らせる
-
3. コストマップ (Costmap) の利用
-
地図やセンサー情報を「安全度」で表すマップ
-
障害物はコスト100(侵入禁止)
-
周辺はコストを少し高くして衝突リスクを減らす
-
-
グローバルプランナーもローカルプランナーもコストマップを参照して計算
4. 実装例:ROS1のmove_base
-
Global Planner:
navfn(Dijkstraベース)やglobal_planner(A*対応) -
Local Planner:
dwa_local_plannerorteb_local_planner -
実行すると
cmd_vel(速度指令)が出力され、ロボットが動く
5. ポイント
-
経路計画は 静的地図(Global) と 動的障害物回避(Local) を分けるのが重要
-
ローカルプランナーはロボットの運動学制約を考慮(急旋回できない等)
-
ロボットの形状や速度特性に合わせたチューニングが必要
6. イメージ図