十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ManiSkill 机器人模型详解:WidowX AI 八自由度机械臂的仿真建模、控制器配置与抓取接口实战

ManiSkill 机器人模型详解:WidowX AI 八自由度机械臂的仿真建模、控制器配置与抓取接口实战 ManiSkill 机器人模型详解WidowX AI 八自由度机械臂的仿真建模、控制器配置与抓取接口实战【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill本篇技术指南以 ManiSkill 开源仓库中的 WidowX AI 机器人文档为主体围绕其机器人 UID、建模质量评级、自由度、控制器集合以及视觉/碰撞模型等核心信息深入源码剖析其关节结构、URDF 物理材质、三种 PD 控制器配置、TCP 位姿与抓取判定接口并结合PickCubeWidowXAI-v1任务环境说明如何在仿真中实际加载与训练该机器人。读完本文你将掌握在 ManiSkill 中复用 WidowX AI 机械臂进行任务构建、控制器选型与抓取状态判断的完整方法。一、机器人文档概览WidowX AI 的核心元信息WidowX AI 是 ManiSkill 仓库中预建模的桌面机械臂机器人其官方文档位于 docs/source/robots/widowxai/index.md页面给出了该机器人在仿真框架中的关键元信息元信息项值Robot UIDwidowxaiAgent 类代码mani_skill/agents/robots/widowxai/widowxai.py建模质量评级BStable, but some values are unrealistic即可稳定仿真但部分参数值不够真实自由度DOF8可用控制器pd_joint_delta_pos、pd_joint_pos、pd_joint_target_delta_pos其中Quality: B的评级并非随意标注而是来自 docs/metadata/robot.json 中的元数据widowxai: {quality: B, name: WidowX AI}该评级体系参考了 MuJoCo Menagerie 的模型质量分级A 表示参数经过系统辨识、A 表示参数现实但未经严格辨识、B 表示仿真稳定但部分数值不够真实、C 表示条件稳定且可显著改进。因此在使用 WidowX AI 做 sim2real 迁移前官方建议针对自己的实物硬件重新做系统辨识System ID。需要说明的是这些机器人文档页面全部由脚本 docs/generate_robot_docs.py 自动生成页面首行也标注了THIS IS ALL GENERATED DOCUMENTATION脚本会遍历mani_skill.agents.robots模块中所有注册的 Agent 类读取其uid、_controller_configs、keyframes等属性并在空环境中用光线追踪渲染出机器人的视觉网格与碰撞网格截图。这也意味着页面上的每一项元数据都能在源码类定义中找到对应实现。二、视觉与碰撞模型网格渲染与物理代理文档页面提供了两组共四张渲染图用于直观展示 WidowX AI 的仿真外观与物理碰撞形状Visual Meshes视觉网格机器人渲染所用的实际三角形网格即玩家/相机看到的机器人外观Collision Meshes碰撞网格物理仿真引擎实际参与碰撞检测的形状。按 ManiSkill 的渲染约定绿色代表凸网格Convex Mesh蓝色代表基本体形状网格Primitive Shape Mesh如球、盒、胶囊、圆柱。从生成脚本 docs/generate_robot_docs.py 的渲染逻辑可以看到碰撞可视化把PhysxCollisionShapeSphere/Box/Capsule/Cylinder等基本体统一染成蓝色把PhysxCollisionShapeConvexMesh染成绿色而三角形网格TriangleMesh则染成红色。对 WidowX AI 而言其碰撞模型以凸网格与基本体的组合形式参与 PhysX 物理仿真这种视觉高保真 碰撞低开销的建模方式是 ManiSkill 保持 GPU 并行仿真性能的关键设计。三、源码级剖析Agent 类的物理与结构定义WidowX AI 的 Agent 实现位于 mani_skill/agents/robots/widowxai/widowxai.py通过register_agent(asset_download_ids[widowxai])注册。类定义中几个核心属性直接决定了机器人的仿真行为3.1 URDF 与摩擦材质配置uid widowxai urdf_path f{ASSET_DIR}/robots/widowxai/wxai_base.urdf urdf_config dict( _materialsdict( gripperdict(static_friction2.0, dynamic_friction2.0, restitution0.0) ), linkdict( gripper_leftdict(materialgripper, patch_radius0.1, min_patch_radius0.1), gripper_rightdict(materialgripper, patch_radius0.1, min_patch_radius0.1), ), )机器人模型通过 URDF 文件wxai_base.urdf加载该文件位于ASSET_DIR/robots/widowxai/目录下属于需要下载的资产因此asset_download_ids指定了widowxai两个夹爪连杆gripper_left/gripper_right被配置了自定义材质gripper其静摩擦系数与动摩擦系数均高达 2.0、恢复系数为 0这是为了保证夹爪在抓取时能产生足够的摩擦力、防止物体滑脱属于典型的任务导向参数调优也正因如此评级为 B 而非 A/Apatch_radius0.1指定了摩擦补丁半径影响接触求解的细节。3.2 关节结构与自由度来源arm_joint_names [ joint_0, joint_1, joint_2, joint_3, joint_4, joint_5, left_carriage_joint, ] gripper_joint_names [ # only control the control joint, not the mimicked one left_carriage_joint, ]WidowX AI 的 8 个自由度构成如下6 个臂关节joint_0~joint_5构成机械臂主体2 个夹爪滑动关节left_carriage_joint与right_carriage_joint其中左侧是受控关节control joint右侧是镜像关节mimicked joint。代码注释明确说明只控制受控关节不控制镜像关节# only control the control joint, not the mimicked one因此gripper_joint_names中仅列出left_carriage_joint——控制器只需驱动左夹爪右夹爪通过镜像约束跟随运动。这解释了为什么 DOF 86 个臂关节 2 个夹爪关节。同时在计算机器人是否静止的is_static方法中速度向量的后 2 维即两个夹爪关节被剔除def is_static(self, threshold: float 0.2): qvel self.robot.get_qvel()[..., :-2] return torch.max(torch.abs(qvel), 1)[0] threshold3.3 初始位姿关键帧Keyframekeyframes dict( ready_to_graspKeyframe( qposnp.array([0.0, 1.38, 1.04, -1.26, 0.0, 0.0, 0.026, 0.026]), posesapien.Pose(), ) )ready_to_grasp关键帧提供了机器人准备抓取的默认关节位姿前 6 维是臂关节角度弧度后 2 维是夹爪开合量0.026 / 0.026 表示夹爪张开到约一半行程对应下方夹爪控制器上界 0.044 的约 60%。关键帧会被环境初始化逻辑用于设置机器人初始状态机器人文档中的渲染图也正是以该关键帧位姿渲染的。3.4 末端执行器与 TCP 接口ee_link_name ee_gripper_link ... def _after_loading_articulation(self): self.finger1_link self.robot.links_map[gripper_left] self.finger2_link self.robot.links_map[gripper_right] self.tcp self.robot.links_map[self.ee_link_name] property def tcp_pos(self): return self.tcp.pose.p property def tcp_pose(self): return self.tcp.pose_after_loading_articulation在机器人装配体加载完成后自动回调缓存了左右夹爪连杆与 TCPTool Center Point工具中心点即ee_gripper_link的引用并通过tcp_pos/tcp_pose属性对外暴露 TCP 位置与完整位姿。这是任务代码如 PickCube 的奖励函数中self.agent.tcp_pose.p的直接数据来源。四、控制器配置详解三种 PD 控制器的参数化文档列出 WidowX AI 支持三种控制器其完整定义在_controller_configs属性中。三个控制器共享相同的刚度/阻尼/力限基础参数区别在于动作空间的编码方式控制器臂部控制方式动作范围说明pd_joint_pos绝对关节位置无界lowerNone, upperNone直接输出目标关节绝对角度normalize_actionFalse不归一化动作pd_joint_delta_pos关节位置增量lower-0.1, upper0.1use_deltaTrue, use_targetFalse输出为当前位置的增量pd_joint_target_delta_pos目标位置增量lower-0.1, upper0.1与 delta 模式同范围但use_targetTrue增量作用于维护的目标位置arm_pd_joint_delta_pos PDJointPosControllerConfig( self.arm_joint_names, lower-0.1, upper0.1, stiffnessself.arm_stiffness, dampingself.arm_damping, force_limitself.arm_force_limit, use_deltaTrue, use_targetFalse, ) arm_pd_joint_target_delta_pos copy.deepcopy(arm_pd_joint_delta_pos) arm_pd_joint_target_delta_pos.use_target True所有控制器共享的物理参数定义在类属性中臂部arm_stiffness 1e3刚度 1000、arm_damping 1e2阻尼 100、arm_force_limit 100力限 100N夹爪gripper_stiffness 1e3、gripper_damping 1e2、gripper_force_limit 100。夹爪在三种控制器下均使用pd_joint_pos绝对位置控制行程下界为0.0完全闭合、上界为0.044完全张开gripper_pd_joint_pos PDJointPosControllerConfig( self.gripper_joint_names, lower0.0, upper0.044, stiffnessself.gripper_stiffness, dampingself.gripper_damping, )在强化学习实践中pd_joint_delta_pos是最常用的选择增量式动作每维限制在 ±0.1 rad天然适合神经网络策略输出能避免绝对角度动作带来的量纲不一致问题而pd_joint_target_delta_pos通过内部维护目标位置适用于需要平滑轨迹、减少抖动的高级控制场景。五、抓取判定接口is_grasping 的实现原理WidowX AI 提供了成熟的两指夹爪抓取判定接口is_grasping任务环境的成功条件直接依赖它def is_grasping(self, object: Actor, min_force0.2, max_angle85): l_contact_forces self.scene.get_pairwise_contact_forces(self.finger1_link, object) r_contact_forces self.scene.get_pairwise_contact_forces(self.finger2_link, object) lforce torch.linalg.norm(l_contact_forces, axis1) rforce torch.linalg.norm(r_contact_forces, axis1) ldirection self.finger1_link.pose.to_transformation_matrix()[..., :3, 1] rdirection -self.finger2_link.pose.to_transformation_matrix()[..., :3, 1] langle common.compute_angle_between(ldirection, l_contact_forces) rangle common.compute_angle_between(rdirection, r_contact_forces) lflag torch.logical_and(lforce min_force, torch.rad2deg(langle) max_angle) rflag torch.logical_and(rforce min_force, torch.rad2deg(rangle) max_angle) return torch.logical_and(lflag, rflag)判定逻辑包含两个并行条件注意整个操作是张量化的可一次性对成百上千个并行环境同时判定接触力阈值左右夹爪与物体之间的法向接触力大小均需 ≥min_force默认 0.2N接触角度约束接触力方向与夹爪指向的夹角需 ≤max_angle默认 85°确保接触来自夹爪正面而非侧面刮蹭。只有当左右两指同时满足上述条件时才认为机器人抓住了该物体。该接口是 mani_skill/envs/tasks/tabletop/pick_cube.py 中is_grasped self.agent.is_grasping(self.cube)的直接调用来源也是任务 dense reward 中抓取奖励 1的判定依据。六、带腕部相机的变体WidowXAIWristCam文档对应的机器人目录下还包含一个带视觉感知的变体类WidowXAIWristCam定义于 mani_skill/agents/robots/widowxai/widowxai_wristcam.py其 UID 为widowxai_wristcamclass WidowXAIWristCam(WidowXAI): WidowX AI robot with a Intel Realsense D405 mounted on the gripper uid widowxai_wristcam urdf_path f{ASSET_DIR}/robots/widowxai/wxai_follower.urdf property def _sensor_configs(self): return [ CameraConfig( uidwrist_camera, posesapien.Pose(p[0, 0, 0], q[1, 0, 0, 0]), width128, height128, fovnp.pi / 2, near0.01, far100, mountself.robot.links_map[camera_link], ) ]该变体在夹爪上安装了一台模拟Intel RealSense D405深度相机的腕部相机相机通过camera_link连杆挂载分辨率为 128×128FOV 为 π/290°近裁剪面 0.01m、远裁剪面 100m采用不同的 URDFwxai_follower.urdf对应实物遥操作teleoperation中跟随端的相机安装构型。这意味着你可以直接使用robot_uidswidowxai_wristcam构建 RGB-D 观测下的视觉强化学习或模仿学习任务而无需手动添加相机配置。七、在任务环境中的实战应用PickCubeWidowXAI-v1WidowX AI 在 ManiSkill 中被正式收录为 PickCube 基准任务的受支持机器人。在 mani_skill/envs/tasks/tabletop/pick_cube.py 中SUPPORTED_ROBOTS列表包含widowxai并注册了专用环境PickCubeWidowXAI-v1register_env(PickCubeWidowXAI-v1, max_episode_steps50) class PickCubeWidowXAIEnv(PickCubeEnv): def __init__(self, *args, **kwargs): super().__init__(*args, robot_uidswidowxai, **kwargs)针对 WidowX AI 的臂长、工作空间与夹爪尺寸mani_skill/envs/tasks/tabletop/pick_cube_cfgs.py 专门配置了一套任务参数配置项WidowX AI 专属值说明cube_half_size0.018 m立方体边长一半按夹爪开合行程0.044缩小适配goal_thresh0.018 × 1.25 0.0225 m判定成功的距离阈值cube_spawn_center(-0.25, 0)立方体生成中心贴合其前向工作空间max_goal_height0.2 m目标高度随机上限sensor_cam_eye_pos[0.0, 0, 0.35]观测相机眼点sensor_cam_target_pos[-0.2, 0, 0.1]观测相机注视点此外PickCube 的奖励函数对 WidowX AI 做了特殊处理计算静止奖励时剔除夹爪关节速度qvel[..., :-2]见 pick_cube.py因为夹爪在抓取后仍会保持小幅运动不应影响机器人静止的判定。在任意已安装 ManiSkill 的环境中可通过如下方式加载该机器人与任务import mani_skill.envs import gymnasium as gym env gym.make(PickCubeWidowXAI-v1, num_envs16, obs_modestate, render_modesensors)或将robot_uidswidowxai传入PickCube-v1直接使用该机器人运行基线任务视觉任务则可改用robot_uidswidowxai_wristcam获取腕部相机观测。相应运行示例视频见 figures/environment_demos/PickCubeWidowXAI-v1_rt.mp4。八、小结WidowX AI 是 ManiSkill 中一款建模完整的桌面机械臂8 自由度6 臂 2 夹爪其中右夹爪为镜像关节、三种 PD 控制器绝对位置 / 位置增量 / 目标增量覆盖了从 RL 训练到轨迹控制的常见需求is_grasping与is_static等张量化接口使其天然适配 GPU 大规模并行仿真并已被 PickCube 等基准任务正式收录。文档页面中Quality: B的评级提示其参数如夹爪 2.0 的高摩擦系数是为仿真稳定性与任务成功率调优的若需 sim2real 迁移应自行重新做系统辨识。需要深入定制时可参考 docs/source/robots/index.md 的机器人目录页或研读 docs/source/user_guide/tutorials/custom_robots.md 学习如何加载自定义机器人模型。【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表