# rl_deploy_python
**Repository Path**: nanhaibei/rl_deploy_python
## Basic Information
- **Project Name**: rl_deploy_python
- **Description**: 使用python+ROS2编写的强化学习推理框架
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2025-06-12
- **Last Updated**: 2025-12-17
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# rl_deploy_python
## 📖 介绍
`rl_deploy_python` 是一个基于 **Python + ROS2 Humble** 的强化学习策略部署框架,专为腿足机器人设计。该框架支持将训练好的强化学习策略(ONNX格式)快速部署到真实机器人或仿真环境中,提供了统一的接口和丰富的工具支持。
### ✨ 主要特性
- 🤖 **多机器人支持**:支持人形机器人(G1, S3)和四足机器人(Go2, L1, Pegasus, ZSL1)
- 🔌 **统一接口**:使用 MIT Cheetah 风格的统一控制接口
- 🚀 **ONNX推理**:高效的 ONNX Runtime 推理引擎
- 🎮 **状态机管理**:灵活的 FSM(有限状态机)控制
- 🛠️ **丰富工具**:包含调试、日志记录、信号测试等实用工具
- 🗺️ **高程图支持**:支持基于高程图的地形感知控制
- ⚙️ **易于配置**:基于 YAML 的参数配置系统
## 📦 支持的机器人平台
### 人形机器人
- ✅ **Unitree G1** - 支持标准控制、高程图控制、AMP控制等多种模式
- ✅ **启灵机器人 S3** - 支持标准控制和 EstNet 控制
### 四足机器人
- ✅ **Unitree Go2** - 标准四足控制
- ✅ **启灵机器人 L1** - 标准四足控制
- ✅ **智身机器人 ZSL1** - 标准四足控制
## 🔧 安装
### 系统依赖
```bash
# 安装 TOML 解析库
sudo apt-get install python3-tomli
# 安装 ROS 2 Foxglove Bridge(用于可视化)
sudo apt install ros-humble-foxglove-bridge
```
### Python 依赖
```bash
# 安装必要的 Python 包
pip install tabulate onnxruntime numpy
```
### 安装 ROS2 Humble
推荐使用鱼香ROS一键安装脚本:
```bash
wget http://fishros.com/install -O fishros && . fishros
```
### 构建工作空间
#### 📝 依赖包说明
根据您的使用场景,需要克隆不同的包:
| 使用场景 | 必需的包 | 说明 |
|---------|---------|------|
| **🎮 仅运行仿真** | `rl_deploy_python`
`mujoco_simulator`
`robot_description`
`communicate_interface` | 包含控制器、MuJoCo 仿真器、机器人模型描述和消息定义 |
| **🤖 运行实物机器人** | `rl_deploy_python`
`communicate_interface` | 仅需控制器和通信接口包(消息定义和话题转换器) |
#### 🎮 仅运行仿真
如果您只想在仿真环境中测试控制器,执行以下步骤:
```bash
# 1. 创建工作空间
mkdir -p ~/rl_das_ws/src
cd ~/rl_das_ws/src
# 2. 克隆必需的仿真包
# 克隆本仓库(强化学习控制器)
git clone https://gitee.com/nanhaibei/rl_deploy_python.git
# 克隆 MuJoCo 仿真器
git clone https://github.com/NanHaibei/mujoco_simulator.git
# 克隆机器人描述文件
git clone https://gitee.com/coralab/robot_description.git
# 克隆通信接口包(消息定义)
git clone https://gitee.com/nanhaibei/communicate_interface.git
# 3. 安装 Python 包(开发模式)
cd rl_deploy_python
pip install -e .
cd ../..
# 4. 编译工作空间
sudo apt install ros-humble-rosidl-generator-dds-idl
colcon build --symlink-install
source install/setup.bash
```
#### 🤖 运行实物机器人
如果您需要在真实机器人上部署,只需要以下 2 个包:
```bash
# 1. 创建工作空间
mkdir -p ~/rl_das_ws/src
cd ~/rl_das_ws/src
# 2. 克隆必需的包
# 克隆本仓库(强化学习控制器)
git clone https://gitee.com/nanhaibei/rl_deploy_python.git
# ⭐ 克隆通信接口包(实物部署必需)
git clone https://gitee.com/nanhaibei/communicate_interface.git
# 3. 安装 Python 包(开发模式)
cd rl_deploy_python
pip install -e .
cd ../..
# 4. 编译工作空间
colcon build --symlink-install
source install/setup.bash
```
> **💡 提示**:
> - **仿真环境**:需要 `mujoco_simulator` 和 `robot_description` 来运行仿真器和加载机器人模型
> - **实物机器人**:不需要仿真器和模型文件,只需控制器和通信接口
> - `communicate_interface` 包含了各机器人的 ROS2 消息定义和话题转换器,仿真和实物都需要
## 🚀 快速开始
### 1. 配置控制器参数
打开 `config/` 目录,每个控制器都有对应的配置文件。以 `G1_controller` 为例:
```yaml
# config/G1/G1_controller_config.yaml
parameters:
# ONNX 模型路径(相对于 onnx/ 目录)
onnx_path: "G1/your_policy.onnx"
# 状态机参数
# 0: 仅行走状态(推荐仿真调试)
# 1: 根据命令值确定状态(实物部署)
FSMFlag: 0
# CPU 核心绑定(-1 表示不绑定)
CPUCore: 6
# 话题名称
lowStateTopic: "/low_state"
jointCommandsTopic: "/low_command"
twistTopic: "/rl_cmd_vel"
# PD 控制参数
kp: [40.18, 99.10, ...] # 位置增益
kd: [2.56, 6.31, ...] # 速度增益
# 默认关节位置
defaultPos: [-0.312, 0.00, ...]
```
⚠️ **重要提示**:实物部署前请检查 `FSMFlag` 参数,避免危险发生!
### 2. 启动控制器
#### 方法 1:直接运行节点
```bash
# 启动 G1 控制器
ros2 run rl_deploy_python G1_controller
# 启动 Go2 控制器
ros2 run rl_deploy_python Go2_controller
# 启动 S3 控制器
ros2 run rl_deploy_python S3_controller
```
#### 方法 2:使用 Launch 文件(推荐)
```bash
# 启动 G1 控制器(包含话题转换器)
ros2 launch rl_deploy_python G1_controller.launch.py
# 启动 G1 高程图控制器
ros2 launch rl_deploy_python G1_elevation_controller.launch.py
# 启动 Go2 控制器
ros2 launch rl_deploy_python Go2_controller.launch.py
```
## 🎮 控制器类型说明
### G1 控制器
| 控制器 | 说明 | Launch 文件 |
|--------|------|------------|
| `G1_controller` | 标准强化学习控制器 | `G1_controller.launch.py` |
| `G1_elevation_controller` | 基于高程图的地形感知控制器 | `G1_elevation_controller.launch.py` |
| `G1_amp_controller` | AMP(Adversarial Motion Priors)控制器 | `G1_amp_controller.launch.py` |
| `G1_mix_controller` | 混合控制器 | - |
| `G1_EstNet_DWAQ_controller` | EstNet DWAQ 控制器 | `G1_EstNet_DWAQ_controller.launch.py` |
### S3 控制器
| 控制器 | 说明 | Launch 文件 |
|--------|------|------------|
| `S3_controller` | 标准强化学习控制器 | `S3_controller.launch.py` |
| `S3_controller_real` | 实物机器人控制器 | `S3_controller_real.launch.py` |
| `S3_EstNet_controller` | EstNet 控制器 | `S3_EstNet_controller.launch.py` |
| `S3_slw_controller` | SLW 控制器 | `S3_slw_controller.launch.py` |
### 四足机器人控制器
| 机器人 | 控制器 | Launch 文件 |
|--------|--------|------------|
| Go2 | `Go2_controller` | `Go2_controller.launch.py` |
| L1 | `L1_controller` | `L1_controller.launch.py` |
| Pegasus | `Pegasus_controller` | `Pegasus_controller.launch.py` |
| ZSL1 | `zsl1_controller` | `zsl1_controller.launch.py` |
## 🛠️ 实用工具
### GUI 速度控制器
```bash
ros2 run rl_deploy_python cmd_vel_gui_controller
```
### 手柄转换器
```bash
ros2 run rl_deploy_python js0_converter
```
### 传感器数据记录器
```bash
ros2 run rl_deploy_python sensor_logger
```
### 高程图发布节点
```bash
ros2 run rl_deploy_python elevation_map_publish_node
```
### 扭矩延迟测试
```bash
ros2 run rl_deploy_python torque_delay_test
```
### Chirp 信号生成器
```bash
ros2 run rl_deploy_python chirp_signal
```
## 🎯 部署场景
### 🎮 仿真部署
仿真环境需要以下 **4 个包**:
- ✅ `rl_deploy_python` - 强化学习控制器
- ✅ `mujoco_simulator` - MuJoCo 仿真器
- ✅ `robot_description` - 机器人 URDF/MJCF 模型
- ✅ `communicate_interface` - 消息定义和接口
#### 启动仿真
```bash
# 1. 启动 MuJoCo 仿真器
ros2 launch mujoco_simulator_python simulate.launch.py
# 2. 启动控制器
ros2 launch rl_deploy_python G1_controller.launch.py
```
> **📦 包说明**:
> - `mujoco_simulator` 提供物理仿真环境
> - `robot_description` 包含机器人的 URDF 和 MJCF 模型文件
> - `communicate_interface` 提供统一的消息定义(MIT 风格接口)
### 🤖 实物部署
实物机器人只需要以下 **2 个包**:
- ✅ `rl_deploy_python` - 强化学习控制器
- ⭐ `communicate_interface` - **消息定义和话题转换器(实物必需)**
#### 启动实物机器人
```bash
# 启动控制器(launch 文件会自动启动话题转换器)
ros2 launch rl_deploy_python G1_controller.launch.py
```
> **⚠️ 重要提示**:
> - 实物部署前请在仿真中充分测试
> - 确保 `FSMFlag` 参数设置正确
> - 检查 PD 增益参数是否适合实物
> - 准备好紧急停止措施
>
> **💡 为什么实物不需要仿真包?**
> - 实物机器人有自己的硬件驱动和状态反馈
> - 不需要 `mujoco_simulator`(仿真器)和 `robot_description`(模型文件)
> - `communicate_interface` 的话题转换器将硬件消息转换为控制器所需的格式
### 🖥️ Foxglove 可视化
```bash
# 启动 Foxglove Bridge
ros2 launch foxglove_bridge foxglove_bridge_launch.xml
# 在浏览器中打开 https://foxglove.dev/studio
# 连接到 ws://localhost:8765
```
## 📁 项目结构
```
rl_deploy_python/
├── config/ # 配置文件目录
│ ├── G1/ # G1 机器人配置
│ ├── Go2/ # Go2 机器人配置
│ ├── S3/ # S3 机器人配置
│ ├── L1/ # L1 机器人配置
│ └── ...
├── launch/ # Launch 文件目录
│ ├── G1/ # G1 launch 文件
│ ├── Go2/ # Go2 launch 文件
│ └── ...
├── onnx/ # ONNX 模型文件目录
│ ├── G1/ # G1 模型
│ ├── Go2/ # Go2 模型
│ └── ...
├── rl_deploy_python/ # Python 包源代码
│ ├── base_controller.py # 基础控制器类
│ ├── FSM.py # 状态机实现
│ ├── humanoid/ # 人形机器人控制器
│ │ ├── G1/ # G1 控制器实现
│ │ └── S3/ # S3 控制器实现
│ ├── quadruped/ # 四足机器人控制器
│ │ ├── Go2/ # Go2 控制器实现
│ │ ├── L1/ # L1 控制器实现
│ │ ├── Pegasus/ # Pegasus 控制器实现
│ │ └── ZSL/ # ZSL1 控制器实现
│ └── utils/ # 工具函数和辅助节点
│ ├── cmd_vel_gui_controller.py
│ ├── elevation_map_publish_node.py
│ ├── sensor_logger.py
│ └── ...
├── setup.py # Python 包安装配置
├── package.xml # ROS2 包配置
└── README.md # 本文件
```
## 🔌 话题接口
### 订阅的话题
| 话题名 | 消息类型 | 说明 |
|--------|---------|------|
| `/low_state` | `unitree_go/LowState` 或 `unitree_hg/LowState` | 机器人低层状态(关节、IMU等) |
| `/rl_cmd_vel` | `geometry_msgs/Twist` | 速度命令 |
| `/elevation_map` | `sensor_msgs/PointCloud2` | 高程图数据(仅高程图控制器) |
### 发布的话题
| 话题名 | 消息类型 | 说明 |
|--------|---------|------|
| `/low_command` | `unitree_go/LowCmd` 或 `unitree_hg/LowCmd` | 关节控制命令 |
| `/mit_low_state` | `mit_msgs/MITLowState` | MIT 风格的状态反馈 |
## ⚙️ 参数说明
### 关键参数
| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `onnx_path` | string | - | ONNX 模型文件相对路径 |
| `FSMFlag` | int | 0 | 状态机模式(0: 仅行走, 1: 多状态) |
| `CPUCore` | int | -1 | CPU 核心绑定(-1: 不绑定) |
| `ShowLog` | int | 1 | 是否显示日志 |
| `defaultPos` | array | - | 默认关节位置 |
| `kp` | array | - | PD 控制位置增益 |
| `kd` | array | - | PD 控制速度增益 |
| `scale` | array | - | 输出缩放因子 |
## 🐛 常见问题
### 1. 找不到 ONNX 文件
**问题**:控制器启动时报错 "ONNX file not found"
**解决方法**:
- 检查 `config/*.yaml` 中的 `onnx_path` 是否正确
- 确保 ONNX 文件存在于 `onnx/` 目录下
- 使用相对路径,例如 `"G1/policy.onnx"`
### 2. 话题连接问题
**问题**:控制器启动后无法接收或发送消息
**解决方法**:
- 使用 `ros2 topic list` 检查话题是否存在
- 使用 `ros2 topic echo` 检查消息内容
- 确认话题转换器已正确启动
- 检查话题名称是否与配置文件一致
### 3. 机器人抖动或不稳定
**问题**:机器人在运行时出现抖动
**解决方法**:
- 检查 PD 增益参数(`kp`, `kd`)是否合适
- 降低输出缩放因子(`scale`)
- 检查默认关节位置(`defaultPos`)是否合理
- 在仿真中先测试,确认稳定后再部署到实物
### 4. CPU 占用过高
**问题**:控制器运行时 CPU 占用率过高
**解决方法**:
- 绑定 CPU 核心:设置 `CPUCore` 参数
- 优化 ONNX 模型:减少模型复杂度
- 使用 GPU 推理(需要安装 `onnxruntime-gpu`)
## 📝 开发指南
### 添加新的机器人支持
1. 在 `rl_deploy_python/humanoid/` 或 `quadruped/` 下创建新的文件夹
2. 创建控制器类,继承自 `BaseController`
3. 在 `config/` 下创建对应的配置文件
4. 在 `launch/` 下创建对应的 launch 文件
5. 在 `setup.py` 中添加入口点
6. 在 `onnx/` 下放置训练好的模型
### 自定义控制器
```python
from rl_deploy_python.base_controller import BaseController
class MyController(BaseController):
def __init__(self):
super().__init__('my_controller')
# 初始化代码
def control_loop(self):
# 控制循环逻辑
pass
def inference(self, obs):
# 推理逻辑
return action
def main():
controller = MyController()
controller.run()
```
## 🤝 参与贡献
欢迎提交 Issue 和 Pull Request!
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request
## 📄 许可证
请查看具体项目的许可证要求。
## 📮 联系方式
- 维护者: nanhaibei
- Email: 371743175@qq.com
- 相关项目:
- [MuJoCo Simulator](https://github.com/NanHaibei/mujoco_simulator)
- [Communicate Interface](../communicate_interface)
## 🙏 致谢
感谢所有为本项目做出贡献的开发者!