2. 开发环境搭建:Ubuntu + ROS2 Humble 安装、C++/Python 混合开发环境配置、OpenCV/Eigen 库安装、Git 版本管理与代码规范

好,咱们直接进入正题。做车道保持系统,环境搭不好,后面全是坑。我见过太多人卡在安装这一步,一卡就是半天。今天咱们一步到位,把 Ubuntu、ROS2、C++/Python 混编、OpenCV、Eigen 还有 Git 全搞定。

2.1 为什么选 Ubuntu 22.04 + ROS2 Humble?

说实话,ROS2 的版本有好几个,但我个人强烈推荐 Humble。为什么?因为它是长期支持版,稳定,而且跟 Ubuntu 22.04 是官方配对。你想想看,做量产项目,最怕什么?最怕库版本冲突,一升级全崩了。

我在项目里踩过最深的坑,就是用了 ROS2 Galactic,结果半年后官方停止维护,不得不迁移。那次迁移,整整花了我两周时间。所以,听我一句劝,直接用 Humble,省心。

系统要求:
  • Ubuntu 22.04 LTS(推荐桌面版)
  • 至少 4GB 内存(8GB 以上更佳)
  • 至少 50GB 空闲磁盘空间
  • 稳定的网络连接(国内用户建议配置镜像源)

2.2 Ubuntu 22.04 安装与基础配置

安装过程我就不啰嗦了,网上教程一大堆。但有几个关键点,我得提醒你。

第一,分区要合理。 我建议至少分三个区:/(根分区)给 30GB,/home 给剩下的,再分一个 swap 分区,大小等于你的内存。为什么?因为编译大型项目时,内存不够会直接卡死。我曾经在编译 ROS2 源码时,就因为 swap 太小,系统直接 freeze,那叫一个崩溃。

第二,换源。 安装完第一件事,换国内镜像源。我用的是清华源,速度稳定。命令如下:

sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
小技巧: 换完源后,记得安装 build-essentialcurl,后面很多依赖都要用到。

2.3 ROS2 Humble 安装

ROS2 的安装,官方文档写得很详细,但步骤多,容易漏。我帮你梳理一下核心步骤。

首先,设置 locale。这一步很多人忽略,但很重要。ROS2 对 UTF-8 支持要求严格。

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
export LANG=en_US.UTF-8

然后,添加 ROS2 的 apt 仓库。这里要注意,一定要先添加密钥,否则会报错。

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 -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

最后,安装 ROS2 Humble 桌面版。我建议直接装桌面版,包含所有常用工具和可视化库。

sudo apt update
sudo apt install ros-humble-desktop -y
注意: 安装过程可能持续 10-20 分钟,取决于你的网速。如果中途断网,重新执行 sudo apt install 即可,它会继续下载未完成的部分。

安装完成后,别忘了配置环境变量。每次打开终端都要 source 一下,或者直接写进 .bashrc

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证一下:

ros2 --version

如果看到类似 ros2 humble 的输出,恭喜你,环境搭好了。

2.4 C++/Python 混合开发环境配置

车道保持系统,核心算法用 C++,数据分析和可视化用 Python。这是业界标配。为什么?C++ 性能好,Python 开发快。两者结合,效率最高。

C++ 环境: 安装 g++ 和 cmake。

sudo apt install g++ cmake -y

Python 环境: 我建议用 Python 3.10(Ubuntu 22.04 自带)。再装个 pipvirtualenv,方便管理依赖。

sudo apt install python3-pip python3-venv -y

我个人习惯,每个项目建一个虚拟环境,避免依赖冲突。比如:

python3 -m venv lane_keeping_env
source lane_keeping_env/bin/activate

然后,安装 ROS2 的 Python 客户端库:

pip install rclpy
混合开发的关键: ROS2 支持 C++ 节点和 Python 节点在同一个系统中运行。你只需要在 CMakeLists.txt 中配置好 C++ 节点,在 setup.py 中配置好 Python 节点即可。两者通过话题(Topic)通信,完全透明。

2.5 OpenCV 与 Eigen 库安装

这两个库,是车道保持系统的左膀右臂。OpenCV 处理图像,Eigen 处理矩阵运算。

OpenCV 安装: 我建议从源码编译,这样能启用 GPU 加速。但如果你只是学习,直接 apt 安装也行。

sudo apt install libopencv-dev python3-opencv -y

验证一下:

python3 -c "import cv2; print(cv2.__version__)"

如果看到 4.5.4 或更高版本,就对了。

Eigen 安装: Eigen 是头文件库,安装很简单。

sudo apt install libeigen3-dev -y

验证:

dpkg -l | grep eigen
避坑指南: 我曾经在项目里用了系统自带的 Eigen 3.3,结果发现缺少 Eigen/Geometry 中的某个函数。后来换成 3.4 版本才解决。所以,建议你安装最新稳定版。可以从官网下载源码,手动编译安装。

2.6 Git 版本管理与代码规范

做量产项目,没有版本管理,就是裸奔。我见过有人把代码存在 U 盘里,结果 U 盘丢了,整个项目重写。嗯,这不是段子,是真事。

Git 安装:

sudo apt install git -y

配置用户名和邮箱:

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

代码规范: 我个人推崇 Google 的 C++ 代码风格。为什么?因为它清晰、统一,团队协作时不会因为代码风格吵架。

我建议你安装 clang-format 来自动格式化代码:

sudo apt install clang-format -y

然后,在项目根目录放一个 .clang-format 文件,内容如下:

BasedOnStyle: Google
IndentWidth: 2
UseTab: Never
ColumnLimit: 100

每次提交代码前,运行:

clang-format -i src/*.cpp src/*.hpp

Python 代码,我推荐用 black 格式化:

pip install black
black src/*.py
重要: 代码规范不是摆设。我在项目里定了一条铁律:代码格式化不过关,不能合并到主分支。刚开始大家觉得麻烦,但一个月后,所有人都说真香。

2.7 验证环境:跑一个简单的车道线检测示例

环境搭好了,咱们跑个例子验证一下。写一个简单的 Python 脚本,用 OpenCV 读取摄像头画面,然后发布到 ROS2 话题上。

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2

class CameraPublisher(Node):
    def __init__(self):
        super().__init__('camera_publisher')
        self.publisher_ = self.create_publisher(Image, 'camera/image_raw', 10)
        self.timer = self.create_timer(0.1, self.timer_callback)
        self.cap = cv2.VideoCapture(0)
        self.bridge = CvBridge()

    def timer_callback(self):
        ret, frame = self.cap.read()
        if ret:
            msg = self.bridge.cv2_to_imgmsg(frame, 'bgr8')
            self.publisher_.publish(msg)
            self.get_logger().info('Publishing image')

def main(args=None):
    rclpy.init(args=args)
    node = CameraPublisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

运行这个节点,然后在另一个终端用 ros2 topic echo /camera/image_raw 查看,如果能看到数据,说明整个环境完全打通了。

总结一下: 今天咱们把 Ubuntu、ROS2 Humble、C++/Python 混编、OpenCV、Eigen 和 Git 全装好了。这些工具,就是咱们做车道保持系统的地基。地基稳了,后面盖楼才放心。

下一章,咱们开始讲 ROS2 的核心概念——节点、话题、服务。这些东西搞懂了,你就能像搭积木一样搭建自动驾驶系统。到时候见。