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 流水线包含以下阶段:
- 代码检查:静态分析、代码风格检查
- 编译构建:在 Docker 容器中编译整个项目
- 单元测试:运行所有测试用例
- 集成测试:模拟场景测试
- 镜像打包:生成部署用的 Docker 镜像
- 部署:推送到测试环境或实车
避坑指南:我曾经在 CI 里直接跑实车测试,结果一次代码错误导致车辆急刹,差点出事。后来我规定:CI 只做编译和单元测试,集成测试必须用仿真环境。
2.6 知识体系总览
下面这张图概括了本章的核心逻辑,从开发环境到自动化部署的完整链路:
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 跑起来,你会发现开发效率翻倍。
可可精品资料库