はじめに
Nav2 ドキュメントのセットアップガイドによると TFツリーをREP 105に従って図1のように /map
→ /odom
→ /base_link
の変換を公開する必要がある とあるが、図2のように /odom
フレームなしで /map
→ /base_link
の構成で動かすことができる。
この記事では/odom
フレームなしでNav2を動かす手順についてTurtleBot3とGazebo Classic環境を用いて説明する。
なおこの記事では/odomフレームの存在理由については解説しないものとする。
図1
図2
環境
OS : ubuntu22.04LTS
ROS : ROS2 Iron (Humbleでも可)
ドキュメント通りNav2がインストールされており以下のサンプルが実行できる環境であること
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
手順
おおまかな手順
- Gazebo のdiff driveから出るodometryのframe_idをmapに変更する。
- nav2 parameter ファイルの
global_frame
のodomの部分をすべてmapに変更する。 - 通常通り起動する
必要なパッケージのインストール
sudo apt install ros-$ROS_DISTRO-navigation2
sudo apt install ros-$ROS_DISTRO-nav2-bringup
sudo apt install ros-$ROS_DISTRO-turtlebot3-gazebo
source /opt/ros/$ROS_DISTRO/setup.bash
export TURTLEBOT3_MODEL=waffle
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/$ROS_DISTRO/share/turtlebot3_gazebo/models
turtlebot3のsdfファイル編集
odometry_frameのodomをmapに変更する。
(直接編集するのがいやな場合はコピーして別の場所にうつす)
< <odometry_frame>map</odometry_frame>
---
> <odometry_frame>odom</odometry_frame>
nav2 parameterのyamlファイル編集
Local costmapなどframeがodomになっている箇所をすべてmapに変更。
190c190
< global_frame: map
---
> global_frame: odom
312c312
< local_frame: map
---
> local_frame: odom
実行
sdf, yamlファイルをコピーして編集した場合、引数でファイルの絶対パスを指定。
(amclも起動しているがあってもなくても変わらないので無視)
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False robot_sdf:='/home/user/waffle.model' params_file:='/home/user/nav2_params.yaml'
TF 構成 (/odomがない)
おわりに
odom
フレームなしでmap
→ base_link
の構成でNav2を動かす方法について解説した。
応用事例としてはAutowareのTF構成がmap
→ base_link
となっているので、AutowareのLocalizationモジュールで自己位置推定した結果を直接入力してNav2を動かしたりできる。
そもそもodomフレームとは何か?何故odomフレームが必要なのか?については以下の記事を読んで下さい。
参考