511 lines
14 KiB
Markdown
511 lines
14 KiB
Markdown
# 01 · 5 分钟上手 Quickstart(完整图文版)
|
||
|
||
> **目标**:从"零"到"看到第一个 ROS2 消息流",每步带**预期输出 + 排错**,5 分钟内完成。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [Step 0: 准备清单](#step-0-准备清单)
|
||
- [Step 1: 安装 Docker](#step-1-安装-docker)
|
||
- [Step 2: 拉取并构建镜像](#step-2-拉取并构建镜像)
|
||
- [Step 3: 启动容器](#step-3-启动容器)
|
||
- [Step 4: 在容器内编译](#step-4-在容器内编译)
|
||
- [Step 5: 跑你的第一个 demo](#step-5-跑你的第一个-demo)
|
||
- [Step 6: 本机 venv 开发工作流](#step-6-本机-venv-开发工作流)
|
||
- [Step 7: 验证清单](#step-7-验证清单)
|
||
- [Step 8: 常见问题 FAQ](#step-8-常见问题-faq)
|
||
|
||
---
|
||
|
||
## Step 0: 准备清单
|
||
|
||
| 项 | 需要 |
|
||
|---|---|
|
||
| **操作系统** | Windows 10/11 · macOS 12+ · Linux(Ubuntu 20.04+) |
|
||
| **Docker** | Docker Desktop(Win/macOS)或 Docker Engine(Linux) |
|
||
| **磁盘空间** | 8 GB 可用(Docker 镜像 + 构建缓存) |
|
||
| **网络** | 首次构建需要下载 ~3 GB 镜像 |
|
||
| **时间** | 首次构建 5-10 分钟;后续秒级 |
|
||
|
||
> 💡 Windows 用户:在 BIOS 里开启虚拟化(Intel VT-x / AMD-V),否则 Docker 起不来。
|
||
|
||
---
|
||
|
||
## Step 1: 安装 Docker
|
||
|
||
### 1.1 Windows
|
||
1. 下载 [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/)
|
||
2. 双击安装,需要 WSL 2 后端(安装时它会提示)
|
||
3. 重启电脑
|
||
4. 启动 Docker Desktop,**等到右下角鲸鱼图标不再转动**
|
||
|
||
### 1.2 macOS
|
||
```bash
|
||
brew install --cask docker
|
||
# 启动 Docker Desktop
|
||
```
|
||
|
||
### 1.3 Linux
|
||
```bash
|
||
# Ubuntu
|
||
sudo apt install docker.io docker-compose-plugin
|
||
sudo systemctl enable --now docker
|
||
sudo usermod -aG docker $USER
|
||
# 重新登录后生效
|
||
```
|
||
|
||
### 1.4 验证 Docker 装好
|
||
```bash
|
||
docker --version
|
||
# Docker version 29.4.3, build ...
|
||
|
||
docker compose version
|
||
# Docker Compose version v5.1.3
|
||
```
|
||
|
||
**若报 `Cannot connect to Docker daemon`**: 启动 Docker Desktop(Win/macOS)或 `sudo systemctl start docker`(Linux)。
|
||
|
||
---
|
||
|
||
## Step 2: 拉取并构建镜像
|
||
|
||
### 2.1 进入项目目录
|
||
```bash
|
||
# Windows PowerShell
|
||
cd D:\xs\ros2
|
||
|
||
# Linux / macOS
|
||
cd /path/to/ros2
|
||
```
|
||
### 2.2 构建镜像(首次 5-10 分钟)
|
||
|
||
```bash
|
||
docker compose -p ros2 -f docker/docker-compose.yml build
|
||
```
|
||
|
||
**这一步做了什么**:
|
||
1. 拉 `osrf/ros:humble-desktop` 基础镜像(约 2 GB)
|
||
2. 装 `colcon-common-extensions`、`colcon-argcomplete` 等开发工具
|
||
3. 打 tag 为 `ros2-humble-dev:latest`
|
||
|
||
**预期输出(末尾)**:
|
||
```
|
||
#10 exporting layers 1.5s done
|
||
#10 exporting manifest sha256:xxxxx 0.0s done
|
||
#10 exporting config sha256:xxxxx 0.0s done
|
||
#10 naming to docker.io/library/ros2-humble-dev:latest done
|
||
|
||
Image ros2-humble-dev:latest Built
|
||
```
|
||
|
||
**若报 `ERROR: pull access denied`**:
|
||
- 检查网络(可能在国内,需要配 Docker 镜像加速器)
|
||
- 或: `docker pull osrf/ros:humble-desktop` 单步测试
|
||
|
||
### 2.3 验证镜像
|
||
```bash
|
||
docker images
|
||
# REPOSITORY TAG IMAGE ID CREATED SIZE
|
||
# ros2-humble-dev latest abc123def456 1 minute ago 3.4GB
|
||
# osrf/ros humble-desktop 789xyz... 3 weeks ago 2.1GB
|
||
```
|
||
|
||
---
|
||
|
||
## Step 3: 启动容器
|
||
|
||
```bash
|
||
docker compose -p ros2 -f docker/docker-compose.yml up -d
|
||
```
|
||
|
||
**参数说明**:
|
||
- `-p ros2`:compose project 名,所有容器归在 `ros2` 项目下(脱离默认 `docker`)
|
||
- `up -d`:后台启动(`-d` = detached)
|
||
- `container_name: ros2_dev`:容器名叫这个
|
||
- `networks: ros2_net`:自定义 bridge(脱离 docker_default,IP 段 172.20.0.0/24)
|
||
|
||
**预期**:
|
||
```
|
||
[+] Running 2/2
|
||
✔ Container ros2_dev Created
|
||
✔ Container ros2_dev Started
|
||
```
|
||
|
||
**验证容器在跑**:
|
||
```bash
|
||
docker ps
|
||
# CONTAINER ID IMAGE NAMES ...
|
||
# abc123def456 ros2-humble-dev:latest ros2_dev Up X seconds
|
||
```
|
||
|
||
**进入开发终端**:
|
||
```bash
|
||
docker exec -it ros2_dev bash -lc "source /opt/ros/humble/setup.bash && source /root/ros2_ws/install/setup.bash && exec bash"
|
||
```
|
||
|
||
> ❗ **两个 `source` 都要有**:
|
||
> - `source /opt/ros/humble/setup.bash` — 加载 ROS2 环境变量(rclpy / colcon / ros2 CLI)
|
||
> - `source /root/ros2_ws/install/setup.bash` — 加载本项目 12 个编译产物(只有 build 后才有 `install/`,第 4 步前先注释掉这一行)
|
||
|
||
你应该看到类似:
|
||
```
|
||
root@docker-desktop:/root/ros2_ws#
|
||
```
|
||
|
||
> 💡 **小技巧**: 用 `bash scripts/shell.sh` 一键进入(自动检查容器是否在跑 + 启动 + source)。
|
||
|
||
---
|
||
|
||
## Step 4: 在容器内编译
|
||
|
||
### 4.1 准备编译
|
||
```bash
|
||
# 在容器内
|
||
source /opt/ros/humble/setup.bash # 加载 ROS2 环境
|
||
cd /root/ros2_ws # 进入工作空间
|
||
```
|
||
### 4.2 编译所有包
|
||
|
||
```bash
|
||
bash scripts/build.sh
|
||
```
|
||
*(脚本封装了 `source /opt/ros/humble/setup.bash` + `colcon build --symlink-install --executor sequential` 12 个包;手动等价命令见下)*
|
||
|
||
**手动等价命令**:
|
||
```bash
|
||
source /opt/ros/humble/setup.bash
|
||
cd /root/ros2_ws
|
||
colcon build --symlink-install --executor sequential \
|
||
--packages-select \
|
||
py_pubsub cpp_pubsub py_srv py_action_demo \
|
||
cpp_robot_tf2 py_vision_demo py_params \
|
||
cpp_custom_interface py_lifecycle_composable \
|
||
cpp_qos_demo py_overlay_dds bringup
|
||
```
|
||
|
||
> ❗ **`--executor sequential` 必需**。colcon 默认并行构建 12 个包,`cpp_custom_interface` 的 rosidl export cmake 步骤会偶发失败(已知 CMake bug)。串行构建稳定通过。
|
||
|
||
**预期输出(末尾)**:
|
||
```
|
||
Finished <<< py_pubsub [9.5s]
|
||
Finished <<< cpp_pubsub [42s]
|
||
Finished <<< py_srv [11s]
|
||
Finished <<< py_action_demo [17s]
|
||
Finished <<< cpp_robot_tf2 [49s]
|
||
Finished <<< py_vision_demo [11s]
|
||
Finished <<< py_params [12s]
|
||
Finished <<< cpp_custom_interface [38s]
|
||
Finished <<< py_lifecycle_composable [8s]
|
||
Finished <<< cpp_qos_demo [22s]
|
||
Finished <<< py_overlay_dds [9s]
|
||
Finished <<< bringup [12s]
|
||
|
||
Summary: 12 packages finished [3min 30s]
|
||
```
|
||
|
||
**编译产物位置**:
|
||
```
|
||
/root/ros2_ws/install/ ← source 这个目录才能用 ros2 命令
|
||
├── py_pubsub/
|
||
├── cpp_pubsub/
|
||
├── py_srv/
|
||
├── py_action_demo/
|
||
├── cpp_robot_tf2/
|
||
├── py_vision_demo/
|
||
├── py_params/
|
||
├── cpp_custom_interface/
|
||
├── py_lifecycle_composable/
|
||
├── cpp_qos_demo/
|
||
├── py_overlay_dds/
|
||
└── bringup/
|
||
```
|
||
### 4.3 跑测试(可选)
|
||
|
||
```bash
|
||
bash scripts/test.sh
|
||
```
|
||
|
||
**预期**:
|
||
```
|
||
Summary: 12 packages finished [1min 30s]
|
||
0 packages failed
|
||
|
||
build/py_pubsub/pytest.xml: 11 tests, 0 errors, 0 failures, 0 skipped
|
||
build/cpp_pubsub/test_results/cpp_pubsub/test_pub_sub.gtest.xml: 3 tests, ...
|
||
build/py_srv/pytest.xml: 7 tests, ...
|
||
...
|
||
Summary: 82 tests, 0 errors, 0 failures, 0 skipped
|
||
```
|
||
|
||
---
|
||
|
||
## Step 5: 跑你的第一个 demo — Topic 跨语言互通
|
||
|
||
### 5.1 启动 4 个节点(2 Python + 2 C++)
|
||
```bash
|
||
bash scripts/launch.sh pubsub_launch 30
|
||
# 第 2 个参数是运行时长(秒);空着 = 一直跑
|
||
```
|
||
|
||
**预期输出**:
|
||
```
|
||
[INFO] [launch]: All log files can be found below /root/.ros/log/2026-08-03-...
|
||
[INFO] [launch]: Default logging verbosity is set to INFO
|
||
[INFO] [talker-1]: process started with pid [56]
|
||
[INFO] [listener-2]: process started with pid [58]
|
||
[INFO] [talker-3]: process started with pid [60]
|
||
[INFO] [listener-4]: process started with pid [62]
|
||
[talker-1] [INFO] [...] talker_py started -> topic=chatter, period=500ms
|
||
[listener-2] [INFO] [...] listener_py subscribed <- chatter
|
||
[talker-3] [INFO] [...] talker_cpp started -> topic=chatter, period=500ms
|
||
[listener-4] [INFO] [...] listener_cpp subscribed <- chatter
|
||
[listener-2] [INFO] [...] recv: "Hello from PY, seq=0"
|
||
[listener-4] [INFO] [...] recv: "Hello from C++, seq=0"
|
||
[listener-4] [INFO] [...] recv: "Hello from PY, seq=0" ← **跨语言互通!**
|
||
[listener-2] [INFO] [...] recv: "Hello from C++, seq=0" ← **跨语言互通!**
|
||
```
|
||
|
||
按 **Ctrl+C** 退出。
|
||
|
||
### 5.2 在另一个终端验证
|
||
|
||
**新开一个 PowerShell/终端**,运行:
|
||
```bash
|
||
docker exec ros2_dev bash -lc "source /opt/ros/humble/setup.bash && source /root/ros2_ws/install/setup.bash && ros2 topic list --no-daemon"
|
||
```
|
||
|
||
**预期输出**:
|
||
```
|
||
/chatter
|
||
/joint_states
|
||
/parameter_events
|
||
/rosout
|
||
/tf
|
||
```
|
||
|
||
**看 chatter 频率**:
|
||
```bash
|
||
docker exec ros2_dev bash -lc "source /opt/ros/humble/setup.bash && source /root/ros2_ws/install/setup.bash && ros2 topic hz /chatter --no-daemon"
|
||
```
|
||
|
||
**预期**:
|
||
```
|
||
average rate: 4.000
|
||
min: 0.250s max: 0.260s std dev: 0.00302s window: 10
|
||
```
|
||
|
||
(4Hz = 2 talker × 2Hz)
|
||
|
||
### 5.3 看通信拓扑(可视化)
|
||
|
||
**新终端**:
|
||
```bash
|
||
docker exec ros2_dev bash -lc "source /opt/ros/humble/setup.bash && source /root/ros2_ws/install/setup.bash && ros2 run rqt_graph rqt_graph"
|
||
```
|
||
|
||
**会看到**(rqt_graph GUI):
|
||
- `talker_py` → `chatter` → `listener_py`
|
||
- `talker_cpp` → `chatter` → `listener_cpp`
|
||
- 4 节点 2 topic 互通
|
||
|
||
---
|
||
|
||
## Step 6: 本机 venv 开发工作流
|
||
|
||
### 6.1 创建 venv(不污染系统 Python)
|
||
```powershell
|
||
# Windows
|
||
cd D:\xs\ros2
|
||
powershell .\tools\setup_venv.ps1
|
||
```
|
||
|
||
```bash
|
||
# Linux / macOS / WSL
|
||
cd /path/to/ros2
|
||
./tools/setup_venv.sh
|
||
```
|
||
|
||
**预期**:
|
||
```
|
||
==> Python: Python 3.10.x
|
||
==> Creating venv at .venv
|
||
==> Upgrading pip + installing requirements-dev.txt
|
||
OK py_pubsub
|
||
OK py_srv
|
||
OK py_action_demo
|
||
OK py_vision_demo
|
||
✅ venv ready. Activate with:
|
||
.\.venv\Scripts\Activate.ps1
|
||
```
|
||
|
||
### 6.2 激活 venv
|
||
```powershell
|
||
# Windows
|
||
.\.venv\Scripts\Activate.ps1
|
||
|
||
# Linux / macOS / WSL
|
||
source .venv/bin/activate
|
||
```
|
||
|
||
**预期**: 终端前缀出现 `(.venv)`,如:
|
||
```
|
||
(.venv) PS D:\xs\ros2>
|
||
```
|
||
|
||
### 6.3 在 venv 里能做什么 / 不能做什么
|
||
|
||
| 能做 | 不能做 |
|
||
|---|---|
|
||
| 编辑 Python 源码,IDE 自动补全 | `import rclpy` (rclpy 没 Windows wheels) |
|
||
| 跑 ruff / black / mypy | 跑 ROS2 节点 / launch 文件 |
|
||
| 装纯 Python 包(numpy / torch / opencv-python) | 跑 ros2 CLI 命令 |
|
||
|
||
### 6.4 配置 VSCode / PyCharm
|
||
|
||
**VSCode**:
|
||
- `Ctrl+Shift+P` → "Python: Select Interpreter" → 选 `.venv\Scripts\python.exe`
|
||
- 装扩展:Python, Pylance, ROS(可选)
|
||
- `pyrightconfig.json` 已配好
|
||
|
||
**PyCharm**:
|
||
- `Settings → Project → Python Interpreter` → 选 `.venv\Scripts\python.exe`
|
||
|
||
---
|
||
|
||
## Step 7: 验证清单
|
||
|
||
按这个清单逐项打勾,全过才算"5 分钟上手成功":
|
||
|
||
- [ ] `docker ps` 看到 `ros2_dev` 容器 `Up`
|
||
- [ ] `docker exec ros2_dev echo hello` 输出 `hello`
|
||
- [ ] `bash scripts/build.sh` 12 packages 全 build 成功
|
||
- [ ] `bash scripts/test.sh` 全过(12 packages / 78 tests, 0 failed)
|
||
- [ ] `bash scripts/launch.sh pubsub_launch 30` 启动 4 节点
|
||
- [ ] `docker exec ros2_dev bash -c "ros2 topic list"` 看到 `/chatter`
|
||
- [ ] `docker exec ros2_dev bash -c "ros2 topic hz /chatter --no-daemon"` 显示 ~4Hz
|
||
- [ ] `docker exec ros2_dev bash -c "ros2 topic info /chatter -v --no-daemon"` 看到 Python + C++ pub/sub
|
||
- [ ] venv 装好且激活,`python -c "import sys; print(sys.executable)"` 显示 `.venv` 路径
|
||
|
||
如果有任何一项 ✗,看 [Step 8 FAQ](#step-8-常见问题-faq)。
|
||
|
||
---
|
||
|
||
## Step 8: 常见问题 FAQ
|
||
|
||
### Q1: 容器启动失败 `Cannot connect to Docker daemon`
|
||
**原因**: Docker Desktop 没运行 / WSL2 没启动
|
||
**解决**:
|
||
- Win/macOS:启动 Docker Desktop,等右下角图标稳定
|
||
- Linux:`sudo systemctl start docker`
|
||
|
||
### Q2: 构建镜像很慢,卡在 `pulling image`
|
||
**原因**: 网络慢 / 在国内
|
||
**解决**:
|
||
```bash
|
||
# 加 Docker 镜像加速器
|
||
# Docker Desktop → Settings → Docker Engine,加:
|
||
{
|
||
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
|
||
}
|
||
```
|
||
然后 `docker compose build` 重试。
|
||
|
||
### Q3: `bash scripts/build.sh` 报 `rcl_xxx not found`
|
||
**原因**: 没 source ROS2
|
||
**解决**:
|
||
```bash
|
||
source /opt/ros/humble/setup.bash
|
||
bash scripts/build.sh
|
||
```
|
||
|
||
**或者** 把这句加进 `~/.bashrc`:
|
||
```bash
|
||
echo 'source /opt/ros/humble/setup.bash' >> ~/.bashrc
|
||
```
|
||
|
||
### Q4: 容器里 `ros2` 命令找不到
|
||
**原因**: 没 source `install/setup.bash`
|
||
**解决**:
|
||
```bash
|
||
source /root/ros2_ws/install/setup.bash
|
||
ros2 --help # 应该输出帮助
|
||
```
|
||
|
||
### Q5: `ros2 topic hz` 显示 0 Hz
|
||
**原因**: 没节点 publish 数据
|
||
**解决**: 确认 launch 起来了,看到 `[INFO] pub: "Hello from..."` 日志
|
||
|
||
### Q6: Windows venv 里 `import rclpy` 飘红
|
||
**原因**: rclpy 没 Windows wheels
|
||
**解决**: 正常现象,不影响阅读代码。要跑 rclpy 在容器里跑
|
||
|
||
### Q7: 容器里 `pip install` 装不上 ROS2 包
|
||
**原因**: 你在容器 venv,ROS2 包来自 apt
|
||
**解决**:
|
||
```bash
|
||
# 不在容器 venv 里
|
||
exit # 退出 venv
|
||
# 或用 apt
|
||
sudo apt install ros-humble-<pkg>
|
||
```
|
||
|
||
### Q8: 容器里中文显示乱码
|
||
**原因**: 容器没装中文字体
|
||
**解决**: 在容器内 `export LANG=C.UTF-8 LC_ALL=C.UTF-8`
|
||
### Q9: `colcon build` 报 `CMakeCache` 或 `export_cpp_custom_interface__rosidl_generator_cExport` 错误
|
||
|
||
**原因**: 上次 build 残留 CMakeCache,或 `cpp_custom_interface` 的 rosidl export cmake 并行构建偶发失败
|
||
**解决**:
|
||
```bash
|
||
cd /root/ros2_ws
|
||
bash scripts/clean.sh # 等价于 rm -rf build install log
|
||
bash scripts/build.sh # 脚本已带 --executor sequential
|
||
```
|
||
如果还挂,加上 `--cmake-clean-cache`:
|
||
```bash
|
||
colcon build --symlink-install --executor sequential --cmake-clean-cache \
|
||
--packages-select <12 个包>
|
||
```
|
||
|
||
### Q10: 容器跑一段时间后磁盘满了
|
||
**原因**: `build/` `install/` `log/` 默认在本目录
|
||
**解决**:
|
||
```bash
|
||
# 进容器清理
|
||
docker exec ros2_dev bash /root/ros2_ws/scripts/clean.sh
|
||
docker exec ros2_dev bash /root/ros2_ws/scripts/build.sh
|
||
|
||
# 或清理 Docker
|
||
docker system prune -a
|
||
```
|
||
|
||
---
|
||
|
||
## 下一步
|
||
|
||
5 分钟上手成功!现在你可以:
|
||
|
||
- 阅读 [`doc/10-concepts.md`](10-concepts.md) — 理解 ROS2 核心概念
|
||
- 阅读 [`doc/20-topics.md`](20-topics.md) — Topic 深度
|
||
- 阅读 [`doc/100-embedded-deployment.md`](100-embedded-deployment.md) — 三机部署实操
|
||
- 阅读 [`doc/99-embodied-ai.md`](99-embodied-ai.md) — 具身智能路径
|
||
|
||
**动手尝试**: 改一下 `py_pubsub` 里 talker 的 `period_ms`,观察 `/chatter` 频率变化。这是理解 ROS2 参数的最快方式。
|
||
|
||
加油,ROS2 之旅开始! 🚀
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## 📖 阅读路径导航
|
||
|
||
> 💡 这是仓库 `doc/` 下所有文档的推荐阅读顺序。[返回 README 总导航](../README.md#-23-篇文档怎么读)
|
||
>
|
||
> ⏱ **本文预计阅读时间**: 30 分钟
|
||
> 📍 **当前位置**: 第 3 / 24 篇
|
||
|
||
- ⏮ **上一篇**: [Level 1-4 学习路线](00-levels.md)
|
||
- ⏭ **下一篇**: [Node / Topic / Service / Action / TF / Time](10-concepts.md)
|