288 lines
10 KiB
Markdown
288 lines
10 KiB
Markdown
# RC_Legged 项目规范
|
||
|
||
## 1. 项目概述
|
||
|
||
RC_Legged 是一个四轮足强化学习(RL)机器狗项目,涵盖机械设计、硬件电路、嵌入式软件和控制算法全栈开发。
|
||
|
||
### 仓库地址
|
||
|
||
- **Gitea 远程仓库**: `https://git.zeitvex.com/Robocon/RC_Legged.git`
|
||
- **SSH**: `git@git.zeitvex.com:Robocon/RC_Legged.git`
|
||
|
||
---
|
||
|
||
## 2. 仓库目录结构规范
|
||
|
||
```
|
||
RC_Legged/
|
||
├── 00_reference/ # 参考项目与文档(只读,不改动)
|
||
├── 01_doc/ # 项目文档(设计文档、会议记录、需求文档)
|
||
├── 02_mechanical/ # 机械设计(SolidWorks/STL/URDF/STEP)
|
||
│ ├── CAD/ # 源文件
|
||
│ ├── STL/ # 3D 打印文件
|
||
│ └── URDF/ # URDF 描述文件
|
||
├── 03_hardware/ # 硬件电路设计(KiCad/Altium)
|
||
│ ├── PCB/ # PCB 工程文件
|
||
│ ├── BOM/ # 物料清单
|
||
│ └── datasheet/ # 芯片/模块数据手册
|
||
├── 04_firmware/ # 嵌入式固件(STM32/ESP32 等)
|
||
│ ├── motor_driver/ # 电机驱动固件
|
||
│ └── sensor_board/ # 传感器板固件
|
||
├── 05_software/ # 上层软件
|
||
│ ├── rl_training/ # 强化学习训练代码
|
||
│ │ ├── configs/ # 训练配置
|
||
│ │ ├── envs/ # 环境定义
|
||
│ │ └── logs/ # 训练日志(.gitignore)
|
||
│ ├── ros_ws/ # ROS 工作空间
|
||
│ │ ├── src/
|
||
│ │ └── scripts/
|
||
│ └── utils/ # 通用工具脚本
|
||
├── 06_assets/ # 媒体资源(渲染图、演示视频等)
|
||
├── .gitignore
|
||
├── .pre-commit-config.yaml # Pre-commit 配置
|
||
├── README.md # 项目总览
|
||
└── 项目规范.md # 本文件
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 分支管理策略
|
||
|
||
### 3.1 分支结构
|
||
|
||
```
|
||
main ─────●────────────●────────────────●── 最稳定,仅里程碑合并
|
||
\ / /
|
||
main-nightly ──●────●──●────●─────────●─────────── 每日构建/集成测试
|
||
\ \ / \ /
|
||
task-<name> ─────●──●────────●──●──────────●──── 具体任务分支(实验/算法/feature)
|
||
\ /
|
||
task-<name>-infra ─────────●────────────────●─────── 核心代码修补分支(紧急修复)
|
||
```
|
||
|
||
### 3.2 分支职责
|
||
|
||
| 分支 | 角色 | 说明 |
|
||
|------|------|------|
|
||
| `main` | 项目所有负责人 | 最保守,只合并经过充分验证的里程碑版本。每次合并应为 **no-ff**(保留合并记录)。 |
|
||
| `main-nightly` | 主要维护人员 | 日常集成测试目标。任务分支达标后先合入此分支,稳定后再合入 `main`。 |
|
||
| `task-<name>` | 具体任务开发者 | 自己维护,主要用于 task 配置和实验记录。**只允许修改对应子目录内的文件**。 |
|
||
| `task-<name>-infra` | 任务开发者(极端情况) | 当必须修改 `main-nightly` 核心代码才能跑通当前训练时使用,快速验证后合入 `main-nightly`。 |
|
||
|
||
### 3.3 分支操作规则
|
||
|
||
1. **`main` 分支**:禁止直接推送。只能通过 Pull Request 从 `main-nightly` 合并,且必须经过 Code Review。
|
||
2. **`main-nightly` 分支**:原则上禁止直接推送。任务分支通过 PR 合入,需经过基本验证。
|
||
3. **`task-*` 分支**:从 `main-nightly` 创建,开发者自行推送。
|
||
4. **`task-*-infra` 分支**:从 `main-nightly` 创建,只包含核心代码改动,**不允许包含任何 task 配置文件**,合入后立即删除。
|
||
5. **配置代码与逻辑代码分离**:训练 config 文件和核心逻辑代码必须在不同的分支维护。只允许 config 分支从 logic 分支 merge。在里程碑之前,logic 分支不吸收任何 config 分支改动。
|
||
|
||
---
|
||
|
||
## 4. 提交(Commit)规范
|
||
|
||
### 4.1 Commit Message 格式
|
||
|
||
```
|
||
[tag] 一句话描述(不超过 72 字符)
|
||
|
||
(空一行后可补充详细说明,例如改动动机、注意事项等)
|
||
```
|
||
|
||
### 4.2 标签规则
|
||
|
||
| 标签 | 含义 | 示例 |
|
||
|------|------|------|
|
||
| `[add]` | 新增功能/文件 | `[add] 四足逆运动学求解器` |
|
||
| `[update]` | 修改已有功能 | `[update] 优化步态切换逻辑` |
|
||
| `[fix]` | 修复 Bug | `[fix] 电机 CAN 通讯超时处理` |
|
||
| `[remove]` | 删除功能/文件 | `[remove] 废弃旧版遥控器协议` |
|
||
| `[format]` | 代码格式化/重构 | `[format] 统一命名规范` |
|
||
| `[log]` | 实验记录/日志提交 | `[log] 第3轮训练结果,reward 收敛至0.85` |
|
||
| `[doc]` | 文档相关 | `[doc] 添加CAN总线协议说明` |
|
||
| `[hardware]` | 硬件相关改动 | `[hardware] PCB v1.2 修改电源走线` |
|
||
| `[mechanical]` | 机械相关改动 | `[mechanical] 大腿连杆加厚2mm` |
|
||
|
||
### 4.3 Commit 原则
|
||
|
||
1. **一个 Commit 只做一件事**。如果一次改动了多个不相关的问题,必须拆分为多个 commit。
|
||
2. **Commit Message 必须说清楚改动内容**。只看 message 就能理解改了什么,否则需要修正。
|
||
3. **Task 配置文件和核心代码不得混在同一个 commit 中**。
|
||
4. **未通过 Pre-commit 检查的代码不允许 commit**。
|
||
5. **如果 commit 历史有问题,必须先修复再继续开发**。
|
||
|
||
---
|
||
|
||
## 5. 代码质量规范
|
||
|
||
### 5.1 Pre-commit 自动检查
|
||
|
||
- 使用 [pre-commit](https://pre-commit.com/) 工具实现提交前自动检查。
|
||
- 安装:`pip install pre-commit`
|
||
- 启用:在仓库根目录执行 `pre-commit install`
|
||
- 手动运行:`pre-commit run --all-files`
|
||
- 所有检查项必须全部通过(绿色/蓝色)方可 commit。
|
||
- `.pre-commit-config.yaml` 需包含:代码格式化(Clang-Format / Black)、Python 语法检查(Flake8 / Ruff)、YAML 检查、文件末尾换行符检查等。
|
||
|
||
### 5.2 代码风格
|
||
|
||
- **C/C++**:遵循 Google C++ Style Guide,使用 `.clang-format` 统一格式。
|
||
- **Python**:遵循 PEP 8,使用 Black 格式化。
|
||
- **ROS**:遵循 ROS C++/Python 编码规范。
|
||
- **命名**:
|
||
- 文件名:小写 + 下划线(`imu_driver.cpp`)
|
||
- 类名:大驼峰(`ImuDriver`)
|
||
- 函数/变量:小写 + 下划线(`read_imu_data()`)
|
||
- 宏/常量:全大写 + 下划线(`IMU_TIMEOUT_MS`)
|
||
|
||
### 5.3 接口变更流程
|
||
|
||
1. 首先尝试在现有接口定义下完成需求。
|
||
2. 如必须修改接口,向项目负责人 + 所有使用者提交申请。
|
||
3. 通过后,使用 **Pull Request** 标记变更过程,关联相关 Issue。
|
||
|
||
---
|
||
|
||
## 6. Pull Request 与代码审查(Code Review)
|
||
|
||
### 6.1 PR 流程
|
||
|
||
1. 在 `task-*` 或 `task-*-infra` 分支上完成开发并推送。
|
||
2. 在 Gitea 上创建 Pull Request:
|
||
- **来源分支**:`task-*` → **目标分支**:`main-nightly`
|
||
- **来源分支**:`main-nightly` → **目标分支**:`main`
|
||
3. PR 标题格式:`[tag] 简短描述`(与 commit message 一致)。
|
||
4. PR 描述中说明:改动内容、验证方式、影响范围。
|
||
|
||
### 6.2 审查要求
|
||
|
||
- 必须由至少 1 名项目成员 Review 后方可合并。
|
||
- 审查重点:功能正确性、接口兼容性、代码风格、是否包含无关文件。
|
||
- 如有修改意见,PR 作者修改后重新请求 Review。
|
||
|
||
### 6.3 合并方式
|
||
|
||
- 合入 `main-nightly`:使用 **Squash Merge**(保持 nightly 历史清晰)。
|
||
- 合入 `main`:使用 **Merge Commit (no-ff)**(保留完整分支历史)。
|
||
|
||
---
|
||
|
||
## 7. Gitea 配置
|
||
|
||
### 7.1 仓库设置
|
||
|
||
- **可见性**:私有(Private)
|
||
- **默认分支**:`main`
|
||
- **分支保护**(`main` 分支):
|
||
- 禁止直接推送
|
||
- 要求 PR 审查通过后才能合并
|
||
- 要求 PR 必须基于最新 `main`
|
||
- 禁用强制推送
|
||
|
||
### 7.2 初始推送
|
||
|
||
```bash
|
||
git init
|
||
git checkout -b main
|
||
git add .
|
||
git commit -m "[init] RC_Legged 项目初始化"
|
||
git remote add origin https://git.zeitvex.com/Robocon/RC_Legged.git
|
||
git push -u origin main
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 硬件测试规范
|
||
|
||
### 8.1 真机测试要求
|
||
|
||
1. **全程录像**:每次真机测试必须有独立相机全程拍摄视频。
|
||
2. **ROS Bag 记录**:完整系统测试时必须用 ROS Bag 记录所有 message 数据。
|
||
- 使用 `ros2 bag record -s mcap -o <bag_name> /topic1 /topic2 ...`
|
||
- 推荐编写 `rosbag.sh` 脚本自动记录所有传感器数据。
|
||
- 所有与项目相关的电脑需安装 [Foxglove Studio](https://foxglove.dev/) 用于查看 bag。
|
||
3. **可视化配置**:所有 ROS 系统必须配置 RViz + `robot_state_publisher` + `joint_state_publisher`。
|
||
|
||
### 8.2 急停方案
|
||
|
||
所有真机测试脚本必须包含:
|
||
- 除 `Ctrl+C` 外的独立急停机制(如遥控器急停按钮)。
|
||
- 急停触发后立即进入 **Damping Mode**,无任何等待延迟。
|
||
- 推荐方案:控制程序监听遥控器急停信号,触发后立即终止程序。
|
||
|
||
---
|
||
|
||
## 9. .gitignore 示例
|
||
|
||
```gitignore
|
||
# 编译产出
|
||
build/
|
||
devel/
|
||
install/
|
||
*.o
|
||
*.elf
|
||
*.hex
|
||
|
||
# Python
|
||
__pycache__/
|
||
*.pyc
|
||
*.pyo
|
||
.venv/
|
||
venv/
|
||
|
||
# IDE
|
||
.vscode/
|
||
.idea/
|
||
*.swp
|
||
*.swo
|
||
|
||
# 训练产出
|
||
05_software/rl_training/logs/
|
||
05_software/rl_training/checkpoints/
|
||
wandb/
|
||
|
||
# ROS
|
||
*.bag
|
||
*.mcap
|
||
|
||
# 系统
|
||
.DS_Store
|
||
Thumbs.db
|
||
|
||
# 机械
|
||
*.sldprt
|
||
*.sldasm
|
||
*.step
|
||
*.stp
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 项目里程碑工作流
|
||
|
||
```
|
||
[日常开发]
|
||
task-xxx 分支开发 → 提交 → 推送 → PR → Code Review → 合入 main-nightly
|
||
|
||
[里程碑发布]
|
||
main-nightly 经过充分测试
|
||
→ 创建 PR: main-nightly → main
|
||
→ 项目负责人 Review
|
||
→ 合入 main
|
||
→ 创建 Git Tag: v1.0.0, v1.1.0, ...
|
||
```
|
||
|
||
---
|
||
|
||
## 11. 参考项目
|
||
|
||
| 项目 | 类型 | 地址 |
|
||
|------|------|------|
|
||
| EDULITE_A3 | 四足机器人 | `00_reference/EDULITE_A3/` |
|
||
| OpenDog | 四足机器人 | `00_reference/open-dog/` |
|
||
| reBot-DevArm | 机械臂 | `00_reference/reBot-DevArm/` |
|
||
|
||
---
|
||
|
||
*本规范参考上述开源项目及行业最佳实践编写,随项目推进持续完善。*
|