﻿# TRON2 双足运控项目开源示例

<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff5eb; border: 1px solid #f3ddc7; border-left: 4px solid #d97706; border-radius: 8px; color: #3f3428; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0 0 10px; font-weight: 600; color: #92400e;">电脑硬件配置及开发环境要求（训练与部署同等需求）：</p>
    <ol style="margin: 0; padding-left: 24px;">
        <li style="padding-left: 4px; margin-bottom: 8px;">GPU：NVIDIA GPU至少 8GB 显存。为节省训练时间，推荐 GeForce RTX 3090 (24 GB) 或更高</li>
        <li style="padding-left: 4px; margin-bottom: 8px;">CPU：至少六核处理器，推荐Intel: Core i7-10700K/AMD:Ryzen5 5600X/或更高版本</li>
        <li style="padding-left: 4px; margin-bottom: 8px;">内存：16GB以上</li>
        <li style="padding-left: 4px; margin-bottom: 8px;">存储空间：至少 30GB 可用空间</li>
        <li style="padding-left: 4px; margin-bottom: 8px;">操作系统：Ubuntu 22.04 LTS及以上版本</li>
        <li style="padding-left: 4px; margin-bottom: 8px;">Python：3.10或更高版本</li>
        <li style="padding-left: 4px;">网络环境：能正常访问Github</li>
    </ol>
</blockquote>

## 1 任务概述

双足运控项目的开发流程包含以下 4 个主要阶段：

```mermaid
flowchart LR
    A["01 · 训练"] --> B["02 · Play"] --> C["03 · Sim2Sim"] --> D["04 · Sim2Real"]

    classDef training fill:#e8f1ff,stroke:#4f83cc,color:#17365d,stroke-width:1.5px
    classDef play fill:#e8f6f1,stroke:#4a9b76,color:#174d38,stroke-width:1.5px
    classDef sim2sim fill:#fff4df,stroke:#d69b36,color:#68480d,stroke-width:1.5px
    classDef sim2real fill:#f2ecff,stroke:#8666c5,color:#38265f,stroke-width:1.5px

    class A training
    class B play
    class C sim2sim
    class D sim2real
```

本教程中所用到的训练环境为IsaacLab 2.3.2 + Isaac Sim 5.1.0。

**Isaac Lab** 是一个统一的、模块化的机器人学习框架，旨在简化机器人研究中的常见工作流程（如强化学习、从示范中学习和运动规划）。它构建在 [NVIDIA Isaac Sim](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html) 之上，以利用最新的仿真能力以用于逼真的场景和快速高效的仿真。

该框架的核心目标包括:

- **模块化**: 轻松定制并添加新的环境、机器人和传感器。

- **灵活性**: 适应社区的不断变化需求。

- **开放性**: 保持开源，允许社区贡献和扩展该框架。

- **功能齐全**: 包括多种环境、传感器和任务，可供直接使用。

Isaac Lab 中提供的主要功能包括由 PhysX 提供的快速准确的物理仿真，用于矢量化渲染的分块渲染 API，用于改善鲁棒性和适应性的域随机化，以及支持在云端运行的功能。

为了快速上手，我们将在本教程中指导您完成一个具体的双足运控任务，即TRON2机器人WF、SF形态下的基础运动。如下所示

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_zh.png" alt="" title="image.png" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

## 2 环境配置

以下步骤首先从其预构建的二进制文件中安装 Isaac Sim，然后从源代码中安装 Isaac Lab。

### 2.1 IsaacSim安装

在本次安装中，我们使用Isaaclab的预编译二进制安装，可以从下方页面下载ZIP包：

[https://docs.isaacsim.omniverse.nvidia.com/5.1.0/installation/download.html]()

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_2_zh.png" alt="" title="image.png" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff5eb; border: 1px solid #f3ddc7; border-left: 4px solid #d97706; border-radius: 8px; color: #3f3428; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0 0 10px;">下载完成 zip 文件后，您可以将其解压到所需目录。</p>
    <p style="margin: 0;">在本次安装中，我们假设Isaac Sim目录被命名为 <code>${HOME}/isaacsim</code> 。</p>
</blockquote>

然后将下面两个指令加入环境变量.bashrc中：

```Bash
# Isaac Sim root directory
export ISAACSIM_PATH="${HOME}/isaacsim"
# Isaac Sim python executable
export ISAACSIM_PYTHON_EXE="${ISAACSIM_PATH}/python.sh"
```

### 2.2 验证 Isaac Sim 安装

使用下方指令检查仿真器是否正常运行:：

```Plain Text
# note: you can pass the argument "--help" to see all arguments possible.
${ISAACSIM_PATH}/isaac-sim.sh
```
使用下方指令检查仿真器是否可以从独立的 python 脚本中运行:

```Markdown
# checks that python path is set correctly
${ISAACSIM_PYTHON_EXE} -c "print('Isaac Sim configuration is now complete.')"
# checks that Isaac Sim can be launched from python
${ISAACSIM_PYTHON_EXE} ${ISAACSIM_PATH}/standalone_examples/api/isaacsim.core.api/add_cubes.py
```
<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff5eb; border: 1px solid #f3ddc7; border-left: 4px solid #d97706; border-radius: 8px; color: #3f3428; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0 0 10px;">如果您之前使用过 Isaac Sim 的旧版本，您需要在安装后 <em>第一次</em> 运行以下命令，以删除所有旧用户数据和缓存变量:</p>
    <p style="margin: 0;"><code>${ISAACSIM_PATH}/isaac-sim.sh --reset-user</code></p>
</blockquote>

如果按照上述说明仿真器无法运行或崩溃，意味着某些配置不正确。要调试和故障排除，请查看 Isaac Sim [文档](https://docs.omniverse.nvidia.com/dev-guide/latest/linux-troubleshooting.html) 和 [Isaac Sim Forums](https://docs.isaacsim.omniverse.nvidia.com/latest/common/feedback.html) 。

### 2.3 IsaacLab安装

#### 2.3.1 克隆IsaacLab

```Plain Text
git clone -b release/2.3.0 https://github.com/isaac-sim/IsaacLab.git
```

#### 2.3.2 构建软链接

```Plain Text
# enter the cloned repository
cd IsaacLab
# create a symbolic link
ln -s path_to_isaac_sim _isaac_sim
# path_to_isaac_sim是指本地的isaac_sim的存放路径，需注意！！！
# recommended: ln -s ~/isaacsim _isaac_sim
```

### 2.4 Conda安装

可以参照下方的方法安装Conda：

[https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html]()

安装好Conda后，创建Conda环境：

```Bash
# Option 1: Default environment name 'env_isaaclab'
./isaaclab.sh --conda  # or "./isaaclab.sh -c"
# Option 2: Custom name
./isaaclab.sh --conda my_env  # or "./isaaclab.sh -c my_env"
#激活环境
# Activate environment
conda activate env_isaaclab  # or "conda activate my_env"
```

### 2.5 Python依赖安装

#### 2.5.1 安装系统依赖包

`build-essential` 是 Ubuntu / Debian 系统中的一个**元软件包（meta-package）**，用于一次性安装 C/C++ 开发最基础的一套编译工具。

```Plain Text
# these dependency are needed by robomimic which is not available on Windows
sudo apt install cmake build-essential
```

#### 2.5.2 安装IsaacLab Python包

```Plain Text
./isaaclab.sh --install # or "./isaaclab.sh -i"
```
默认情况下，上述命令将安装 **所有** 学习框架。这些包括 `rl_games` 、 `rsl_rl` 、 `sb3` 、 `skrl` 、 `robomimic` 。

### 2.6 验证 Isaac Lab 安装

```Markdown
# Option 1: Using the isaaclab.sh executable
# note: this works for both the bundled python and the virtual environment
./isaaclab.sh -p scripts/tutorials/00_sim/create_empty.py

# Option 2: Using python in your virtual environment
python scripts/tutorials/00_sim/create_empty.py
```
上述命令应该启动仿真器，并显示具有黑色视口的窗口。您可以通过在终端上按 `Ctrl+C` 来退出脚本。

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_3_zh.png" alt="" title="image.png" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

如果您看到这个，那么安装成功了！ 

<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff5eb; border: 1px solid #f3ddc7; border-left: 4px solid #d97706; border-radius: 8px; color: #3f3428; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0;">如果出现错误 <code>ModuleNotFoundError: No module named 'isaacsim'</code> ，请确保虚拟环境已激活且已执行 <code>source _isaac_sim/setup_conda_env.sh</code> 。</p>
</blockquote>

## 3 代码准备

### 3.1 拉取代码

使用下方指令拉取代码：

```Plain Text
git clone https://github.com/limx-tron2/tron2_rl_lab
```

### 3.2 安装Python包

首先进入代码路径

```Plain Text
cd tron2_rl_lab
```
激活Conda环境

```Plain Text
conda activate env_isaaclab
```
然后安装代码包

```Plain Text
pip install -e rsl_rl
pip install -e exts/bipedal_locomotion --no-build-isolation
```

## 4 启动训练

本章代码均以脚掌形态为示例

### 4.1 训练

```Plain Text
conda activate env_isaaclab
python scripts/rsl_rl/train.py \
  --task Isaac-Limx-SF-TRON2A-Blind-Flat-v0 \
  --num_envs 4096 \
  --headless 
```

### 4.2 Play训练好的策略

使用如下指令播放训练好的策略，播放的同时也会导出部署所需要的ONNX模型文件

```Plain Text
conda activate env_isaaclab
python scripts/rsl_rl/play.py \
  --task Isaac-Limx-SF-TRON2A-Blind-Flat-v0 \
  --num_envs 1 
```

## 5 仿真、真机部署

### 5.1 环境准备

- 配置 Conda 环境用于Python部署

    创建一个专门用于Python部署运行的 Conda 环境（例如，`tron2_deploy`），并指定 Python 版本：

    ```Bash
    conda create --name tron2_deploy python=3.8
    ```

- 激活刚刚创建的环境：

    ```Bash
    conda activate tron2_deploy
    ```

### 5.2 创建工作空间

可以按照以下步骤，创建一个RL部署开发工作空间：

- 打开一个Bash终端。

- 创建一个新目录来存放工作空间。例如，可以在用户的主目录下创建一个名为“limx_ws”的目录：

    ```Bash
    mkdir -p ~/limx_ws
    ```

- 下载 MuJoCo 仿真器

    ```Bash
    cd ~/limx_ws
    git clone --recurse-submodules https://github.com/limx-tron2/tron2_mujoco_sim
    ```

- 下载部署实现

    ```Bash
    cd ~/limx_ws
    git clone --recurse-submodules https://github.com/limx-tron2/tron2_rl_deploy_python
    ```

- 安装运动控制开发库（如果尚未安装）：

    - Linux x86_64 环境

    ```Bash
    # 激活tron2_deploy的conda环境
    conda activate tron2_deploy
    
    # 安装limxsdk
    pip install tron2_rl_deploy_python/limxsdk-lowlevel/python3/amd64/limxsdk-*-py3-none-any.whl
    
    ```

    - Linux aarch64 环境

    ```Bash
    # 激活tron2_deploy的conda环境
    conda activate tron2_deploy
    
    # 安装limxsdk
    pip install tron2-rl-deploy-python/limxsdk-lowlevel/python3/aarch64/limxsdk-*-py3-none-any.whl    
    ```

- 设置机器人型号：请参考“查看/设置机器人型号”章节，查看您的机器人型号。如果尚未设置，请按照以下步骤进行设置。

    - 通过 Shell 命令 `tree -L 1 tron2-mujoco-sim/robot-description/tron2` 列出可用的机器人类型：

    ```Plain Text
    limx@limx:~$ tree -L 1 tron2-mujoco-sim/robot-description/tron2
    tron2-mujoco-sim/robot-description/pointfoot
    ├── SF_TRON2A
    └── WF_TRON2A
    ```

    - 以 WF_TRON2A（请根据实际机器人类型进行替换）为例，设置机器人型号类型：

    ```Plain Text
    echo 'export ROBOT_TYPE=WF_TRON2A' >> ~/.bashrc && source ~/.bashrc
    ```

### 5.3 更新RL训练模型

在您的工作空间中，以 WF_TRON2A机器人类型为例，

- RL模型、配置文件所在路径为：`~/limx_ws/tron2-rl-deploy-python/controllers/model/WF_TRON2A`，

如下所示。请根据您所使用的训练环境和训练结果更新替换。

```Bash
tree ~/limx_ws/tron2-rl-deploy-python/controllers/model/WF_TRON2A/
.
├── params.yaml
├── policy.onnx
└── encoder.onnx
```

### 5.4 仿真部署

- 打开一个Bash终端，运行 MuJoCo 仿真器。

    ```Python
    # 激活tron2_deploy的conda环境
    conda activate tron2_deploy
    
    # 运行仿真器
    cd ~/limx_ws
    python tron2-mujoco-sim/simulator.py
    ```

- 打开一个Bash终端，运行控制算法。

    如果您的机器人处于摔倒状态，请在启动运动控制后，单击 MuJoCo 仿真器左侧菜单栏的`“Reset”`按钮以重置机器人。此时，您将看到机器人恢复并开始行走。

    ```Bash
    # 激活tron2_deploy的conda环境
    conda activate tron2_deploy
    
    # 运行控制算法
    python tron2-rl-deploy-python/main.py
    ```

- 打开一个Bash终端，运行虚拟遥控器：仿真的过程中，您可以使用虚拟遥控器来控制机器人运动。左摇杆：控制前进/后退/左转/右转运动；右遥控：可控制机器人左右横向运动。

    ```Bash
    ./tron2-mujoco-sim/robot-joystick/robot-joystick
    ```

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_4_zh.gif" alt="" title="wfmj-ezgif.com-video-to-gif-converter.gif" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_5_zh.gif" alt="" title="sfmj-ezgif.com-video-to-gif-converter.gif" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

### 5.5 部署前准备

- 修改开发者电脑IP：确保您的开发电脑与机器人本体通过外置网口连接。设置您的电脑IP地址为：`10.192.1.200`，并通过Shell命令`ping 10.192.1.4` 能够正常ping通。如下图所示对您的开发电脑进行IP设置：

<img src="https://oss.limxdynamics.com/uploads/material/%E9%BB%98%E8%AE%A4/TRON%202/demo/Bipedal_Locomotion_Example/TRON2_0_sec_6_zh.png" alt="" title="image.png" loading="lazy" style="width: 100%; max-width: 500px; border-radius: 5px; border: 1px solid #e0e0e0;">

- 打开底层开发者模式：机器人开机后，同时按下遥控器按键 `R1 + Right` 会进入`High-level Dev`，再按`L1 + □` 进入`Idle`，再按`R1 + Right` 会进入`Low-level Dev`，这时本体主机将会底层开发者模式，灯显颜色为`绿色`。在此模式下，用户可以开发自己的运动控制算法。模式设置掉电后不会失效，重新开机后仍然是底层开发者模式。

- 实机部署运行。在Bash终端只需下面Shell命令启动控制算法（在进行实机部署运行时，确保机器人吊装非常重要）：

    ```Bash
    # 激活tron2_deploy的conda环境
    conda activate tron2_deploy
    
    # 指定机器人IP地址，运行控制算法
    python3 tron2-rl-deploy-python/main.py 10.192.1.4
    ```

<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff1f0; border: 1px solid #f2ceca; border-left: 4px solid #dc2626; border-radius: 8px; color: #492c2a; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0 0 10px; font-weight: 700; color: #b91c1c;">警告</p>
    <ol style="margin: 0; padding-left: 24px;">
        <li style="padding-left: 4px; margin-bottom: 8px;">执行完运控程序，机器人会自动进入<code>prepare</code>状态（所有关节处于默认零位，机器人处于站直的状态），因此执行程序前需将机器人吊起，并且确保周围没人；</li>
        <li style="padding-left: 4px;">在进入机器人行走功能前，确保机器人是被吊装的，且机器人末端着地；</li>
    </ol>
</blockquote>

- 这时您可以通过遥控器按键`L1 + △`开启机器人行走功能。左摇杆：控制前进/后退/左转/右转运动；右遥控：可控制机器人左右横向运动。

- 遥控器按`L1 + □`关闭机器人行走功能。



### 5.6 实机部署

当您完成仿真和真机调试后，可以将您的算法程序部署到机器人上（在部署测试完成之前，确保机器人始终保持吊装状态非常重要，以保障安全）。详细步骤如下：

- 准备工作

    - 保持机器人继续处于开发者模式：确保机器人仍处于开发者模式，方便您进行程序部署和调试。

    - 网络连接：确保开发电脑与机器人通过外置网口（Ethernet）连接，网络稳定且通信正常。部署完成后，网络连接将不再需要。

- 拷贝算法程序到机器人

    - 在开发电脑上打开终端，进入到存放算法程序的工作目录，例如 `~/limx_ws`。

    - 使用 `scp` 命令将包含算法的目录拷贝到机器人中，默认机器人用户为 `guest`，密码为 `123456`。

    ```Bash
    cd ~/limx_ws
    scp -r tron2-rl-deploy-python guest@10.192.1.4:/home/guest
    ```

- 安装运动控制开发库（如果尚未安装）：

    ```Bash
    ssh guest@10.192.1.4 "pip install /home/guest/tron2-rl-deploy-python/limxsdk-lowlevel/python3/amd64/limxsdk-*-py3-none-any.whl"   
    ```

- 启动程序：在Bash终端只需下面Shell命令启动控制算法（在进行实机部署运行时，确保机器人吊装非常重要）：

```Bash
# 激活tron2_deploy的conda环境
conda activate tron2_deploy

# 指定机器人IP地址，运行控制算法
python3 tron2-rl-deploy-python/main.py 10.192.1.2
```
<blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #fff1f0; border: 1px solid #f2ceca; border-left: 4px solid #dc2626; border-radius: 8px; color: #492c2a; line-height: 1.7; overflow-wrap: anywhere;">
    <p style="margin: 0 0 10px; font-weight: 700; color: #b91c1c;">警告</p>
    <ol style="margin: 0; padding-left: 24px;">
        <li style="padding-left: 4px; margin-bottom: 8px;">执行完运控程序，机器人会自动进入<code>prepare</code>状态（所有关节处于默认零位，机器人处于站直的状态），因此执行程序前需将机器人吊起，并且确保周围没人；</li>
        <li style="padding-left: 4px;">在进入机器人行走功能前，确保机器人是被吊装的，且机器人末端着地；</li>
    </ol>
</blockquote>

- 配置算法自动启动（按需配置）

    - SSH 登录机器人：使用 ssh 命令远程登录到机器人系统，密码为 `123456`。

        ```Bash
        ssh guest@10.192.1.4
        ```

    自启动脚本正在编辑，用户目前需要手动启动控制器，我们会迅速OTA自启动脚本（6.17）：

    ```Plain Text
    python3 /home/guest/tron2-rl-deploy-python/main.py 10.192.1.2
    ```

    <blockquote style="margin: 16px 0; padding: 18px 22px; background-color: #eff6ff; border: 1px solid #cadcf5; border-left: 4px solid #2563eb; border-radius: 8px; color: #263b53; line-height: 1.7; overflow-wrap: anywhere;">
            <p style="margin: 0 0 10px; font-weight: 600; color: #1e40af;">修改自启动脚本：</p>
            <ul style="margin: 0; padding-left: 24px;">
                <li style="padding-left: 4px; margin-bottom: 12px;">打开自启动脚本 <code>/home/guest/autolaunch/autolaunch.sh</code> 进行编辑：
                    <pre style="margin: 10px 0 0; padding: 12px; background-color: #f8fafc; color: #1f2937; border-radius: 6px; white-space: pre-wrap; overflow-wrap: anywhere;"><code class="language-bash">busybox vi /home/guest/autolaunch/autolaunch.sh</code></pre>
                </li>
                <li style="padding-left: 4px; margin-bottom: 12px;">在脚本中找到启动 <code>main.py</code> 的命令：确保 <code>python3 /home/guest/tron2-rl-deploy-python/main.py 10.192.1.4</code> 这一行未被注释（没有 <code>#</code> 注释符号）。编辑完成后，保存并退出编辑器。
                    <pre style="margin: 10px 0 0; padding: 12px; background-color: #f8fafc; color: #1f2937; border-radius: 6px; white-space: pre-wrap; overflow-wrap: anywhere;"><code class="language-bash">#!/bin/bash&#10;&#10;while true; do&#10;  # 启动用于控制 Pointfoot 机器人的 Python 控制器脚本&#10;  # 参数 10.192.1.4 表示机器人所在的 IP 地址&#10;  # 该行被注释掉，若要启用自动控制器启动，请取消注释&#10;  # 请根据您控制器脚本的实际路径修改此路径&#10;  python3 /home/guest/tron2-rl-deploy-python/main.py 10.192.1.4&#10;&#10;  # 使用 roslaunch 启动机器人控制算法&#10;  # 若要启动机器人控制算法，请取消下面注释&#10;  # 请根据您安装的实际路径修改路径&#10;  # source /home/guest/install/setup.bash&#10;  # roslaunch robot_hw pointfoot_hw.launch&#10;&#10;  # 等待 3 秒后重新启动&#10;  sleep 3&#10;done</code></pre>
                </li>
                <li style="padding-left: 4px;">重启机器人电脑。修改完成后，执行以下命令重启机器人：
                    <pre style="margin: 10px 0 0; padding: 12px; background-color: #f8fafc; color: #1f2937; border-radius: 6px; white-space: pre-wrap; overflow-wrap: anywhere;"><code class="language-bash">reboot</code></pre>
                </li>
            </ul>
        </blockquote>

- 控制机器人运动

    等待系统启动后，您可以使用遥控器控制机器人：

    - L1 + △：启动机器人行走功能；

    - L1 + □： 关闭机器人行走功能；

    - 左摇杆：控制机器人前进、后退、左转、右转；

    - 右摇杆：控制机器人左右横向运动。
