文章總覽
1 純定位模式
當完成建圖后,會生成pbstream格式的地圖文件
配置純定位模式的lua腳本
backpack_2d_localization.lua
include "backpack_2d.lua"TRAJECTORY_BUILDER.pure_localization_trimmer = {max_submaps_to_keep = 3,
}
POSE_GRAPH.optimize_every_n_nodes = 20return options
配置純定位模式的launch文件
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgumentdef generate_launch_description():# 參數聲明map_file = DeclareLaunchArgument('map_file',default_value=os.path.expanduser('/home/cat/map/map.pbstream'),description='Path to prebuilt map file')configuration_directory = DeclareLaunchArgument('configuration_directory',default_value='/home/cat/cartographer_ws/src/cartographer_ros/cartographer_ros/configuration_files',description='Configuration directory')configuration_basename = DeclareLaunchArgument('configuration_basename',default_value='backpack_2d_localization.lua',description='Configuration file basename')use_sim_time = DeclareLaunchArgument('use_sim_time',default_value='false',description='Use simulation time')# Cartographer 節點cartographer_node = Node(package='cartographer_ros',executable='cartographer_node',name='cartographer_node',parameters=[{'use_sim_time': LaunchConfiguration('use_sim_time')}],arguments=['-configuration_directory', LaunchConfiguration('configuration_directory'),'-configuration_basename', LaunchConfiguration('configuration_basename'),'-load_state_filename', LaunchConfiguration('map_file'),'-load_frozen_state', 'true' # 關鍵:凍結地圖狀態'-pure_localization', 'true' # 關鍵:明確啟用純定位模式],# 關鍵重映射:確保與 Navigation2 兼容remappings=[('scan', '/scan'), # 激光雷達數據('odom', '/odom'), # 里程計數據('imu', '/imu/data'), # IMU 數據('initial_pose', '/initialpose') # 初始位姿設置(用于重定位)],output='screen')# 占用網格節點# occupancy_grid_node = Node(# package='cartographer_ros',# executable='cartographer_occupancy_grid_node',# name='occupancy_grid_node',# parameters=[{'use_sim_time': LaunchConfiguration('use_sim_time')}],# arguments=[ # '-resolution', '0.05', # 網格分辨率# '-pure_localization', 'true' # 純定位模式# ]# ) return LaunchDescription([map_file,configuration_directory,configuration_basename,use_sim_time,cartographer_node])
2 地圖發布
注意點:occupancy_grid_node需要注釋掉,否則仍然會發送/map話題,cartographer算法沒有純定位的功能,在純定位時也會計算子圖。
我們可以使用nav2_map_server包的map_server節點實現地圖的發送,配置yaml_filename問題,即可發送地圖信息。
將之前slam建圖時得到的pbstream文件轉為yaml文件,使用如下命令實現:
ros2 run cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=map18 -pbstream_filename=map.pbstream -resolution=0.02