Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【自律移動ロボット】 強化学習を使わない自律移動ロボットの実現方法

 強化学習を使わない自律移動ロボットは、古典的なナビゲーション手法(SLAM+経路計画+制御)を組み合わせて実現するのが一般的です。研究・実用ロボットの多くがこの手法を使っており、ROSのナビゲーションスタック(Nav2など)もこの流れです。以下に詳しく説明します。

 

 

目次

 

 

1.強化学習を使わない自律移動ロボットの実現方法

1. 基本構成

自律移動の古典的フローは以下のようになります:

 

センサー取得(LiDAR/カメラ/IMUなど)

      ↓
  自己位置推定(Localization)
      ↓
    地図作成(SLAM)※必要に応じて
      ↓
  経路計画(Global + Local planner)
      ↓
   モーション制御(低レベル制御)
 
 
 

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)

  1. 地図作成(SLAM)

    • SLAMパッケージ(gmapping/cartographer/ORB-SLAM)で2D or 3D地図を作成

  2. Localization

    • 地図があればAMCL(Adaptive Monte Carlo Localization)で自己位置推定

  3. 経路計画

    • Global plannerでゴールまでの経路を決定(AやD

    • Local planner(DWA/TEB)で障害物回避しながら走行

  4. 実機制御

    • センサデータを取り込みながら継続的に経路修正


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. 地図作成のためのポイント

  1. 環境全体をカバーすること

    • LiDARは障害物で見えない部分があるため、通路や部屋の奥まで回る

  2. ループクロージャーを活用する

    • 同じ場所を通ると位置誤差を補正できる(ループを閉じる)

  3. 安定した走行

    • 急加速・急旋回は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での自己位置推定の流れ

  1. オドメトリ情報でおおよその位置を推定

  2. LiDARスキャンをマッチングして補正

  3. 過去の位置との関係をグラフとして保存

  4. ループクロージャーを検出したらグラフ全体を最適化して位置を補正

 
 [オドメトリで予測位置]
→ [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)

  1. 現在位置を自己位置推定 (AMCL) で取得

  2. ゴール位置を設定(座標 or マップ上のポイント)

  3. グローバルプランナーが地図上で経路を計算

    • AやD Liteでスタート→ゴールの最短経路を決定

    • コストマップ(障害物は高コスト)を使う

  4. ローカルプランナーが近傍の障害物を避けつつ経路を追従

    • DWAやTEBで速度コマンドを生成

  5. 動的障害物があれば再計画

    • 経路が塞がれたら、再度グローバルプランナーを走らせる


3. コストマップ (Costmap) の利用

  • 地図やセンサー情報を「安全度」で表すマップ

    • 障害物はコスト100(侵入禁止)

    • 周辺はコストを少し高くして衝突リスクを減らす

  • グローバルプランナーもローカルプランナーもコストマップを参照して計算

 

 

  ゴール  ●
           ↑ コスト低
 障害物  ■■■ ← コスト高
 
 
 

4. 実装例:ROS1のmove_base

  • Global Planner: navfnDijkstraベース)やglobal_planner(A*対応)

  • Local Planner: dwa_local_planner or teb_local_planner

  • 実行するとcmd_vel(速度指令)が出力され、ロボットが動く


5. ポイント

  • 経路計画は 静的地図(Global)動的障害物回避(Local) を分けるのが重要

  • ローカルプランナーはロボットの運動学制約を考慮(急旋回できない等)

  • ロボットの形状や速度特性に合わせたチューニングが必要


6. イメージ図

 
[Global Planner]
   └── 地図全体でスタートからゴールまで最短経路を計算(A*など)
         ↓
[Local Planner]
   └── 経路を追従しつつ近くの障害物を避ける(DWA/TEB)
         ↓
[制御]
 └── ロボットの車輪速度コマンドを生成
 
 

5.モーション制御

 
 
 
モーション制御(低レベル制御)は、経路計画で決まった目標の速度や軌道を、ロボットのモータや車輪の制御信号に変換して実際に動かす部分のことです。自律移動ロボットの最下層に位置する制御で、ロボットが「計画通りにまっすぐ走る・曲がる・止まる」ことを保証します。
 
 

1. モーション制御の役割

  • 上位の ローカルプランナー が「速度指令(vx:前進速度, ω:角速度)」を出す

  • モーション制御はこれを モータの回転数やPWM制御信号に変換し、実際にロボットを動かす

  • 外乱(床の摩擦・車輪スリップ・傾斜)に対しても PID制御などで補正し、安定した動きを実現


2. 差動二輪ロボット(2輪+キャスター)の例

2-1. 入力される指令

ローカルプランナーから以下が送られてくる:

 
 
vx = 前進/後退の速度 (m/s)
ω  = 回転速度 (rad/s)
 
 
 

2-2. 車輪速度に変換

左右の車輪速度VR、VLに変換する式:

 
 
VR = vx + (ω * 車輪間距離 / 2)
VL = vx - (ω * 車輪間距離 / 2)
 
 
 

2-3. モータ制御

  • エンコーダ(車輪回転センサ)で現在の回転数を計測

  • 目標回転数との差を PID制御 で補正してモータ電圧を調整

  • 制御周期は 10ms~50ms程度のリアルタイムループ


3. 制御の種類

3-1. 開ループ制御 (Open-loop)

  • 指令値をそのまま出す(例:PWM50%)

  • 実際の速度を計測しないので誤差が溜まりやすい

  • 実験用の簡易制御で使うことが多い

3-2. 閉ループ制御 (Closed-loop)

  • エンコーダやIMUでフィードバックして誤差を補正

  • 一般的にはPID制御を使う

    • P: 誤差の大きさに比例して補正

    • I: 誤差の累積を補正(偏りをなくす)

    • D: 誤差の変化を補正(オーバーシュート抑制)

3-3. モデル予測制御 (MPC)

  • 未来の挙動を予測して最適な制御入力を決める

  • 高度な制御だが計算量が多いので産業用ロボットで使われることが多い


4. ローカルプランナーとの関係

  1. ローカルプランナーが「この瞬間の最適速度」を決める

  2. モーション制御が「その速度になるようにモータを回す」

  3. フィードバックループで誤差を補正


5. 実例:ROSのコントローラ

  • diff_drive_controller (ROS control)

    • 差動二輪用のモーション制御パッケージ

    • エンコーダからオドメトリを生成しつつ、PIDで速度指令を実現

  • ros2_control + hardware_interface で実機のモータドライバと接続


6. まとめ

  • モーション制御はロボットを計画通り動かす最下層の制御

  • 主な処理:

    1. 経路計画で出た速度指令を車輪やアクチュエータの目標値に変換

    2. エンコーダやIMUで現在値を計測

    3. PID制御などで目標値に追従させる

  • 安定した自己位置推定や経路追従のために非常に重要