跨频调度

“大脑以秒为单位思考,脊髓以毫秒为单位反应——中间的 1000:1 频率鸿沟不是设计失误,而是物理约束。”

EICPS 三层架构中存在不可压缩的频率鸿沟:Brain 层(VLA/LLM)工作在 ~1Hz,Spine 层(实时控制)工作在 ~1kHz,两者相差三个数量级。跨频调度的任务是:让这两个异步运行的计算域安全、稳定地协同工作,既不让大模型的低频思考拖慢实时控制,也不让实时控制的高频噪声淹没语义规划。

📐 理论定位

Goebel, Sanfelice & Teel(2012)的混合动力系统理论为 Flow(连续演化)与 Jump(离散切换)提供了统一的数学框架,覆盖了稳定性分析、Zeno 行为检测、最小驻留时间定理等工程工具。Brooks(1986)的包容架构(Subsumption Architecture)最早指出机器人控制应按响应速度分层。神经生物学给出了”这条路行得通”的存在性证明——哺乳动物皮层(慢思考)与脊髓(快反射)的分工已经过亿年进化验证(△ Goebel et al. 2012 混合动力系统框架)。

频率鸿沟的三层分析

频率鸿沟的根本原因是计算需求与物理约束的不兼容

层级频率为什么不能改变
Brain(VLA/LLM)~1 Hz大模型推理一次需要 100ms–1s,无法实时化
Spine(CBF/EKF)~1 kHz安全监控必须快于机械动力学响应(~10ms),不能降频
Body(电机 FOC)~10 kHz硬件 PWM 时序,软件层无法干预

这三个频率段之间各相差约 10 倍——Brain 无法以 1kHz 运行(算力不够),Spine 不能降到 1Hz(安全无法保证)。频率鸿沟是物理约束,不是设计选择

混合动力系统形式化

EICPS 以混合系统 H=(C,f,D,g)\mathcal{H} = (C, f, D, g) 统一描述两种动力学模式:

H:{x˙=f(x,u),xC(Flow:连续演化)x+=g(x),xD(Jump:离散切换)\mathcal{H}: \begin{cases} \dot{x} = f(x, u), & x \in C \quad \text{(Flow:连续演化)} \\ x^+ = g(x), & x \in D \quad \text{(Jump:离散切换)} \end{cases}
  • CMphyC \subset \mathcal{M}_{phy}流集合,系统在此做连续控制(Spine 层 1kHz 执行)
  • DMphyD \subset \mathcal{M}_{phy}跳集合,新 Brain 指令到达或安全事件触发离散切换
  • ff流映射,Spine 层的连续控制律(CBF + EKF + 动力学控制器)
  • gg跳映射,Brain→Spine 的状态重置函数(相位对齐、参考轨迹更新)

工程语义:Flow 对应”正常运行中 Spine 以 1kHz 执行当前模态”;Jump 对应”新 Brain 指令到达,Spine 切换到新的参考轨迹和约束集”。

跨频调度的三个核心机制

零阶保持(ZOH)

Brain 每隔约 1 秒发出一条新指令,但 Spine 在这 1000ms 内需要持续执行控制。零阶保持的策略:Spine 保存最后一次收到的 Brain 指令,在 Jump 到来之前持续以此为参考执行 Flow。

uref(t)=uBrain(tk),t[tk,tk+1)u_{ref}(t) = u_{Brain}(t_{k}), \quad t \in [t_k,\, t_{k+1})

ZOH 保证了 Brain 无响应时(网络延迟、计算超时)Spine 不停机——这是安全关键系统的必要属性。Spine 不等待,不询问,依靠最后一条指令继续保持安全执行。

平滑切换(Bumpless Transfer)

当新 Brain 指令到达触发 Jump 时,直接切换控制目标会产生控制量突变(Bump)——电机电流瞬间冲击,可能超过安全阈值或引起机械振动。

Bumpless Transfer 在跳映射 gg 中嵌入插值过渡:

x+=g(x)=x+α(t)(xnewxold),α(t):01 over Ttransx^+ = g(x) = x + \alpha(t) \cdot (x_{new} - x_{old}), \quad \alpha(t): 0 \to 1 \text{ over } T_{trans}

过渡时间 TtransT_{trans} 通常取 3–5 个控制周期(3–5ms),足以消除电流冲击,同时对语义任务层面几乎无感。

Prj167 中的典型 Jump 场景:Brain 发出”切换到防振锤抓取模态”指令,Spine 需要从”接近导线”模态平滑过渡,末端速度从 0.5m/s 线性减速到 0.1m/s,同时切换 CBF 安全函数的参数集。

状态压缩上报

Spine 产生的 1kHz 传感器数据不能原样上报 Brain——信息量过大(1kHz × 60 维状态 = 6 万个数/秒),且 Brain 根本无法以此频率消费。

压缩策略:Spine 按需触发(事件驱动)将结构化状态摘要上报 Brain:

上报内容:
  - 当前位姿摘要(SE(3) 压缩表示)
  - STL 鲁棒度 ρ(安全裕量)
  - 模态状态(当前 Flow 模态编号)
  - 异常标志(EMI 检出、接触力超限等)

触发条件(任一满足):
  - ρ 跌破预警阈值(ρ ≤ ρ_warn)
  - 模态发生切换(Jump 完成)
  - 距上次上报超过 500ms(心跳)

Brain 根据摘要决策是否重新规划,而不是被 1kHz 数据流淹没。

Zeno 行为与最小驻留时间

Zeno 行为:混合系统理论中的病态情形——系统在有限时间内无限次触发 Jump,导致时间”凝固”(时间步长趋于零),系统卡死。

在 EICPS 中,Zeno 的典型触发源是 CBF 安全边界的来回振荡:系统状态在 h(x)=0h(x) = 0 边界附近反复横跳,每次越界都触发一次 Jump,Jump 密度无限增大。

最小驻留时间定理(Minimum Dwell Time):保证每次 Jump 后系统在新模态至少停留时间 τmin\tau_{min} 再允许下一次 Jump:

tk+1tkτmint_{k+1} - t_k \geq \tau_{min}

在 Prj167 中,τmin=10ms\tau_{min} = 10\text{ms}(10 个控制周期)——物理上对应机械臂从响应指令到稳定运动的最短建立时间。这保证每次模态切换后系统有足够时间稳定,不会陷入无意义的快速振荡。

Zeno 检测算法

class ZenoDetector:
    def __init__(self, tau_min: float = 0.01, window: int = 10):
        self.tau_min = tau_min     # 最小驻留时间(秒)
        self.jump_times = []       # 记录最近若干次 Jump 时间戳
        self.window = window

    def record_jump(self, t: float) -> dict:
        self.jump_times.append(t)
        if len(self.jump_times) > self.window:
            self.jump_times.pop(0)

        if len(self.jump_times) < 2:
            return {"zeno": False}

        # 最近若干次 Jump 的最小间隔
        intervals = [self.jump_times[i+1] - self.jump_times[i]
                     for i in range(len(self.jump_times)-1)]
        min_interval = min(intervals)

        return {
            "zeno": min_interval < self.tau_min,
            "min_interval": min_interval,
            "action": "HOLD_FLOW" if min_interval < self.tau_min else "OK"
        }

Prj167 完整调度流程

以防振锤更换任务为例,跨频调度的完整时序:

t = 0s    Brain 发出 "开始接近防振锤" 指令
          → Jump:Spine 切换到 [APPROACH] 模态,Bumpless Transfer 3ms
          → Flow:Spine 以 1kHz 执行接近轨迹,EKF 持续更新位姿

t = 8s    Brain 发出 "切换到抓取模态" 指令
          → Jump:[APPROACH] → [GRASP],速度从 0.3m/s 过渡到 0.05m/s
          → Flow:CBF 切换为接触力约束,STL 规约更新为抓取规约

t = 9.2s  Spine 检出 ρ ≤ ρ_warn(导线距离接近预警)
          → 事件触发上报 Brain
          → Brain 重新评估,下发微调指令

t = 15s   防振锤到达安装位置
          → Spine 检出 STL-TASK 规约满足(任务完成条件)
          → Jump → [RETURN] 模态

整个 15 秒任务中,Brain 介入约 3–5 次(1Hz 内),Spine 执行了约 15,000 个控制周期,ZOH 填补了其中 99% 的”Brain 沉默”时间。


🔢 完整实现:Flow-Jump 联合求解(scipy.integrate.solve_ivp + 跳集事件检测)、Bumpless Transfer 插值器、ZenoDetector 完整 Python 实现见 数学讲义·Flow-Jump 动力学

任务切换机制(HTN 如何生成 Jump 指令序列)

实时安全监控(CBF)(Spine 层 Flow 阶段的 1kHz 安全约束)


参考文献

#文献关联概念
[1]Goebel, R., Sanfelice, R. G., & Teel, A. R. (2012). Hybrid Dynamical Systems: Modeling, Stability, and Robustness. Princeton University Press.混合动力系统框架,Flow/Jump,Zeno,最小驻留时间
[2]Brooks, R. A. (1986). A robust layered control system for a mobile robot. IEEE Journal on Robotics and Automation, 2(1), 14–23.包容架构,分层响应速度
[3]Liberzon, D. (2003). Switching in Systems and Control. Birkhäuser.切换系统稳定性,最小驻留时间定理