ManiSkill panda_wristcam 腕部相机机械臂:从最小示例到参数覆盖的完整指南【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkillManiSkill 是构建在 SAPIEN 之上的 GPU 并行机器人仿真器,内置了一个带腕部相机的 Franka Panda 变体panda_wristcam:9 自由度机械臂,末端夹爪处挂一台 128×128、垂直视场角 90° 的第一视角 RGB-D 相机。使用它的人最常问的问题是:怎么在观测里拿到腕部相机画面?相机参数、控制模式又该在哪里覆盖、覆盖之后会有什么后果?这篇文章围绕这个问题展开。上图分别是它在空环境中的视觉网格与碰撞网格,由文档生成脚本渲染,能看到"机械臂 + 夹爪 + 腕部相机"的完整构型。1. 最小可运行示例:一个脚本看到腕部相机观测跑通只需一个标准 Gymnasium 接口,核心是三行gym.make参数:指定机器人 uid、要求 RGB-D 观测、声明使用传感器渲染。import gymnasium as gym import mani_skill.envs env = gym.make( "PickSingleYCB-v1", robot_uids="panda_wristcam", obs_mode="rgbd", render_mode="sensors", control_mode="pd_ee_delta_pose", num_envs=8, ) obs, _ = env.reset(seed=0) for _ in range(50): obs, reward, terminated, truncated, info = env.step(env.action_space.sample()) env.close()跑起来之后你能确认三件事:num_envs=8会自动切到 GPU 并行仿真模式;obs_mode="rgbd"时观测字典里除状态向量外还包含hand_camera的图像流,打印obs的键即可看到;动作空间是 11 维——10 维末端位姿增量(位置 3 维 + 轴角旋转 3 维 + 预留 4 维)加 1 维夹爪。无显示环境可以直接用仓库自带的随机策略脚本:python -m mani_skill.examples.demo_random_action -e PickSingleYCB-v1 --render-mode="rgb_array"它不渲染 GUI,把每帧传感器渲染结果写成视频文件。注意这个脚本默认加载任务自带的机器人,要换成panda_wristcam仍需走上面robot_uids的参数入口。下面把机器人本身拆开,看这三行参数背后各自对应哪段实现。2. 核心组成:注册、基类、相机三层结构panda_wristcam的全部实现只有 30 行出头(mani_skill/agents/robots/panda/panda_wristcam.py),因为它采用"基类复用 + 增量覆盖"的写法,只定义了三样东西。理解这三层结构,你就能读懂 ManiSkill 里所有同类机器人变体。2.1 字符串注册:uid 是唯一的加载入口类上的@register_agent()装饰器把PandaWristCam按uid = "panda_wristcam"写进全局注册表REGISTERED_AGENTS(实现见 mani_skill/agents/registration.py)。之后gym.make(..., robot_uids="panda_wristcam")就靠这个字符串找到类,不需要 import 类名。这也意味着自定义机器人只要分配一个不冲突的 uid、完成注册,就能以同样的字符串方式接入任意任务。2.2 基类 Panda:9 自由度与 11 种控制模式动力学、关节、控制器全部继承自基类 Panda。自由度构成如下:项目数值手臂关节panda_joint1–panda_joint7,共 7 个夹爪关节panda_finger_joint1、panda_finger_joint2,共 2 个末端执行器 linkpanda_hand_tcp初始位形 keyframerest,qpos 为 9 维[0, π/8, 0, -5π/8, 0, 3π/4, π/4, 0.04, 0.04](弧度/米)PD 参数手臂与夹爪统一:刚度 1e3、阻尼 1e2、力限 100 N基类还提供两个常用判断:is_grasping(object, min_force=0.5, max_angle=85)依据左右手指与物体的成对接触力(≥0.5 N 且接触角 ≤85°)判定抓取,is_static(threshold=0.2)依据关节速度判断机械臂是否静止。它定义了 11 种控制模式,夹爪部分固定为pd_joint_pos(右指通过mimic约束镜像左指,下界故意设为 -0.01 m 以便夹薄物体),区别全在手臂部分:控制模式动作范围绝对/增量pd_joint_delta_pos(默认)±0.1 rad增量pd_joint_pos不归一化绝对pd_joint_target_delta_pos±0.1 rad增量 + 目标位置pd_ee_delta_pos±0.1 m末端位置增量pd_ee_delta_pose±0.1 m / rad末端位姿增量,旋转用轴角pd_ee_pose±2.0 m末端绝对位姿pd_ee_target_delta_pos±0.1 m增量 + 目标位置pd_ee_target_delta_pose±0.1 m / rad增量 + 目标位置pd_joint_vel±1.0 rad/s速度pd_joint_pos_vel不归一化位置 + 速度pd_joint_delta_pos_vel±0.1 rad增量位置 + 速度默认取列表第一项pd_joint_delta_pos,运行时可用env.agent.set_control_mode(...)切换。2.3 腕部相机:唯一的新增传感器子类覆盖_sensor_configs属性,返回一个CameraConfig(定义在 mani_skill/sensors/camera.py):字段值含义uid"hand_camera"观测键前缀,如hand_camera/rgb、hand_camera/depthpose平移[0,0,0]、四元数[1,0,0,0]相对挂载点无偏移width/height128 / 128默认渲染分辨率fovnp.pi / 2(90°)垂直视场角,与intrinsic二选一near/far0.01 / 100 m裁剪面mountURDF 的camera_link全局位姿 = 挂载 link 位姿 × 局部位姿shader_pack"minimal"(默认)最快渲染、显存占用最小的着色器设计上值得注意的一点是:相机挂载写在代码里而非 URDF 里。panda_wristcam用带camera_link的panda_v3.urdf,普通panda用panda_v2.urdf;同一份 URDF 配合不同的_sensor_configs就能衍生出无相机与带相机两个变体,传感器声明因此可以独立于模型文件迭代。仓库里widowxai_wristcam走的正是同一种模式。panda_wristcam的质量评级为 A(参数真实但未做过系统辨识),该评级与显示名维护在 docs/metadata/robot.json。知道了这些默认值,下一步自然是要弄清楚哪些能在不改源码的前提下覆盖。3. 覆盖相机参数:sensor_configs 的两个作用域gym.make的sensor_configs参数是唯一的相机覆盖入口,ManiSkillEnv内部调用update_sensor_configs_from_dict把它合并进默认配置(实现见 mani_skill/envs/sapien_env.py 与 mani_skill/sensors/camera.py)。合并规则分两级作用域:全局键:键名不等于任何相机 uid 的条目,会应用到环境中所有传感器相机。例如sensor_configs=dict(width=320, height=240)会把所有相机都改成 320×240;按相机键:键名等于相机 uid 的条目,只作用于那一台。只改腕部相机应写成dict(hand_camera=dict(width=320, height=240))。env = gym.make( "PickSingleYCB-v1", robot_uids="panda_wristcam", obs_mode="rgbd", render_mode="sensors", sensor_configs=dict( hand_camera=dict( width=320, height=240, fov=1.0, # 约 57°,单位弧度 shader_pack="default", # minimal / default / rt 三选一 ) ), )覆盖后的效果:分辨率直接决定观测张量尺寸,下游网络输入层要跟着改;fov与intrinsic在Camera.__init__里有一道互斥断言,二者只能给一个,都给或都不给会直接报错;pose覆盖时必须传 7 元素列表[x, y, z, qw, qx, qy, qz](JSON 可序列化),不能传sapien.Pose对象。另外有一个隐藏开关use_stereo_depth=True,写在某台相机的覆盖项里会把它从CameraConfig原地替换为StereoDepthCameraConfig,转成双目深度相机。除了相机,control_mode是另一个常用覆盖点:传字符串即可切换 11 种模式之一,也可以运行时env.agent.set_control_mode(...)切换,切换后动作空间维度不变(手臂仍是 10 维)但语义完全不同。任务侧的初始化参数(如robot_init_qpos_noise)同样走gym.make透传,属于第三类"任务参数"而非"传感器参数",覆盖时要分清。这些参数组合进真实任务时,panda_wristcam出现在哪些环境里、以什么身份出现,是下一个问题。4. 组合场景:任务默认值、双机协作与观测键在mani_skill/envs/tasks/tabletop/下检索,panda_wristcam出现在三类任务中,身份各不相同:任务身份说明PegInsertionSide-v1、AssemblingKits-v1、PlugCharger-v1唯一支持(SUPPORTED_ROBOTS = ["panda_wristcam"])精细装配类任务,只允许腕部相机机器人StackCube-v1、StackPyramid-v1、PickSingleYCB-v1、TurnFaucet-v1默认值robot_uids="panda_wristcam"为默认参数,可换成panda、fetchTwoRobotPickCube-v1、TwoRobotStackCube-v1双机唯一组合SUPPORTED_ROBOTS = [("panda_wristcam", "panda_wristcam")]桌面场景构建器(mani_skill/utils/scene_builder/table/scene_builder.py)对它有专门分支:初始 9 维 qpos 显式取[0, π/8, 0, -5π/8, 0, 3π/4, -π/4, 0.04, 0.04](注意第 7 关节是 -π/4,与restkeyframe 的 +π/4 不同),每个关节叠加标准差 0.02 rad 的高斯噪声,机器人基座固定在[-0.615, 0, 0]。双机器人写法是把robot_uids传成二元组:env = gym.make( "TwoRobotPickCube-v1", robot_uids=("panda_wristcam", "panda_wristcam"), obs_mode="rgbd", render_mode="sensors", )同一场景加载两台带腕部相机的 Panda 协作,两个 agent 各挂一台hand_camera,观测按 agent 分组,键形如agent_0/hand_camera/rgb与agent_1/hand_camera/rgb,互不串扰。StackCube-v1等默认任务同样可以显式传robot_uids=("panda_wristcam", "panda_wristcam")做多机演示。双机场景下 GPU 显存约翻倍(相机数量翻倍),num_envs要相应调小。参数与组合都确认后,下面是实际使用中高频踩到的坑。5. 避坑清单:五个高频问题现象:obs_mode="rgbd"但render_mode="human",hand_camera的图像张量全黑。原因:human只渲染 GUI 观察相机,传感器相机不会执行渲染。规避:要拿传感器画面就传render_mode="sensors",它同时会切到 GPU 仿真路径。现象:只想放大腕部相机分辨率,结果环境里所有相机(含任务自带的环境相机)都变了尺寸。原因:sensor_configs=dict(width=320, height=240)这类不含相机 uid 的键是全局作用域,合并到每一台相机上。规避:用按相机作用域sensor_configs=dict(hand_camera=dict(width=320, height=240))。现象:切到pd_joint_vel、pd_joint_pos_vel、pd_joint_delta_pos_vel后策略学不动或抖动。原因:源码注释明确标注这几个控制器"需单独调阻尼"——它们的阻尼与位置控制共用arm_damping=1e2,但速度控制对该值敏感。规避:无特殊需求就用默认的pd_joint_delta_pos或末端位姿类模式,速度类模式要自行辨识阻尼。现象:仿真里训练效果不错,迁移到真机后动力学对不上。原因:质量评级 A 的含义是"参数真实但未做系统辨识",不是"已验证可迁移"。规避:做 sim2real 前对真机单独跑系统辨识,不要用 A 级参数直接迁移。现象:把基类restkeyframe 抄进自定义场景,初始姿态却和内置桌面任务不一致。原因:桌面场景构建器对panda_wristcam的初始 qpos 第 7 关节取 -π/4,而rest是 +π/4,基座位姿也由场景构建器统一设为[-0.615, 0, 0]。规避:自定义场景复用场景构建器分支,不要手抄 keyframe;若调整pose偏移量,注意它只平移、不改朝向,视场变化要靠旋转四元数实现。这些坑基本都源于对"文档页是怎么来的、哪些数字是手工维护的"没有概念,最后一节交代清楚来源,方便你改自己的机器人时同步维护。6. 溯源与延伸:文档生成链路和延伸阅读panda_wristcam的机器人页 docs/source/robots/panda_wristcam/index.md 文件头注明:内容由 docs/generate_robot_docs.py 自动生成,禁止手改。脚本的链路是:遍历mani_skill.agents.robots里所有已注册 Agent 类 → 读取 docs/metadata/robot.json 里的显示名与质量评级 → 在空环境中按首个 keyframe 渲染前后视图,分别截视觉网格与碰撞网格(绿色为凸网格、蓝色为基础形状)→ 拼装出每个机器人的index.md。你在第 4 节看到的初始位姿、第 2 节看到的自由度与控制器列表,都是脚本从类属性反推出来的,所以新增机器人时真正要维护的是类本身和robot.json元数据,文档页会自动跟上。延伸阅读(均为仓库内相对路径):机器人注册机制:mani_skill/agents/registration.py基类与控制器装配:mani_skill/agents/robots/panda/panda.py、mani_skill/agents/base_agent.py相机与传感器覆盖实现:mani_skill/sensors/camera.py传感器机制说明:docs/source/user_guide/concepts/sensors.md快速上手与gym.make全参数:docs/source/user_guide/getting_started/quickstart.md自定义机器人教程:docs/source/user_guide/tutorials/custom_robots.md遥操作示例(兼容panda与panda_wristcam的键位逻辑):mani_skill/examples/teleoperation/interactive_panda.py机器人总览(含全部 uid 与质量评级):docs/source/robots/index.md【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
ManiSkill panda_wristcam 腕部相机机械臂:从最小示例到参数覆盖的完整指南【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkillManiSkill 是构建在 SAPIEN 之上的 GPU 并行机器人仿真器,内置了一个带腕部相机的 Franka Panda 变体panda_wristcam:9 自由度机械臂,末端夹爪处挂一台 128×128、垂直视场角 90° 的第一视角 RGB-D 相机。使用它的人最常问的问题是:怎么在观测里拿到腕部相机画面?相机参数、控制模式又该在哪里覆盖、覆盖之后会有什么后果?这篇文章围绕这个问题展开。上图分别是它在空环境中的视觉网格与碰撞网格,由文档生成脚本渲染,能看到"机械臂 + 夹爪 + 腕部相机"的完整构型。1. 最小可运行示例:一个脚本看到腕部相机观测跑通只需一个标准 Gymnasium 接口,核心是三行gym.make参数:指定机器人 uid、要求 RGB-D 观测、声明使用传感器渲染。import gymnasium as gym import mani_skill.envs env = gym.make( "PickSingleYCB-v1", robot_uids="panda_wristcam", obs_mode="rgbd", render_mode="sensors", control_mode="pd_ee_delta_pose", num_envs=8, ) obs, _ = env.reset(seed=0) for _ in range(50): obs, reward, terminated, truncated, info = env.step(env.action_space.sample()) env.close()跑起来之后你能确认三件事:num_envs=8会自动切到 GPU 并行仿真模式;obs_mode="rgbd"时观测字典里除状态向量外还包含hand_camera的图像流,打印obs的键即可看到;动作空间是 11 维——10 维末端位姿增量(位置 3 维 + 轴角旋转 3 维 + 预留 4 维)加 1 维夹爪。无显示环境可以直接用仓库自带的随机策略脚本:python -m mani_skill.examples.demo_random_action -e PickSingleYCB-v1 --render-mode="rgb_array"它不渲染 GUI,把每帧传感器渲染结果写成视频文件。注意这个脚本默认加载任务自带的机器人,要换成panda_wristcam仍需走上面robot_uids的参数入口。下面把机器人本身拆开,看这三行参数背后各自对应哪段实现。2. 核心组成:注册、基类、相机三层结构panda_wristcam的全部实现只有 30 行出头(mani_skill/agents/robots/panda/panda_wristcam.py),因为它采用"基类复用 + 增量覆盖"的写法,只定义了三样东西。理解这三层结构,你就能读懂 ManiSkill 里所有同类机器人变体。2.1 字符串注册:uid 是唯一的加载入口类上的@register_agent()装饰器把PandaWristCam按uid = "panda_wristcam"写进全局注册表REGISTERED_AGENTS(实现见 mani_skill/agents/registration.py)。之后gym.make(..., robot_uids="panda_wristcam")就靠这个字符串找到类,不需要 import 类名。这也意味着自定义机器人只要分配一个不冲突的 uid、完成注册,就能以同样的字符串方式接入任意任务。2.2 基类 Panda:9 自由度与 11 种控制模式动力学、关节、控制器全部继承自基类 Panda。自由度构成如下:项目数值手臂关节panda_joint1–panda_joint7,共 7 个夹爪关节panda_finger_joint1、panda_finger_joint2,共 2 个末端执行器 linkpanda_hand_tcp初始位形 keyframerest,qpos 为 9 维[0, π/8, 0, -5π/8, 0, 3π/4, π/4, 0.04, 0.04](弧度/米)PD 参数手臂与夹爪统一:刚度 1e3、阻尼 1e2、力限 100 N基类还提供两个常用判断:is_grasping(object, min_force=0.5, max_angle=85)依据左右手指与物体的成对接触力(≥0.5 N 且接触角 ≤85°)判定抓取,is_static(threshold=0.2)依据关节速度判断机械臂是否静止。它定义了 11 种控制模式,夹爪部分固定为pd_joint_pos(右指通过mimic约束镜像左指,下界故意设为 -0.01 m 以便夹薄物体),区别全在手臂部分:控制模式动作范围绝对/增量pd_joint_delta_pos(默认)±0.1 rad增量pd_joint_pos不归一化绝对pd_joint_target_delta_pos±0.1 rad增量 + 目标位置pd_ee_delta_pos±0.1 m末端位置增量pd_ee_delta_pose±0.1 m / rad末端位姿增量,旋转用轴角pd_ee_pose±2.0 m末端绝对位姿pd_ee_target_delta_pos±0.1 m增量 + 目标位置pd_ee_target_delta_pose±0.1 m / rad增量 + 目标位置pd_joint_vel±1.0 rad/s速度pd_joint_pos_vel不归一化位置 + 速度pd_joint_delta_pos_vel±0.1 rad增量位置 + 速度默认取列表第一项pd_joint_delta_pos,运行时可用env.agent.set_control_mode(...)切换。2.3 腕部相机:唯一的新增传感器子类覆盖_sensor_configs属性,返回一个CameraConfig(定义在 mani_skill/sensors/camera.py):字段值含义uid"hand_camera"观测键前缀,如hand_camera/rgb、hand_camera/depthpose平移[0,0,0]、四元数[1,0,0,0]相对挂载点无偏移width/height128 / 128默认渲染分辨率fovnp.pi / 2(90°)垂直视场角,与intrinsic二选一near/far0.01 / 100 m裁剪面mountURDF 的camera_link全局位姿 = 挂载 link 位姿 × 局部位姿shader_pack"minimal"(默认)最快渲染、显存占用最小的着色器设计上值得注意的一点是:相机挂载写在代码里而非 URDF 里。panda_wristcam用带camera_link的panda_v3.urdf,普通panda用panda_v2.urdf;同一份 URDF 配合不同的_sensor_configs就能衍生出无相机与带相机两个变体,传感器声明因此可以独立于模型文件迭代。仓库里widowxai_wristcam走的正是同一种模式。panda_wristcam的质量评级为 A(参数真实但未做过系统辨识),该评级与显示名维护在 docs/metadata/robot.json。知道了这些默认值,下一步自然是要弄清楚哪些能在不改源码的前提下覆盖。3. 覆盖相机参数:sensor_configs 的两个作用域gym.make的sensor_configs参数是唯一的相机覆盖入口,ManiSkillEnv内部调用update_sensor_configs_from_dict把它合并进默认配置(实现见 mani_skill/envs/sapien_env.py 与 mani_skill/sensors/camera.py)。合并规则分两级作用域:全局键:键名不等于任何相机 uid 的条目,会应用到环境中所有传感器相机。例如sensor_configs=dict(width=320, height=240)会把所有相机都改成 320×240;按相机键:键名等于相机 uid 的条目,只作用于那一台。只改腕部相机应写成dict(hand_camera=dict(width=320, height=240))。env = gym.make( "PickSingleYCB-v1", robot_uids="panda_wristcam", obs_mode="rgbd", render_mode="sensors", sensor_configs=dict( hand_camera=dict( width=320, height=240, fov=1.0, # 约 57°,单位弧度 shader_pack="default", # minimal / default / rt 三选一 ) ), )覆盖后的效果:分辨率直接决定观测张量尺寸,下游网络输入层要跟着改;fov与intrinsic在Camera.__init__里有一道互斥断言,二者只能给一个,都给或都不给会直接报错;pose覆盖时必须传 7 元素列表[x, y, z, qw, qx, qy, qz](JSON 可序列化),不能传sapien.Pose对象。另外有一个隐藏开关use_stereo_depth=True,写在某台相机的覆盖项里会把它从CameraConfig原地替换为StereoDepthCameraConfig,转成双目深度相机。除了相机,control_mode是另一个常用覆盖点:传字符串即可切换 11 种模式之一,也可以运行时env.agent.set_control_mode(...)切换,切换后动作空间维度不变(手臂仍是 10 维)但语义完全不同。任务侧的初始化参数(如robot_init_qpos_noise)同样走gym.make透传,属于第三类"任务参数"而非"传感器参数",覆盖时要分清。这些参数组合进真实任务时,panda_wristcam出现在哪些环境里、以什么身份出现,是下一个问题。4. 组合场景:任务默认值、双机协作与观测键在mani_skill/envs/tasks/tabletop/下检索,panda_wristcam出现在三类任务中,身份各不相同:任务身份说明PegInsertionSide-v1、AssemblingKits-v1、PlugCharger-v1唯一支持(SUPPORTED_ROBOTS = ["panda_wristcam"])精细装配类任务,只允许腕部相机机器人StackCube-v1、StackPyramid-v1、PickSingleYCB-v1、TurnFaucet-v1默认值robot_uids="panda_wristcam"为默认参数,可换成panda、fetchTwoRobotPickCube-v1、TwoRobotStackCube-v1双机唯一组合SUPPORTED_ROBOTS = [("panda_wristcam", "panda_wristcam")]桌面场景构建器(mani_skill/utils/scene_builder/table/scene_builder.py)对它有专门分支:初始 9 维 qpos 显式取[0, π/8, 0, -5π/8, 0, 3π/4, -π/4, 0.04, 0.04](注意第 7 关节是 -π/4,与restkeyframe 的 +π/4 不同),每个关节叠加标准差 0.02 rad 的高斯噪声,机器人基座固定在[-0.615, 0, 0]。双机器人写法是把robot_uids传成二元组:env = gym.make( "TwoRobotPickCube-v1", robot_uids=("panda_wristcam", "panda_wristcam"), obs_mode="rgbd", render_mode="sensors", )同一场景加载两台带腕部相机的 Panda 协作,两个 agent 各挂一台hand_camera,观测按 agent 分组,键形如agent_0/hand_camera/rgb与agent_1/hand_camera/rgb,互不串扰。StackCube-v1等默认任务同样可以显式传robot_uids=("panda_wristcam", "panda_wristcam")做多机演示。双机场景下 GPU 显存约翻倍(相机数量翻倍),num_envs要相应调小。参数与组合都确认后,下面是实际使用中高频踩到的坑。5. 避坑清单:五个高频问题现象:obs_mode="rgbd"但render_mode="human",hand_camera的图像张量全黑。原因:human只渲染 GUI 观察相机,传感器相机不会执行渲染。规避:要拿传感器画面就传render_mode="sensors",它同时会切到 GPU 仿真路径。现象:只想放大腕部相机分辨率,结果环境里所有相机(含任务自带的环境相机)都变了尺寸。原因:sensor_configs=dict(width=320, height=240)这类不含相机 uid 的键是全局作用域,合并到每一台相机上。规避:用按相机作用域sensor_configs=dict(hand_camera=dict(width=320, height=240))。现象:切到pd_joint_vel、pd_joint_pos_vel、pd_joint_delta_pos_vel后策略学不动或抖动。原因:源码注释明确标注这几个控制器"需单独调阻尼"——它们的阻尼与位置控制共用arm_damping=1e2,但速度控制对该值敏感。规避:无特殊需求就用默认的pd_joint_delta_pos或末端位姿类模式,速度类模式要自行辨识阻尼。现象:仿真里训练效果不错,迁移到真机后动力学对不上。原因:质量评级 A 的含义是"参数真实但未做系统辨识",不是"已验证可迁移"。规避:做 sim2real 前对真机单独跑系统辨识,不要用 A 级参数直接迁移。现象:把基类restkeyframe 抄进自定义场景,初始姿态却和内置桌面任务不一致。原因:桌面场景构建器对panda_wristcam的初始 qpos 第 7 关节取 -π/4,而rest是 +π/4,基座位姿也由场景构建器统一设为[-0.615, 0, 0]。规避:自定义场景复用场景构建器分支,不要手抄 keyframe;若调整pose偏移量,注意它只平移、不改朝向,视场变化要靠旋转四元数实现。这些坑基本都源于对"文档页是怎么来的、哪些数字是手工维护的"没有概念,最后一节交代清楚来源,方便你改自己的机器人时同步维护。6. 溯源与延伸:文档生成链路和延伸阅读panda_wristcam的机器人页 docs/source/robots/panda_wristcam/index.md 文件头注明:内容由 docs/generate_robot_docs.py 自动生成,禁止手改。脚本的链路是:遍历mani_skill.agents.robots里所有已注册 Agent 类 → 读取 docs/metadata/robot.json 里的显示名与质量评级 → 在空环境中按首个 keyframe 渲染前后视图,分别截视觉网格与碰撞网格(绿色为凸网格、蓝色为基础形状)→ 拼装出每个机器人的index.md。你在第 4 节看到的初始位姿、第 2 节看到的自由度与控制器列表,都是脚本从类属性反推出来的,所以新增机器人时真正要维护的是类本身和robot.json元数据,文档页会自动跟上。延伸阅读(均为仓库内相对路径):机器人注册机制:mani_skill/agents/registration.py基类与控制器装配:mani_skill/agents/robots/panda/panda.py、mani_skill/agents/base_agent.py相机与传感器覆盖实现:mani_skill/sensors/camera.py传感器机制说明:docs/source/user_guide/concepts/sensors.md快速上手与gym.make全参数:docs/source/user_guide/getting_started/quickstart.md自定义机器人教程:docs/source/user_guide/tutorials/custom_robots.md遥操作示例(兼容panda与panda_wristcam的键位逻辑):mani_skill/examples/teleoperation/interactive_panda.py机器人总览(含全部 uid 与质量评级):docs/source/robots/index.md【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考