cartographer 常见问题及解决方法

本文解决了在使用Cartographer进行地图构建时遇到的两个常见问题:一是关于SPARSE_POSE_GRAPH参数错误,需要从lua文件中删除该参数;二是protobuff版本冲突问题,解决方法是删除并重新编译安装cartographer。

1. Check failed: status == 0 (2 vs. 0) [string “include “map_builder.lua”…”]:36: attempt to index global ‘SPARSE_POSE_GRAPH’ (a nil value)

问题描述:出现这个问题的原因是map_builder.lua文件中没有SPARSE_POSE_GRAPH这个参数,这是由于cartographer更新导致的。
解决方案
删掉lua文件里SPARSE_POSE_GRAPH参数。

2. protobuff版本冲突问题

问题描述:

In file included from /home/zhangying/Downloads/cartographer/cartographer/common/ceres_solver_options.h:21:0,
                 from /home/zhangying/Downloads/cartographer/cartographer/common/ceres_solver_options.cc:17:
/usr/local/include/cartographer/common/proto/ceres_solver_options.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
 #error This file was generated by a newer version of protoc which is
  ^~~~~
/usr/local/include/cartographer/common/proto/ceres_solver_options.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
 #error incompatible with your Protocol Buffer headers.  Please update
  ^~~~~
/usr/local/include/cartographer/common/proto/ceres_solver_options.pb.h:14:2: error: #error your headers.
 #error your headers.

解决方案:
删除/usr/local/include/下的cartographer文件夹,重新编译安装cartographer

cd /usr/local/include
sudo rm -rf cartographer
cd ~/Downloads/cartographer
rm -rf bulid
mkdir build
cd build
cmake ..
make -j4
sudo make install
### Cartographer Check Failed 错误分析与解决方案 在使用 Cartographer 融合定位时,可能出现 `Check failed: data.time > std::prev(trajectory.end())->first` 的错误。这一问题通常源于时间戳逻辑的冲突或数据流处理不当。以下是详细的分析和解决方法。 #### 1. **时间戳顺序问题** Cartographer 的核心组件之一是基于时间戳的数据管理机制。当新的传感器数据(如激光雷达扫描或里程计更新)被加入到轨迹中时,其时间戳必须大于之前最近一条数据的时间戳[^3]。如果新数据的时间戳小于等于之前的最新时间戳,则触发此检查失败。 ```cpp template <typename DataType> void MapByTime<DataType>::Append(const int trajectory_id, const DataType& data) { CHECK_GE(trajectory_id, 0); auto& trajectory = data_[trajectory_id]; if (!trajectory.empty()) { CHECK_GT(data.time, std::prev(trajectory.end())->first); // 时间戳校验 } trajectory.emplace(data.time, data); } ``` 为了修复这个问题,可以尝试以下两种方式: - **调整传感器驱动程序**:确保所有传感器提供的时间戳严格递增。 - **增加延迟缓冲区**:对于可能存在乱序到达的数据源,引入一个短暂的缓存队列以重新排列数据次序[^1]。 #### 2. **采样频率设置不合理** 另一个常见原因是里程计 (`odometry`) 数据的采样率过高或过低。高频率的里程计消息可能导致连续两次之间几乎没有变化,从而使得后续计算得出相同甚至更早的时间标记[^4]。 降低里程计采样比例是一个有效的缓解策略。例如,在 `.lua` 参数配置文件中修改如下参数即可减少不必要的频繁更新: ```lua TRAJECTORY_BUILDER.odometry_sampling_ratio = 0.1 -- 将原值改为较小数值 ``` 这样做的目的是让系统忽略掉部分冗余的 odometry 输入,仅保留那些确实带来显著位置改变的信息点[^4]。 #### 3. **Lua 配置优化** 除了上述提到的 `odometry_sampling_ratio` 外部接口外,还可以进一步审查整个 lua 文件内的其他相关设定项是否有潜在影响因素存在。比如下面这段代码片段展示了如何合理规划局部地图修剪规则以及全局线程数量分配等方面的内容[^5]: ```lua include "2d_online.lua" TRAJECTORY_BUILDER.pure_localization_trimmer = { max_submaps_to_keep = 3, } MAP_BUILDER.num_background_threads = 8 POSE_GRAPH.optimize_every_n_nodes = 80 return options ``` 适当调整这些超参有助于改善整体性能表现同时也间接规避了一些边界情况下的崩溃风险。 --- ### 结论 综上所述,针对 `Check failed: data.time > std::prev(trajectory.end())->first` 这类问题可以从三个方面入手解决:一是确认硬件层面上各传感设备输出是否遵循预期规律;二是依据实际情况灵活调节软件层面涉及时间节点控制的各项系数;最后则是综合考量项目需求定制专属版本的 cartographer 库本身内部实现细节上的改进措施。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值