“互卷积(cross-convolution)”在这里其实指用”互相关(cross-correlation,互相关函数)”来对齐两段时间序列,从而估计它们之间的时间延迟。之所以会叫”互卷积”,是因为互相关在时域上等价于把其中一个信号时间翻转后与另一个信号做卷积:r_xy = x * y_rev,因此工程里常用 FFT 以”卷积方式”实现互相关。
要点
- 目标:找到期望夹爪宽度序列 u[n](你发的命令)与实测宽度 y[n](传感器读到的)之间的最优滞后 k*,则端到端延迟 le2e = k* · dt。
- 定义(离散互相关):。当 r_xy[k] 在 k=k* 处最大时,说明 y 相对 x 滞后 k* 个采样点。
- 等价关系:互相关 r_xy = x ⋆ y = x * y_rev,其中 y_rev[n] = y[-n];用 FFT 可高效计算:r = ifft(FFT(x) · conj(FFT(y)))。
实操步骤
- 预处理:把 u、y 去均值、按标准差归一化;必要时带通/低通滤波;重采样到相同频率。
- 互相关:计算 r = xcorr(u, y)(或用 FFT 方式实现),并做足够的零填充(避免循环相关)。
- 找峰值:k* = argmax_k r[k];若 k*>0,表示 y 滞后 u;le2e = k* · dt。
- 精细化:对峰值附近 3 点做抛物线插值,得到亚采样级精度的 k*。
- 夹爪执行延迟:laction = le2e − lobs(再扣除本体感知链路的观测延迟)。
注意事项
- 激励要有“形状”:正弦/阶跃/扫频比常值更容易对齐;信号太平或重复图案会产生多重峰。
- 同步与采样:确保同一时钟域;u、y 统一采样周期 dt。
- 正则化:用“归一化互相关(NCC)”可降低幅值变化的影响。
- 零填充:长度至少 N+M−1,避免 FFT 造成的循环混叠。
极简示例(Python/NumPy)
import numpy as np
from numpy.fft import rfft, irfft
def xcorr_fft(x, y):
n = len(x) + len(y) - 1
nfft = 1 << (n-1).bit_length() # 最近的2次幂
X = rfft(x - x.mean(), nfft)
Y = rfft(y - y.mean(), nfft)
r = irfft(X * np.conj(Y), nfft)
# 把“负滞后”移到前半段,得到 [-len(y)+1, len(x)-1] 的滞后范围
r = np.concatenate([r[-(len(y)-1):], r[:len(x)]])
lags = np.arange(-len(y)+1, len(x))
return r, lags
r, lags = xcorr_fft(u, y) # u=命令,y=测量
k = lags[np.argmax(r)]
le2e = k * dt # 秒一句话概括 他们说的“互卷积”就是用互相关来“滑动比对”两段信号,找到最大相似度的位置,以此估计夹爪命令与测量之间的时间滞后,从而得到端到端执行延迟。