ナビゲーションの基本概念
ナビゲーションはロボットがA地点からB地点へ自主移動するためのシステムです。ROSではナビゲーションスタックと呼ばれる機能パッケージ群で実現され、以下の要素を統合します:
- グローバルマップの構築
- ロボットの位置推定
- 経路計画
- 運動制御
- 環境認識
ナビゲーションスタックは専門チームによって開発・メンテナンスされ、開発者は下位層の実装に拘らず上位機能の実装に集中できます。主な利点は以下の通りです:
- 安全性: 専門チームによる品質管理
- 機能性: 完備された機能と安定性
- 効率性: 上位機能開発に集中可能
座標系の重要性
ナビゲーションの実現には座標系の理解が不可欠です。主に以下の3つの座標系が関与します:
- map: グローバルマップの基準座標系
- odom: 位置推定のためのオドメトリ座標系
- base_link: ロボット本体の基準座標系
座標変換の関係は
map → odom → base_linkと構成されます。オドメトリは連続的な情報提供が可能ですが累積誤差の問題があります。一方、センサー定位は精度が高いですが、環境依存性が高いため、両方を組み合わせて利用します。
ハードウェア要件
ナビゲーション実装には以下のハードウェア制約があります:
- 差動駆動の輪式ロボット
- 単線レーザーレーダーの搭載
- 正方形または円形のロボット形状
実装手順
SLAMによる地図構築 (gmapping)
地図作成にはgmappingパッケージを使用します。以下のlaunchファイルを実行します:
<launch>
<param name="use_sim_time" value="true"/>
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<remap from="scan" to="scan"/>
<param name="robot_frame" value="base_link"/>
<param name="odom_frame" value="odom"/>
<param name="update_interval" value="3.0"/>
<param name="max_scan_range" value="15.0"/>
<param name="sigma" value="0.03"/>
<param name="map_resolution" value="0.05"/>
<param name="min_particles" value="25"/>
<param name="max_particles" value="60"/>
</node>
<node pkg="robot_state_publisher" type="robot_state_publisher" />
<node pkg="rviz" type="rviz" name="rviz" />
</launch>
この設定でロボットを操作すると、RVizで地図が生成されます。
マップの保存と読み込み
生成した地図を永続化するにはmap_serverを使用します。
- 地図の保存:
<node name="map_saver" pkg="map_server" type="map_saver" args="-f $(find map)/environment"/>
- 地図の読み込み:
<node name="map_server" pkg="map_server" type="map_server" args="$(find map)/environment.yaml"/>
保存された地図は
.pgm画像と
.yamlメタデータファイルで構成されます。メタデータでは解像度、原点位置、障害物閾値が定義されます。
位置推定 (AMCL)
AMCLは確率的定位システムで、地図とセンサーデータを用いてロボットの位置を推定します。主要パラメータは以下の通りです:
initial_pose_x: 初期X座標
initial_pose_y: 初期Y座標
initial_pose_a: 初期角度
min_particles: 最小粒子数