2. 环境搭建
说实话,做SLAM这几年,我见过太多人在环境搭建这一步就卡住了。明明算法原理都懂,代码也写好了,结果编译报错一整天,心态直接崩掉。我自己刚入行那会儿,也曾在PCL版本冲突上浪费过整整一个周末。
所以这一章,咱们把环境搭得稳稳当当的。你跟着我的步骤走,保证一次过。
2.1 Ubuntu系统配置——选对版本,少走弯路
我个人习惯用Ubuntu 20.04 LTS。为什么?因为ROS Noetic官方支持的就是20.04。你想想看,如果选了18.04装Noetic,那得自己折腾多少依赖?没必要。
系统装好后,第一件事是换源。国内用户直接用清华源或者阿里源,速度能快十倍。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 20.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update
sudo apt upgrade -y
vim、git、cmake、build-essential。这些是后面编译的基石,缺一个都可能报错。
2.2 ROS Noetic安装——全量还是精简?
ROS的安装方式有两种:desktop-full 和 desktop。我建议你直接装 desktop-full,因为它包含了Gazebo、Rviz、各种导航库。做激光SLAM,Rviz几乎是天天用的,Gazebo也能用来仿真测试。
# 设置ROS源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 添加密钥
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
# 安装
sudo apt update
sudo apt install ros-noetic-desktop-full -y
装完之后,别忘了初始化 rosdep。这一步很多人会漏掉,结果后面编译功能包时各种依赖找不到。
sudo rosdep init
rosdep update
然后配置环境变量:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
.bashrc 改成 .zshrc。我曾经帮一个同事排查了半天,最后发现他用的zsh但配置写在了bashrc里……
验证安装:
roscore
如果看到类似 started core service [/rosout] 的输出,说明ROS已经跑起来了。
2.3 PCL库编译与验证——从源码到实战
PCL(Point Cloud Library)是点云处理的核心。Ubuntu的apt源里其实有预编译版本,但我强烈建议你从源码编译。为什么?因为预编译版本往往比较老,而且缺少一些模块(比如 pcl_visualization 的某些功能)。
我当年做多线激光雷达融合时,就遇到过apt装的PCL不支持某些滤波算法,最后只能重新编译。
2.3.1 安装依赖
sudo apt install libeigen3-dev libflann-dev libboost-all-dev \
libvtk7-dev libvtk7-qt-dev libqhull-dev \
libopenni2-dev libpcap-dev -y
嗯,这里要注意:VTK版本一定要对。Ubuntu 20.04对应的是VTK 7,如果你装了VTK 9,后面编译PCL时可能会报链接错误。
2.3.2 下载并编译PCL
# 下载源码
git clone https://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build && cd build
# CMake配置
cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_visualization=ON \
-DBUILD_surface_on_nurbs=ON \
-DBUILD_tools=ON \
..
# 编译(-j4根据你的CPU核心数调整)
make -j4
# 安装
sudo make install
sudo ldconfig
BUILD_visualization=ON:编译可视化模块,方便调试点云BUILD_surface_on_nurbs=ON:曲面重建模块,做地图优化时有用BUILD_tools=ON:编译pcl_viewer等命令行工具
2.3.3 验证PCL安装
写一个简单的测试程序,看看PCL能不能正常工作:
// test_pcl.cpp
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
int main() {
// 创建一个点云对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 填充点云数据
cloud->width = 100;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size(); ++i) {
cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
// 保存为PCD文件
pcl::io::savePCDFileASCII("test_pcd.pcd", *cloud);
std::cout << "Saved " << cloud->points.size() << " data points to test_pcd.pcd." << std::endl;
// 可视化
pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped()) {
// 等待用户关闭窗口
}
return 0;
}
编译运行:
g++ test_pcl.cpp -o test_pcl -lpcl_io -lpcl_visualization -lpcl_common
./test_pcl
如果弹出一个窗口,显示随机生成的点云,那就说明PCL安装成功了。
undefined reference to ...,多半是链接库的顺序不对。把 -lpcl_io 放在最前面,依赖库放在后面。这是GCC链接器的特性,说白了就是后面的库依赖前面的库。
2.4 本章知识体系总览
下面这张图,是我梳理的本章核心逻辑。你可以把它当作一张地图,随时回来对照:
你看,整个环境搭建其实就三层:系统层(Ubuntu)、通信层(ROS)、算法层(PCL)。每一层都踩实了,后面的开发才能顺风顺水。
好了,环境搭好了,咱们就可以开始玩点云了。下一章,我会带你用PCL读取第一帧激光雷达数据,看看那些密密麻麻的点到底长什么样。
可可精品资料库