
ManiSkill 中 Unitree G1 Simplified Legs 人形机器人37 自由度智能体源码、控制器与仿真配置全解析【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill本篇文章以 ManiSkill 仓库中unitree_g1_simplified_legs机器人文档docs/source/robots/unitree_g1_simplified_legs/index.md为主线结合其 Agent 源码、URDF 模型与任务环境实现完整讲解该人形机器人的自由度结构、关节参数、Keyframe 复位姿态、PD 控制器配置以及在站立任务中的实际用法。读完本文你将掌握如何在 ManiSkill 中定位、加载并控制 Unitree G1简化腿版人形机器人理解其 37 个自由度的组成与关节级控制方案。机器人概览与核心标识根据官方生成的机器人文档unitree_g1_simplified_legs的核心标识信息如下项目值机器人 UIDunitree_g1_simplified_legsAgent 类UnitreeG1Simplified质量等级BStable但部分数值不够真实自由度DoF37可用控制器pd_joint_pos、pd_joint_delta_pos其中“质量等级 B”沿用了与 Mujoco Menagerie 中定义B 级表示“Stable, but some values are unrealistic”可稳定仿真但部分动力学参数未经系统辨识、不够真实。文档同时提示ManiSkill 中凡是已用于现有任务的机器人通常质量最高且经过调优而即使达到 A/A 级的机器人官方也强烈建议在迁移真实机器人前自行做系统辨识System ID。源码位置与类继承结构该机器人的 Agent 实现位于 mani_skill/agents/robots/unitree_g1/g1.py类定义如下register_agent() class UnitreeG1(BaseAgent): uid unitree_g1 urdf_path f{PACKAGE_ASSET_DIR}/robots/g1_humanoid/g1.urdf urdf_config dict() fix_root_link False load_multiple_collisions True ... register_agent() class UnitreeG1Simplified(UnitreeG1): uid unitree_g1_simplified_legs urdf_path f{PACKAGE_ASSET_DIR}/robots/g1_humanoid/g1_simplified_legs.urdf从源码结构看UnitreeG1Simplified是UnitreeG1的子类仅替换了 URDF 路径其余自由度列表、Keyframes、控制器、辅助函数全部继承自父类。两个类都通过register_agent()装饰器完成注册因此可以直接用 UID 字符串unitree_g1_simplified_legs在环境中加载。模块导出位于 mani_skill/agents/robots/unitree_g1/init.py。与同目录下的另一个变体对比可以更清楚地理解“Simplified”的含义unitree_g1完整版37 自由度加载g1.urdfunitree_g1_simplified_legs本文主题37 自由度加载g1_simplified_legs.urdf腿部碰撞几何被简化见下文 URDF 分析unitree_g1_simplified_upper_bodyg1_upper_body.pyfix_root_link True腿部关节被注释移除仅保留躯干旋转与双臂/双手控制自由度大幅减少。URDF 资源与网格文件位于 mani_skill/assets/robots/g1_humanoid包含g1.urdf、g1_simplified_legs.urdf、g1_simplified_upper_body.urdf三份模型及 44 个 STL 网格meshes/目录。根据 mani_skill/assets/robots/g1_humanoid/README.md原始资源来自 Unitree 官方unitree_ros仓库的g1_description采用 BSD-3-Clause 许可见同目录 LICENSE.txt。37 个自由度的组成URDF 运动学结构g1_simplified_legs.urdf以robot nameg1为根采用 MJCF 编译器指令mujococompiler meshdirmeshes discardvisualfalse/根连杆为pelvis骨盆。关节类型上除head_joint、logo_joint、imu_joint、pelvis_contour_joint、左右palm_joint为固定关节外其余 37 个均为revolute旋转关节恰好与文档声明的“Degrees of Freedom: 37”一一对应。这 37 个活动关节可划分为四组与源码中body_joints及分组列表完全一致g1.py分组关节数量包含关节下肢lower_body_joints12左右髋 pitch / roll / yaw、膝 pitch、踝 pitch / roll各 6 个 ×2躯干1torso_joint绕 Z 轴旋转上肢upper_body_joints10左右肩 pitch / roll / yaw、肘 pitch / roll各 5 个 ×2双手left/right_hand_joints14每只手 7 个手指关节zero到six合计 12 1 10 14 37。需要注意的是URDF 中头部head_link通过固定关节挂在躯干上因此头部没有额外自由度。简化体现在哪里对比完整版g1_simplified_legs.urdf的“简化”主要体现在腿部碰撞几何例如左右膝关节left_knee_link/right_knee_link在 URDF 中直接使用圆柱体原始形状作为碰撞体collision origin xyz0.007 0.005 -0.15 rpy0 0 0/ geometry cylinder radius0.015 length0.15/ /geometry /collision而踝关节left_ankle_roll_link等则直接引用 STL 网格作为碰撞体。这种“网格视觉 原始形状/网格碰撞”的混合建模方式是 ManiSkill 为提升 GPU 并行仿真稳定性和碰撞检测效率而采用的常见做法。关节限位与动力学参数来自 URDF以下参数直接取自 g1_simplified_legs.urdf 中各关节的limit标签单位为弧度effort 单位为 N·mvelocity 单位为 rad/s关节下界 (rad)上界 (rad)EffortVelocity髋 pitch-2.353.058832髋 roll左/右-0.26 / -2.532.53 / 0.268832髋 yaw-2.752.758832膝 pitch-0.334892.544913920踝 pitch-0.680.734053踝 roll-0.26180.26184053躯干 torso-2.6182.6188832肩 pitch-2.96712.79252153肩 roll左/右-1.5882 / -2.25152.2515 / 1.58822153肩 yaw-2.6182.6182153肘 pitch-0.22683.42082153肘 roll-2.09432.09432153手指关节7×2各关节不同如 ±0.5236 / -1~1.2 / 0~1.84 等—0.723关键动力学观察膝关节 effort 最大139 N·m而手指关节仅 0.7 N·m下肢关节髋、膝、踝的力矩上限明显高于上肢肩、肘符合人形机器人“腿部承重、手臂精细操作”的物理特征。质量分布方面骨盆 2.86 kg、躯干约 6.34 kg、膝关节 2.252 kg整体重心集中在躯干。Keyframes预定义复位姿态Agent 源码中定义了三个 Keyframeg1.py用于把机器人设置到不同的初始姿态standing标准站立姿态基座位姿sapien.Pose(p[0, 0, 0.755])right_knee_up右膝抬起右髋 pitch -1.5、右膝 pitch 1.5left_knee_up左膝抬起左髋 pitch -1.5、左膝 pitch 1.5。以standing为例其 37 维 qpos 向量为按body_joints顺序排列qpos np.array([ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, # 髋 pitch/roll、躯干、肩 pitch 等 0.2, -0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, # 髋 yaw、肩 roll、膝 0.9, 0.9, 0.0, 0.0, 0.0, 0.0, 0.0, # 肩 yaw、踝 pitch、肘 pitch -0.77, -0.77, 0.0, 0.77, 0.77, # 踝 roll、肘 roll 0.1, -0.92, -0.92, -0.1, 0.92, 0.92, 0.92, -0.92 # 14 个手指关节 ])注意前 6 个髋/躯干关节为 0膝关节为 0自然伸直而手指关节有非零预弯曲±0.77~0.92 附近使得站立姿态下手掌呈现半握拳的自然形态。三个 Keyframe 的基座高度均为 0.755 m这也是UnitreeG1Stand-v1任务复位时使用的初始高度。控制器配置pd_joint_pos 与 pd_joint_delta_pos文档声明该机器人提供pd_joint_pos和pd_joint_delta_pos两种控制器其配置在 g1.py 的_controller_configs属性中实现property def _controller_configs(self): body_pd_joint_pos PDJointPosControllerConfig( self.body_joints, lowerNone, upperNone, stiffnessself.body_stiffness, # 50 dampingself.body_damping, # 1 force_limitself.body_force_limit, # 100 normalize_actionFalse, ) body_pd_joint_delta_pos PDJointPosControllerConfig( self.body_joints, lower-0.2, upper0.2, stiffnessself.body_stiffness, dampingself.body_damping, force_limitself.body_force_limit, use_deltaTrue, ) return dict( pd_joint_posdict(bodybody_pd_joint_pos, balance_passive_forceFalse), pd_joint_delta_posdict(bodybody_pd_joint_delta_pos, balance_passive_forceFalse), )两种控制器的核心区别pd_joint_pos直接输出目标关节角度lowerNone, upperNone不做动作归一化适用于需要精确指定各关节绝对角度的场景pd_joint_delta_pos输出相对增量use_deltaTrue且动作被限制在[-0.2, 0.2] rad的增量范围内适合强化学习策略输出连续小步长动作天然限制每步关节变化幅度。两者共用body_stiffness 50、body_damping 1、body_force_limit 100三组 PD 参数。源码中还留有一段关键注释note we must addbalance_passive_forceFalseotherwise gravity will be disabled for the robot itself;balance_passive_forceTrueis only useful for fixed robots即对于fix_root_link False的浮动基座机器人必须设置balance_passive_forceFalse否则机器人的重力补偿会被禁用、无法正常站立。这一点与固定基座机器人如unitree_g1_simplified_upper_body使用balance_passive_forceTrue形成鲜明对比。站立状态辅助函数UnitreeG1Simplified从父类继承了is_standing()和is_fallen()两个基于躯干高度的启发式状态判断函数def is_standing(self): Checks if G1 is standing with a simple heuristic of checking if the torso is at a minimum height return (self.robot.pose.p[:, 2] 0.5) (self.robot.pose.p[:, 2] 1.0) def is_fallen(self): Checks if G1 has fallen on the ground. Effectively checks if the torso is too low return self.robot.pose.p[:, 2] 0.3躯干高度在0.5 ~ 1.0 m之间判定为“站立”躯干高度低于0.3 m判定为“摔倒”。由于这些函数直接使用self.robot.pose.p[:, 2]支持批量的张量运算它们天然兼容 ManiSkill 的 GPU 并行环境可一次对多个并行环境同时做状态判断。实战在 UnitreeG1Stand-v1 环境中使用unitree_g1_simplified_legs是 ManiSkill 内置站立任务的指定机器人。在 mani_skill/envs/tasks/humanoid/humanoid_stand.py 中定义了UnitreeG1Stand-v1register_env(UnitreeG1Stand-v1, max_episode_steps1000) class UnitreeG1StandEnv(HumanoidStandEnv): SUPPORTED_ROBOTS [unitree_g1_simplified_legs] agent: Union[UnitreeG1Simplified] def __init__(self, *args, robot_uidsunitree_g1_simplified_legs, **kwargs): super().__init__(*args, robot_uidsrobot_uids, **kwargs)该环境的几个关键配置奖励模式SUPPORTED_REWARD_MODES [sparse, none]稀疏奖励直接取info[is_standing]回合长度max_episode_steps1000默认仿真配置SimConfig(gpu_memory_configGPUMemoryConfig(max_rigid_contact_count2**22, max_rigid_patch_count2**21))为足式机器人高频接触显式扩大了 GPU 刚体接触缓存这是人形/四足类任务常见的调参手段回合初始化在standingKeyframe 的 qpos 上叠加标准差为 0.05 的高斯噪声并将基座设置在[0, 0, 0.755]制造略有扰动的初始站立条件评估逻辑evaluate()返回{is_standing: ..., fail: ~is_standing}即机器人只要站住躯干高度在 0.5~1.0 m即成功。基类HumanoidStandEnv的默认机器人为unitree_h1_simplified但UnitreeG1Stand-v1将其覆盖为unitree_g1_simplified_legs体现了“同一环境模板适配不同人形机器人”的设计。如何快速运行在完成 ManiSkill 安装后参见 docs/source/user_guide/getting_started/installation.md 与 docs/source/user_guide/getting_started/quickstart.md可直接通过 UID 加载并观察该机器人import mani_skill.envs import gymnasium as gym env gym.make(UnitreeG1Stand-v1, robot_uidsunitree_g1_simplified_legs, render_modehuman) obs, _ env.reset()也可以运行仓库自带的随机动作演示脚本观察其站立/摔倒行为python mani_skill/examples/demo_random_action.py -e UnitreeG1Stand-v1若想用其他控制器pd_joint_pos/pd_joint_delta_pos配合强化学习训练可参考 docs/source/user_guide/concepts/controllers.md 中对关节位置控制器的说明以及 examples/baselines/ppo/ppo.py 中的 PPO 训练示例。视觉与碰撞模型文档以两行截图展示了该机器人的视觉网格与碰撞网格绿色 凸包网格蓝色 原始形状网格图片位于 docs/source/_static/robot_images/unitree_g1_simplified_legs碰撞模型截图front_collision.png、side_collision.png与视觉网格同目录存放其中绿色表示凸包网格、蓝色表示原始形状网格如前述膝关节的圆柱体碰撞体。这种“可视化网格 轻量碰撞体”的组合也是 ManiSkill 中仿真效率与视觉保真度折中的体现。注意事项与后续扩展质量等级 B 的含义该模型可稳定仿真但部分参数如 PD 刚度、关节阻尼未经系统辨识若用于 sim2real 迁移建议参考 docs/source/user_guide/tutorials/sim2real 自行校准机器人列表与质量分级总览完整机器人目录与分级表见 docs/source/robots/index.md自定义机器人如需基于该模型改造例如更换碰撞体、调整关节限位URDF 位于 mani_skill/assets/robots/g1_humanoid/g1_simplified_legs.urdf加载自定义机器人的完整流程参见 docs/source/user_guide/tutorials/custom_robots.md相关变体若你的任务只涉及上半身操作双臂 双手可选用unitree_g1_simplified_upper_body腿部固定、fix_root_linkTrue见 g1_upper_body.py其将balance_passive_force设为True并额外提供抓手检测等辅助函数更适合桌面操作类任务。【免费下载链接】ManiSkillManipulation Skill Framework, an open source GPU parallelized robotics simulator and benchmark项目地址: https://gitcode.com/GitHub_Trending/ma/ManiSkill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。