Cartographer安装避坑全记录:从Git代理到Eigen3版本,一次解决所有编译错误
2026/6/15 1:59:50 网站建设 项目流程

Cartographer实战避坑指南:从零搭建到完美运行的完整路线图

当你第一次接触Cartographer时,可能会被它强大的建图能力所吸引,但随即就会被复杂的安装过程浇一盆冷水。作为Google开源的SLAM算法,Cartographer确实在精度和效率上表现出色,但其依赖复杂、配置繁琐的特点也让不少开发者望而却步。本文将带你系统性地解决从环境准备到最终运行的全流程问题,特别针对那些官方文档没有明确说明的"坑点"。

1. 环境准备:打好地基才能建高楼

在开始之前,确保你的Ubuntu系统版本与ROS发行版匹配。对于Cartographer ROS,推荐使用Ubuntu 20.04 + Noetic或Ubuntu 18.04 + Melodic组合。我曾见过不少开发者因为版本不匹配而浪费数天时间。

基础依赖安装清单

sudo apt-get update sudo apt-get install -y \ cmake \ g++ \ git \ google-mock \ libboost-all-dev \ libcairo2-dev \ libeigen3-dev \ libgflags-dev \ libgoogle-glog-dev \ liblua5.3-dev \ libsuitesparse-dev \ ninja-build \ python3-sphinx

特别注意libeigen3-dev的版本问题。Cartographer对Eigen3版本有严格要求,太新或太旧都会导致编译失败。Ubuntu 20.04默认安装的Eigen3 3.3.7版本通常能良好工作,但如果遇到问题,可以尝试以下解决方案:

# 查看已安装的Eigen3版本 dpkg -l | grep eigen # 如果需要特定版本,可以手动下载编译 wget https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz tar -xzvf eigen-3.3.7.tar.gz cd eigen-3.3.7 mkdir build && cd build cmake .. sudo make install

2. 工作空间配置:构建稳健的开发环境

创建一个独立的工作空间是避免依赖冲突的关键。我推荐使用以下结构:

carto_ws/ src/ cartographer/ cartographer_ros/ ceres-solver/

逐步构建工作空间

  1. 初始化工作空间:
mkdir -p ~/carto_ws/src cd ~/carto_ws catkin_make_isolated --install --use-ninja
  1. 获取Cartographer源码:
cd ~/carto_ws/src git clone https://github.com/cartographer-project/cartographer.git git clone https://github.com/cartographer-project/cartographer_ros.git
  1. 安装Ceres Solver(必须1.13.0及以上版本):
sudo apt-get install -y libatlas-base-dev libsuitesparse-dev cd ~/carto_ws/src git clone https://ceres-solver.googlesource.com/ceres-solver cd ceres-solver git checkout 1.14.0 # 使用稳定版本 mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) sudo make install

3. 编译与安装:解决常见错误的实战方案

进入编译阶段,90%的问题都集中在依赖缺失和版本冲突上。以下是我总结的高频错误及解决方案:

错误1:Protobuf版本冲突

症状:编译时出现"protobuf版本不匹配"相关错误

解决方案:

# 查看当前protobuf版本 protoc --version # 如果版本低于3.0.0,需要升级 sudo apt-get remove libprotobuf-dev cd ~ git clone https://github.com/protocolbuffers/protobuf.git cd protobuf git submodule update --init --recursive ./autogen.sh ./configure make -j$(nproc) make check sudo make install sudo ldconfig

错误2:找不到absl库

解决方案:手动安装abseil-cpp

cd ~/carto_ws/src git clone https://github.com/abseil/abseil-cpp.git cd abseil-cpp mkdir build && cd build cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. make -j$(nproc) sudo make install

错误3:lua5.3相关错误

解决方案:确保lua5.3正确安装并配置

sudo apt-get install -y liblua5.3-dev # 如果系统同时存在多个lua版本,可能需要创建符号链接 sudo ln -s /usr/include/lua5.3 /usr/include/lua sudo ln -s /usr/lib/x86_64-linux-gnu/liblua5.3.so /usr/lib/liblua.so

完成以上准备工作后,可以开始正式编译:

cd ~/carto_ws catkin_make_isolated --install --use-ninja -DCMAKE_BUILD_TYPE=Release source ~/carto_ws/install_isolated/setup.bash

4. 配置与运行:让Cartographer真正工作起来

编译通过只是第一步,正确的配置才是Cartographer发挥性能的关键。以下是典型配置流程:

传感器配置检查表

传感器类型必须检查项常见问题
激光雷达frame_id, topic名称, 坐标系关系frame_id不匹配导致TF树断裂
IMU坐标系方向, 数据频率, 时间同步加速度计和陀螺仪数据方向错误
里程计协方差矩阵, 数据频率协方差设置不当导致定位漂移

关键配置文件修改

  1. revo_lds.lua主要参数调整:
TRAJECTORY_BUILDER_2D = { use_imu_data = true, -- 根据是否使用IMU调整 min_range = 0.3, -- 匹配你的雷达最小测距 max_range = 8., -- 匹配你的雷达最大测距 missing_data_ray_length = 1., num_accumulated_range_data = 1, voxel_filter_size = 0.025, } POSE_GRAPH = { optimize_every_n_nodes = 35, -- 优化频率,影响CPU负载 constraint_builder = { sampling_ratio = 0.3, max_constraint_distance = 15., min_score = 0.55, -- 回环检测阈值,影响识别灵敏度 } }
  1. Launch文件关键配置:
<launch> <param name="/use_sim_time" value="false" /> <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="horizontal_laser_2d" /> <!-- 确保与雷达topic一致 --> </node> <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" /> </launch>

调试技巧

  1. TF树检查:
rosrun tf view_frames evince frames.pdf # 查看生成的TF树结构
  1. 数据时间同步检查:
rostopic hz /scan # 雷达数据频率 rostopic hz /imu # IMU数据频率
  1. RViz显示配置要点:
  • 添加LaserScan显示,设置正确的Topic
  • 添加TF显示,检查坐标系关系
  • 添加Map显示,观察建图效果

5. 高级优化:提升建图质量的实用技巧

当Cartographer基本运行后,你可能希望进一步提升建图质量。以下是几个经过验证的优化方向:

IMU数据校准

# 简单的IMU数据检查脚本 #!/usr/bin/env python import rospy from sensor_msgs.msg import Imu def imu_callback(data): # 检查加速度计数据 if abs(data.linear_acceleration.x) > 9.8: rospy.logwarn("异常加速度计数据: x=%.2f", data.linear_acceleration.x) # 检查陀螺仪数据 if abs(data.angular_velocity.z) > 1.0: rospy.logwarn("高旋转速度: z=%.2f rad/s", data.angular_velocity.z) rospy.init_node('imu_check') rospy.Subscriber("/imu", Imu, imu_callback) rospy.spin()

参数调优对照表

参数名默认值调整方向影响效果
TRAJECTORY_BUILDER_2D.submaps.num_range_data35增大→建图更平滑但延迟增加影响局部地图更新频率
POSE_GRAPH.optimize_every_n_nodes35增大→降低CPU负载但优化延迟影响全局优化的实时性
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window0.1增大→提高匹配鲁棒性但增加计算量影响扫描匹配成功率
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight10增大→位姿估计更稳定影响定位精度

性能监控命令

# 查看Cartographer节点CPU和内存使用情况 top -p $(pgrep -d',' cartographer) # 监控ROS节点计算延迟 rostopic delay /scan

经过这些优化后,你应该能得到比默认参数更好的建图效果。记得每次只调整一个参数,并记录变化效果,这样才能准确掌握每个参数的实际影响。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询