当前位置: 首页 > news >正文

IsaacLab | 如何在Manipulation任务中添加新的目标(target)

如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。

假使说我们有一个机械臂操作的任务,这样婶的

Isaac Lab | Push

我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样

Isaac Lab | Add target

那么就需要改动如下代码。

1. 添加新的目标命令

假如你的环境保留了IsaacLab他提供的的文件结构,像这样
在这里插入图片描述

我们应该有一个叫做 ****_env_cfg.py 的文件环境名,在lift环境里,有一个 lift_env_cfg.py,在reach 环境中,有一个reach_env_cfg.py。也许你有一个自己命名的文件,但是没有关系。

****_env_cfg.py 中,我们包装了如环境设置ObjectTableSceneCfg,目标命令CommandsCfg,动作空间ActionCfg,观察空间ObservationCfg,随机化事件EvetCfg,奖励函数RewardsCfg,终止条件TerminationsCfg等项

我们首先需要改动的在 ****_env_cfg.py 中,找到目标命令类CommandsCfg,他可能长这样

@configclass
class CommandsCfg:"""Command terms for the MDP."""object_pose = mdp.UniformPoseCommandCfg(asset_name="robot",body_name=MISSING,  # will be set by agent env cfgresampling_time_range=(5.0, 5.0),debug_vis=True,ranges=mdp.UniformPoseCommandCfg.Ranges(pos_x=(0.3, 0.7), pos_y=(-0.3, 0.3), pos_z=(0.0, 0.0), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0)),)

这里只写了一个目标命令object_pose,我们直接复制粘贴,可以得到

@configclass
class CommandsCfg:"""Command terms for the MDP."""object_pose = mdp.UniformPoseCommandCfg(asset_name="robot",body_name=MISSING,  # will be set by agent env cfgresampling_time_range=(5.0, 5.0),debug_vis=True,ranges=mdp.UniformPoseCommandCfg.Ranges(pos_x=(0.3, 0.7), pos_y=(-0.3, 0.3), pos_z=(0.0, 0.0), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0)),)object2_pose = mdp.UniformPoseCommandCfg(asset_name="robot",body_name=MISSING,  # will be set by agent env cfgresampling_time_range=(5.0, 5.0),debug_vis=True,ranges=mdp.UniformPoseCommandCfg.Ranges(pos_x=(0.3, 0.7), pos_y=(-0.3, 0.3), pos_z=(0.0, 0.0), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0)),)

这样我们就有两个目标命令了(傻笑)。

2. 将新的目标命令添加到观察空间中

还是在这个****_env_cfg.py 文件中,找到观察空间类ObservationCfg

@configclass
class ObservationsCfg:"""Observation specifications for the MDP."""@configclassclass PolicyCfg(ObsGroup):"""Observations for policy group."""joint_pos = ObsTerm(func=mdp.joint_pos_rel)joint_vel = ObsTerm(func=mdp.joint_vel_rel)object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame)target1_object1_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"})# Add object2 position in robot root frameobject2_position = ObsTerm(func=mdp.object2_position_in_robot_root_frame)actions = ObsTerm(func=mdp.last_action)def __post_init__(self):self.enable_corruption = Trueself.concatenate_terms = True# observation groupspolicy: PolicyCfg = PolicyCfg()

这里我们需要添加新的target_object_position,所以object2_position后面会加一句。

@configclass
class ObservationsCfg:"""Observation specifications for the MDP."""@configclassclass PolicyCfg(ObsGroup):"""Observations for policy group."""joint_pos = ObsTerm(func=mdp.joint_pos_rel)joint_vel = ObsTerm(func=mdp.joint_vel_rel)object_position = ObsTerm(func=mdp.object_position_in_robot_root_frame)target1_object1_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object_pose"})# Add object2 position in robot root frameobject2_position = ObsTerm(func=mdp.object2_position_in_robot_root_frame)target2_object2_position = ObsTerm(func=mdp.generated_commands, params={"command_name": "object2_pose"})actions = ObsTerm(func=mdp.last_action)def __post_init__(self):self.enable_corruption = Trueself.concatenate_terms = True# observation groupspolicy: PolicyCfg = PolicyCfg()

当然这里使用的是我个人的一种情况举例,只是为了告诉老铁们如果添加了新的目标到环境里,不要忘了把他加到观察空间中哦!

3. 把body_name的名字传进去

事情是这样的,让我们回过头去看目标命令类的代码CommandsCfg

@configclass
class CommandsCfg:"""Command terms for the MDP."""object_pose = mdp.UniformPoseCommandCfg(asset_name="robot",body_name=MISSING,  # will be set by agent env cfgresampling_time_range=(5.0, 5.0),debug_vis=True,ranges=mdp.UniformPoseCommandCfg.Ranges(pos_x=(0.3, 0.7), pos_y=(-0.3, 0.3), pos_z=(0.0, 0.0), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0)),)object2_pose = mdp.UniformPoseCommandCfg(asset_name="robot",body_name=MISSING,  # will be set by agent env cfgresampling_time_range=(5.0, 5.0),debug_vis=True,ranges=mdp.UniformPoseCommandCfg.Ranges(pos_x=(0.3, 0.7), pos_y=(-0.3, 0.3), pos_z=(0.0, 0.0), roll=(0.0, 0.0), pitch=(0.0, 0.0), yaw=(0.0, 0.0)),)

他的body_name属性是没有(Missing)的,他的注释后面说 will be set by agent env cfg,会被agent的环境配置传进来,这就神奇了。

众所周知,agent的环境配置在这个文件夹下,以lift任务为例在这里插入图片描述
打开我们想更改的配置文件,我们能看到这样的代码

@configclass
class Franka2CubePushEnvCfg(Push2EnvCfg):def __post_init__(self):# post init of parentsuper().__post_init__()# Set Franka as robotself.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")# Set actions for the specific robot type (franka)self.actions.body_joint_pos = mdp.JointPositionActionCfg(asset_name="robot", joint_names=["panda_joint.*"], scale=0.5, use_default_offset=True)self.actions.finger_joint_pos = mdp.BinaryJointPositionActionCfg(asset_name="robot",joint_names=["panda_finger.*"],open_command_expr={"panda_finger_.*": 0.04},close_command_expr={"panda_finger_.*": 0.0},)# Set the body name for the end effectorself.commands.object_pose.body_name = "panda_hand"

可以看到是在最后一行,他把panda_hand的名字传进来了, 所以我们要为新的目标命令也把名字传过去,修改后的代码会像

@configclass
class Franka2CubePushEnvCfg(Push2EnvCfg):def __post_init__(self):# post init of parentsuper().__post_init__()# Set Franka as robotself.scene.robot = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot")# Set actions for the specific robot type (franka)self.actions.body_joint_pos = mdp.JointPositionActionCfg(asset_name="robot", joint_names=["panda_joint.*"], scale=0.5, use_default_offset=True)self.actions.finger_joint_pos = mdp.BinaryJointPositionActionCfg(asset_name="robot",joint_names=["panda_finger.*"],open_command_expr={"panda_finger_.*": 0.04},close_command_expr={"panda_finger_.*": 0.0},)# Set the body name for the end effectorself.commands.object_pose.body_name = "panda_hand"self.commands.object2_pose.body_name = "panda_hand"

4. 设计新的奖励函数

这一步就说不明白了,因为大家搓出来的任务都不大一样。但终归我们加了新的目标,是为了做新的强化学习训练的,那就又得为新的目标更改新的奖励函数。

但是通过上面的步骤,新的目标标记会出现在环境中在这里插入图片描述就是这样

非常的有品

以上

相关文章:

IsaacLab | 如何在Manipulation任务中添加新的目标(target)

如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。 假使说我们有一个机械臂操作的任务,这样婶的 Isaac Lab | Push 我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样 Isaac Lab | Add target 那…...

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…...

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows:微软公司开发的一款桌面操作系统(闭源系统)。版本有dos,win98,win NT,win XP , win7, win vista. win8, win10,win11。服务器操作系统:winserve…...

CSS(九)——CSS 轮廓(outline)

CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...

Unity Timeline:构建复杂动画序列的利器

Unity的Timeline是一个强大的动画工具,它允许开发者创建复杂的动画序列,将动画、音频和事件整合到一个统一的时间轴上。Timeline的可视化编辑界面使得动画制作变得更加直观和灵活。本文将介绍Unity Timeline的基本概念、功能以及如何使用它来实现动画。 …...

C# 与C++ cli

cli CLI(Command Line Interface)是一种通过命令行界面与计算机系统进行交互的方式。它提供了一种以文本形式输入命令和接收系统输出的方法,用于执行各种操作和管理计算机系统。以下是CLI的详细解释: 一、定义与基本概念 定义&…...

Linux文件编程--打开及创建

...

Vue3点击按钮实现跳转页面并携带参数

前提&#xff1a;有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…...

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…...

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …...

mybatise全接触-面试宝典-知识大全

1 . 简述什么是Mybatis和原理 &#xff1f; Mybatis工作原理&#xff1a; &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;加载驱动、创建连接、创建statement等繁杂的过程&#xff0c;开发者…...

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…...

【Hot100】LeetCode—416. 分割等和子集

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;416. 分割等和子集 1- 思路 理解为背包问题 思路&#xff1a; 能否将均分的子集理解为一个背包&#xff0c;比如对于 [1,5,11,5]&#xff0c;判断能否凑齐背包为 11 的容量…...

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…...

【嵌入式硬件】快衰减和慢衰减

1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…...

C语言 | Leetcode C语言题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…...

速盾:网络安全和 CDN 之间的关系是怎样的?

网络安全和内容交付网络&#xff08;CDN&#xff09;之间有着密切的关系。网络安全主要涉及保护网络和系统免受各种威胁和攻击&#xff0c;而CDN是一种用于提供更快速、高效和可靠的内容交付服务的技术。在当今数字化和云计算时代&#xff0c;网络安全和CDN之间的关系变得更加紧…...

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需要知道MySQL的安全基线标准和加固方式。 MySQL基线检查 1、更新…...

【SpringBoot】参数传递

1.定义URL变量 RequestMapping("/user/{username}") ResponseBody public String userProfile(PathVariable String username){ return "user:"username; } 2.定义多个URL变量 RequestMapping("/user/{username}/blog/{blogId}") Response…...

Unity 骨骼动画(Skinned Mesh Renderer): 角色动画的高级渲染

在Unity中&#xff0c;骨骼动画(Skinned Mesh Renderer)是一种用于高级角色动画渲染的组件。它允许开发者将复杂的3D模型和动画应用到游戏角色上&#xff0c;实现逼真的视觉效果。本文将探讨Skinned Mesh Renderer的基本概念、使用方法以及如何优化性能。 Skinned Mesh Render…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...