文章总览
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