跳转至

深度研究报告:底盘运动规划中的跟踪微分器与卷积滤波技术解析

在现代高性能移动机器人与自动化底盘控制系统的工程实践中,运动轨迹的平滑性不仅是衡量控制算法优劣的核心理论指标,更是直接决定底层机械结构疲劳寿命、伺服电机过载极限以及末端执行器定位精度的关键物理因素。当前,底盘速度规划模块(基于 chassis_calculations.c 顶层调度与 td.c 算法核心)广泛采用了由中国控制理论学者韩京清教授首创的跟踪微分器(Tracking Differentiator, TD)作为轨迹平滑的核心引擎。该架构在实现快速无超调的信号跟随方面展现出了卓越的工程价值,但在系统向更高阶的物理平滑性(即 S 型速度曲线与加加速度连续)演进时,逐渐暴露出了由其底层二阶非线性数学逻辑所固有的物理瓶颈。

本报告旨在从代码底层的原子逻辑出发,深度审计现有底盘速度规划模块的运行机制与架构演进,从第一性原理和严格的数学推导层面解构“卷积平滑”(移动平均滤波,MAF)在消除刚性冲击中的核心作用。在此基础上,报告将全方位对比原生高阶跟踪微分器与基于卷积原理的轻量化滤波方案的优劣,并为现有 C 语言架构提供一套兼顾极低算力消耗与极致平滑性能的代码重构最佳实践。

现有代码架构深度审计与物理瓶颈分析

在深入探讨更高级的平滑算法之前,必须对系统现有的运行机理进行透彻的白盒审计。底盘运动控制的本质是一个将离散的、可能存在剧烈突变的用户或导航层指令,转化为符合物理执行器动力学约束的连续平滑指令的过程。

顶层调度逻辑与模式降级机制的演进

chassis_calculations.c 的核心调度函数 chassis_plan_step 中,系统负责在每一个实时操作系统(RTOS)控制周期内,将给定的目标速度(X 轴、Y 轴平移与 Yaw 轴旋转)转化为受限的平滑输出。根据对源代码的深度解构,该函数的运行机制依赖于严格的时间步长计算与多轴独立状态更新 。

系统首先通过 compute_dt_sec(xTaskGetTickCount()) 获取自上一次调度以来的时间差 dt。为了保障离散时间积分的数值稳定性,系统在获取 dt 后会进行严格的边界检查,一旦发现时间步长异常(例如 dt <= 0 或超过了宏定义的极限单步时间 MAX_DT_SEC),系统将立即挂起本次规划,维持上一周期的输出指令。这种防御性编程在嵌入式 RTOS 任务可能遭遇高优先级中断抢占的复杂工况下,是保障系统不发生积分爆炸的基础。

在确认时间步长有效后,调度器进入核心的分轴模式路由逻辑。代码库中一个极其显著的架构演进在于版本 2.1 对轨迹平滑模式的“降级”与统一化处理。在早期的系统设计中,为了实现 S 型的柔和启停,架构中独立定义了 CHASSIS_SPEED_PLAN_COSINE(余弦曲线规划)和 CHASSIS_SPEED_PLAN_POLYNOMIAL(五次多项式规划)模式。这些模式原本依赖于显式的时间参数化方程,例如余弦形状插值 \(0.5 \times (1.0 - \cos(\pi \times p))\),以及基于归一化时间参量 \(p\) 的五次多项式求值 \(p^3 \times (10.0 + p \times (-15.0 + 6.0 \times p))\)

然而,显式的解析曲线在应对动态变化的机器人底盘时存在致命缺陷:此类轨迹生成器通常要求预先知道确切的起始状态、终止状态以及规划持续时间(Duration)。当底盘在运行中途突然接收到新的目标速度指令(即在线轨迹生成,Online Trajectory Generation 场景)时,显式曲线极难在保证高阶导数连续的前提下进行无缝的轨迹重置与拼接 。基于这一工程痛点,现有代码在版本演进中将这些复杂的解析模式予以挂起(相关代码被严谨地包裹在 #if 0 的预编译指令内以作历史参考),转而采取了一种降级映射策略:只要系统未处于最基础的匀加速梯形模式(CHASSIS_SPEED_PLAN_TRAPEZOID),所有的 S 型曲线需求均被无条件重定向至 step_td_axis,交由二阶跟踪微分器统一接管处理 。

这种架构映射的工程优势极为明显:TD 算法本质上是一个闭环的非线性反馈动态系统,它不需要预先计算总时长,也不需要维持一个脆弱的归一化时间变量。无论目标指令在何时发生何种幅度的突变,TD 都能依据当前的内部状态(位置与速度)即时计算出趋近目标的最优控制量。然而,这种映射也直接导致系统继承了二阶 TD 算法在物理动力学层面固有的缺陷。

跟踪微分器底层的相平面数学逻辑

为了理解这一物理缺陷的根源,必须深入剖析 td.c 中的核心算法 td_fhan。该函数是韩京清教授自抗扰控制(ADRC)理论中的精髓——离散时间最速控制综合函数(Fastest Control Synthesis Function)的 C 语言实现 。该算法的控制目标是:针对一个纯二阶积分器被控对象,在系统允许的最大控制力(即最大加速度 \(r\))严格受界的约束下,寻找一种反馈控制律,使得系统状态(位置误差 \(x_1\) 与速度 \(x_2\))能够以理论上的最短时间被驱动至相平面的原点,且在这个过程中绝对不能出现超越目标值的过冲(Overshoot)现象。

在连续时间域中,由庞特里亚金极大值原理(Pontryagin's Maximum Principle)可知,受界二阶系统的最优控制策略是典型的 Bang-Bang 控制,其在相平面上的最优切换轨线是一条由两段抛物线拼接而成的曲线。然而,直接将连续 Bang-Bang 控制离散化应用于数字微控制器中,会导致系统在目标原点附近发生剧烈的高频正负切换,引发灾难性的高频颤振(Chattering) 。

td_fhan 的数学创新正是在于它完美解决了离散化带来的颤振问题。算法首先计算了两个极其关键的离散尺度参数:\(d = r \cdot h\) 代表了系统在单次采样周期 \(h\) 内能够产生的最大速度变化量;\(d_0 = h_0 \cdot d\) 则利用滤波因子 \(h_0\) 人为定义了相平面原点附近的一个“线性滤波缓冲区” 。

紧接着,算法引入了具有前瞻性的预测误差计算:\(y = x_1 + h \cdot x_2\)。这一步巧妙地利用当前速度对下一时刻的位置进行了提前预估,从而补偿了数字控制系统中固有的零阶保持器(ZOH)相位滞后 。基于这个预测状态,算法计算出决定系统命运的离散最优制动切换曲线: \(a_0 = \sqrt{d^2 + 8 \cdot r \cdot |y|}\) 这个包含平方根运算的非线性代数方程,正是连续时间抛物线轨线 \(v = \sqrt{2as}\) 在离散时域下的精确反函数扩展 。它精确计算出了系统为了恰好停在目标点所必须具备的临界状态距离。

在获得了切换基准后,控制器通过严格的分支逻辑将相平面划分为两种截然不同的控制区域:

  1. 线性滤波积分区(靠近目标): 当预测状态满足 \(|y| \le d_0\) 时,系统判定自身已经进入目标点附近的微小邻域。此时,算法彻底抛弃了非线性的 Bang-Bang 逻辑,转而采用一种类似于比例-微分(PD)控制的线性负反馈规律 \(a = x_2 + y/h\)。最终输出指令通过 \(-r \cdot a/d\) 进行了平滑的比例衰减。这种设计使得系统在逼近静止的最后阶段能够柔和地收敛,如同在弹簧阻尼系统中加入了极大的黏性摩擦,彻底消灭了稳态颤振 。

  2. 非线性最优饱和区(远离目标): 当系统状态位于 \(|y| > d_0\) 时,说明距离目标尚有显著差距。此时系统严格遵循最速控制轨线,计算出偏离切换曲线的代数距离 \(a = x_2 + 0.5 \cdot (a_0 - d) \cdot \text{sign}(y)\)。只要这个调整需求足够大(\(|a| > d\)),系统的最终输出将被冷酷无情地钳位在硬件允许的最大物理边界上,即 \(fhan\_out = -r \cdot \text{sign}(a)\)

梯形速度曲线的生成与无限加加速度(Jerk)的物理瓶颈

上述精妙的非线性数学逻辑,决定了整个底盘运动规划输出的宏观物理形态。td_fhan 函数计算并返回的数值,在物理量纲上代表着底盘的加速度指令。由于在系统大范围响应目标阶跃时,其状态长期处于“非线性最优饱和区”,输出指令会被强行限制在正向最大加速度 \(+r\) 或反向最大加速度 \(-r\)

当这个加速度指令进入外层的 td_update 循环中进行数值积分(\(new\_x2 = x_2 + h \cdot fhan\_out\)),并结合 chassis_plan_step 中基于 max_speed_xy 的平面的绝对速度物理截断(即 abs_limit(&new_x2, td->max_x2)),底盘在时域上的运行轨迹不可避免地坍缩成了工业界最为典型的梯形速度曲线(Trapezoidal Velocity Profile) :

  1. 加速爬升期: 误差巨大,加速度恒定为 \(+r\),积分导致速度呈现严格的线性正比例斜坡上升。

  2. 匀速巡航期: 速度触及底盘的物理极限 max_x2,外层裁剪函数强行切断积分,此时加速度陡降至 \(0\),速度保持为一条水平直线 。

  3. 制动减速期: 系统状态跨越相平面上的最优制动切换曲线 \(a_0\),加速度瞬间翻转为恒定的 \(-r\),速度以恒定的负比例斜率线性下降,直至在原点附近平滑归零 。

从一阶导数(速度)的角度来看,梯形曲线确实保证了速度本身的连续性,避免了电机控制指令出现断崖式跳变。然而,如果我们在微积分的阶梯上再攀登两阶,这种控制策略的刚性物理瓶颈就会以一种极具破坏性的方式暴露出来。

梯形速度曲线的导数是加速度曲线,而由于梯形的边是由直线构成的,其对应的加速度曲线是一系列离散的矩形脉冲(Rectangular Pulses) 。而在物理学与高阶运动学中,加速度的时间导数被称为加加速度(Jerk,物理学符号通常记为 \(j = da/dt\)) 。在系统由静止瞬间起步(加速度从 \(0\) 突变到 \(r\))、加速转为匀速(加速度从 \(r\) 突变回 \(0\))、以及开始全力刹车(加速度瞬间跌至 \(-r\))的三个临界切换点上,加速度函数经历了垂直的阶跃。在数学上,阶跃函数的导数是狄拉克 \(\delta\) 函数(Dirac Delta Function),这意味着在这些微秒级的瞬间,底盘所承受的 Jerk 理论上趋近于无穷大(Infinite Jerk)

在由质量、刚度和阻尼构成的真实物理底盘系统中,无穷大的 Jerk 是极其危险的。伺服电机的电磁转矩与加速度成正比,当系统要求加速度在 \(0\) 毫秒内发生跳变时,电机驱动器的电流环必须输出一个极具冲击性的巨大尖峰电流。这种电流突变不仅极大地考验了功率元器件的热容量,更致命的是,剧烈的转矩阶跃会像一把铁锤一样敲击底盘的传动齿轮、悬挂减震器以及轮胎与地面的摩擦接触面。对于轻载或缺乏阻尼的机器人,无限大的 Jerk 会直接激发机械结构的固有谐振频率,导致底盘在起停瞬间产生肉眼可见的剧烈颤振、履带打滑以及不可逆的机械磨损 。现有的二阶 TD 算法受限于其控制核心的微分阶数,在数学原理上就完全丧失了对 Jerk 进行约束的能力,这正是当前代码在追求极致丝滑运动(S-Curve)时必须跨越的物理鸿沟 。

“卷积魔法”原理:从第一性原理重构时域平滑

为了在极端严苛的微控制器算力约束下,彻底消除二阶系统梯形速度曲线带来的刚性物理冲击,引入信号处理领域的移动平均滤波(Moving Average Filter, MAF) 技术,是一种被工业运动控制界推崇备至的优雅范式。这种技术通过极其简易的算术迭代,在数学本质上实现了运动学方程的完美升阶,由于其效果极其显著且运算量极低,常被工程师们戏称为“卷积魔法” 。

卷积平滑的核心概念与物理直觉解构

在高等数学与数字信号处理(DSP)的语境中,所谓“平滑滤波”,其核心数学算子即为卷积(Convolution)。卷积不仅是抽象的积分符号,更是描述系统如何将其对过去历史的“记忆”与当前的“输入”进行混合叠加的物理过程。

移动平均滤波器(MAF)作为最基础的有限冲激响应(FIR)滤波器,其冲激响应(Impulse Response,即系统对一个瞬间脉冲的反应)在时域上表现为一个宽度为 \(T_i\)(对应离散域的窗口长度 \(N\))、幅值为 \(1/T_i\) 的完美矩形脉冲。由于其形状方正,在图像与信号处理界也被形象地称为“盒式滤波器”(Box Filter) 。

当我们试图对现有的运动规划进行平滑改造时,我们所面对的数学公式如下:

\(Scurve(t) = Trapezoid(t) * BoxFilter(t) = \int_{-\infty}^{\infty} Trapezoid(\tau) \cdot BoxFilter(t - \tau) d\tau\)

如果抛开枯燥的微积分符号,用物理直觉和可视化的滑动窗口来解构这个公式:想象我们在时间轴上拥有一个宽度固定的“观察窗”。对于当前时间点 \(t\) 应该输出的确切速度,系统并不是直接采用规划器输出的原始值,而是将这个观察窗向过去的历史时间滑动,把窗口内框住的所有“旧速度”和“新速度”相加,计算出一个算术平均值作为当前的实际输出 。

这个平均化过程的“魔法”在于其对系统突变状态的“拉扯”作用。当原始梯形速度曲线处于长期的匀速直线段时,窗口内框住的数值全部相同,平均后的输出等于原始输出,信号毫无畸变。然而,当观察窗滑过梯形曲线的“折角”(即加速度发生断崖式阶跃的瞬间点)时,窗口内部同时包含了阶跃发生前的低速数据与阶跃发生后的高速数据。通过求均值,原本发生在无穷小瞬间的几何折角,被强制分摊并延展到了整个时间窗口 \(T_i\) 的长度内。尖锐的锐角被“打磨”成了一段平滑的二次抛物线过渡,宏观上,刚硬的梯形曲线被柔化成了优美的 S 型曲线 。

消除加速度突变的严谨微积分证明

为什么仅仅对“速度”进行一次看似简单的滑动平均,就能够顺理成章地消除“加速度”的突变?这个结果并非巧合,而是由微积分中卷积算子的微分传递性质所严格保证的。

根据线性时不变系统(LTI)的基本微分定理,两个连续函数卷积的导数,等于其中任意一个函数的导数与另一个函数的卷积。以数学公式表达即为:

\(\frac{d}{dt}[f(t) * g(t)] = \frac{df(t)}{dt} * g(t) = f(t) * \frac{dg(t)}{dt}\)

将这一定理代入我们的运动控制系统:

  1. 已知前置条件: 平滑后的最终速度 \(V_{smooth}(t) = V_{trapz}(t) * BoxFilter(t)\)

  2. 求解加速度: 我们对平滑后的速度求关于时间的导数,即得到平滑后的系统加速度 \(A_{smooth}(t)\)

    \(A_{smooth}(t) = \frac{d}{dt}[V_{smooth}(t)] = \frac{d}{dt}[V_{trapz}(t)] * BoxFilter(t)\)

  3. 降维打击: 根据前文对 TD 的物理瓶颈分析,原始梯形速度的导数 \(\frac{d}{dt}[V_{trapz}(t)]\),正是那个包含着无限大 Jerk 隐患的矩形加速度脉冲序列 \(A_{rect}(t)\)

  4. 形态重塑: 因此,最终系统输出的实际加速度 \(A_{smooth}(t) = A_{rect}(t) * BoxFilter(t)\)。这就意味着,平滑后的加速度等于原始的矩形加速度与矩形 Box Filter 的卷积。

在信号几何学中,一个宽度有限的矩形脉冲与另一个矩形脉冲的卷积结果,其解析几何形态必然是一个连续的等腰梯形(若两矩形宽度不等,则为普通梯形) 。

至此,数学逻辑的闭环完美合拢:原本呈现垂直阶跃跳变的加速度,经过这层不起眼的卷积处理后,自动被展宽并倾斜,变成了带有恒定斜率的梯形加速度。由于加速度的边变成了倾斜的直线,其导数——也就是令系统颤振的元凶加加速度(Jerk)——在这些斜坡区间内不再是无穷大的狄拉克 \(\delta\) 脉冲,而变成了一个被严格限制在某一有限幅值内的矩形常数信号 。系统的加速度实现了绝对意义上的连续性,所有的机械刚性冲击在理论根源上被彻底抹除 。

频域抑制机制与时域全景演变分析

为了进一步论证“卷积魔法”的科学性,我们必须跨出时域,从频域(Frequency Domain)的上帝视角审视这一过程。

在离散系统中,移动平均滤波器实际上是一个具有极佳低通特性的有限冲激响应(Low-pass FIR)滤波器 。假设滤波器窗口包含 \(N\) 个采样点,其在 Z 域的传递函数为: \(H(z) = \frac{1}{N} \sum_{k=0}^{N-1} z^{-k} = \frac{1}{N} \frac{1 - z^{-N}}{1 - z^{-1}}\)

通过代入 \(z = e^{j\omega}\) 获取其频率响应,我们可以发现其幅频响应曲线呈现出典型的 Sinc 函数包络(\(\frac{\sin(x)}{x}\) 的形态)。这个 FIR 滤波器最引人注目的特性在于:它在频率轴上的 \(f = k \cdot (F_s / N)\) 处(其中 \(F_s\) 为采样率,\(k\) 为正整数)存在深不见底的绝对零点(Nulls / Notches),并且对高频分量提供了 \(-20\text{dB/dec}\) 的基础衰减率 。

当底盘速度发生梯形折跃时,这种几何上的“尖点”在频域中包含了极度丰富的宽带高频谐波能量。正是这些高频能量激发了机器人的结构共振。当指令通过这个 FIR 滤波器时,Sinc 函数特有的频域谷点会像精准的手术刀一样,将那些容易诱发抖动的特定高频谐波分量无情切除,只放行维持底盘宏观物理位移所需的低频基波信号 。

为了直观展现这一过程对底盘物理运动的重塑,我们可以通过以下时域状态变量演变全景(Position, Velocity, Acceleration, Jerk 的连续积分链)来进行对比审视:

引入滑动平均滤波器(Ring Buffer)前后的轨迹形态变化全景图:

================================================================================ 阶段 1: 原始二阶 TD 输出 (梯形速度规划) - 存在刚性冲击

(P) 位置 Position (V) 速度 Velocity (A) 加速度 Accel (J) 加加速度 Jerk

. ------- +r +-------+ ∞| |

/ / | | | |

/ / | | +-------+

/ 0 ---+ +---- 0 |

/ |

------- 0 ---+ +--- 0 -r +---+ -∞ (冲击点)

  • 痛点:加速度 (A) 瞬间从 0 跳变至 +r,其导数 (Jerk) 在瞬间趋于无穷大 (∞)。

    底盘在这些点会遭遇如同铁锤敲击般的刚性扭矩阶跃。

================================================================================ 阶段 2: 引入卷积魔法后 (TD + 移动平均滤波) - 柔性 S 型曲线

(P) 位置 Position (V) 速度 Velocity (A) 加速度 Accel (J) 加加速度 Jerk

. .-------. +r .---. +j +---+

/ / / | |

/ / / 0 + +---+ + 0

/ 0 --+ +--- 0 | | |

/ +---+ -j

------- 0 --+ +-- 0 -r .-. (有界且分布均匀)

  • 魔法效果:速度 (V) 的起步和停止不再带有尖锐折角,呈现圆润的 S 型抛物线过渡。
  • 加速度 (A) 变异为梯形,具备了恒定的上升与下降斜率。
  • 加加速度 (J) 被完美地限制在了由滤波器窗口长度决定的小幅值常数矩形框内,冲击被彻底吸收。

    ================================================================================

通过这一系列时域与频域的解构,我们可以断言:在底层加入一层简易的移动平均卷积操作,绝非是工程上的粗暴拼凑,而是一种深度契合了连续动力学积分链、并且具备坚实泛函分析基础的降维打击策略。

方案多维大比武:原生三阶 TD vs. 二阶 TD + 卷积滤波

在知晓了二阶 TD 存在无穷大 Jerk 缺陷后,控制理论界的正统解决方案通常是升级系统方程的阶数,即推导并实现原生的“三阶韩式跟踪微分器”(3rd-Order Tracking Differentiator)。由于三阶系统在内部直接积分了位置、速度和加速度三个状态,因此其输出天生自带连续的加速度与有界的 Jerk 。然而,在工业界特别是单片机(MCU)算力捉襟见肘的机器人底盘控制系统中,我们必须在“理论完美度”与“工程可实现性”之间进行残酷的取舍。

下表从核心系统指标出发,对“原生三阶 TD”与“二阶 TD 级联卷积滤波(MAF/Ring Buffer)”两种实现 S 型速度规划的范式进行了极致深度的评估。

评估核心维度 原生三阶跟踪微分器 (3rd-Order Han's TD) 二阶 TD + 卷积滤波 (2nd-Order TD + MAF) 胜出者与工程定论
理论推导模型 基于三阶纯积分器的非线性最速控制规律严格数学求解。 混合架构:非线性二阶最速控制级联线性时不变 (LTI) FIR 低通滤波。 三阶 TD。理论上具有更高阶的全局数学严密性。
加加速度 (Jerk) 连续性 系统状态原生输出,Jerk 理论上呈现完美的矩形交替分布,加速度曲线绝对连续,系统趋近目标的最速性达到数学极值极限 。 严格确保 Jerk 在离散域内有界且呈现矩形脉冲分布,同样彻底消除无穷大冲击点,S 型起步降落柔顺平滑 。 平局。在离散微处理器中,两者呈现出的物理防冲击效果肉眼无法分辨。
计算复杂度 (CPU 周期消耗) 极度高昂。 随着维度的增加,相平面的最佳切换曲面由二维曲线升级为三维超曲面。其离散时间的解析解必须在单步内执行极其复杂的非线性代数运算,涉及多次嵌套的浮点立方根求解(cbrtf)以及极度繁琐的分段多项式条件判断,将榨干 MCU 大量的 FPU 周期 。 几乎忽略不计。 依然复用现有二阶 TD 的单次开平方运算(sqrtf)。级联的 MAF 若采用滑动累加算法,单次更新时间复杂度仅为绝对恒定的 \(O(1)\),只需一次浮点加法、一次浮点减法和一次标量乘除法 。 卷积滤波完胜。在动辄上千赫兹的底盘高频控制环中,省下的 CPU 周期可以留给上层更为复杂的 SLAM 或 MPC 算法。
内存消耗 (RAM 占用) 极低。作为纯状态机算法,仅需定义和维护三个浮点状态变量(位置 \(x_1\)、速度 \(x_2\)、加速度 \(x_3\)),无需保留任何过去的历史控制数据 。 较高。受限于卷积的“时间滑窗”本质,必须在堆栈中预留并维护一块固定大小的环形缓冲区(Ring Buffer)。内存开销与窗口长度 \(N\) 严格成正比。例如 \(N=100\) 时,三轴共需耗费约 \(1.2\) KB 的连续 RAM 空间 。 三阶 TD 胜出。但现代 MCU(如 STM32 系列)通常具备上百 KB 甚至 MB 级的 SRAM,用微量内存换取巨大的 CPU 算力是极其划算的买卖。
响应延迟 (Group Delay 计算) 存在极其复杂、高度非线性且极难解析预估的相位滞后。其延迟时长并非定值,而是随着跟踪目标阶跃误差的大小动态变化,在大范围追踪时会产生强烈的非线性动态追赶效应 。 存在恒定、确定且完全可通过解析公式计算的群延时(Group Delay)。根据离散信号处理原理,FIR 移动平均滤波器的群延时恒定为 \(\tau_g = \frac{N-1}{2} T_s\)\(T_s\) 为采样周期)。其相位滞后随频率严格呈线性关系,不会导致信号包络畸变 。 卷积滤波完胜。对于机器人多轴联动而言,确定且恒定的群延时使得系统极易在空间域进行时间补偿与轨迹同步,这是复杂运动规划的核心诉求。
参数整定与调试难度 堪称地狱级。 需要同时平衡控制系统中追踪因子 \(r\) 与三个相互纠缠的高频滤波因子。由于高维相平面的非线性耦合极其严重,参数空间呈现混沌态,稍有偏差即可导致系统震荡发散或进入局部极限环颤振 。 简单直观。 参数完全解耦:二阶 TD 的 \(r\) 专门负责决定底盘物理基准加速能力(力量),而滤波器的窗口大小 \(N\) 则专属掌控 S 曲线的圆润程度(柔和度)。两个参数各司其职,调整时所见即所得。 卷积滤波完胜。极大地降低了电控工程师在产线上的部署与校调成本。
系统鲁棒性与异常处理 对离散系统的采样周期抖动极度敏感。此外,纯微分结构天然会指数级放大传感器带入的高频白噪声,必须依赖严苛的前置抗混叠低通处理 。 具备极强的结构确定性与鲁棒性。纯前向 FIR 结构绝对稳定,永远不会产生内部振荡。应对任何异常工况,只需简单清空 Ring Buffer 即可实现无缝状态复位 。 卷积滤波完胜

通过上述全方位的方案大比武,我们可以得出极其清晰的工程定论:在微控制器(MCU)受限的底层执行环境中,强行部署结构复杂的高阶(三阶)TD 是极不经济且伴随极高调试风险的学术理想主义。相反,采用“二阶 TD 产生限幅梯形速度核心 + Ring Buffer 卷积滑动平均”的混合方案,本质上是在运用“算法降维”的智慧。系统利用廉价的静态 RAM 空间去置换极其宝贵的 CPU 计算时间,同时获得了与高阶系统等效的连续 Jerk 物理属性,这无疑是目前工业级底盘运动控制实现 S 曲线的最佳实践架构 。

最佳实践:如何侵入式重构现有 chassis_calculations 架构

在理论选型落定之后,真正的工程挑战在于如何将上述的“卷积魔法”优雅、健壮且无损地嵌入到现有的由 chassis_plan_step 主导的高频循环调用链中。这绝非简单地在代码末尾添加一个滤波函数,而是需要在一套严密的流水线架构中精雕细琢数据结构、注入位置、初始化时序以及数字精度防微杜渐等重重边界条件。

1. 数据结构设计:Ring Buffer 的内存安全嵌入

为了在不破坏现有 ChassisPlanCtx(底盘规划上下文)高内聚模块化特性的前提下引入历史缓冲,我们需要为滑动平均滤波器设计一个专用的环形缓冲机制(Ring Buffer)。由于该逻辑需要在极其严苛的实时中断或高频任务中运行,我们坚决摒弃动态内存分配(避免 malloc 带来的内存碎片与时间不确定性),采用静态固定数组结合指针漂移的实现方式 。

在相应的头文件中,构建如下的基础结构:

C

// 定义移动平均滤波器的滑动窗口深度
// 若控制周期 dt 为 1ms,N=50 代表 50ms 的平滑延展宽度
#define MAF_WINDOW_SIZE 50 

typedef struct {
    float buffer; // 静态连续内存空间,存储历史速度样本
    uint16_t head;                 // 环形写指针,指示下一个数据覆写位置
    float current_sum;             // 维护窗口内部所有有效样本的代数累加和
    uint16_t count;                // 记录当前缓冲区内真正的有效数据个数,防零填充冲击
} MovingAverageFilter;

随后,将这套结构无缝嵌入到 ChassisPlanCtx(或相应的底层静态全局变量 g_plan)中,为平移 X、平移 Y 和旋转 Yaw 三个正交控制轴各自分配一个独立的滤波器实例:

C

typedef struct {
    //... 原有 TD 和速度控制变量...
    MovingAverageFilter velocity_maf; // :X, :Y, :Yaw
} ChassisPlanCtx;

2. 核心架构注入点:流水线穿插的最佳位置

现有的 chassis_plan_step 遵循一条高度连贯的管道处理流:

轴向独立 TD 降级处理 -> limit_output_speed (平面矢量限幅) -> limit_planar_accel (平面总加速度裁剪) -> sync_td_state_after_limits (底盘内部状态反向同步)

在这套精密运转的流水线中,滤波逻辑到底该注入在何处?这是成败的关键。工程上的唯一正确答案是:必须将其精淮插入在 limit_planar_accel 之后,且在 sync_td_state_after_limits 之前执行。

  • 为何不能在此之前(例如刚出 TD 就滤波)? 如果我们在执行 limit_planar_accel 之前就提前生成了柔美的 S 型平滑速度,那么在系统遭遇极端工况(例如剧烈的斜向目标跳变)时,这个已经被平滑过的向量很可能会直接撞上底盘的物理极限天花板。此时,冷酷的 limit_planar_accel 会启动强行等比例缩放截断。这种粗暴的截断会瞬间破坏 S 曲线辛苦构建起来的二阶导数连续性,在曲线的尖端重新切割出一个断崖,无穷大的 Jerk 幽灵将再度降临,致使“卷积魔法”彻底破功废弃 。
  • 完美的因果闭环原理解析: 基于连续可导数学的坚实推论,移动平均滤波器具备一项核心优势属性:无超调性(No-Overshoot Guarantee)。这意味着,只要我们首先利用原有的 TD 和生硬的裁剪函数,毫无保留地输出一套严格满足最大速度限幅 \([-V_{max}, V_{max}]\) 与最大加速度限幅 \([-A_{max}, A_{max}]\) 的、带有“硬折角”的复合梯形速度信号,随后将这套已经被物理界限框死的信号直接送入 Ring Buffer。经过滑动平均卷积后,其输出的柔化信号不仅拥有完美的连续导数,更在绝对数值上永远不可能突破之前设定好的任何速度或加速度极限 。
  • 后置反馈机制的协调: 在输出这一终极平滑速度后,我们紧接着将其作为实参馈送入 sync_td_state_after_limits 函数。这一步迫使底层的 TD 模型将其内部虚拟状态强制对齐到这个被平滑延后的真实物理速度上,有效扼杀了由于滤波群延时可能引发的跟踪模型状态分离与积分抗饱和(Wind-up)发散问题 。

架构入侵范例代码展示:

C

// 1. 维持现有的硬边界物理极限限制逻辑
limit_output_speed();     // 限制平面最大合速度
limit_planar_accel(dt);   // 限制平面最大合成加速度 (此时生成的是严酷的折角梯形信号)

// 2. 注入点:遍历三轴,执行 O(1) 复杂度的滑动平均卷积平滑
for (int i = 0; i < 3; i++) {
    float new_val = g_plan.speed[i]; // 截取刚才生成的生硬限制信号
    MovingAverageFilter* maf = &g_plan.velocity_maf[i];

    // O(1) 迭代:扣除将要被覆盖的最老历史值,加入最新采样值
    maf->current_sum -= maf->buffer[maf->head];
    maf->buffer[maf->head] = new_val;
    maf->current_sum += new_val;

    // 循环游标自增与模算数回绕
    maf->head = (maf->head + 1) % MAF_WINDOW_SIZE;

    // 动态维护窗口有效数据量以应对启动期
    if (maf->count < MAF_WINDOW_SIZE) {
        maf->count++;
    }

    // 使用平均值覆写原有指令,完成硬轨到柔性 S 曲线的涅槃重塑
    g_plan.speed[i] = maf->current_sum / (float)maf->count; 
}

// 3. 使用终极平滑滤波后的速度,逆向强制同步 TD 内部追踪状态
sync_td_state_after_limits(dt); 

3. 深水区排雷:边界条件交接与 IEEE 754 浮点漂移抑制

在将这套理论完美的代码实际部署到长年累月不间断运行的机器人控制主板(如 STM32)上时,有两个极其凶险的边界衍生灾难必须被妥善压制。

致命隐患一:无限期迭代下的浮点累加灾难 (Floating-point Accumulation Drift) 仔细观察上方优雅的 \(O(1)\) 滤波算法逻辑:current_sum += new_val - old_val。在这个精妙的递归减加机制中隐藏着一颗定时炸弹。在 C 语言使用的 IEEE 754 单精度浮点数(float)标准中,当系统经历数以亿万计的控制周期(例如底盘以 1kHz 频率运行数小时),尤其是在包含极大数值和微小数值的加减混算中,极低位有效尾数(Mantissa)的微小截断误差会像滚雪球一样不断沉淀积累 。 最终导致的宏观物理灾难表现为严重的零点漂移:当用户的遥控摇杆彻底松开、目标速度降为 \(0\)、且 TD 算法也完全收敛到 \(0\) 之后,底盘的实际输出指令竟然未能归零,反而因为这累积的一丁点浮点残渣,致使巨大的底盘仍以 \(0.02\text{m/s}\) 的幽灵速度向未知的远方持续蠕动 。

  • 工业级最佳阻断策略: 虽然可以通过引入沉重的 Kahan 补偿求和算法(Kahan Summation Algorithm)来专门对抗这种精度丢失 ,但在底盘控制的特定业务逻辑中,最具工程性价比的解法是引入物理静止态归零判定。在 chassis_plan_step 的循环体末尾,增加一层阈值断言:当检测到底层 TD 追踪的输入目标速度绝对值为 \(0\),并且经过计算后的最终平滑输出速度的绝对值小于某个极小阈值(如 1e-4f)时,系统立刻将当前轴滤波器结构体内的 current_sum 强制归零,并使用 memsetbuffer 数组全额清刷为 \(0\)。这通过周期性的“强制切除”彻底拔除了漂移的根基 。

致命隐患二:滤波器初始化与状态切换黑洞 (Cold Start Buffer Hole) 由于底盘在开机闭环的一瞬间,或者在通过 chassis_plan_mode_set 宏观改变轨迹规划模式时,新分配的滤波 buffer 内部是一片空白的死寂(全是初始化留下的 \(0\)) 。如果底盘在当前恰好处于高速运行状态(例如以 \(1.0\text{m/s}\) 的速度飞驰并突然切换模式),此时高速信号骤然灌入这个布满 \(0\) 的空洞数组,求平均的计算结果会被尚未填满的 \(0\) 疯狂拉低,在时域上表现为底盘速度瞬间遭受断崖式的逆向制动跌落,产生极强烈的反向拖拽冲击。

  • 工业级最佳阻断策略: 预防冷启动冲击的关键,在于滤波器的瞬态动量继承填充。在 chassis_calculations.cinit_td_runtime 模式初始化函数中,或者在系统判定初次使能运行前,应当增加一套针对滤波器的重置注入逻辑:提取底盘当前真实实时的反馈物理速度(即当前的 g_plan.speed[i]),然后将这个真实速度强行克隆并填满整个 buffer 数组(\(N\) 个元素全部赋予此同一瞬态值),同时将累加和 current_sum 直接初始化为 \(N \times \text{当前瞬态速度}\),并将有效数 count 设满 。这种动量注入手法使得卷积核从诞生的第一微秒起,就处于与底盘现实宏观动量完全匹配的等效稳态中,确保了任何模式的切换都如同热刀切黄油般绝对平顺、无缝衔接。

总结

现行的基于韩京清非线性二阶跟踪微分器(td_fhan)的底盘速度规划架构,在克服传统控制方法的高频振荡与实现时间最优路径跟随方面已奠定了坚实的工程根基。然而,由纯粹二阶相平面切换逻辑先天限定的梯形速度曲线机制,在物理本源上伴随着无穷大加加速度(Infinite Jerk)的残酷副作用,在起停交变中持续对机器人底盘施加破坏性的机械共振与应力疲劳。

跳出无休止调参的泥沼,本研究通过引入数字信号处理领域的“卷积魔法”,论证了其降维打击的威力:以不足百字节的静态环形缓冲内存与运算量可忽略不计的 \(O(1)\) 常数级滑动平均算术,在不侵入破坏原有加速度与速度物理极值守卫逻辑的前提下,将刚硬刺目的梯形速度梯级强制拉伸成了顺滑细腻、加加速度完全有界连续的优美 S 型曲线。这种二阶非线性寻优与线性 FIR 低通滤波相得益彰的混合架构设计,无疑为嵌入式算力极度受限的高机动设备追求极致丝滑运动,标定了一条兼顾数学美感与工业实用主义的最优突围路径。

评论