first
This commit is contained in:
486
da.py
Normal file
486
da.py
Normal file
@@ -0,0 +1,486 @@
|
||||
import omni
|
||||
from omni.isaac.core.robots import Robot
|
||||
import omni.timeline
|
||||
import carb
|
||||
import asyncio
|
||||
|
||||
def print_robot_actions_info(robot_prim_path="/World/piper_description"):
|
||||
"""打印机器人的所有动作和关节信息"""
|
||||
print("\n========== 机器人动作和关节信息 ==========")
|
||||
|
||||
# 获取机器人对象
|
||||
try:
|
||||
robot = Robot(prim_path=robot_prim_path)
|
||||
robot.initialize()
|
||||
print(f"成功加载机器人: {robot_prim_path}")
|
||||
except Exception as e:
|
||||
print(f"无法加载机器人: {e}")
|
||||
return
|
||||
|
||||
# 1. 打印关节数量
|
||||
num_joints = robot.num_dof
|
||||
print(f"\n关节数量: {num_joints}")
|
||||
|
||||
# 2. 打印关节名称
|
||||
joint_names = robot.dof_names
|
||||
print("\n关节名称:")
|
||||
for i, name in enumerate(joint_names):
|
||||
print(f" [{i}] {name}")
|
||||
|
||||
# 3. 打印关节类型
|
||||
print("\n关节类型:")
|
||||
for i, name in enumerate(joint_names):
|
||||
# 大多数机器人关节是旋转关节
|
||||
if "prismatic" in name.lower():
|
||||
joint_type_str = "PRISMATIC"
|
||||
else:
|
||||
joint_type_str = "REVOLUTE"
|
||||
print(f" [{i}] {name}: {joint_type_str}")
|
||||
|
||||
# 4. 打印关节位置信息
|
||||
positions = robot.get_joint_positions()
|
||||
print("\n当前关节位置:")
|
||||
for i, pos in enumerate(positions):
|
||||
print(f" [{i}] {joint_names[i]}: {pos:.4f}")
|
||||
|
||||
# 5. 打印关节速度
|
||||
velocities = robot.get_joint_velocities()
|
||||
print("\n当前关节速度:")
|
||||
for i, vel in enumerate(velocities):
|
||||
print(f" [{i}] {joint_names[i]}: {vel:.4f}")
|
||||
|
||||
# 6. 打印关节力矩
|
||||
efforts = robot.get_applied_joint_efforts()
|
||||
print("\n当前关节力矩:")
|
||||
for i, eff in enumerate(efforts):
|
||||
print(f" [{i}] {joint_names[i]}: {eff:.4f}")
|
||||
|
||||
# 使用Isaac Sim 4.2的API获取关节限制
|
||||
print("\n关节限制 (使用Isaac Sim 4.2 API):")
|
||||
try:
|
||||
from omni.isaac.core.articulations import Articulation
|
||||
from pxr import UsdPhysics
|
||||
|
||||
# 创建一个Articulation对象
|
||||
articulation = Articulation(prim_path=robot_prim_path)
|
||||
articulation.initialize()
|
||||
|
||||
# 通过USD接口获取关节限制
|
||||
from pxr import Usd, UsdPhysics
|
||||
stage = omni.usd.get_context().get_stage()
|
||||
|
||||
for i, joint_name in enumerate(joint_names):
|
||||
# 尝试从名称推断关节路径
|
||||
# 注意:这里假设关节路径格式为 robotPath/jointName
|
||||
joint_path = f"{robot_prim_path}/{joint_name}"
|
||||
joint_prim = stage.GetPrimAtPath(joint_path)
|
||||
|
||||
if not joint_prim:
|
||||
# 尝试其他可能的路径格式
|
||||
possible_paths = [
|
||||
f"{robot_prim_path}/joints/{joint_name}",
|
||||
f"{robot_prim_path}/{joint_name}_joint"
|
||||
]
|
||||
|
||||
for path in possible_paths:
|
||||
joint_prim = stage.GetPrimAtPath(path)
|
||||
if joint_prim:
|
||||
joint_path = path
|
||||
break
|
||||
|
||||
if joint_prim:
|
||||
joint_api = UsdPhysics.RevoluteJoint(joint_prim)
|
||||
if joint_api:
|
||||
lower_attr = joint_api.GetLowerAttr()
|
||||
upper_attr = joint_api.GetUpperAttr()
|
||||
|
||||
if lower_attr and upper_attr:
|
||||
lower = lower_attr.Get() if lower_attr.HasValue() else float('-inf')
|
||||
upper = upper_attr.Get() if upper_attr.HasValue() else float('inf')
|
||||
print(f" [{i}] {joint_name}: 下限={lower:.4f}, 上限={upper:.4f}")
|
||||
continue
|
||||
|
||||
# 如果无法找到关节或获取限制,使用默认值
|
||||
print(f" [{i}] {joint_name}: 下限=-π, 上限=π (默认值)")
|
||||
|
||||
except Exception as e:
|
||||
print(f" 无法通过USD接口获取关节限制: {e}")
|
||||
print(" 使用默认值: 下限=-π, 上限=π")
|
||||
|
||||
# 8. 驱动类型和控制器参数
|
||||
print("\n驱动类型和控制器参数 (使用Action Graph节点获取):")
|
||||
print(" 请使用下面的方法获取Action Graph中的控制器信息")
|
||||
|
||||
print("\n========================================")
|
||||
|
||||
|
||||
# 使用兼容的方式获取Action Graph信息
|
||||
def print_action_graph_info_compatible():
|
||||
"""使用兼容Isaac Sim 4.2的方式打印Action Graph信息"""
|
||||
print("\n========== Action Graph节点信息 (兼容方式) ==========")
|
||||
|
||||
try:
|
||||
# 在Isaac Sim 4.2中,我们需要使用不同的API获取Action Graph
|
||||
import omni.kit
|
||||
from omni.kit.viewport.utility import get_viewport_from_window_name
|
||||
viewport = get_viewport_from_window_name("Viewport")
|
||||
|
||||
# 打印Action Graph信息 - 方法1:使用USD查询
|
||||
import omni.usd
|
||||
from pxr import Usd, Sdf
|
||||
|
||||
# 获取当前舞台
|
||||
stage = omni.usd.get_context().get_stage()
|
||||
|
||||
# 查找所有ActionGraph节点
|
||||
print("\nAction Graph节点查找方法1 - USD路径查询:")
|
||||
action_graph_paths = []
|
||||
|
||||
# 查找可能的Action Graph节点路径
|
||||
possible_paths = ["/World/ActionGraph", "/ActionGraph"]
|
||||
for path in possible_paths:
|
||||
prim = stage.GetPrimAtPath(path)
|
||||
if prim:
|
||||
action_graph_paths.append(path)
|
||||
print(f" 找到Action Graph路径: {path}")
|
||||
|
||||
# 打印子节点
|
||||
children = prim.GetChildren()
|
||||
if children:
|
||||
print(" 子节点:")
|
||||
for child in children:
|
||||
print(f" - {child.GetPath()}")
|
||||
|
||||
# 尝试获取更多信息
|
||||
attrs = child.GetAttributes()
|
||||
if attrs:
|
||||
print(f" 属性数量: {len(attrs)}")
|
||||
# 打印前10个属性
|
||||
for i, attr in enumerate(attrs):
|
||||
if i >= 10:
|
||||
break
|
||||
print(f" {attr.GetName()}: {attr.Get() if attr.IsValid() else 'N/A'}")
|
||||
|
||||
if not action_graph_paths:
|
||||
print(" 无法在常见路径找到Action Graph节点")
|
||||
|
||||
# 尝试搜索整个场景
|
||||
print("\n 尝试搜索整个场景中的ActionGraph相关节点:")
|
||||
|
||||
def traverse_stage(prim):
|
||||
paths = []
|
||||
if "ActionGraph" in prim.GetName() or "articulation_controller" in prim.GetName().lower():
|
||||
paths.append(prim.GetPath())
|
||||
|
||||
for child in prim.GetChildren():
|
||||
paths.extend(traverse_stage(child))
|
||||
return paths
|
||||
|
||||
root = stage.GetPseudoRoot()
|
||||
all_action_paths = traverse_stage(root)
|
||||
|
||||
if all_action_paths:
|
||||
print(f" 找到 {len(all_action_paths)} 个可能的Action Graph相关节点:")
|
||||
for path in all_action_paths:
|
||||
print(f" - {path}")
|
||||
else:
|
||||
print(" 未找到任何ActionGraph相关节点")
|
||||
|
||||
# 尝试查找ArticulationController节点
|
||||
print("\n尝试找到ArticulationController节点:")
|
||||
controller_found = False
|
||||
|
||||
for prim in Usd.PrimRange(stage.GetPseudoRoot()):
|
||||
prim_type = prim.GetTypeName()
|
||||
prim_name = prim.GetName()
|
||||
|
||||
if "ArticulationController" in str(prim_type) or "ArticulationController" in prim_name:
|
||||
print(f" 找到控制器: {prim.GetPath()}")
|
||||
controller_found = True
|
||||
|
||||
# 打印属性
|
||||
attrs = prim.GetAttributes()
|
||||
if attrs:
|
||||
print(" 控制器属性:")
|
||||
for attr in attrs:
|
||||
if attr.IsValid():
|
||||
print(f" - {attr.GetName()}: {attr.Get() if attr.HasValue() else 'N/A'}")
|
||||
|
||||
if not controller_found:
|
||||
print(" 未找到ArticulationController节点")
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取Action Graph信息时出错: {e}")
|
||||
|
||||
print("\n========================================")
|
||||
|
||||
|
||||
# 使用视觉脚本检查Action Graph
|
||||
def print_action_graph_visual_info():
|
||||
"""通过NVIDIA Omniverse视觉脚本API获取Action Graph信息"""
|
||||
print("\n========== Action Graph信息 (视觉脚本API) ==========")
|
||||
|
||||
try:
|
||||
# 尝试使用视觉脚本API
|
||||
try:
|
||||
import omni.kit.visual_scripting as vs
|
||||
print("成功导入视觉脚本API")
|
||||
|
||||
# 尝试获取视觉脚本图表
|
||||
graphs = vs.get_all_graphs()
|
||||
if graphs:
|
||||
print(f"找到 {len(graphs)} 个视觉脚本图表")
|
||||
for i, graph in enumerate(graphs):
|
||||
print(f"\n图表 {i+1}:")
|
||||
print(f" 路径: {graph.get_path()}")
|
||||
|
||||
# 获取节点
|
||||
nodes = graph.get_nodes()
|
||||
print(f" 节点数量: {len(nodes)}")
|
||||
for node in nodes:
|
||||
print(f" - {node.get_title()} ({node.get_type_name()})")
|
||||
|
||||
# 获取节点参数
|
||||
params = node.get_parameters()
|
||||
if params:
|
||||
print(" 参数:")
|
||||
for param_name, param_value in params.items():
|
||||
print(f" {param_name}: {param_value}")
|
||||
else:
|
||||
print("没有找到视觉脚本图表")
|
||||
|
||||
except ImportError:
|
||||
print("视觉脚本API不可用")
|
||||
|
||||
# 尝试使用新版的图表API
|
||||
try:
|
||||
import omni.graph.core as og
|
||||
print("\n尝试使用omni.graph.core API")
|
||||
|
||||
# 在Isaac Sim 4.2中,API可能发生了变化
|
||||
# 尝试使用可能的替代方法
|
||||
if hasattr(og, "get_graph_keys"):
|
||||
keys = og.get_graph_keys()
|
||||
print(f"找到 {len(keys)} 个图表键")
|
||||
|
||||
for key in keys:
|
||||
print(f" 图表键: {key}")
|
||||
graph = og.get_graph(key)
|
||||
if graph:
|
||||
print(" 成功获取图表")
|
||||
# 处理图表...
|
||||
else:
|
||||
print(" get_graph_keys 方法不可用")
|
||||
|
||||
# 尝试其他可能的方法
|
||||
if hasattr(og, "get_registered_graphs"):
|
||||
graphs = og.get_registered_graphs()
|
||||
print(f"找到 {len(graphs)} 个注册的图表")
|
||||
# 处理图表...
|
||||
else:
|
||||
print(" get_registered_graphs 方法不可用")
|
||||
|
||||
except Exception as e:
|
||||
print(f"使用omni.graph.core时出错: {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取视觉脚本信息时出错: {e}")
|
||||
|
||||
print("\n========================================")
|
||||
|
||||
|
||||
# 使用USD直接查询机器人关节
|
||||
def print_robot_joints_via_usd(robot_prim_path="/World/piper_description"):
|
||||
"""使用USD API直接查询机器人关节信息"""
|
||||
print("\n========== USD API查询机器人关节信息 ==========")
|
||||
|
||||
try:
|
||||
from pxr import Usd, UsdPhysics, UsdGeom, Gf
|
||||
|
||||
# 获取当前舞台
|
||||
stage = omni.usd.get_context().get_stage()
|
||||
|
||||
# 获取机器人根节点
|
||||
robot_prim = stage.GetPrimAtPath(robot_prim_path)
|
||||
if not robot_prim:
|
||||
print(f"找不到机器人: {robot_prim_path}")
|
||||
return
|
||||
|
||||
print(f"找到机器人: {robot_prim_path}")
|
||||
|
||||
# 查找关节
|
||||
joints = []
|
||||
|
||||
# 方法1: 直接查找关节类型
|
||||
for prim in Usd.PrimRange(robot_prim):
|
||||
if prim.IsA(UsdPhysics.Joint) or prim.IsA(UsdPhysics.RevoluteJoint) or prim.IsA(UsdPhysics.PrismaticJoint):
|
||||
joints.append(prim)
|
||||
|
||||
print(f"\n找到 {len(joints)} 个关节")
|
||||
|
||||
if joints:
|
||||
for i, joint in enumerate(joints):
|
||||
joint_path = joint.GetPath()
|
||||
joint_name = joint.GetName()
|
||||
|
||||
print(f"\n关节 {i+1}:")
|
||||
print(f" 路径: {joint_path}")
|
||||
print(f" 名称: {joint_name}")
|
||||
|
||||
# 获取关节类型
|
||||
joint_type = "未知"
|
||||
if joint.IsA(UsdPhysics.RevoluteJoint):
|
||||
joint_type = "旋转关节"
|
||||
elif joint.IsA(UsdPhysics.PrismaticJoint):
|
||||
joint_type = "平移关节"
|
||||
elif joint.IsA(UsdPhysics.Joint):
|
||||
joint_type = "通用关节"
|
||||
|
||||
print(f" 类型: {joint_type}")
|
||||
|
||||
# 获取关节限制
|
||||
if joint.IsA(UsdPhysics.RevoluteJoint):
|
||||
joint_api = UsdPhysics.RevoluteJoint(joint)
|
||||
lower = joint_api.GetLowerAttr().Get() if joint_api.GetLowerAttr().HasValue() else float('-inf')
|
||||
upper = joint_api.GetUpperAttr().Get() if joint_api.GetUpperAttr().HasValue() else float('inf')
|
||||
print(f" 限制范围: [{lower:.4f}, {upper:.4f}]")
|
||||
|
||||
# 获取关节属性
|
||||
attrs = joint.GetAttributes()
|
||||
if attrs:
|
||||
print(" 属性:")
|
||||
for attr in attrs:
|
||||
if attr.HasValue() and attr.IsValid():
|
||||
print(f" - {attr.GetName()}: {attr.Get()}")
|
||||
|
||||
else:
|
||||
print("未找到任何关节,尝试查找所有可能的关节...")
|
||||
|
||||
# 方法2: 查找包含'joint'的节点
|
||||
possible_joints = []
|
||||
|
||||
for prim in Usd.PrimRange(robot_prim):
|
||||
if "joint" in prim.GetName().lower():
|
||||
possible_joints.append(prim)
|
||||
|
||||
print(f"\n找到 {len(possible_joints)} 个可能的关节")
|
||||
|
||||
for i, joint in enumerate(possible_joints[:5]): # 只显示前5个
|
||||
print(f" {i+1}. {joint.GetPath()}")
|
||||
|
||||
if len(possible_joints) > 5:
|
||||
print(f" ...以及 {len(possible_joints) - 5} 个其他关节")
|
||||
|
||||
except Exception as e:
|
||||
print(f"使用USD API查询关节信息时出错: {e}")
|
||||
|
||||
print("\n========================================")
|
||||
|
||||
|
||||
# 综合打印物理模拟状态
|
||||
def print_physics_status():
|
||||
"""打印物理模拟状态"""
|
||||
print("\n========== 物理模拟状态检查 ==========")
|
||||
|
||||
# 检查物理模拟状态
|
||||
timeline = omni.timeline.get_timeline_interface()
|
||||
is_playing = timeline.is_playing()
|
||||
print(f"物理模拟状态: {'运行中' if is_playing else '已停止'}")
|
||||
|
||||
# 获取PhysX版本信息
|
||||
try:
|
||||
import omni.physx
|
||||
print("成功导入omni.physx")
|
||||
|
||||
# 尝试获取PhysX接口
|
||||
physx_interface = omni.physx.get_physx_interface()
|
||||
if physx_interface:
|
||||
print("成功获取PhysX接口")
|
||||
|
||||
# 尝试获取PhysX属性
|
||||
try:
|
||||
physx_props = {}
|
||||
|
||||
# 测试可能的方法
|
||||
if hasattr(physx_interface, "get_scene_count"):
|
||||
physx_props["场景数量"] = physx_interface.get_scene_count()
|
||||
|
||||
if hasattr(physx_interface, "is_simulating"):
|
||||
physx_props["正在模拟"] = physx_interface.is_simulating()
|
||||
|
||||
if hasattr(physx_interface, "get_active_stage_id"):
|
||||
physx_props["活动场景ID"] = physx_interface.get_active_stage_id()
|
||||
|
||||
if hasattr(physx_interface, "get_gravitational_acceleration"):
|
||||
physx_props["重力加速度"] = physx_interface.get_gravitational_acceleration()
|
||||
|
||||
if physx_props:
|
||||
print("\nPhysX属性:")
|
||||
for prop, value in physx_props.items():
|
||||
print(f" {prop}: {value}")
|
||||
else:
|
||||
print("未找到可查询的PhysX属性")
|
||||
except Exception as e:
|
||||
print(f"获取PhysX属性时出错: {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取PhysX接口时出错: {e}")
|
||||
|
||||
print("\n通过USD API查询物理属性:")
|
||||
try:
|
||||
from pxr import Usd, UsdPhysics
|
||||
|
||||
# 获取当前舞台
|
||||
stage = omni.usd.get_context().get_stage()
|
||||
|
||||
# 查找物理场景
|
||||
scene = UsdPhysics.Scene.Get(stage)
|
||||
if scene:
|
||||
scene_prim = scene.GetPrim()
|
||||
print(f"找到物理场景: {scene_prim.GetPath()}")
|
||||
|
||||
# 获取重力
|
||||
gravity_attr = scene.GetGravityDirectionAttr()
|
||||
gravity_mag_attr = scene.GetGravityMagnitudeAttr()
|
||||
|
||||
if gravity_attr and gravity_attr.HasValue():
|
||||
gravity_dir = gravity_attr.Get()
|
||||
print(f" 重力方向: {gravity_dir}")
|
||||
|
||||
if gravity_mag_attr and gravity_mag_attr.HasValue():
|
||||
gravity_mag = gravity_mag_attr.Get()
|
||||
print(f" 重力大小: {gravity_mag}")
|
||||
else:
|
||||
print("未找到物理场景")
|
||||
|
||||
except Exception as e:
|
||||
print(f"查询USD物理属性时出错: {e}")
|
||||
|
||||
print("========================================")
|
||||
|
||||
|
||||
# 执行所有函数
|
||||
try:
|
||||
# 确保物理模拟已启动
|
||||
timeline = omni.timeline.get_timeline_interface()
|
||||
if not timeline.is_playing():
|
||||
timeline.play()
|
||||
print("已启动物理模拟")
|
||||
|
||||
# 打印机器人信息
|
||||
print_robot_actions_info("/World/piper_description")
|
||||
|
||||
# 使用兼容方式打印Action Graph信息
|
||||
print_action_graph_info_compatible()
|
||||
|
||||
# 使用视觉脚本API获取信息
|
||||
print_action_graph_visual_info()
|
||||
|
||||
# 使用USD API查询关节信息
|
||||
print_robot_joints_via_usd("/World/piper_description")
|
||||
|
||||
# 打印物理模拟状态
|
||||
print_physics_status()
|
||||
|
||||
except Exception as e:
|
||||
print(f"执行过程中出现错误: {e}")
|
||||
Reference in New Issue
Block a user