1.3 创建最小UR10项目
小范围修改新创建的外部项目,先让项目运行起来,以 UR10 机械臂为例
一、目标
先不要一上来就把新建的外部项目改得很复杂,而是先做一个:
最小 UR10 可创建版本
新建的外部项目虽然文件名已经改成了自己的项目名,但内部很多内容仍然是官方模板,例如 Cartpole。先做到:
- 把机械臂从 Cartpole 换成 UR10
- 把动作改成 UR10 的 6 关节动作
- 把 reset 改成 UR10 的 6 关节 reset
- 临时去掉 Cartpole 的 reward 和 termination
- 先让环境能成功启动并显示画面
二、第一步:把Cartpole换成 UR10
1. 原因
虽然项目名已经是自己的项目名,但环境里实际加载的可能还是 Cartpole。
所以第一步要先把场景中的机器人换成 UR10。
2. 修改前
from isaaclab_assets.robots.cartpole import CARTPOLE_CFG # isort:skiprobot: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")3. 修改后
from isaaclab_assets.robots.universal_robots import UR10_CFG # isort:skiprobot: ArticulationCfg = UR10_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")4. 推荐顺手修改注释
修改前
"""Configuration for a cart-pole scene."""修改后
"""Configuration for a UR10 scene."""5. 这一部分的作用
这一步完成后:
- 场景中的机器人不再是 Cartpole
- 环境开始真正使用 UR10 机械臂,但还不能运行成功
- 需要修改后续动作Actions、reset、reward 的修改才有意义
四、第二步:修改 class ActionsCfg:
1. 原因
原模板中的动作通常还是 Cartpole 的动作逻辑,例如只控制一个关节。
但 UR10 是 6 自由度机械臂,因此动作必须改成对 6 个关节进行控制。
UR10 的 6 个关节名为:
shoulder_pan_jointshoulder_lift_jointelbow_jointwrist_1_jointwrist_2_jointwrist_3_joint
3. 把class ActionsCfg:修改为
@configclass
class ActionsCfg:
"""Action specifications for the MDP."""
joint_effort = mdp.JointEffortActionCfg(
asset_name="robot",
joint_names=[
"shoulder_pan_joint",
"shoulder_lift_joint",
"elbow_joint",
"wrist_1_joint",
"wrist_2_joint",
"wrist_3_joint",
],
scale=10.0,
)这一步完成后:
- 动作空间不再是 Cartpole 的单维动作
- 动作空间变成 UR10 的 6 维动作
- 环境开始能对 UR10 的 6 个关节进行控制
五、第三步:修改 reset
1. 原因
原模板中的 reset 逻辑通常还是针对 Cartpole,例如:
slider_to_cartcart_to_pole
但 UR10 并没有这些关节,因此 reset 必须改成 UR10 的关节逻辑。
2. 把class EventCfg:修改为
@configclass
class EventCfg:
"""Configuration for events."""
reset_robot_joints = EventTerm(
func=mdp.reset_joints_by_offset,
mode="reset",
params={
"asset_cfg": SceneEntityCfg(
"robot",
joint_names=[
"shoulder_pan_joint",
"shoulder_lift_joint",
"elbow_joint",
"wrist_1_joint",
"wrist_2_joint",
"wrist_3_joint",
],
),
"position_range": (-0.1, 0.1),
"velocity_range": (-0.1, 0.1),
},
)这样修改之后:
- 每次环境 reset 时,UR10 的 6 个关节都会在小范围内随机初始化
- 避免继续使用 Cartpole 的关节名导致报错
- 为后面真正的机械臂任务打下基础
六、第四步:临时去掉 reward 和 termination
1. 原因
原模板中的 reward 和 termination 通常都是围绕 Cartpole 设计的,例如:
- 杆子角度保持竖直
- 小车位置越界
- 小车速度惩罚
- 杆子角速度惩罚
这些逻辑对 UR10 来说都不适用。
所以在“最小 UR10 可创建版本”阶段,最稳的做法不是马上重写复杂 reward,而是:
- 临时去掉 Cartpole 的 reward
- 临时去掉 Cartpole 的 termination
- 只保留最基本的占位逻辑
2. Reward 修改为
@configclass
class RewardsCfg:
"""Reward terms for the MDP."""
alive = RewTerm(func=mdp.is_alive, weight=1.0)3. Termination 修改为
@configclass
class TerminationsCfg:
"""Termination terms for the MDP."""
time_out = DoneTerm(func=mdp.time_out, time_out=True)这样做的目的不是为了训练出有意义的策略,而是为了:
- 先让 Reward Manager 能正常工作
- 先让 Termination Manager 能正常工作
- 先避免因为 Cartpole 旧逻辑导致环境报错
七、第五步:降低并行环境数,先让环境稳定启动
1. 原因
把机器人从 Cartpole 换成 UR10 后,模板原来的并行环境数4096可能会太大,导致 GPU 显存不足。
例如模板文件ur10e_ocs_2_env_cfg.py里可能是:
scene: Ur10eOcs2SceneCfg = Ur10eOcs2SceneCfg(num_envs=4096, env_spacing=4.0)这个值对 Cartpole 还可能可以,但对 UR10 这种机械臂通常过大,容易报:
- CUDA out of memory
解决办法:把num_envs=4096修改为64/32/8等
这样做之后:
- 可以降低 UR10 机械臂并行仿真的显存占用
- 让环境先稳定创建成功
- 更适合初学阶段调试和观察
八、最后的目标:先让环境能启动
在完成前面这些修改后,此时最重要的不是马上训练,而是先验证下面几件事:
进入项目目录并且激活conda环境,运行
python scripts/random_agent.py --task Template-Ur10e-Ocs-2-v0Template-Ur10e-Ocs-2-v0 为自己的项目名称
观察:
- 环境能否成功创建
- 画面能否正常显示
- 动作空间是否变成 6 维
- 观测空间是否能正常生成
- UR10 是否真正出现在isaacsim场景里
只要这些条件满足,就说明已经完成了:
最小 UR10 可创建版本
这个环境还不是一个完整的机械臂强化学习任务,但已经成功从官方模板跨到了自己的机械臂环境骨架。
