4、环境搭建:Ubuntu系统配置、ROS/ROS2安装、依赖库编译安装

好,咱们正式开始动手了。这一章我把它叫做「地基工程」。你想想看,传感器标定工具链跑不跑得顺,全看底层环境稳不稳。我自己带团队时,最怕听到的一句话就是:「我环境装好了,但编译报错。」一问,Ubuntu版本不对,ROS源没换,Eigen还是系统自带的古董版……嗯,这些坑我基本都踩过一遍了。

今天咱们就一步一个脚印,把Ubuntu、ROS/ROS2、还有那几个绕不开的依赖库——Eigen、Ceres、OpenCV、PCL,全部安排明白。

4.1 Ubuntu系统配置:选对版本,少走弯路

我个人习惯用Ubuntu 20.04 LTS。为什么?因为ROS1 Noetic和ROS2 Foxy都能完美支持,而且社区资源最丰富。你如果非要用22.04,也不是不行,但有些老包的兼容性会让你头疼。我在项目中遇到过一位同事,硬上22.04配ROS1,折腾了两天,最后还是乖乖退回了20.04。

装好系统后,第一件事不是装ROS,而是换源。国内用户你懂的,不换源的话,apt下载速度能让你怀疑人生。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源(以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
我的小习惯:装完系统先装个build-essential和git,后面编译依赖库时你会感谢我的。

4.2 ROS/ROS2安装:双版本共存?可以,但有讲究

标定工具链里,ROS1和ROS2都有可能用到。比如一些老牌的标定包(如camera_calibration)还在ROS1上跑得欢,而新出的工具(比如lidar_align)已经转向ROS2了。所以我的建议是:主装一个,辅装另一个

我个人主力用ROS1 Noetic,因为生态成熟。但我会同时装ROS2 Foxy,以备不时之需。

4.2.1 安装ROS1 Noetic

# 添加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-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

# 安装桌面完整版(包含标定常用工具)
sudo apt install ros-noetic-desktop-full -y

# 初始化rosdep
sudo rosdep init
rosdep update

# 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.2.2 安装ROS2 Foxy

# 设置locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 添加ROS2源
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装ROS2基础包
sudo apt update
sudo apt install ros-foxy-desktop -y

# 环境变量(注意不要和ROS1冲突)
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc_ros2
注意:ROS1和ROS2的环境变量不要同时source!我建议在~/.bashrc里只source ROS1,需要切到ROS2时手动执行source ~/.bashrc_ros2。我曾经因为两个同时source,导致rviz和rqt都打不开,排查了半天才发现是环境变量打架了。

4.3 依赖库编译安装:自己动手,丰衣足食

系统自带的库版本往往太老,或者缺少某些模块。比如标定中常用的Ceres Solver,apt源里的版本可能不支持自动求导的某些特性。所以,我建议全部源码编译。别怕麻烦,编译一次,后面省心一年。

4.3.1 Eigen:最轻量的线性代数库

Eigen是纯头文件库,说白了就是不需要编译,解压就能用。但要注意版本,标定工具链一般要求3.3.7以上。

# 下载Eigen 3.4.0
wget https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
tar -xzf eigen-3.4.0.tar.gz
cd eigen-3.4.0

# 创建build目录并安装
mkdir build && cd build
cmake ..
sudo make install

# 安装后头文件在 /usr/local/include/eigen3/
避坑指南:我曾经因为Eigen版本太低,编译Ceres时报了一堆模板错误。后来才发现是Eigen 3.2和Ceres 2.0不兼容。所以,Eigen尽量用最新的稳定版。

4.3.2 Ceres Solver:非线性优化的利器

标定中大量用到Ceres做优化,比如相机内参标定、手眼标定。它的依赖有点多,但按顺序装就行。

# 安装Ceres依赖
sudo apt install libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev

# 下载Ceres 2.1.0
wget http://ceres-solver.org/ceres-solver-2.1.0.tar.gz
tar -xzf ceres-solver-2.1.0.tar.gz
cd ceres-solver-2.1.0

# 编译安装
mkdir build && cd build
cmake ..
make -j4
sudo make install

编译时如果报错找不到Eigen,记得在cmake时指定路径:cmake -DEIGEN_INCLUDE_DIR=/usr/local/include/eigen3 ..

4.3.3 OpenCV:图像处理的核心

标定工具链里,OpenCV负责图像读取、特征点提取、棋盘格角点检测等。我建议装4.5.5版本,稳定且兼容性好。

# 安装OpenCV依赖
sudo apt install build-essential cmake git pkg-config libjpeg-dev libtiff5-dev libpng-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install libgtk2.0-dev libcanberra-gtk-module libcanberra-gtk3-module

# 下载OpenCV 4.5.5
wget -O opencv-4.5.5.zip https://github.com/opencv/opencv/archive/4.5.5.zip
unzip opencv-4.5.5.zip
cd opencv-4.5.5

# 编译(开启contrib模块的话会更强大,但标定用基础版就够了)
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
注意:编译OpenCV时,如果内存不够(比如虚拟机只给了2G),make -j4可能会卡死。我建议先make -j2,或者加大swap空间。我曾经在笔记本上编译到一半直接死机,后来老老实实加了4G swap。

4.3.4 PCL:点云处理的基础

激光雷达标定离不开PCL。它的依赖比较多,但好在大部分都能通过apt解决。

# 安装PCL依赖
sudo apt install libboost-all-dev libeigen3-dev libflann-dev libvtk7-dev libvtk7-qt-dev

# 下载PCL 1.12.1
wget https://github.com/PointCloudLibrary/pcl/archive/refs/tags/pcl-1.12.1.tar.gz
tar -xzf pcl-1.12.1.tar.gz
cd pcl-pcl-1.12.1

# 编译安装
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j4
sudo make install

编译PCL时,VTK的版本容易出问题。如果你用的是Ubuntu 20.04,VTK 7.1是官方支持的。如果报VTK相关的错,可以试试sudo apt install libvtk7-dev重新装一下。

4.4 验证安装:跑个小demo试试

所有库装完后,我习惯写一个简单的CMakeLists.txt来验证。这样能快速发现链接问题。

# 创建一个测试目录
mkdir ~/sensor_calib_test && cd ~/sensor_calib_test

# 创建CMakeLists.txt
cat << EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(calib_test)

find_package(Eigen3 REQUIRED)
find_package(Ceres REQUIRED)
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED)

add_executable(test_calib test_calib.cpp)
target_link_libraries(test_calib
    \${EIGEN3_LIBRARIES}
    \${CERES_LIBRARIES}
    \${OpenCV_LIBS}
    \${PCL_LIBRARIES}
)
EOF

# 创建测试源文件
cat << EOF > test_calib.cpp
#include <iostream>
#include <Eigen/Dense>
#include <ceres/ceres.h>
#include <opencv2/opencv.hpp>
#include <pcl/point_cloud.h>

int main() {
    std::cout << "Eigen version: " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << std::endl;
    std::cout << "Ceres version: " << CERES_VERSION_STRING << std::endl;
    std::cout << "OpenCV version: " << CV_VERSION << std::endl;
    std::cout << "PCL version: " << PCL_VERSION << std::endl;
    std::cout << "All libraries installed successfully!" << std::endl;
    return 0;
}
EOF

# 编译运行
mkdir build && cd build
cmake ..
make
./test_calib

如果能看到四个库的版本号都打印出来,恭喜你,环境搭建成功了!

总结一下:环境搭建这件事,说白了就是「耐心」二字。每个库的依赖链不同,编译报错是常态。我的经验是:先看报错信息,再Google,最后才问人。大部分问题在StackOverflow上都有答案。嗯,这一章的内容就到这里,下一章咱们开始搭建标定工具链的工程框架。