2、开发环境搭建:Ubuntu + ROS2 + Docker 环境配置、代码仓库管理、CI/CD 流水线入门

说实话,很多做自动驾驶的朋友都卡在环境搭建这一步。我见过太多人花了两周装环境,结果代码一跑就崩。今天我就把压箱底的一套流程拿出来,帮你把开发环境一次搞定。

2.1 为什么选这套组合拳?

你想想看,自动驾驶开发最怕什么?最怕「在我电脑上能跑啊」。Ubuntu 是行业标准,ROS2 是机器人通信的事实协议,Docker 则是解决环境一致性的终极方案。这三者组合起来,基本能覆盖从个人开发到团队协作的全场景。

我个人习惯把开发环境分成三层:

  • 底层:Ubuntu 22.04 LTS —— 稳定,社区支持好
  • 中间层:ROS2 Humble —— 长期支持版本,生态成熟
  • 应用层:Docker —— 隔离依赖,一键部署

核心思路:宿主机只装基础系统,所有开发依赖都打包进 Docker 镜像。这样你换电脑、换服务器,拉个镜像就能继续干活。

2.2 Ubuntu + ROS2 基础配置

先搞定系统。我建议直接用 Ubuntu 22.04 LTS,别追新。为什么?因为 ROS2 Humble 官方支持的就是这个版本,踩过的坑最少。

2.2.1 系统初始化

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装基础工具
sudo apt install -y git curl wget vim net-tools

# 配置中文支持(如果你像我一样习惯中文终端)
sudo apt install -y language-pack-zh-hans
sudo locale-gen zh_CN.UTF-8

小技巧:装完系统第一件事,把软件源换成国内镜像。我在项目中遇到过因为网络问题装包装到崩溃的情况,换源后世界清净了。

2.2.2 ROS2 Humble 安装

ROS2 的安装其实不复杂,但有几个坑要注意。我直接给标准流程:

# 设置编码
sudo apt install -y software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install -y curl
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装桌面版(包含可视化工具)
sudo apt update
sudo apt install -y ros-humble-desktop

# 安装开发工具
sudo apt install -y python3-colcon-common-extensions python3-rosdep

注意:安装完成后一定要执行 source /opt/ros/humble/setup.bash。我建议直接写到 ~/.bashrc 里,不然每次开终端都要手动 source,很烦。

2.3 Docker 环境配置

Docker 这块,说白了就是给你的开发环境拍个快照。我在团队里推 Docker 的时候,一开始大家觉得麻烦,后来发现「环境不一致导致的问题」减少了 80%。

2.3.1 安装 Docker

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 将当前用户加入 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER

避坑指南:我曾经忘记把用户加入 docker 组,结果每次都要 sudo,权限问题搞得头大。执行完 usermod 后记得注销重新登录。

2.3.2 构建 ROS2 + Docker 镜像

这里我直接给一个 Dockerfile,你拿去就能用:

FROM ros:humble-ros-base-jammy

# 安装常用工具
RUN apt-get update && apt-get install -y \
    git \
    vim \
    wget \
    curl \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

# 安装 Python 依赖
RUN pip3 install --upgrade pip
RUN pip3 install numpy opencv-python

# 设置工作目录
WORKDIR /workspace

# 设置 ROS2 环境
RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

# 默认命令
CMD ["bash"]

构建和运行:

# 构建镜像
docker build -t auto-dev:latest .

# 运行容器(挂载当前目录到工作区)
docker run -it --rm \
  -v $(pwd):/workspace \
  --network host \
  auto-dev:latest

2.4 代码仓库管理

代码管理这块,我踩过的坑比吃过的盐还多。早期用 SVN,后来切 Git,现在团队统一用 Git + GitFlow 工作流。

2.4.1 仓库结构设计

自动驾驶项目通常包含多个模块,我建议用 monorepo 或者多 repo 混合模式。这里给一个典型结构:

auto-driving-project/
├── src/
│   ├── perception/       # 感知模块
│   ├── planning/         # 规划模块
│   ├── control/          # 控制模块
│   └── common/           # 公共库
├── scripts/              # 工具脚本
├── config/               # 配置文件
├── docs/                 # 文档
├── tests/                # 测试
├── Dockerfile
├── .gitignore
└── README.md

个人经验:.gitignore 一定要提前写好。我见过有人把编译生成的 build 目录、Docker 镜像层文件都提交上去了,仓库直接膨胀到几个 G。

2.4.2 Git 工作流

我团队用的是简化版 GitFlow:

  • main:生产分支,只合入经过测试的代码
  • develop:开发分支,日常开发的基础
  • feature/*:功能分支,从 develop 拉出,完成后合并回去
  • hotfix/*:紧急修复分支,从 main 拉出

常用的 Git 命令:

# 创建功能分支
git checkout -b feature/new-perception develop

# 开发完成后合并
git checkout develop
git merge --no-ff feature/new-perception

# 打标签
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0

2.5 CI/CD 流水线入门

CI/CD 这东西,说白了就是让机器帮你做重复劳动。我刚开始做自动驾驶时,每次改完代码都要手动编译、手动测试、手动部署,一天能折腾七八次。后来上了 CI/CD,每天省出两小时喝咖啡。

2.5.1 选择 CI/CD 工具

常用的有 Jenkins、GitLab CI、GitHub Actions。我个人推荐 GitHub Actions,因为配置简单,和 GitHub 仓库无缝集成。这里给一个示例配置:

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [ develop, main ]
  pull_request:
    branches: [ develop ]

jobs:
  build-and-test:
    runs-on: ubuntu-22.04

    steps:
    - uses: actions/checkout@v3

    - name: Build Docker image
      run: docker build -t auto-dev:latest .

    - name: Run tests
      run: |
        docker run --rm \
          -v $(pwd):/workspace \
          auto-dev:latest \
          bash -c "source /opt/ros/humble/setup.bash && colcon build && colcon test"

    - name: Lint check
      run: |
        docker run --rm \
          -v $(pwd):/workspace \
          auto-dev:latest \
          bash -c "pip3 install flake8 && flake8 src/"

2.5.2 流水线核心流程

一个标准的 CI/CD 流水线包含以下阶段:

  1. 代码检查:静态分析、代码风格检查
  2. 编译构建:在 Docker 容器中编译整个项目
  3. 单元测试:运行所有测试用例
  4. 集成测试:模拟场景测试
  5. 镜像打包:生成部署用的 Docker 镜像
  6. 部署:推送到测试环境或实车

避坑指南:我曾经在 CI 里直接跑实车测试,结果一次代码错误导致车辆急刹,差点出事。后来我规定:CI 只做编译和单元测试,集成测试必须用仿真环境。

2.6 知识体系总览

下面这张图概括了本章的核心逻辑,从开发环境到自动化部署的完整链路:

开发环境搭建知识体系 Ubuntu 22.04 LTS ROS2 Humble Docker 开发工具链 Git 版本控制 colcon 构建系统 Docker Compose 代码仓库管理 GitFlow 工作流 分支策略 代码审查 CI/CD 自动化流水线 从环境搭建到自动化部署的完整链路

2.7 常见问题与避坑

问题 原因 解决方案
ROS2 节点无法通信 环境变量未正确设置 检查 ROS_DOMAIN_ID 是否一致
Docker 容器内无法访问 GPU 缺少 nvidia-docker 运行时 安装 nvidia-container-toolkit
CI 构建失败但本地成功 环境不一致 确保 CI 使用与本地相同的 Docker 镜像
Git 冲突频繁 多人同时修改同一文件 推行模块化开发,减少耦合

重要提醒:Docker 容器内的 ROS2 通信需要特别注意网络模式。我建议使用 --network host 模式,否则节点发现会出问题。这个坑我踩了整整两天才爬出来。

好了,环境搭建这部分就到这里。记住一个原则:环境一致性比代码质量更重要。代码写错了可以改,环境不一致导致的 bug 能让你怀疑人生。把 Docker 用起来,把 CI/CD 跑起来,你会发现开发效率翻倍。

可可精品资料库