Ubuntu 20.04下从源码编译A-LOAM的完整避坑指南(含PCL 1.9、Ceres库版本选择)
激光SLAM技术近年来在自动驾驶、机器人导航等领域展现出巨大潜力,而A-LOAM作为LOAM算法的优化版本,因其代码简洁、易读性强,成为许多开发者入门激光SLAM的首选框架。然而,在实际部署过程中,特别是在Ubuntu 20.04这样的较新系统环境下,从源码编译A-LOAM往往会遇到各种"坑"。本文将分享我在Ubuntu 20.04系统上成功编译A-LOAM的全过程经验,重点解决PCL和Ceres库的版本兼容性问题,帮助开发者避开常见陷阱。
1. 系统环境准备
在开始编译A-LOAM之前,确保你的Ubuntu 20.04系统已经完成基础配置。这一步看似简单,但往往决定了后续工作的顺利程度。
首先更新系统软件包:
sudo apt update && sudo apt upgrade -y安装必要的开发工具链:
sudo apt install -y build-essential cmake git wget对于ROS的安装,推荐使用国内镜像源来加速下载过程。以下命令将设置中科大ROS镜像源并安装ROS Noetic(Ubuntu 20.04对应的ROS版本):
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-noetic-desktop-full提示:如果遇到网络问题导致ROS安装失败,可以尝试更换网络环境或使用手机热点。部分校园网或企业网络可能对某些软件源有限制。
2. 关键依赖库的安装与版本控制
A-LOAM的编译成功与否很大程度上取决于依赖库的版本选择。经过多次测试,以下版本组合在Ubuntu 20.04上表现最为稳定。
2.1 PCL库安装
PCL(Point Cloud Library)是A-LOAM的核心依赖之一。Ubuntu 20.04官方仓库中的PCL版本为1.10,但实际测试发现1.9版本兼容性更好。
首先卸载可能存在的旧版本:
sudo apt remove -y libpcl-dev然后从源码编译安装PCL 1.9:
wget https://github.com/PointCloudLibrary/pcl/archive/pcl-1.9.1.tar.gz tar -xvf pcl-1.9.1.tar.gz cd pcl-pcl-1.9.1 && mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) sudo make install验证安装是否成功:
pcl_version --version2.2 Ceres Solver安装
Ceres Solver是一个广泛使用的非线性优化库。推荐使用1.14.x版本,避免使用最新的2.x版本可能带来的兼容性问题。
安装依赖项:
sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev libsuitesparse-dev从源码编译安装:
wget https://github.com/ceres-solver/ceres-solver/archive/1.14.0.tar.gz tar -xvf 1.14.0.tar.gz cd ceres-solver-1.14.0 && mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc) sudo make install3. A-LOAM源码编译与配置
完成依赖库安装后,就可以开始编译A-LOAM了。这里我们使用GitHub上的开源实现。
克隆源码仓库:
git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git cd A-LOAM修改CMakeLists.txt文件以确保使用正确的库版本。主要需要检查以下几项:
- 确保find_package(PCL 1.9 REQUIRED)正确配置
- 检查Eigen3的包含路径
- 确认Ceres的链接选项
编译项目:
catkin_make source devel/setup.bash注意:如果编译过程中出现关于Boost或Eigen的报错,可能需要手动指定这些库的路径。Ubuntu 20.04默认安装的Eigen3版本是3.3.7,通常兼容性良好。
4. 运行测试与常见问题解决
成功编译后,可以使用KITTI数据集测试A-LOAM的运行效果。以下是完整的测试流程:
首先下载KITTI数据集(以序列00为例)并转换为ROS bag格式:
rosrun aloam_velodyne kitti_helper /path/to/kitti/sequence/00启动A-LOAM节点:
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch播放数据集:
rosbag play kitti_2011_10_03_drive_0027_synced.bag常见问题及解决方案:
点云显示异常
- 检查rviz中的Fixed Frame是否设置为"camera_init"
- 确认点云话题是否正确订阅
位姿估计漂移严重
- 检查IMU数据是否正确同步
- 尝试调整laserMapping.cpp中的参数
运行时崩溃
- 可能是PCL版本不兼容导致,确认使用的是PCL 1.9
- 检查系统内存是否充足,A-LOAM对内存要求较高
性能优化建议:
- 在laserOdometry.cpp中调整SCAN_NEARBY_SCAN参数可以平衡精度与速度
- 对于低配设备,可以减少laserMapping中的历史关键帧数量
5. 深入理解A-LOAM架构与原理
虽然本文主要关注实践部署,但了解A-LOAM的基本原理有助于更好地使用和调试系统。A-LOAM主要包含以下几个关键模块:
Scan Registration
- 点云预处理:去除无效点、降采样
- 特征提取:计算曲率并分类边点和面点
// 曲率计算核心代码示例 float diffX = laserCloud->points[i-5].x + laserCloud->points[i-4].x + laserCloud->points[i-3].x + laserCloud->points[i-2].x + laserCloud->points[i-1].x - 10 * laserCloud->points[i].x + laserCloud->points[i+1].x + laserCloud->points[i+2].x + laserCloud->points[i+3].x + laserCloud->points[i+4].x + laserCloud->points[i+5].x; // 类似计算Y和Z方向的差值 float curvature = diffX * diffX + diffY * diffY + diffZ * diffZ;Laser Odometry
- 帧间匹配:边点到线距离+面点到面距离
- 运动估计:基于Ceres Solver的非线性优化
Laser Mapping
- 局部地图构建
- 位姿精优化
下表对比了各模块的计算频率和资源消耗:
| 模块 | 运行频率 | CPU占用 | 内存占用 | 主要功能 |
|---|---|---|---|---|
| ScanRegistration | 10Hz | 中 | 低 | 点云预处理和特征提取 |
| LaserOdometry | 10Hz | 高 | 中 | 实时位姿估计 |
| LaserMapping | 1Hz | 很高 | 高 | 全局位姿优化 |
在实际项目中,我发现A-LOAM对机械式激光雷达的运动畸变补偿效果显著,但对于固态激光雷达可能需要调整运动补偿参数。此外,在狭小空间内,适当降低特征点数量可以提高系统稳定性。