KungfuBot——基于物理约束和自适应运动追踪的人形全身控制PBHC,用于学习打拳或跳舞(即RL下的动作模仿和运控)

前言

昨天618,我司「七月在线」长沙具身团队那边,以同事朝阳为主力,我打杂,折腾了整整一天,终于可以通过VR摇操宇树G1了——当然,摇操是为了做训练数据的采集,从而方便 下一步的模型(策略)训练,最终实现机器人自主做各种任务

然灵巧手还没到货(顺带吐槽一下,现在的灵巧手都太贵了,有没有性价比高的或者合作呢,如有,欢迎私我),临时再打印个二指夹爪也得等

那未来这几天 搞啥呢?那就搞运动吧,如此,便关注到最新出来的三个工作

  1. 第一个是GMT: General Motion Tracking forHumanoid Whole-Body Control
  2. 第二个是R2S2和OpenWBT
  3. 第三个则是本文要解读的KungfuBot

顺带和第三个——KungfuBot的一位作者沟通发现,一者他们团队同学也读过我的博客,二者 他导师还是我认识多年的朋友,也是缘分啊

  • 加之他们开源的力度 我个人觉得挺不错的,故我也打算和长沙具身团队其中的一个人形小组复现下该KungfuBot
  • 故写本文一方面 算是对复现的指导,二方面 也是对他们工作的一个宣传,一举多得 何乐不为

PS,如有具身某业务场景的定制开发需求,可以直接私我需求,如想做技术交流 则私我一两句简介,邀你进:七月具身:人形二开交流大群

25年6.24日晚间感慨

  • 今天同事朝阳在装本文这个「基于PBHC的kongfubot 环境」时
    # Install and Test IsaacGym
    wget https://developer.nvidia.com/isaac-gym-preview-4
    tar -xvzf isaac-gym-preview-4
    pip install -e isaacgym/python
    cd isaacgym/python/examplespython 1080_balls_of_solitude.py # or `python 

    发现5090上安装IsaacGym没问题,但是例子跑不出来,后来才得知5090不支持
  • 我真是头大啊,刚买的5090..
    买之前,还对比4090 24g和5090 32g来着,看后者显存更大 又没贵多少,就5090了..

第一部分 KungfuBot

1.1 引言与相关工作

1.1.1 引言

如原KungfuBot论文所说,人形机器人由于具有人类般的形态结构,具备模仿人类在执行不同任务时各种行为的潜力[1-Humanoid locomotion and manipulation: Current progress and challenges in control, planning, and learning]

  1. 随着动作捕捉(Mo-Cap)系统和动作生成方法的不断进步,已经产生了大量的动作数据集
    2- Motiongpt: Human motion as a foreign language
    3-Move as you say interact as you can: Language-guided human motion generation with scene affordance

    这些数据集涵盖了大量带有文本描述的人类活动[4-Amass: Archive of motion capture as surface shapes]

    因此,使人形机器人学习全身控制以模仿人类行为成为了一个有前景的方向
  2. 然而,控制高维度的机器人动作以实现理想的人类表现仍然面临巨大挑战。主要困难之一在于,从人类采集的动作序列往往不符合仿人机器人的物理约束,包括关节极限、动力学和运动学
    5-Exbody2
    6-ASAP


    因此,直接通过强化学习(RL)训练策略以最大化奖励(如负跟踪误差)通常难以获得理想的策略,因为理想解可能并不存在于解空间中
  3. 近期,已经提出了多种基于强化学习(RL)的全身控制框架用于动作跟踪
    7-Exbody
    8-Humanplus

    这些方法通常将参考运动学动作作为输入,并输出用于类人机器人模仿的控制动作

    为了解决物理可行性问题,H2O和 OmniH2O [9,10] 通过训练有特权的模仿策略去除不可行的动作,从而生成干净的动作序列数据集

    ExBody [7] 通过语言标签(如“挥手”和“行走”)筛选,构建了一个可行的动作数据集。Exbody2 [5] 在所有动作上训练初始策略,并利用跟踪误差来衡量每个动作的难度。然而,训练初始策略并寻找最优数据集的成本较高

    此外,在训练过程中,对于难以跟踪的动作,仍缺乏合适的容错机制。因此,先前的方法只能跟踪低速且平滑的动作
  4. 最近,ASAP [6] 引入了多阶段机制,并学习了残差策略来补偿仿真到现实的差异,从而降低了跟踪敏捷动作的难度。然而,ASAP 包含总共四个训练阶段,并且残差策略的训练需要 MoCap 系统记录真实机器人状态

在本文中,来自1 中国电信(TeleAI)、2 上交、3 华东理工大学、4 哈工大、5 上科大的研究者提出了一种基于物理的人形机器人运动控制方法(PBHC)

具体而言,该方法采用两阶段框架来应对敏捷且高度动态运动所带来的挑战

  1. 运动处理阶段
    首先从视频中提取运动数据,并通过在人体模型内估算物理量来建立基于物理的指标,从而筛选出人类动作,剔除超出物理极限的运动
    随后,计算运动的接触掩码,进行运动修正,并最终利用微分逆运动学将处理后的动作重定向到机器人上
  2. 运动模仿阶段,作者提出了一种自适应运动跟踪机制,通过跟踪因子调整跟踪奖励。由于参考动作存在不完善以及需要实现平滑控制,完全跟踪高难度动作在实际中不可行,因此作者根据跟踪误差对不同动作自适应调整跟踪因子

    随后,作者又提出了一个双层优化(Bi-Level Optimization,BLO)[11- An introduction to bilevel optimization: Foundations and applications in signal processing and machine learning]来求解最优因子,并设计了自适应更新规则,在训练过程中在线估算跟踪误差,以动态优化跟踪因子

此外,作者在两阶段框架的基础上,设计了一种非对称的actor-critic结构用于策略优化。Critic采用奖励向量化技术,并利用特权信息提升价值估计的准确性,而actor仅依赖本地观测

1.1.2 相关工作

首先,对于人形动作模仿

  1. 机器人动作模仿旨在从人类动作中学习逼真且自然的行为[21,23]。尽管已有多个包含多样动作的数据集[24,25,4],但由于人类与类人机器人在物理结构上存在显著差异[6,26],类人机器人无法直接学习这些多样化的行为。同时,大多数数据集缺乏物理信息,例如对机器人策略学习至关重要的足部接触标注[27,28]。因此,作者采用基于物理的动作处理方法进行动作筛选和接触标注
  2. 在获得参考动作后,类人机器人学习全身控制策略以与仿真器交互[29,30],目标是获得接近参考动作的状态轨迹[31,32]。然而,学习此类策略极具挑战性,因为机器人需要对高维自由度进行精确控制,以实现稳定且真实的运动[7,8]
  3. 近期的研究采用基于物理的动作筛选和强化学习来学习全身控制策略[5,10],并通过仿真到现实迁移实现真实世界的适应[33]。但由于缺乏对高难度动作的容错机制,这些方法仅能跟踪相对简单的动作
    其他研究还结合了遥操作[34,35]以及上下半身的独立控制[36],但可能牺牲了动作的表现力。相比之下,KungfuBot提出了一种自适应机制,可针对敏捷动作动态调整跟踪奖励

其次,对于仿人机器人全身控制

传统的仿人机器人方法通常分别为行走和操作学习独立的控制策略

  • 在下半身方面,基于强化学习(RL)的控制器已被广泛应用于学习复杂任务的行走策略,如复杂地形行走[37,38]、步态控制[39]、起身[40,41]、跳跃[42],甚至跑酷[43,44]。然而,每项行走任务都需要精细的奖励设计,并且难以获得类人的行为[45,46]
    相比之下,KungfuBot采用人类动作作为参考,这使机器人更容易获得类人的行为
  • 在上半身方面,各种方法提出了不同的架构来学习操作任务,例如扩散策略[47,48]、视觉-语言-动作模型[49,50,51]、双系统架构[52,53]和世界模型[54,55]
    然而,这些方法可能忽视了双臂的协调性

近年来,已经提出了若干全身控制方法,旨在增强整个系统在行走[22,39,34]或执行行走-操作任务[56]时的鲁棒性

  1. 与之不同的是,KungfuBot的方法使上下半身拥有相同的目标,即跟踪参考动作,同时下半身仍需在动作模仿中保持稳定并防止跌倒。其他方法通过收集全身控制数据集来训练仿人基础模型[56,57],但需要大量的轨迹
  2. 相比之下,KungfuBot只需少量参考动作即可学习多样化的行为

1.1.3 预备知识:问题表述和参考动作处理

首先,对于问题表述

作者在工作中采用了Unitree G1 机器人[12],该机器人具有23 个自由度(DoFs)可供控制,不包括每只手腕中的3DoFs。且他们将运动模仿问题表述为一个以目标为条件的强化学习问题,其马尔可夫决策过程为\mathcal{M}=\left(\mathcal{S}, \mathcal{A}, \mathcal{S}^{\mathrm{ref}}, \gamma, r, P\right),其中

  • \mathcal{S}\mathcal{S}^{\mathrm{ref}} 分别表示人形机器人和参考运动的状态空间
  • \mathcal{A}为机器人的动作空间
  • r是由运动跟踪和正则化奖励组成的混合奖励函数
  • P是依赖于机器人形态和物理约束的转移函数

在每个时间步t

  • 策略\pi 观察机器人本体感知状态\boldsymbol{s}_{t}^{\text {prop }}并生成动作a_{t},其目标是获得下一个状态\boldsymbol{s}_{t+1},该状态跟随参考轨迹\left[\boldsymbol{s}_{0}^{\text {ref }}, \ldots, \boldsymbol{s}_{N-1}^{\text {ref }}\right]中的对应参考状态\boldsymbol{s}_{t+1}^{\mathrm{ref}}
    动作\boldsymbol{a}_{t} \in \mathbb{R}^{23}是用于PD 控制器计算电机扭矩的目标关节位置
    PD控制器的增益参数列于表9。为提高训练中模拟器的数值稳定性和精度,作者将踝关节连杆的惯性手动设置为固定值5 \times 10^{-3}

  • 且采用了现成的强化学习算法PPO[13],结合actor-critic架构进行策略优化
    详细的PPO超参数如表8所示

其次,对于参考动作处理

对于人体动作处理,Skinned Multi-Person Linear (SMPL) 模型[14] 提供了一个通用的人体动作表示方法,使用三个关键参数:

  1. \boldsymbol{\beta} \in \mathbb{R}^{10}表示身体形状
  2. \boldsymbol{\theta} \in \mathbb{R}^{24 \times 3}表示关节的轴-角表示旋转
  3. \psi \in \mathbb{R}^{3}表示全局平移

这些参数可以通过可微分蒙皮函数M(\cdot)映射为一个包含6,890 个顶点的三维网格,形式化表达为\mathcal{V}=M(\boldsymbol{\beta}, \boldsymbol{\theta}, \boldsymbol{\psi}) \in \mathbb{R}^{6890 \times 3}

作者采用人体动作恢复模型从视频中估计SMPL 参数(\boldsymbol{\beta}, \boldsymbol{\theta}, \boldsymbol{\psi}),随后进行额外的动作处理

最终得到的SMPL 格式动作通过逆运动学(IK)方法重定向到G1,从而获得用于跟踪的参考动作「The resulting SMPL-format motions are then retargeted toG1 through an Inverse Kinematics (IK) method, yielding the reference motions for tracking purposes」,类似Humanplus论文中的这个图「详见此文《HumanPlus——斯坦福ALOHA团队开源的像人类影子一样的人形机器人:仿真中训小脑HST、真实中训大脑HIT

1.2 PBHC的完整方法论

PBHC 的总体流程如图 1 所示『包括三个核心组件:(a) 从视频中提取动作及多步动作处理,(b)基于最优跟踪因子的自适应动作跟踪,(c) 强化学习训练框架及从仿真到现实的部署

  1. 首先,原始的人体视频通过人体运动恢复(HMR)模型处理,生成 SMPL 格式的运动序列
  2. 这些序列随后通过基于物理的指标进行筛选,并利用接触掩码进行修正
  3. 经过优化的运动数据接着被重定向到 G1 机器人
  4. 最后,每条生成的轨迹作为参考动作,用于训练独立的强化学习(RL)策略,随后部署到真实的 G1 机器人上

1.2.1 动作处理流程:从视频中进行运动估计、动作筛选、动作校正、动作重定向(含数据集说明)

作者提出了一种动作处理流程,用于从视频中提取动作以实现人形动作追踪,该流程包括四个步骤:

  1. 从单目视频中估算SMPL格式的动作
  2. 基于物理的动作滤波
  3. 基于接触感知的动作校正
  4. 动作重定向

该流程确保了物理上合理的动作能够从视频中转移到人形机器人上,接下来,逐一具体阐述上述流程

第一,从视频中进行运动估计

  1. 作者采用 GVHMR [15- World-grounded human motion recovery via gravity-view coordinates] 从单目视频中估算 SMPL 格式的运动。GVHMR 引入了一个与重力方向对齐的重力-视角坐标系,自然地将运动与重力方向对齐,从而消除了仅依赖相机坐标系重建时产生的身体倾斜问题
  2. 此外,GVHMR 通过预测足部静止概率,有效减轻了足部滑动伪影,从而提升了运动质量

第二,基于物理的运动筛选

由于HMR 模型在重建过程中存在不准确性以及分布外问题,从视频中提取的运动可能会违反物理和生物力学约束,因此,作者尝试通过基于物理的原则筛选这些运动

  1. 以往的研究[16-3d human pose estimation via intuitive physics] 表明,质心(CoM)和压力中心(CoP)之间的接近程度可以指示更高的稳定性,并提出了一种从SMPL 数据中估算CoM 和CoP 坐标的方法
  2. 在此基础上,作者计算每一帧中CoM 和CoP 在地面的投影距离,并通过设定阈值来评估稳定性
    具体来说,令\overline{\boldsymbol{p}}_{t}^{\mathrm{CoM}}=\left(p_{t, x}^{\mathrm{CoM}}, p_{t, y}^{\mathrm{CoM}}\right)\overline{\boldsymbol{p}}_{t}^{\mathrm{CoP}}=\left(p_{t, x}^{\mathrm{CoP}}, p_{t, y}^{\mathrm{CoP}}\right)分别表示第t 帧中CoM 和CoP在地面的投影坐标,\Delta d_{t}表示这两个投影之间的距离

    作者将一帧的稳定性判据定义为——如下公式1所示
    \Delta d_{t}=\left\|\overline{\boldsymbol{p}}_{t}^{\mathrm{CoM}}-\overline{\boldsymbol{p}}_{t}^{\mathrm{CoP}}\right\|_{2}<\epsilon_{\mathrm{stab}}

    其中,\epsilon_{\text {stab }} 表示稳定性阈值

    然后,给定一个N 帧的动作序列,令\mathcal{B}=\left[t_{0}, t_{1}, \ldots, t_{K}\right]为满足上述公式(1) 的帧索引递增排序列表,其中t_{k} \in[1, N]

    若满足以下两个条件,则认为该动作序列是稳定的:
    (i) 边界帧稳定性:1 \in \mathcal{B}N \in \mathcal{B}
    (ii) 最大不稳定间隔:连续不稳定帧的最大长度必须小于阈值\epsilon_{\mathrm{N}},即\max _{k} t_{k+1}-t_{k}<\epsilon_{\mathrm{N}}。基于该标准,明显无法保持动态稳定性的动作将从原始数据集中剔除

第三,基于接触掩码的运动校正

为了更好地捕捉运动数据中的足-地接触,作者通过分析连续帧之间的踝关节位移,基于零速度假设[17- Capturing and inferring dense full-body human-scene contact, 18- Reducing
footskate in human motion reconstruction with ground contact constraints
],来估计接触掩码

\boldsymbol{p}_{t}^{\text {l-ankle }} \in \mathbb{R}^{3}表示时刻t 左踝关节的位置,c_{t}^{\text {left }} \in\{0,1\}为对应的接触掩码。接触掩码的估计方式如下

c_{t}^{\text {left }}=\mathbb{I}\left[\left\|\boldsymbol{p}_{t+1}^{\text {l-ankle }}-\boldsymbol{p}_{t}^{\text {l-ankle }}\right\|_{2}^{2}<\epsilon_{\text {vel }}\right] \cdot \mathbb{I}\left[p_{t, z}^{\text {l-ankle }}<\epsilon_{\text {height }}\right]

其中\epsilon_{\mathrm{vel}}\epsilon_{\text {height }}是通过经验选择的阈值,右脚的处理方式类似

为了解决阈值过滤未能消除的轻微悬浮伪影,作者基于估算的接触掩码应用了一个修正步骤

具体而言,如果在第t帧任一只脚处于接触状态,则对全局平移施加一个垂直偏移。设\psi_{t}表示时刻t的姿态全局平移,则修正后的垂直位置为

\psi_{t, z}^{\mathrm{corr}}=\psi_{t, z}-\Delta h_{t}

其中,\Delta h_{t}=\min _{v \in \mathcal{V}_{t}} p_{t, z}^{v}是帧t 时SMPL 网格顶点\mathcal{V}_{t}中最低的z 坐标。虽然该修正减轻了漂浮伪影,但可能会导致帧间抖动。作者通过应用指数移动平均(EMA)来平滑运动,从而解决这一问题

如原论文附录E.3所述,为了评估接触掩码的有效性

  1. 作者还对三种具有不同足部接触模式的代表性动作进行了消融研究,分别为查尔斯顿舞、跳踢和回旋踢。此外,他们引入了平均足部接触掩码误差作为评估指标E_{\text {contact-mask }}=\mathbb{E}\left[\left\|c_{t}-\hat{c}_{t}\right\|_{1}\right]
  2. 如表13所示

    结果表明,与未使用接触掩码的基线方法相比,他们的方法显著降低了足部接触误差 E_{\text {contact-mask }}
    此外,该方法在其他跟踪指标上也带来了显著提升,验证了所提出的感知接触设计的有效性

第四,动作重定向

  1. 作者采用一种基于逆向运动学(IK)的方法 [19- Mink: Python inverse kinematics based on MuJoCo],将处理后的 SMPL 格式动作重定向到G1 机器人。该方法将问题表述为可微分的优化问题,在保证末端执行器轨迹对齐的同时,遵循关节限制
  2. 为了增强动作多样性,作者引入了来自开源数据集 AMASS [4] 和 LAFAN [20-Robust motion in-betweening] 的额外数据
    这些动作部分通过他们的流程进行处理,包括接触掩码估计、动作校正和动作重定向

如原论文附录B所述,他们的数据集整合了以下两类动作:

  1. 基于视频的来源,通过他们提出的多步动作处理流程提取动作数据。该流程的超参数如表3所示

  2. 开源数据集:选自AMASS和LAFAN的数据。该数据集包含13种不同的动作,并根据难度分为三个等级:简单、中等和困难
    为了保证动作之间的平滑过渡,作者在每个序列的开始和结束处进行线性插值,使其从默认姿势过渡到参考动作,再返回默认姿势
    具体细节见表4

1.2.2 自适应动作追踪:指数形式的跟踪奖励、最优跟踪因子、自适应机制

1.2.2.1 指数形式的跟踪奖励

PBHC中的奖励函数(详见附录C.2)由两个部分组成:

  1. 任务特定奖励,用于确保对参考动作的精确跟踪
  2. 以及正则化奖励,用于提升整体的稳定性和平滑性

任务特定的奖励包括用于对齐关节状态、刚体状态和足部接触掩码的项。除了足部接触跟踪项外,这些奖励均采用如下的指数形式——如下公式4 所示:

r(x)=\exp (-x / \sigma)

其中,x表示跟踪误差,通常以关节角等量的均方误差(MSE)来衡量\sigma用于控制误差的容忍度,被称为跟踪因子。相比于负误差形式,这种指数形式因其有界性,有助于稳定训练过程,并为奖励权重分配提供了更直观的方法,因此更受青睐

  • 直观来看,当\sigma远大于x的典型取值范围时,奖励值会保持接近1,并且对x的变化变得不敏感
  • 而当\sigma过小时,奖励值趋近于0,同样会降低其敏感度
    这凸显了合理选择\sigma以提升响应性和追踪精度的重要性

该直观理解如图2所示

1.2.2.2 最优跟踪因子

为了确定最优跟踪因子的选择,作者提出一种简化的运动跟踪模型,并将其表述为一个双层优化问题

该表述的直观想法是,应选择跟踪因子\sigma,以最小化收敛策略在参考轨迹上的累积跟踪误差。在手动调参的情况下,这通常通过一个迭代过程实现:工程师选择一个\sigma值,训练策略,观察结果,并重复这一过程,直到获得令人满意的性能

  1. 给定一个策略\pi,存在一个长度为N 的期望跟踪误差序列\boldsymbol{x} \in \mathbb{R}_{+}^{N},其中x_{i} 表示在第i 步rollout 过程中期望的跟踪误差
    作者并不直接优化策略,而是将跟踪误差序列x 作为决策变量

    这使他们能够将运动跟踪的优化问题重新表述为——如下公式5 所示
    \max _{\boldsymbol{x} \in \mathbb{R}_{+}^{N}} J^{\text {in }}(\boldsymbol{x}, \sigma)+R(\boldsymbol{x})
    其中
    \rightarrow  对于公式中的第一部分内部目标J^{\text {in }}(\boldsymbol{x}, \sigma)=\sum_{i=1}^{N} \exp \left(-x_{i} / \sigma\right)是由公式(4) r(x)=\exp (-x / \sigma)中的跟踪奖励诱导的简化累计奖励
    \rightarrow  对于公式中的第二部分,作者引入R(\boldsymbol{x})以捕捉除J^{\text {in }} 以外的所有附加效应,包括环境动态和其他策略目标(如额外奖励)
    方程(5)的解x^{*}对应于最优策略\pi^{*}所引起的误差序列
  2. 随后,\sigma的优化目标是最大化获得的累计负跟踪误差J^{\mathrm{ex}}\left(\boldsymbol{x}^{*}\right)=\sum_{i=1}^{N}-x_{i}^{*},即外部目标,可形式化为以下双层优化问题——如下公式6 所示
    \max _{\sigma \in \mathbb{R}_{+}} J^{\mathrm{ex}}\left(\boldsymbol{x}^{*}\right), \quad \text { s.t. } \quad \boldsymbol{x}^{*} \in \arg \max _{\boldsymbol{x} \in \mathbb{R}_{+}^{N}} J^{\text {in }}(\boldsymbol{x}, \sigma)+R(\boldsymbol{x})

    在额外的技术假设下,可以求解公式(6),并推导出最优跟踪因子是最优跟踪误差的平均值,如下公式7所示(具体细节见附录A)
    \sigma^{*}=\left(\sum_{i=1}^{N} x_{i}^{*}\right) / N

如原论文附录A所述,来看下最优跟踪Sigma的推导


  1. 回顾公式6中的双层优化问题,具体如下——分别定义为9a/9b
    \begin{aligned} \max _{\sigma \in \mathbb{R}_{+}} & J^{\text {ex }}\left(\boldsymbol{x}^{*}\right) \\ \text { s.t. } & \boldsymbol{x}^{*} \in \arg \max _{\boldsymbol{x} \in \mathbb{R}_{+}^{N}} J^{\text {in }}(\boldsymbol{x}, \sigma)+R(\boldsymbol{x}) \end{aligned}
    假设R(\boldsymbol{x})取线性形式R(\boldsymbol{x})=\boldsymbol{A} \boldsymbol{x}+\boldsymbol{b}J^{\mathrm{ex}}J^{\mathrm{in}}是两次连续可微的,并且下层问题方程(9b) 存在唯一解\boldsymbol{x}^{*}(\sigma)
    因此,作者采用隐式梯度方法来求解
  2. J^{\mathrm{ex}}关于\sigma 的梯度为——公式10
    \frac{d J^{\mathrm{ex}}}{d \sigma}={\frac{d \boldsymbol{x}^{*}(\sigma)^{\top}}{d \sigma}}^{\top} \nabla_{\boldsymbol{x}} J^{\mathrm{ex}}\left(\boldsymbol{x}^{*}(\sigma)\right)

    要想得到上面公式10中等号右边的这个\frac{dx^*(\sigma)}{d\sigma},由于x^*(\sigma)是一个低层解,它满足——公式11
    \nabla_{\boldsymbol{x}}\left(J^{\text {in }}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right)+R(\boldsymbol{x})\right)=0
  3. 对公式(11)关于σ求一阶导数,得到——公式12和公式13
    \begin{array}{c} \frac{d}{d \sigma}\left(\nabla_{\boldsymbol{x}}\left(J^{\text {in }}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right)+R(\boldsymbol{x})\right)=\nabla_{\sigma, \boldsymbol{x}}^{2} J^{\text {in }}+{\frac{d \boldsymbol{x}^{*}(\sigma)}{d \sigma}}^{\top} \nabla_{\boldsymbol{x}, \boldsymbol{x}}^{2} J^{\text {in }}=0\right. \\ {\frac{d \boldsymbol{x}^{*}(\sigma)^{\top}}{d \sigma}}^{\top}=-\nabla_{\sigma, \boldsymbol{x}}^{2} J^{\text {in }}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right) \nabla_{\boldsymbol{x}, \boldsymbol{x}}^{2} J^{\text {in }}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right)^{-1} \end{array}

    将公式(13)代入公式(10),得到公式14
    \frac{d J^{\mathrm{ex}}}{d \sigma}=-\nabla_{\sigma, \boldsymbol{x}}^{2} J^{\mathrm{in}}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right) \nabla_{\boldsymbol{x}, \boldsymbol{x}}^{2} J^{\mathrm{in}}\left(\boldsymbol{x}^{*}(\sigma), \sigma\right)^{-1} \nabla_{\boldsymbol{x}} J^{\mathrm{ex}}\left(\boldsymbol{x}^{*}(\sigma)\right)

    很好,继续往下
  4. 对于公式14中,有以下的公式15(a)和15(b)
    \begin{aligned} J^{\mathrm{ex}}(\boldsymbol{x}) & =\sum_{i=1}^{N}-x_{i} \\ J^{\mathrm{in}}(\boldsymbol{x}, \sigma) & =\sum_{i=1}^{N} \exp \left(-x_{i} / \sigma\right) \end{aligned}
    在公式(14)中计算一阶和二阶梯度如下——分别得到公式16a/16b/16c/16d
    \begin{aligned} \nabla_{\boldsymbol{x}} J^{\text {in }}(\boldsymbol{x}, \sigma) & =\exp (-\boldsymbol{x} / \sigma)\left(-\frac{1}{\sigma}\right) \\ \nabla_{\boldsymbol{x}} J^{\text {ex }}(\boldsymbol{x}) & =\mathbf{1} \\ \nabla_{\sigma, \boldsymbol{x}}^{2} J^{\text {in }}(\boldsymbol{x}, \sigma) & =\frac{\sigma-\boldsymbol{x}}{\sigma^{3}} \odot \exp (-\boldsymbol{x} / \sigma), \\ \nabla_{\boldsymbol{x}, \boldsymbol{x}}^{2} J^{\text {in }}(\boldsymbol{x}, \sigma) & =\operatorname{diag}(\exp (-\boldsymbol{x} / \sigma)) / \sigma^{2} \end{aligned}

    其中⊙表示按元素相乘
  5. 将(16)代入(14),并令梯度等于零 \frac{d J^{e x}}{d \sigma}=0,则有公式17
    \sigma=\frac{\sum_{i=1}^{N} x_{i}^{*}(\sigma)}{N}
1.2.2.3 自适应机制

虽然公式(7)为确定跟踪因子提供了理论指导

  1. \sigma^{*}x^{*}之间的耦合关系导致出现循环依赖,无法直接计算
    此外,由于参考动作数据的质量和复杂度各异,选取一个对所有动作场景都适用的单一固定跟踪因子是不现实的
  2. 为了解决这一问题,作者设计了一种自适应机制,通过误差估计与跟踪因子调整之间的反馈回路,在训练过程中动态调整\sigma

    在该机制中,作者维护了一个关于环境步数的即时跟踪误差的指数移动平均\text { (EMA) } \hat{x}
    该EMA 作为当前策略下期望跟踪误差的在线估计值,在训练过程中,这一数值应当接近当前因子\sigma 下的平均最优跟踪误差\left(\sum_{i=1}^{N} x_{i}^{*}\right) / N

    在每一步,PBHC 将\sigma更新为当前的\hat{x}值,从而形成一个反馈回路,使得跟踪误差的减少导致\sigma的收紧。这个闭环过程推动策略的进一步优化,随着跟踪误差的降低,系统收敛到一个最优的\sigma 值,从而渐近地求解方程(9),如图3 所示

  3. 为了确保训练过程中的稳定性,作者将σ 限制为非递增,并用一个相对较大的值\sigma^{\text {init }}进行初始化。更新规则由公式(8) 给出
    \sigma \leftarrow \min (\sigma, \hat{x})
    如图4 所示,这一自适应机制使策略能够在训练过程中逐步提高其跟踪精度

1.2.3 RL训练框架:非对称Actor-Critic、奖励向量化、参考状态初始化、仿真到现实迁移

  • 非对称Actor-Critic。遵循以往的工作[6,21],引入了时间相位变量\phi_{t} \in[0,1],用于线性表示参考运动的当前进度,其中\phi_{t}=0表示运动的开始,\phi_{t}=1表示运动的结束

    actor的观测s_{t}^{\text {actor }}包括
    \rightarrow  机器人的本体感知\boldsymbol{s}_{t}^{\text {prop }}
    本体感知\boldsymbol{s}_{t}^{\text {prop }}=\left[\boldsymbol{q}_{t-4: t}, \dot{\boldsymbol{q}}_{t-4: t}, \boldsymbol{\omega}_{t-4: t}^{\text {root }}, \boldsymbol{g}_{t-4: t}^{\text {proj }}, \boldsymbol{a}_{t-5: t-1}\right],包括
    关节位置\mathbf{q}_{t} \in \mathbb{R}^{23}的5 步历史
    关节速度\dot{\boldsymbol{q}}_{t} \in \mathbb{R}^{23}
    根部角速度\boldsymbol{\omega}_{t}^{\text {root }} \in \mathbb{R}^{3}
    根部投影重力\boldsymbol{g}_{t}^{\text {proj }} \in \mathbb{R}^{3}
    以及上一步动作\boldsymbol{a}_{t-1} \in \mathbb{R}^{23}


    \rightarrow  以及时间相位变量\phi_{t}

    critic接收增强观测\boldsymbol{s}_{t}^{\text {crtic }},包括\boldsymbol{s}_{t}^{\text {prop }}、时间相位、参考运动位置、根部线速度以及一组随机化物理参数
  • 奖励向量化
    为了便于学习具有多个奖励的价值函数,作者将奖励和价值函数向量化为:\boldsymbol{r}=\left[r_{1}, \ldots, r_{n}\right]\boldsymbol{V}(s)=\left[V_{1}(s), \ldots, V_{n}(s)\right],遵循Xie 等人[22] 的方法

    与将所有奖励聚合为单一标量不同,每个奖励分量r_{i} 被分配给一个价值函数V_{i}(s),该函数独立地估计回报,由具有多个输出头的critic网络实现。所有价值函数被聚合以计算动作优势。这一设计实现了精确的价值估计,并促进了策略优化的稳定性
  • 参考状态初始化
    作者采用参考状态初始化(RSI)[21],该方法从参考动作的不同时间相位中随机采样,并以此初始化机器人的状态。这一做法有助于并行学习不同的动作阶段,从而显著提升训练效率
  • 仿真到现实迁移
    为弥合仿真与现实之间的差距,作者采用领域随机化方法,通过改变仿真环境和人形机器人的物理参数来实现。经过训练的策略会先通过仿真到仿真的测试进行验证,然后直接部署到真实机器人上,实现无需微调的零样本仿真到现实迁移。详细内容见附录C.3

如原论文附录C.1所述

  • 对于观测空间设计
    Actor 观察空间:Actor 的观测\boldsymbol{s}_{t}^{\text {actor }}包括机器人本体感觉状态\boldsymbol{s}_{t}^{\text {prop }}的5 步历史以及时间相位变量\phi_{t}
    Critic 观察空间:Critic 的观测\boldsymbol{s}_{t}^{\text {crtic }}还包括基座线速度、参考运动的身体位置、当前与参考身体位置之间的差异,以及一组领域随机化的物理参数。详细信息见表5

    在领域随机化中使用的若干随机物理参数被纳入critic观测范围,以提升价值估计的鲁棒性。领域随机化的详细设置见附录C.3
  • 对于奖励设计
    所有奖励函数详见表6
    他们的奖励设计主要包括两部分:任务奖励和正则化奖励
    具体而言,当关节位置超过软限制时,会施加惩罚。软限制是通过将硬限制按固定比例(α=0.95)对称缩放得到的
    \begin{aligned} \boldsymbol{m} & =\left(\boldsymbol{q}_{\min }+\boldsymbol{q}_{\max }\right) / 2 \\ \boldsymbol{d} & =\boldsymbol{q}_{\max }-\boldsymbol{q}_{\min } \\ \boldsymbol{q}_{\mathrm{soft}-\min } & =\boldsymbol{m}-0.5 \cdot \boldsymbol{d} \cdot \alpha \\ \boldsymbol{q}_{\mathrm{soft}-\max } & =\boldsymbol{m}+0.5 \cdot \boldsymbol{d} \cdot \alpha \end{aligned}
    其中q表示关节位置。同样的方法也适用于计算关节速度\dot{\boldsymbol{q}}和力矩\tau的软限值

  • 对于域随机化
    为了提升他们训练策略在现实环境中的可迁移性,他们在训练过程中引入了域随机化,以增强从仿真到仿真以及从仿真到现实的鲁棒迁移能力
    具体设置见表7

1.3 实验

在本节中,作者将通过实验评估 PBHC 的有效性。他们的实验旨在回答以下关键研究问题

  • Q1.他们的基于物理的动作过滤方法能否有效筛除不可跟踪的动作?
  • Q2.PBHC在仿真中相比以往方法是否实现了更优的跟踪性能?
  • Q3.自适应运动跟踪机制是否提升了跟踪精度?
  • Q4.PBHC在实际部署中表现如何?

1.3.1 实验设置:评估方法与指标

  • 对于评估方法
    作者采用通过所提出的运动处理流程(详见附录B)构建的高动态运动数据集,对策略的跟踪性能进行评估。相关示例见图5

    他们根据动作的灵活性要求,将动作分为三个难度等级:简单、中等和困难。在每种设置下,策略均在IsaacGym[29]中使用三个不同的随机种子进行训练,并在1,000个回合的测试中进行评估

如原论文附录D.1所述,他们采用的计算平台、真实机器人设置分别如下所示

  • 计算平台:每项实验均在配备24核Intel i7-13700 CPU(主频5.2GHz)、32GB内存和单块NVIDIA GeForce RTX 4090 GPU的机器上进行,操作系统为Ubuntu 20.04
    且他们的的每个模型均训练27小时
  • 真实机器人设置:他们在Unitree G1机器人上部署我们的策略
    系统由车载运动控制板和外部PC组成,两者通过以太网连接
    \rightarrow  控制板采集传感器数据,并通过DDS协议传输至PC
    \rightarrow  PC负责维护观测历史、执行策略推理,并将目标关节角度发送回控制板,控制板随后发出电机指令
  • 对于指标
    策略的跟踪性能通过以下指标进行量化:
    全局平均每身体位置误差(E_{\mathrm{g}-\mathrm{mpbpe}}, \mathrm{~mm})
    即全局每个身体部位位置平均误差(Eg-mpbpe,毫米):身体各部位在全局坐标系下的位置平均误差
    E_{\mathrm{g} \text {-mpbpe }}=\mathbb{E}\left[\left\|\boldsymbol{p}_{t}-\boldsymbol{p}_{t}^{\mathrm{ref}}\right\|_{2}\right]

    根相对平均每身体位置误差\left(E_{\text {mpbpe }}, \mathrm{mm}\right)
    相对于根节点的每个身体部位位置平均误差(Empbpe,毫米):身体各部位相对于根节点位置的平均误差
    E_{\text {mpbpe }}=\mathbb{E}\left[\left\|\left(\boldsymbol{p}_{t}-\boldsymbol{p}_{\text {root }, \mathrm{t}}\right)-\left(\boldsymbol{p}_{t}^{\text {ref }}-\boldsymbol{p}_{\text {root }, \mathrm{t}}^{\text {ref }}\right)\right\|_{2}\right]


    平均每关节位置误差\left(E_{\text {mpjpe }}, 10^{-3} \mathrm{rad}\right)
    即关节位置平均误差:关节旋转的平均角度误差
    E_{\mathrm{mpjpe}}=\mathbb{E}\left[\left\|\boldsymbol{q}_{t}-\boldsymbol{q}_{t}^{\mathrm{ref}}\right\|_{2}\right]

    平均每关节速度误差\left(E_{\text {mpjve }}, 10^{-3} \mathrm{rad} / \text { frame }\right)
    即平均每关节速度误差:关节角速度的平均误差
    E_{\text {mpjve }}=\mathbb{E}\left[\left\|\Delta \boldsymbol{q}_{t}-\Delta \boldsymbol{q}_{t}^{\text {ref }}\right\|_{2}\right]
    其中,\Delta \boldsymbol{q}_{t}=\boldsymbol{q}_{t}-\boldsymbol{q}_{t-1}


    平均每身体速度误差\left(E_{\text {mpbve }}, \mathrm{mm} / \text { frame }\right)
    即身体部位速度平均误差(Empbve,毫米/帧):身体各部位线速度的平均误差
    E_{\mathrm{mpbve}}=\mathbb{E}\left[\left\|\Delta \boldsymbol{p}_{t}-\Delta \boldsymbol{p}_{t}^{\mathrm{ref}}\right\|_{2}\right]
    其中,\Delta \boldsymbol{p}_{t}=\boldsymbol{p}_{t}-\boldsymbol{p}_{t-1}


    以及平均每身体加速度误差\left(E_{\text {mpbae }}, \mathrm{mm} / \text { frame }^{2}\right)
    即平均每个身体部位加速度误差(Empbae , mm/frame2):身体部位加速度的平均误差
    E_{\text {mpbae }}=\mathbb{E}\left[\left\|\Delta^{2} \boldsymbol{p}_{t}-\Delta^{2} \boldsymbol{p}_{t}^{\text {ref }}\right\|_{2}\right]
    其中\Delta^{2} \boldsymbol{p}_{t}=\Delta \boldsymbol{p}_{t}-\Delta \boldsymbol{p}_{t-1}

1.3.2 运动过滤

为了解决Q1.他们的基于物理的动作过滤方法能否有效筛除不可跟踪的动作?作者对10个动作序列应用了基于物理的动作过滤方法(见§3.1)。其中,有4个序列因不符合过滤标准被剔除,其余6个序列被接受

为了评估过滤方法的有效性,为每个动作单独训练一个策略,并计算剧集长度比(ELR),即平均剧集长度与参考动作长度的比值

如图6所示

被接受的动作始终能够获得较高的ELR,这表明满足基于物理指标的动作能够在动作跟踪中实现更优的性能

相比之下,被拒绝的动作最大ELR仅为54%,这表明其经常违反终止条件。上述结果表明,作者的筛选方法能够有效排除本质上无法跟踪的动作,从而通过聚焦于可行候选项提升整体效率

1.3.3 主要结果

为了解决Q2.PBHC在仿真中相比以往方法是否实现了更优的跟踪性能?作者将PBHC与三种基线方法进行了比较:

  1. OmniH2O [10]
  2. Exbody2 [5]
  3. MaskedMimic [23]

所有基线方法在跟踪参考动作时均采用了奖励函数的指数形式,具体如§3.2.1所述。实现细节详见附录D.3

  • 如表1所示

    PBHC在所有评估指标上均稳定优于基线方法OmniH2O和ExBody2
    作者认为,这些提升归因于他们自适应的运动跟踪机制,该机制能够根据运动特征自动调整跟踪因子,而基线方法中固定且依赖经验调优的参数无法适应多样化的运动
  • MaskedMimic在某些指标上表现良好,但它主要用于角色动画,并不适用于机器人控制,因为它没有考虑诸如部分可观测性和动作平滑性等约束条件
    因此,作者将其视为一种“oracle”风格的下界,而不是可以直接比较的基线方法

如原论文附录D.3所示,为确保公平对比,所有基线方法针对每种动作分别进行训练。他们考虑了以下基线方法

  • OmniH2O
    OmniH2O 采用教师-学生训练范式。他们适度提高了跟踪奖励权重,以更好地适配 G1 机器人
    在他们的设置中,教师策略和学生策略分别训练 20 小时和 10 小时
  • Exbody2
    ExBody2采用了解耦的关键点-速度跟踪机制
    教师策略和学生策略分别训练了20小时和10小时
  • MaskedMimic
    MaskedMimic包括三个连续的训练阶段,他们仅使用第一个阶段,因为剩余阶段与他们的任务无关。该方法通过直接优化姿态级别的准确性来复现参考动作,而没有对物理合理性进行显式正则化
    每个策略训练18小时

1.3.4 自适应运动跟踪机制的影响

为研究:Q3.自适应运动跟踪机制是否提升了跟踪精度

  1. 作者进行了消融实验,将作者的自适应运动跟踪机制(§3.2)与四种采用固定跟踪因子的基线配置进行对比:Coarse、Medium、UpperBound 和 LowerBound
  2. 这些配置中的跟踪因子从 Coarse、Medium、UpperBoundLowerBound 依次减小
    其中 LowerBound 大致对应于训练收敛后自适应机制所得的最小跟踪因子,而UpperBound 则大致对应最大值。各基线的具体配置及自适应机制收敛后的跟踪因子详见附录 D.4

如原论文附录D.4所述

  1. 定义了五组跟踪因子:Coarse、Medium、UpperBound、LowerBound 以及 Ours的初始值,如表10所示

  2. 同时,作者在表11中提供了自适应机制收敛后的跟踪因子

如图7所示,固定跟踪因子配置(Coarse、Medium、LowerBound 和 UpperBound)的性能在不同运动类型之间存在差异

  1. 具体而言,虽然 LowerBound 和 UpperBound 在某些运动类型上表现出色,但在其他运动类型上表现不佳,这表明没有任何一种固定设置能够在所有运动中始终实现最优的跟踪效果
  2. 相比之下,作者的自适应运动跟踪机制能够在所有运动类型中始终实现接近最优的性能,充分证明了其根据不同运动特性动态调整跟踪因子的有效性

1.3.5 现实世界部署

如图8、图11及相关支持视频所示

他们的机器人在现实世界中通过多样化的高级技能展现出卓越的动态能力:

  1. 复杂的武术技巧,包括强有力的拳击组合(直拳、勾拳及马步冲拳)和高难度踢技(正踢、跳踢、侧踢、后踢及旋转鞭腿)
  2. 杂技动作,如完整的360度旋转
  3. 灵活的动作,包括深蹲和拉伸
  4. 艺术表演,从动感十足的舞蹈到优雅的太极序列

为了定量评估他们策略的跟踪性能,作者对太极动作进行了10次试验,并基于机载传感器读数计算评估指标,如表2所示「太极动作在现实世界与仿真环境中的跟踪性能对比。由于现实世界中无法访问,机器人根节点被固定在原点

值得注意的是,现实世界中获得的指标与仿真到仿真平台MuJoCo上的结果高度一致,这表明我们的策略能够在保持高性能控制的同时,实现从仿真到现实的稳健迁移

1.4 结论、局限性、课程学习

1.4.1 结论与局限性

本文提出了PBHC,这是一种新颖的强化学习(RL)框架,用于人形机器人全身运动控制。通过基于物理的运动处理和自适应运动跟踪,该框架实现了卓越的高动态行为和优异的跟踪精度

实验结果表明,运动过滤指标能够高效地筛选出难以跟踪的轨迹,而自适应运动跟踪方法在跟踪误差方面始终优于基线方法

然而,他们的方法仍存在局限性

  1. 缺乏对环境的感知能力,例如地形感知和障碍物规避,这限制了其在非结构化现实环境中的部署
  2. 每个策略仅被训练用于模仿单一动作,这对于需要多样动作库的应用来说效率不高。他们将如何在保持高动态性能的同时实现更广泛技能泛化的问题留作未来研究

1.4.2 课程学习

为了模拟高动态动作,作者引入了两种课程机制:一种是终止课程,逐步降低对跟踪误差的容忍度;另一种是惩罚课程,逐步增加正则化项的权重,以促进更稳定且物理上更合理的行为

  • 终止课程:当人形机器人的运动偏离参考超过终止阈值\theta时,该回合将提前终止
    在训练过程中,该阈值会逐步降低,以增加训练难度:
    \theta \leftarrow \operatorname{clip}\left(\theta \cdot(1-\delta), \theta_{\min }, \theta_{\max }\right)

    其中初始阈值\theta=1.5,边界为\theta_{\min }=0.3, \theta_{\max }=2.0,衰减率\delta=2.5 \times 10^{-5}
  • 惩罚课程:为了在训练初期促进学习,同时逐步施加更强的正则化,作者引入了一个逐步递增的缩放因子\alpha,用于调节惩罚项的影响
    \alpha \leftarrow \operatorname{clip}\left(\alpha \cdot(1+\delta), \alpha_{\min }, \alpha_{\max }\right), \quad \hat{r}_{\text {penalty }} \leftarrow \alpha \cdot r_{\text {penalty }}

    其中初始惩罚系数\alpha=0.1,取值范围为\alpha_{\min }=0.0\alpha_{\max }=1.0,增长率\delta=1.0 \times 10^{-4}

// 待更

第二部分 KungfuBot GitHub仓库的整体分析

2.1 整体分析与各大模块简介

2.1.1 仓库所包含的三大模块:运动处理流水线、运动模仿框架、示例数据

如KungfuBot GitHub仓库所述,此存储库包含:

  • 运动处理流水线
    从各种来源(视频、LAFAN、AMASS 等)收集人类运动数据,并统一转换为 SMPL 格式(motion_source/)
    对人类运动进行过滤、校正和重定向至机器人(smpl_retarget/)
    可视化和分析处理后的运动(smpl_vis/、robot_motion_process/)
  • 基于强化学习的运动模仿框架(humanoidverse/)
    在 IsaacGym 中训练策略
    在 MuJoCo 中部署训练好的策略以进行sim2sim的验证。该框架设计易于扩展——自定义策略和现实世界部署模块可以轻松接入
  • 示例数据(example/)
    实验中使用的样本运动数据(example/motion_data/,可以用 robot_motion_process/ 中的工具可视化运动数据)
    预训练策略检查点(example/pretrained_hors_stance_pose/)

具体而言,以下是各自文件夹所对应的代码结构

  • description:提供 SMPL 和 G1 机器人的描述文件
  • motion_source:获取 SMPL 格式数据的文档
  • smpl_retarget:用于将 SMPL 重定向到 G1 机器人的工具
  • smpl_vis:用于可视化 SMPL 格式数据的工具
  • robot_motion_process:用于处理机器人格式运动的工具。包括可视化、插值和轨迹分析
  • humanoidverse:训练强化学习策略
  • example:用于 PBHC 的示例运动和检查点文件

其所参考的库包括

  • ASAP:使用 ASAP 库来构建他们的强化学习代码库
  • RSL_RL:使用 rsl_rl 库来实现 PPO
  • Unitree:使用 Unitree G1 作为测试平台机器人
  • Maskedmimic:使用基于 Mink 的 Maskedmimic 重定向管道
  • PHC:将 PHC 的重定向管道整合到他们的实现中
  • GVHMR:使用 GVHMR 从视频中提取动作
  • IPMAN:基于 IPMAN 代码库来过滤动作

那如何让你的机器人执行新的动作呢?

  1. 从源处收集运动数据,并将运动数据处理为 SMPL 格式(motion_source/)
  2. 将运动数据重新定向到机器人(smpl_retarget/,可以选择 Mink 或 PHC 管道)
  3. 可视化处理后的运动,以检查运动质量是否令人满意(smpl_vis/,robot_motion_process/)
  4. 在 IsaacGym 中为处理后的运动训练策略(humanoidverse/)
  5. 在 MuJoCo 或真实世界的机器人中部署策略(humanoidverse/)

2.1.2 PBHC/humanoidverse:RL下的策略训练

第一,关于策略本身

如PBHC的官方GitHub所示,此目录PBHC/humanoidverse:包含 PBHC policy训练和评估的源代码,且他们还提供了 Horse-stance 姿势动作的预训练policy,位于PBHC/code/policy/example/pretrained_horse_stance_pose/model_50000.pt

PBHC/KungfuBot的代码基于 ASAP [1] 官方代码库。请注意,此代码库中有一些实验性功能,目前尚未在任何地方使用。其中一些可能有用,但无法保证其正确性和稳定性

第二,关于策略训练

要训练一项策略,可以使用以下命令

  • 请将下面命令中的 robot.motion.motion_file 更改为想要训练的动作。示例动作数据集位于 example/motion_data/ 中
  • 更改 num_envs
    将其设置为 4096 用于训练,但也可以将其设置为 128 用于调试
  • 输出策略检查点将保存在 logs/MotionTracking/
    文件名格式为: YYYYMMDD_HHMMSS-debug-motion_tracking-g1_23dof_lock_wrist
    例如 20990521_180647-debug-motion_tracking-g1_23dof_lock_wrist
  • 在论文中的每个实验中,作者训练 50000 次迭代
python humanoidverse/train_agent.py \
+simulator=isaacgym +exp=motion_tracking +terrain=terrain_locomotion_plane \
project_name=MotionTracking num_envs=128 \
+obs=motion_tracking/main \
+robot=g1/g1_23dof_lock_wrist \
+domain_rand=main \
+rewards=motion_tracking/main \
experiment_name=debug \
robot.motion.motion_file="example/motion_data/Horse-stance_pose.pkl" \
seed=1 \
+device=cuda:0

还可以使用以下命令对新的运动数据进行基准测试。此实验设置不采用领域随机化,并在执行者观察中包含特权信息。因此它无法部署,但可用作检查运动质量和难度的参考标准

python humanoidverse/train_agent.py \
+simulator=isaacgym +exp=motion_tracking +terrain=terrain_locomotion_plane \
project_name=MotionTracking num_envs=128 \
+obs=motion_tracking/benchmark \
+robot=g1/g1_23dof_lock_wrist \
+domain_rand=dr_nil \
+rewards=motion_tracking/main \
experiment_name=benchmark \
robot.motion.motion_file="example/motion_data/Horse-stance_pose.pkl" \
seed=1 \
+device=cuda:0

第三,关于策略评估

以下命令提供了如何评估训练好的策略的示例

  • eval_agent.py:在 IsaacGym 中运行策略并进行可视化
  • sample_eps.py:对策略进行若干轮次的滚动,输出评估指标(准确性和平滑度)。禁用了提前终止机制,因此智能体将从动作的开始运行到结束
    将 num_envs 和 num_episodes 更改为要评估的轮次数量,这两个值应相同
  • ratio_eps.py:对策略进行若干轮次的滚动,输出平均轮次长度以及平均轮次长度与参考动作长度的比率。启用了提前终止机制,因此智能体在动作完成时停止以计算轮次长度
    用法与上述相同

python humanoidverse/eval_agent.py +device=cuda:0 +env.config.enforce_randomize_motion_start_eval=False +checkpoint=example/pretrained_horse_stance_pose/model_50000.pt

python humanoidverse/sample_eps.py +device=cuda:0  +checkpoint=example/pretrained_horse_stance_pose/model_50000.pt +num_envs=1 +num_episodes=1 +eps_eval_name=samtraj +opt=record

python humanoidverse/ratio_eps.py +device=cuda:0 +checkpoint=example/pretrained_horse_stance_pose/model_50000.pt +opt=record +num_envs=100 +num_episodes=100 +eps_eval_name=example

第四,关于部署

要在 MuJoCo 中部署该策略,需要:

  • 首先通过运行上述的 eval_agent.py 将策略导出为 onnx 格式,导出的策略会出现在 exported 文件夹中。且PBHC作者已经在 example/pretrained_horse_stance_pose/exported/model_50000.onnx 中提供了预训练检查点的导出策略
    然后运行以下命令在 MuJoCo 中部署策略
    python humanoidverse/urci.py +opt=record +simulator=mujoco +checkpoint=example/pretrained_horse_stance_pose/exported/model_50000.onnx
  • 请参阅 humanoidverse/deploy/mujoco.py 中的 MViewerPlugin 类以获取键映射
    还可以在一次运行中部署多个策略。按 0 选择第一个策略,按 1 选择第二个策略,以此类推
    还可以包含一个移动策略来使机器人移动,有关如何添加自己的策略,请参阅 humanoidverse/deploy/external/core.py
    python humanoidverse/urci.py +checkpoint='[example/pretrained_horse_stance_pose/exported/model_50000.onnx,example/pretrained_horse_stance_pose/exported/model_50000.onnx]' +opt=record +simulator=mujoco

要在实际的机器人中部署该策略,需要:

  1. 首先运行 Sim2sim 部署以进行测试
  2. 为机器人编写一个真实世界的部署模块,接口与 mujoco 模块相同,参见 humanoidverse/deploy/mujoco.py 和 humanoidverse/deploy/urcirobot.py
  3. 确保人员和硬件的安全:
    在设有安全措施(例如紧急停止按钮、安全区围栏)的受控环境中进行测试
    在执行前验证控制代码中的关节限制、速度/加速度上限和扭矩约束
    在初始试验中使用慢动作或小扭矩设置

2.1.3 PBHC/motion_source:从各种来源收集人体动作,然后处理成 SMPL 格式

此文件夹介绍了如何从各种来源收集人体动作,并将其处理成 SMPL 格式

  • 对于SMPL 格式
    SMPL 格式的数据由一个字典组成。具体来说:
    'betas': (10,) - this is the shape paramater of SMPL model, not important
    'gender': str - the gender of SMPL model, default is neutral
    'poses': (frames, 66) - joint rotations, 66 represents 22 joints with 3 angles of rotation each.
    'trans': (frames, 3) - root translation (global translation)
    'mocap_framerate': int - motion fps, amass and video data is 30, mocap data is 120.
  • 对于AMASS
    AMASS 动作在此步骤无需进一步处理
  • 对于视频
    使用 GVHMR 从视频中提取动作
  • LAFAN(宇树)
    请注意,Unitree 重定向的 LAFAN 数据集尚未对外开放
    Unitree LAFAN 数据集的格式为 csv。处理这些数据需分两步:

    首先,将 CSV 转换为 PKL
    python convert_lafan_pkl.py --filepath <path_to_csv> --start 0 --end 100
    \rightarrow  <csv 文件路径> 是 CSV 文件的路径,且不包含 .csv 扩展名
    \rightarrow  start 是起始帧索引,end 是结束帧索引。我们从 CSV 文件中选取 [start:end] 范围内的帧

    其次,计算 PKL 接触掩码
    python count_pkl_contact_mask.py robot=unitree_g1_29dof_anneal_23dof +input_folder=<path_to_input_folder> +target_folder=<path_to_target_folder>
    它通过阈值法计算运动数据的接触掩码

2.1.4 PBHC/smpl_retarget:SMPL 动作重定向

给定 SMPL 格式的动作数据,此文件夹描述了如何将其重定向到机器人上,以 Unitree G1 为例

PBHC的代码整合了 MaskedMimic 和 PHC 的重定向管道——前者基于差分逆运动学框架 Mink 构建,而后者采用基于梯度的优化方法

这两种方法均可用于将人体动作重新定向到机器人上,但结果略有不同。作者在实验中使用的是 Mink 管道

  • 运动滤波器(可选)
    由于 HMR 模型存在重建不准确和分布外问题,从视频中提取的运动可能会违反物理和生物力学约束。因此,作者在运动处理流程中尝试通过基于物理原理来过滤掉这些运动。实践中,可以将其作为可选步骤选择

    运动滤波器的实现是根据官方 IPMAN 代码库改编的,因此请参考其安装流程

    用法:
    cd motion_filter
    python utils/motion_filter.py --folder <path_to_motions> --convert_rot True
    如果动作是 Y 轴朝上,将 --convert_rot 设置为 False。如果动作是 Z 轴朝上,将 --convert_rot 设置为 True
  • Mink 重定向
    首先安装 poselib:
    cd poselib
    pip install -e .
    重新定位命令:
    python mink_retarget/convert_fit_motion.py <PATH_TO_MOTION_FOLDER>
    添加 `--correct` 参数将使用动作校正

    <PATH_TO_MOTION_FOLDER> 是运动数据的根文件夹。运动数据文件夹应如下所示:
    motion_data/
    ├── video_motion/
     |    └── video1.npz
     |    └── video2.npz
     |    └── video3.npz
     |    └── ...
    └── amass/
    └── reverse_spin.npz
    └── wushu_form.npz
    └── ...
    在上述情况中,<PATH_TO_MOTION_FOLDER> 为 motion_data/
  • PHC 重定向
    下载 SMPL v1.1.0 参数,并将其放置在 smpl_model/smpl/ 文件夹中。将文件 basicmodel_neutral_lbs_10_207_0_v1.1.0.pkl、basicmodel_m_lbs_10_207_0_v1.1.0.pkl、basicmodel_f_lbs_10_207_0_v1.1.0.pkl 分别重命名为 SMPL_NEUTRAL.pkl、SMPL_MALE.pkl 和 SMPL_FEMALE.pkl

    文件夹结构应按如下方式组织:
    smpl_model/smpl/
    ├── SMPL_FEMALE.pkl
    ├── SMPL_MALE.pkl
    └── SMPL_NEUTRAL.pkl

    重定向命令:
    python phc_retarget/fit_smpl_motion.py robot=unitree_g1_29dof_anneal_23dof +motion=<PATH_TO_MOTION_FOLDER>

2.1.5 SMPL 运动可视化

此文件夹介绍了如何可视化 SMPL 格式的运动数据。作者提供了两种方法:Blender 和 PyTorch3D

  • Blender 视觉效果
    Blender 是一款开源的 3D 计算机图形软件,它也是用于动态可视化的一款强大工具
    将 npz 动作数据导入 Blender 进行可视化

    \rightarrow  下载 Blender 2.9.0 版本以及 SMPL 插件
    \rightarrow  将 SMPL 对象添加到 Blender 场景中,然后在脚本栏中运行 import_motion_blender.py 脚本,将动作数据绑定到 SMPL 对象上
  • PyTorch3D 可视化
    此实现改编自 GVHMR 代码,因此请参考其安装流程

    smpl_neutral_J_regressor.pt 和 smplx2smpl_sparse.pt 必须放在 ./body_model 中。下载 [SMPLX] 参数并将其放置在 ../smpl_retarget/smpl_model/smplx/ 文件夹中。将文件重命名为 SMPLX_NEUTRAL.npz。../smpl_retarget/smpl_model 的文件夹结构应按如下方式组织:
    smpl_model/
    ├── smpl/
    |    └── SMPL_FEMALE.pkl
    |    └── SMPL_MALE.pkl
    |    └── SMPL_NEUTRAL.pkl
    └── smplx/
    └── SMPLX_NEUTRAL.npz


    运行以下命令以可视化动作:
    python smpl_render.py --filepath <PATH_TO_MOTION>
    <动作文件路径> 包含 .npz 文件

2.1.6 PBHC/robot_motion_process:机器人运动处理

在此文件夹中,作者提供了用于可视化和分析处理后的运动以及来自模拟的运动轨迹的工具
所有从仿真中收集的重定向参考运动和运动轨迹都采用相同的数据格式——motion_readpkl.py 提供了一个示例代码来加载它们

要在 IsaacGym 中收集运动轨迹,请使用 humanoidverse/sample_eps.py。对于 MuJoCo,请使用 humanoidverse/urci.py,程序会在每个回合结束时自动将运动轨迹保存到一个 pickle 文件中

  • 可视化
    vis_q_mj.py 和 vis_rr.py 都用于可视化运动数据,这两个脚本加载相同的数据格式,但具有不同的图形用户界面
    vis_q_mj.py 基于 mujoco_py,提供参考运动和扭矩可视化,并支持手动校正接触掩码vis_rr.py 基于 rerun,提供更交互式的可视化

    用法:
    python robot_motion_process/vis_q_mj.py +motion_file=...
    有关按键映射,请参见 `vis_q_mj.py` 中的 `def key_call_back(keycode)` 函数
    python robot_motion_process/vis_rr.py --filepath=...
    注意需要为 `vis_rr.py` 安装额外的依赖项
    # (Optional) Install additional dependencies for visualization
    pip install rerun-sdk==0.22.0 trimesh
  • 插值Interpolation
    motion_interpolation_pkl.py 用于预处理运动数据。给定一个默认的机器人姿态,此脚本将在默认姿态与运动帧的开头和结尾之间添加线性插值——这样处理后的运动数据都将以默认姿态开始和结束
    这对于部署很有用,因为将现实中的机器人初始化到每个动作的起始姿态很不方便。有些姿态可能很奇怪,以至于机器人无法稳定站立

    用法:
    python robot_motion_process/motion_interpolation_pkl.py +origin_file_name=... +start=... +end=... +start_inter_frame=... +end_inter_frame=...
    其中
    \rightarrow  origin_file_name 是原始运动数据的路径,应为一个 pickle 文件
    \rightarrow  start 和 end 是运动数据的起始和结束帧索引,我们从原始运动数据中选择 [start:end] 帧
    \rightarrow  start_inter_frame 和 end_inter_frame 是在运动数据开头和结尾添加的插值帧数
  • 轨迹分析
    traj_vis.ipynb 用于可视化运动轨迹。对于从策略回放中收集的运动数据,可以使用它来比较运动轨迹与参考运动
    用法:根据示例单元格更改笔记本中运动数据的路径,然后运行所有单元格

// 待更

03-26
### 逆向工程与反编译概述 逆向工程是一种通过对软件的目标代码进行分析,将其转化为更高级别的表示形式的过程。这一过程通常用于研究现有系统的内部结构、功能以及实现细节。在JavaAndroid领域,反编译工具被广泛应用于逆向工程中。 #### Java逆向工程中的Jad反编译工具 Jad是一款经典的Java反编译工具,能够将`.class`字节码文件转换为可读的`.java`源代码[^1]。虽然它可能无法完全恢复原始源代码,但它提供了足够的信息来帮助开发者理解已编译的Java程序逻辑。Jad支持多种反编译模式,并允许用户自定义规则以适应不同的需求。此外,其命令行接口图形界面使得复杂代码的分析变得更加便捷。 #### Android逆向工程中的JEB反编译工具 针对Android应用的逆向工程,JEB是由PNF Software开发的一款专业级工具[^2]。相较于其他同类产品,JEB不仅具备强大的APK文件反编译能力,还能对Dalvik字节码执行高效而精准的操作。它的核心优势在于以下几个方面: - **广泛的平台兼容性**:除Android外,还支持ARM、MIPS等多种架构的二进制文件反汇编。 - **混淆代码解析**:内置模块能有效应对高度混淆的代码,提供分层重构机制以便于深入分析。 - **API集成支持**:允许通过编写PythonJava脚本来扩展功能并完成特定任务。 #### APK反编译流程及其意义 当涉及到具体的APK包时,可以通过一系列步骤提取其中的信息来进行全面的安全评估学习目的的研究工作[^3]。这些步骤一般包括但不限于获取资产目录(`assets`)内的资源数据;解密XML配置文档如`AndroidManifest.xml`定位应用程序启动点;最后利用上述提到的各种专用软件重现整个项目框架供进一步探讨。 ```bash # 使用apktool反编译APK示例 apktool d your_app.apk -o output_directory/ ``` 以上命令展示了如何借助开源工具ApkTool轻松拆卸目标安卓档案至易于探索的状态下。 ### 结论 无论是传统的桌面端还是现代移动端环境里头,恰当运用合适的反编译解决方案都是达成逆向工程项目成功不可缺的一环。每种工具有各自专精之处,在实际应用场景当中应当依据具体需求做出明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v_JULY_v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
OSZAR »