使用cartographer扩展地图

说明

主要是使用cartographer在已有地图的基础上扩展未知区域地图,避免对已有地图重复建图

1. 加载已有地图

首先要在定位模式下加载已有地图

启动launch文件

bash 复制代码
<launch>
    <arg name = "configuration_directory" default = "/work/slam/script"/>
  <arg name = "configuration_basename" default = "expand_map.lua"/>
  <arg name = "load_state_filename" default = "/work/slam/maps/map.pbstream"/>
  <arg name="load_frozen_state" default="true"/>
 
  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(arg configuration_directory)
          -configuration_basename $(arg configuration_basename)
          -load_state_filename $(arg load_state_filename)
          -load_frozen_state $(arg load_frozen_state)"
      output="screen">
  </node>
  <node name="rviz" pkg="rviz" type="rviz" required="true"  
        args="-d /work/slam/script/demo_2d.rviz" />
  </launch> 

2. 结束当前轨迹

需要结束定位产生的轨迹

bash 复制代码
source install_isolated/setup.bash
rosservice call /finish_trajectory 1

3. 开启新的轨迹

通过调用cartographer服务开启新的轨迹

bash 复制代码
rosservice call /start_trajectory "configuration_directory: '/work/slam/script'
configuration_basename: 'expand_map.lua'
use_initial_pose: true     
initial_pose:
  position: {x: -0.0551091, y: -0.939531, z: 0.0}
  orientation: {x: 0.0, y: 0.0, z: -0.00436956, w: 0.999996}
relative_to_trajectory_id: 0" 

4. 保存地图

当对未知地图完成扫描后保存地图

bash 复制代码
#!/bin/bash
source install_isolated/setup.bash

# Call the ROS service and save the output to a variable
response=$(rosservice call /get_trajectory_states "{}")

# Extract the trajectory_id array from the response
trajectory_ids=$(echo "$response" | awk -F'trajectory_id: ' '{print $2}' | awk -F']' '{print $1}')

# Extract the last element from the trajectory_id array
last_element=$(echo "$trajectory_ids" | awk -F', ' '{print $NF}')

# Print the last element
echo "Last element of trajectory_id: $last_element"

rosservice call /finish_trajectory $last_element

rosservice call /write_state "{filename: '/work/slam/map/map.pbstream'}"

注意

1, 由于在定位阶段加载了lua参数,新建轨迹时如果参数不同,不会生效;

2, 在定位模式下,结束当前轨迹时,会删除当前轨迹,导致在转换地图时出现

bash 复制代码
F0317 08:40:01.665091 111541 proto_stream_deserializer.cc:70] Check failed: pose_graph_.pose_graph().trajectory_size() == all_trajectory_builder_options_.all_trajectory_builder_options() .options_with_sensor_ids_size() (2 vs. 1) 
*** Check failure stack trace: ***
    @     0x7a369d2e90cd  google::LogMessage::Fail()
    @     0x7a369d2eaf33  google::LogMessage::SendToLog()
    @     0x7a369d2e8c28  google::LogMessage::Flush()
    @     0x7a369d2eb999  google::LogMessageFatal::~LogMessageFatal()
    @     0x6503b3f07528  (unknown)
    @     0x6503b3ef915a  (unknown)
    @     0x6503b3ef7968  (unknown)
    @     0x7a369ba21c87  __libc_start_main
    @     0x6503b3ef901a  (unknown)

因此需要在代码中对删除的操作进行特别处理

相关推荐
@小匠2 小时前
Read Frog:一款开源的 AI 驱动浏览器语言学习扩展
人工智能·学习
炽烈小老头8 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
阿杰学AI8 小时前
AI核心知识115—大语言模型之 自监督学习(简洁且通俗易懂版)
人工智能·学习·ai·语言模型·aigc·监督学习·自监督学习
九英里路9 小时前
OS学习之路——动静态库制作与原理
linux·学习·操作系统·unix·进程·编译·动静态库
red_redemption10 小时前
自由学习记录(160)
学习
南無忘码至尊10 小时前
Unity学习90天-第2天-认识Unity生命周期函数并用 Update 控制物体移动,FixedUpdate 控制物理
学习·unity·游戏引擎
报错小能手10 小时前
ios开发方向——swift错误处理:do/try/catch、Result、throws
开发语言·学习·ios·swift
Z.风止10 小时前
Large Model-learning(3)
人工智能·笔记·后端·深度学习
LX5677710 小时前
传统销售如何系统学习成为AI智能销售顾问?认证指南
人工智能·学习
做cv的小昊11 小时前
【TJU】应用统计学——第五周作业(3.1 假设检验的基本思想、3.2 单个正态总体参数的假设检验)
学习·线性代数·机器学习·数学建模·矩阵·概率论·tju