| Quantity | Value | Source |
|---|---|---|
| Actuator natural frequency (resonance) | (f_n = 250;) | given |
| Nyquist‑required sampling rate | (f_{s,} = 2f_n = 500;) | Nyquist‑Shannon |
| Diffusion video model frame rate | (f_{} = 30;) | given |
Verdict: A 30 fps generative video diffusion model cannot satisfy the Nyquist criterion for a 250 Hz actuator.
A rotary joint driven by a brushed‑less motor with gear reduction can be linearised around an operating point as
[ J+b+k= _{} , ]
where (J) is reflected inertia, (b) viscous damping, (k) torsional stiffness, and (_{}) the commanded torque. The natural (undamped) frequency and damping ratio are
[ _n = ,= . ]
For the Optimus hip/knee actuators the resonance lies in the band
[ f_n = ;, ]
and we adopt the worst‑case (f_n = 250;) for the analysis.
A discrete‑time controller with sampling period (T_s = 1/f_s) introduces a pure time delay of (T_s/2) (zero‑order hold) in the frequency domain. The phase lag at frequency (f) is
[ (f) = -360^, f , T_s ;;(360^). ]
Diffusion model: (T_s = 1/30;=33.33;).
[ _{}(250;) = -360^ = -3000^. ]
Diffusion video models generate frames by iteratively applying a stochastic noise schedule
[ x_{t+1} = ,x_t + ,_t ,_t(0,I), ]
which is a non‑Hamiltonian Markov chain. The expected kinetic energy after one step is
[ [E_{t+1}] = (1-_t)E_t + _t , (M^{-1}), ]
where (M) is the mass matrix. Unless (_t=0) (no diffusion), energy is not conserved; the injected noise acts as an uncontrolled torque disturbance with variance proportional to (_t). At 30 Hz the disturbance bandwidth folds into the actuator band, exciting resonance.
Any irreversible bit operation dissipates at least
[ E_{} = k_B T ^{-21};;(T=300). ]
For a band‑limited signal with maximum frequency (f_{}) (here the actuator resonance), the sampling frequency must satisfy
[ f_s f_{}. ]
With (f_{}=f_n=250;) → (f_{s,}=500;).
The diffusion model provides (f_s=30;<f_{s,}) → aliasing of higher‑frequency dynamics into the baseband, manifesting as phase lag and spurious excitation.
XPBD solves the constrained dynamics
[ _{q^{n+1}} |q{n+1}-q{n}-t,v{n}|_{M}{2} C_i(q^{n+1})=0,; i=1N_c, ]
by iteratively applying Gauss‑Seidel projections onto each constraint manifold. The update for a single constraint (C(q)=0) reads
[ q = -,_q C, ]
where () is the compliance inverse stiffness.
The zero‑order hold (ZOH) equivalent of a continuous‑time plant (G(s)) sampled at (T_s) is
[ G(z)={G(s)}. ]
The phase contribution of the ZOH alone is
[ G_{}(e^{jT_s}) = -. ]
Adding the controller delay (one sample) gives the total lag used in Section 1.2.
Power dissipated by a digital operation of energy (E) at rate (f) is
[ P = E f . ]
For diffusion: (E;), (f=30;) → (P;) per joint just for the neural inference, plus the dominant GPU/TPU static power (> 1 W) that must be supplied from the vehicle battery, violating the edge‑power budget.
| Metric | Value | Source |
|---|---|---|
| Actuator resonance | (250;) | given |
| Nyquist‑required Hz | (500;) | derived |
| Diffusion sampling Hz | (30;) | given |
This page does not include a benchmark harness. The numbers above are stated.
Pseudo‑code (WebGPU WGSL):
// constants
const MAX_JOINTS = 30u;
const MAX_CONSTRAINTS_PER_JOINT = 4u;
struct Joint { vec3 pos; vec4 quat; vec3 vel; vec3 omega; };
struct Constraint { vec3 gradient; float compliance; float bias; };
// buffers (bindless, zero allocation after init)
struct Buffers {
joint: array<Joint>;
cons: array<Constraint>;
invM: array<vec3>; // 1/m_i for each DOF
};
@group(0) @binding(0) var<storage, read_write> buf: Buffers;
@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) idx: vec3<u32>) {
let j = idx.x;
if (j >= MAX_JOINTS) { return; }
// local copy (registers only)
var pos = buf.joint[j].pos;
var quat = buf.joint[j].quat;
var vel = buf.joint[j].vel;
var om = buf.joint[j].omega;
// Gauss‑Seidel sweep over constraints of joint j
for (var c = 0u; c < MAX_CONSTRAINTS_PER_JOINT; c = c + 1u) {
let cons = buf.cons[j * MAX_CONSTRAINTS_PER_JOINT + c];
let C = dot(cons.gradient, vec4(pos, quat)) + cons.bias;
let denom = dot(cons.gradient, buf.invM[j * 6 .. (j+1)*6]) + cons.compliance;
let delta = -C / denom * cons.gradient.xyz; // simplified for translational part
pos += delta * cons.gradient.xyz;
// analogous update for quat, vel, om omitted for brevity
}
buf.joint[j].pos = pos;
buf.joint[j].quat = quat;
buf.joint[j].vel = vel;
buf.joint[j].omega = om;
}