docs(nav): 阅读路径导航 + 数字统一
This commit is contained in:
+135
-42
@@ -1,57 +1,150 @@
|
||||
# bringup
|
||||
# bringup — 跨包 launch 聚合(11 节点一键启动)
|
||||
|
||||
顶层 launch 聚合包。属于 Level 1 跨包集成层。
|
||||
> 最后一个包:**整合所有 demo 一键启动**。
|
||||
>
|
||||
> 预计学习时间:30 分钟。
|
||||
|
||||
## 6 个 launch 文件
|
||||
---
|
||||
|
||||
| 文件 | 启动节点 | 数量 |
|
||||
|---|---|---|
|
||||
| `pubsub_launch.py` | py_pubsub + cpp_pubsub 的 pub/sub | 4 |
|
||||
| `service_launch.py` | add_two_ints_server | 1 |
|
||||
| `action_launch.py` | fibonacci_action_server | 1 |
|
||||
| `robot_launch.py` | URDF + JointState + TF(nested `cpp_robot_tf2`) | 3 |
|
||||
| `vision_launch.py` | fake_camera + image_processor(nested `py_vision_demo`) | 2 |
|
||||
| `full_demo_launch.py` | 上面所有组合 | **11** |
|
||||
## 这是什么?
|
||||
|
||||
## 关键设计
|
||||
|
||||
- **不实现业务节点** — 只用 `IncludeLaunchDescription` 复用其他包的 launch
|
||||
- **跨包嵌套** — `robot_launch.py` / `vision_launch.py` 用 `FindPackageShare` + `PythonLaunchDescriptionSource` 引用单包 launch
|
||||
- **包名避让** — 包名是 `bringup`,**不是** `launch`(与 ROS2 系统包同名会冲突)
|
||||
|
||||
## 运行
|
||||
`bringup` 包专门用来**跨包启动多个节点**。ROS2 项目一般会有一个 `bringup` 包负责"启动整个机器人"。
|
||||
|
||||
**典型用法**:
|
||||
```bash
|
||||
# 各 demo 单独启动
|
||||
ros2 launch bringup pubsub_launch.py
|
||||
ros2 launch bringup service_launch.py
|
||||
ros2 launch bringup action_launch.py
|
||||
ros2 launch bringup robot_launch.py
|
||||
ros2 launch bringup vision_launch.py
|
||||
|
||||
# 全开(11 节点同时跑)
|
||||
ros2 launch bringup full_demo_launch.py
|
||||
```
|
||||
|
||||
## 验证端到端
|
||||
一个命令启动所有 11 个节点(模拟整个机器人系统)。
|
||||
|
||||
---
|
||||
|
||||
## 🎯 学完之后你能做什么?
|
||||
|
||||
1. ✅ 用 `IncludeLaunchDescription` 复用其他包的 launch
|
||||
2. ✅ 用 `FindPackageShare` 找其他包的资源路径
|
||||
3. ✅ 写一个聚合 launch,启动整个系统
|
||||
|
||||
---
|
||||
|
||||
## 🚀 跑起来
|
||||
|
||||
### 一键启动 11 节点
|
||||
|
||||
```bash
|
||||
# 跨包跨语言 Topic:PY + CPP 同时发,listener 都收到
|
||||
ros2 launch bringup pubsub_launch.py
|
||||
ros2 topic info /chatter -v
|
||||
# 预期:Publication count: 2, Subscription count: 2
|
||||
source /opt/ros/humble/setup.bash
|
||||
source /root/ros2_ws/install/setup.bash
|
||||
|
||||
# Action
|
||||
ros2 launch bringup action_launch.py
|
||||
ros2 action send_goal /fibonacci example_interfaces/action/Fibonacci "{order: 6}" --feedback
|
||||
|
||||
# Service
|
||||
ros2 launch bringup service_launch.py
|
||||
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 12, b: 30}"
|
||||
# 预期: sum: 42
|
||||
ros2 launch bringup full_demo_launch.py
|
||||
```
|
||||
|
||||
## 深度学习
|
||||
**预期**:11 个节点同时跑,看到各种 Topic/Service/Action 交互。
|
||||
|
||||
- 编程规范:[`doc/CODING_STYLE.md`](../doc/CODING_STYLE.md) §5.5
|
||||
- launch 深度:[`doc/70-launch.md`](../doc/70-launch.md)
|
||||
### 单独启动某个 launch
|
||||
|
||||
```bash
|
||||
# 只启动 Topic 演示(4 节点)
|
||||
ros2 launch bringup pubsub_launch.py
|
||||
|
||||
# 只启动机器人 TF2 演示(3 节点)
|
||||
ros2 launch bringup robot_launch.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 文件结构
|
||||
|
||||
```
|
||||
src/bringup/
|
||||
├── launch/
|
||||
│ ├── full_demo_launch.py # 启动 11 节点
|
||||
│ ├── pubsub_launch.py # Topic 演示(4 节点)
|
||||
│ ├── service_launch.py # Service 演示
|
||||
│ ├── action_launch.py # Action 演示
|
||||
│ ├── robot_launch.py # TF2 + URDF 演示
|
||||
│ ├── vision_launch.py # 图像演示
|
||||
│ └── params_launch.py # 参数演示
|
||||
├── setup.py
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📖 核心代码(IncludeLaunchDescription)
|
||||
|
||||
```python
|
||||
from launch import LaunchDescription
|
||||
from launch.actions import IncludeLaunchDescription
|
||||
from launch.launch_description_sources import PythonLaunchDescriptionSource
|
||||
from ament_index_python.packages import get_package_share_directory
|
||||
import os
|
||||
|
||||
def generate_launch_description():
|
||||
# 找其他包的 share 目录
|
||||
py_pubsub_dir = get_package_share_directory('py_pubsub')
|
||||
|
||||
return LaunchDescription([
|
||||
# 启动 py_pubsub 的 launch
|
||||
IncludeLaunchDescription(
|
||||
PythonLaunchDescriptionSource(
|
||||
os.path.join(py_pubsub_dir, 'launch', 'pubsub_launch.py')
|
||||
),
|
||||
launch_arguments={'publish_rate_hz': '2.0'}.items(), # 覆盖参数
|
||||
),
|
||||
|
||||
# 启动 cpp_pubsub
|
||||
IncludeLaunchDescription(
|
||||
PythonLaunchDescriptionSource(
|
||||
os.path.join(get_package_share_directory('cpp_pubsub'), 'launch', 'pubsub_cpp_launch.py')
|
||||
),
|
||||
),
|
||||
|
||||
# ... 其他包
|
||||
])
|
||||
```
|
||||
|
||||
**关键 API**:
|
||||
- `get_package_share_directory('pkg_name')`:拿其他包的 share 路径
|
||||
- `IncludeLaunchDescription`:复用其他 launch
|
||||
- `launch_arguments={'param': 'value'}.items()`:覆盖参数
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 命名约束
|
||||
|
||||
ROS2 系统有一个 `launch` 包(`ros-humble-launch`),所以**包名不能叫 `launch`**(会冲突)。本仓库用 `bringup` 这个名字(机器人行业惯例)。
|
||||
|
||||
---
|
||||
|
||||
## 🧪 跑测试
|
||||
|
||||
```bash
|
||||
colcon test --packages-select bringup
|
||||
```
|
||||
|
||||
**预期**:`bringup` 没有 pytest/gtest(launch 包不写测试代码,只整合)。
|
||||
|
||||
---
|
||||
|
||||
## 📚 深入学习
|
||||
|
||||
- [doc/70-launch.md](../../doc/70-launch.md) — launch 文件深度
|
||||
|
||||
---
|
||||
|
||||
## 🎉 学完整个仓库了!
|
||||
|
||||
接下来:
|
||||
1. **做项目**:用本仓库的模板做自己的 ROS2 项目
|
||||
2. **学 Level 2**:看 [doc/99-embodied-ai.md](../../doc/99-embodied-ai.md),学 ros2_control + MoveIt2 + Gazebo
|
||||
3. **上真实机器人**:看 [doc/100-embedded-deployment.md](../../doc/100-embedded-deployment.md),PC + RDK X5 + RK3506 三机部署
|
||||
|
||||
---
|
||||
|
||||
## 📍 学习路径导航
|
||||
|
||||
| ⏮ 上一个 | 🏠 当前位置 | ⏭ 下一个 |
|
||||
|---|---|---|
|
||||
| [py_overlay_dds — Python DDS + overlay](../py_overlay_dds/README.md) | **bringup — 跨包 launch 聚合** | (学完整个仓库 🎉) |
|
||||
|
||||
📍 完整 12 包学习顺序见 [主 README](../../README.md#-12-包推荐学习顺序)
|
||||
|
||||
Reference in New Issue
Block a user