机械臂强化学习¶
环境配置好后的操作流程¶
新创建了一个叫isaac-lab的docker镜像,代码空间挂载在主目录的isaac_ws文件夹下,对应到容器内的/root/isaac_ws路径。修改代码就正常进入修改,运行时需要在终端进入docker容器内.
训练操作流程¶
1、开始训练
2、监控训练曲线
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 这个用户)
在输入scp命令的终端输入上面命令后,然后再执行scp命令就可以了自定义任务训练¶
基于openarm已有的双臂到达任务,训练一个双臂协同搬运任务:工作台上有一个又长又重的托盘,单臂的抓取宽度不够或者力量不足以平稳举起,必须要求左右臂同时抓取物体的两端,并将其平稳举起到目标高度。
1、场景配置¶
验证任务是否成功注册¶
输出任务目录中包含Isaac-Lift-Tray-OpenArm-Bi-v0 和 Isaac-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的两张显卡进行训练)
-
只用某1张特定的卡进行训练
命令解析:
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:
正确地将环境分配到对应的显卡上.