状況
環境:ros2 humble
Navigating Using GPS Localizationを試していた.
※githubにあるnavigation2 tutorialのhumbleブランチではnav2_gps_waypoint_follower_demoパッケージは準備されていないので,rollingブランチから直接持ってきた.
「2- Setup Navigation system」の
ros2 launch nav2_gps_waypoint_follower_demo gps_waypoint_follower.launch.py use_rviz:=True
まで実行するとシミュレーションが立ち上がり,robot_localizationにより,
base_footprint->odom
odom->map
のtfをパブリッシュさせることができた.
nav2のhumbleバージョンではfollowGpsWaypoints(wps)メソッドがまだ実装されていないので,「3- Interactive GPS Waypoint Follower」以降は実行できない.
これを実機のセンサデータでlocalizationしてみたい.
しかしなぜかtfがパブリッシュされなかった.
原因
nav2_gps_waypoint_follower_demoのlauchファイルを書き換えたため,parameterの{"use_sim_time": True}を消し忘れていた.
上手くいかなかったrobot_localizationを立ち上げるlaunchファイルの中身
---(省略)
return LaunchDescription(
[
launch_ros.actions.Node(
package="robot_localization",
executable="ekf_node",
name="ekf_filter_node_odom",
output="screen",
parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
remappings=[("odometry/filtered", "odometry/local")],
),
launch_ros.actions.Node(
package="robot_localization",
executable="ekf_node",
name="ekf_filter_node_map",
output="screen",
parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
remappings=[("odometry/filtered", "odometry/global")],
),
launch_ros.actions.Node(
package="robot_localization",
executable="navsat_transform_node",
name="navsat_transform",
output="screen",
parameters=[rl_params_file,{"use_sim_time": True}],<--こいつ
remappings=[
("imu/data", "imu/data"),
("gps/fix", "gps/fix"),
("gps/filtered", "gps/filtered"),
("odometry/gps", "odometry/gps"),
("odometry/filtered", "odometry/global"),
],
),
]
)
robot localizationはセンサデータのトピックのtime stampを見る.
今回はセンサデータのtime stampは現実の時間になっている.
しかしuse_sim_time=Trueにしたせいでrobot_localizationはシミュレーションの時間を使うことになり,センサデータはlocalizationの考慮に入れられなかった.
よってtfがパブリッシュされなかったと考えられる.
反省
robot_localizationに関する情報がほぼ英語で理解が薄かったため,どこが悪いのか探すのにとても時間がかかってしまった.
シミュレーションでは動くのに実機のデータでは動かない場合,
time stamp関連
サブスクライブするトピック名
などをチェックしてみてほしい.