跳转至

机械臂强化学习

环境配置好后的操作流程

新创建了一个叫isaac-lab的docker镜像,代码空间挂载在主目录的isaac_ws文件夹下,对应到容器内的/root/isaac_ws路径。修改代码就正常进入修改,运行时需要在终端进入docker容器内.

# 进入docker容器
./start_isaac.sh   # 已经设置好了启动入口,进入后直接对应到/isaac_ws/openarm_isaac_lab/目录下

训练操作流程

1、开始训练

python ./scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Reach-OpenArm-v0 --headless

2、监控训练曲线

python -m tensorboard.main --logdir=logs

3、回放测试模型

在本地运行时num_envs参数设置小一点,比如1或4,避免资源占用过高

# rsl策略、单臂到达
python ./scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-OpenArm-v0 --num_envs 1

# rl_games策略、双臂到达
python ./scripts/reinforcement_learning/rl_games/play.py --task Isaac-Reach-OpenArm-Bi-v0 --num_envs 1

# rsl策略、双臂举起托盘
python ./scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Lift-Tray-OpenArm-Bi-v0 --num_envs 1

服务器训练、本地显示的流程

1、服务器训练
需要把本地代码上传到相应的服务器代码目录下
2种方法:scp 和 git
git方法:

# 在本地修改好代码后上传仓库
git add .
git commit -m "update code"
git push

# 进入服务器代码目录后拉取最新的代码
git pull

# 注意通过ssh终端进入后,网络不会连接上梯子(即便服务器上挂了),所以需要设置一下git的代理才能拉取代码
# 注意端口号,不一定是7897,最新一次是7997
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897

2、训练曲线转发给本地端口(可选)

# 在本地电脑终端运行(保持这个终端不关闭)
ssh -L 6006:localhost:6006 username@server_ip

# 然后再在ssh中运行tensorboard(其实只要有log/xxx/  下面对应的文件夹就能显示,也可以训练好后本地下载了再看)
python -m tensorboard.main --logdir=logs

3、本地回放显示
需要将训练的模型参数下载回本地对应文件夹下,运行play.py脚本

# 模型参数下载 
# 在本地先切换到要下载的目录下,下面的.代表当前目录
scp -r kemove@192.168.50.227:<服务器上的文件路径> .

# 注意服务器上的本地路径是根目录下的路径,而不是容器的路径
# 训练后的文件在logs/目录下,如/home/kemove/njt_data/isaac_ws/openarm_isaac_lab/logs/rsl_rl/openarm_bi_tray_lift/2026-05-06_03-04-39
# 打印当前路径
pwd

# 本地回放显示
python ./scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-OpenArm-v0 --num_envs 4

常见错误

1、之前可以,后面突然检测不到显卡的提示
RuntimeError: No CUDA GPUs are available

原因:有底层变动,导致硬件映射失效了

解决办法:

# 强制销毁断网的空壳容器
docker rm -f isaac-lab
# 重新拉起一条满血的硬件连接
./start_isaac.sh
# ==重新建立容器后,需要重新挂载一下环境==(注意在这一步时可能需要挂梯子,要能够访问PyPI 服务器)
python -m pip install -e source/openarm

2、isaac-lab打开后没有显示,或者卡死

解决办法:num_envs参数设置小一点、将后台其他应用清空、重启docker环境docker restart xxx

3、在用scp从服务器下载文件时,提示./xxxx: Permission denied

原因:本地电脑拒绝写入当前文件夹,权限不够

解决办法:(将本地电脑该文件夹下所有权强制交还给 jintao 这个用户)

sudo chown -R jintao:jintao .
在输入scp命令的终端输入上面命令后,然后再执行scp命令就可以了

自定义任务训练

基于openarm已有的双臂到达任务,训练一个双臂协同搬运任务:工作台上有一个又长又重的托盘,单臂的抓取宽度不够或者力量不足以平稳举起,必须要求左右臂同时抓取物体的两端,并将其平稳举起到目标高度。

1、场景配置

验证任务是否成功注册

python ./scripts/tools/list_envs.py --headless
输出任务目录中包含Isaac-Lift-Tray-OpenArm-Bi-v0Isaac-Lift-Tray-OpenArm-Bi-Play-v0的任务名,就说明注册成功

场景配置文件

lift_env_cfg.py # ★ 环境核心配置(场景/观测/动作/奖励/终止/课程)
joint_pos_env_cfg.py # ★ 具体实例化配置(托盘/EE/关节动作参数)

场景配置验证

场景验证其实就是让它训练起来,但不加headless,就会显示布局情况,环境数量num_envs不要设置太大,训练次数可以设置多一点,因为次数完了isaac-lab会自动关闭。

python ./scripts/reinforcement_learning/rsl_rl/train.py \
    --task Isaac-Lift-Tray-OpenArm-Bi-v0 \
    --num_envs 1 \
    --max_iterations 100

2、训练脚本配置

相关文件

│       └── mdp/
│           ├── observations.py      # 自定义观测函数
│           ├── rewards.py           # ★ 全部奖励函数实现
│           └── terminations.py      # 自定义终止条件

训练命令

在服务器上开始训练时,环境数量、训练次数都可以设置大一点,加上--headless参数,训练时不会打开图形界面。
可以在下面的命令中修改环境数量、训练次数等参数,进行训练。

python ./scripts/reinforcement_learning/rsl_rl/train.py \
    --task Isaac-Lift-Tray-OpenArm-Bi-v0 \
    --num_envs 2048 \
    --max_iterations 3000 \
    --headless

  • 多张显卡同时进行训练(下面的命令是用编号为0和1的两张显卡进行训练)

    CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.run --nproc_per_node=2 ./scripts/reinforcement_learning/rsl_rl/train.py \
        --task Isaac-Lift-Tray-OpenArm-Bi-v0 \
        --num_envs 4096 \
        --max_iterations 3000 \
        --headless \
        --distributed
    

  • 只用某1张特定的卡进行训练

    CUDA_VISIBLE_DEVICES=1 python ./scripts/reinforcement_learning/rsl_rl/train.py \
        --task Isaac-Lift-Tray-OpenArm-Bi-v0 \
        --num_envs 8192 \
        --max_iterations 3000 \
        --headless
    

命令解析:

CUDA_VISIBLE_DEVICES=0,1;
这是最关键的一步。它会在系统层面“欺骗” PyTorch,让你的训练脚本以为这台服务器上只有编号为 0 和 1 的两张显卡。
-m torch.distributed.run;
这是启动 PyTorch 分布式训练的标准方法。不要直接用 python xxx.py,因为单进程代码无法自动分配到多张卡上。
--nproc_per_node=2:
告诉 torchrun 你要启动 2 个进程(分别对应你开放给它的 0 号和 1 号显卡)。
--distributed:
正确地将环境分配到对应的显卡上.

训练逻辑