用catrographer跑自己的数据集

本文详细介绍了如何使用Cartographer SLAM系统构建自定义地图的过程。包括修改配置文件以匹配个人激光雷达数据集,调整坐标系设置,运行代码生成地图,以及如何保存和转换地图数据为常见格式。
部署运行你感兴趣的模型镜像

用catrographer跑自己的数据集

1、更改demo_revo_lds.launch和revo_lds.lua

1.1 修改demo_revo_lds.launch

原本的demo_revo_lds.launch为

<launch>
  <param name="/use_sim_time" value="true" />

  <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename revo_lds.lua"
      output="screen">
    <remap from="scan" to="scan" />
  </node>

  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

  <node name="rviz" pkg="rviz" type="rviz" required="true"
      args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
  <node name="playbag" pkg="rosbag" type="play"
      args="--clock $(arg bag_filename)" />
</launch>

其中我们要修改的是

<remap from="scan" to="scan" />

将其改成我们自己的激光数据集里面的激光雷达发布的topic,我的为/sick_scan,因为我把这里改成

<remap from="scan" to="sick_scan" />

其他的都不动

1.1 修改revo_lds.lua

原来的代码有有一段代码为

  map_frame = "map",
  tracking_frame = "laser",
  published_frame = "laser",
  odom_frame = "odom",

将其进行修改,针对tracking_frame和published_frame,将他们改成自己的数据集里面的激光slam中激光topic的坐标名称
注意这里的坐标名称可以通过

rosrun rqt_tree rqt_tree

来进行查看,注意了必须和rqt_tree里面的一样才行,这里不是topic,还是topic的坐标名称

2、运行代码

运行代码

roslaunch cartographer_ros demo_revo_lds.launch

可以看到地图
在这里插入图片描述

3、保存地图

序列化保存其当前状态

rosservice call /write_state "{filename: '${HOME}/Downloads/mymap.pbstream'}"

将pbstream转换为pgm和yaml

rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=${HOME}/Downloads/mymap -pbstream_filename=${HOME}/Downloads/mymap.pbstream -resolution=0.05

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

Cartographer SLAM 系统中的闭环检测(Loop Closure Detection)是实现高精度地图构建和定位的关键部分。闭环检测的目标是在机器人运动过程中,识别出当前观测与之前某一时刻观测之间的匹配关系,从而修正由运动估计误差导致的累积漂移问题。 ### 闭环检测原理 在 Cartographer 中,闭环检测通过将当前扫描数据(scan)与历史子图(submap)进行匹配来实现。Cartographer 的设计结合了局部(local)和全局(global)两种方式来进行激光 SLAM,其中闭环检测属于全局优化的一部分[^2]。 具体而言,Cartographer 将地图划分为多个子图(submap),每个子图包含一定数量的激光扫描数据,并以栅格地图或概率地图的形式进行存储。当系统运行时,它不仅使用前端(local)的 scan matching 来更新当前帧的姿态,还会周期性地执行后端(global)的闭环检测任务,即在历史子图中寻找与当前扫描最匹配的位置[^1]。 闭环检测的核心思想是:如果当前扫描与某个旧子图之间存在高度相似性,则说明机器人可能回到了一个曾经访问过的位置,此时可以通过优化算法调整轨迹,使得整个地图的一致性更高。 ### 实现方法 Cartographer 的闭环检测实现主要包括以下几个步骤: #### 1. 扫描到子图匹配(Scan-to-Submap Matching) Cartographer 使用分支定界法(Branch and Bound)进行高效的二维扫描匹配。该方法通过比较当前扫描点云与子图之间的相似性,计算出最优的变换矩阵(即旋转和平移)。这一过程利用了相关性评分(correlation score)来衡量匹配程度[^4]。 ```cpp // 示例伪代码:扫描到子图匹配 Transform2d ComputeBestTransform(const Submap& submap, const PointCloud2D& scan) { double best_score = -infinity; Transform2d best_transform; for (const auto& candidate_transform : GenerateCandidateTransforms()) { double score = ComputeCorrelationScore(submap, scan, candidate_transform); if (score > best_score) { best_score = score; best_transform = candidate_transform; } } return best_transform; } ``` #### 2. 回环候选生成与验证 Cartographer 在后台维护一个闭环检测队列,定期从队列中取出扫描帧,并尝试与所有已存在的子图进行匹配。为了提高效率,通常只考虑最近一段时间内的子图作为匹配对象。一旦发现高相关性的匹配对,就将其作为回环候选。 随后,系统会对这些候选进行进一步验证,包括几何一致性检查和时间间隔分析,以避免误匹配带来的负面影响。 #### 3. 图优化(Graph Optimization) 一旦闭环被确认有效,Cartographer 就会将该闭环约束添加到图优化模块中。图优化采用 Ceres Solver 进行非线性最小二乘优化,目标是最小化所有节点(pose)之间的残差,从而调整机器人的轨迹并提升地图的一致性。 ```cpp // 示例伪代码:添加闭环约束 void AddLoopClosureConstraint(Graph* graph, int current_node_id, int loop_node_id, const Transform2d& transform) { ceres::CostFunction* cost_function = new LoopConstraintCostFunction(transform); graph->AddConstraint(current_node_id, loop_node_id, cost_function); } ``` ### 优势与特点 Cartographer 的闭环检测机制具有以下优势: - **高效性**:通过使用子图结构而非原始扫描序列,减少了每次匹配的数据量,提高了实时性能。 - **鲁棒性**:结合多尺度搜索策略和相关性评分机制,增强了在不同环境下的适应能力。 - **可扩展性**:支持大规模地图构建,适用于长期运行的机器人系统[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值