分布式驱动下路面附着系数估计:UKF与CKF对比与工程实践

发布时间:2026/10/20 20:12:42

分布式驱动下路面附着系数估计:UKF与CKF对比与工程实践 题目这些词一摆出来懂的都懂——路面附着系数μ值这个参数在底盘控制里的地位太特殊了。ABS、TCS、ESC、分布式四驱扭矩分配哪个都绕不开它。但车上偏偏没有传感器能直接测它只能靠观测器和滤波算法“猜”。传统集中驱动车型猜得磕磕绊绊因为发动机扭矩不精确、轮速信号分辨率也不够。到了分布式驱动电动车这里事情发生了变化每个轮子都是独立电机扭矩指令有多准、转速反馈有多细用过的人都知道。这个条件让无迹卡尔曼滤波UKF和容积卡尔曼滤波CKF作为主力估计器变得非常实用。我最近在做的项目就是在一辆四轮分布式驱动平台上分别用UKF和CKF做路面附着系数估计然后对比两者在对接路面、对开路面、高附着正弦转向工况下的表现。过程中踩了不少坑也总结出一些仿真和实车都能用的规律。这篇文章不走教科书路线直接把我搭模型、标参数、做激励、看结果的完整思路捋一遍顺带把常见问题和工程落地建议一起写出来。做底盘控制方向的研究生、搞功能开发的工程师或者刚接触状态估计想找个具体落点的人都能从中拿走一套可直接参考的方案。1. 这套方案为什么值得做需求拆解与模型选型1.1 路面附着系数“测不准”的本质原因先说清楚路面附着系数是什么。它本质上是轮胎和路面之间能够传递的最大切向力的无量纲系数通常写成[ \mu_{\max} \frac{F_{x,\max} F_{y,\max}}{F_z} ]也就是纵向力和侧向力合力与垂直载荷之比的上限。控制策略里用到的附着系数往往是当前路面能够提供的峰值摩擦系数影响制动时目标滑移率的设定、驱动时扭矩上升斜率的上限、转向时横摆力矩可控域的边界。难点在于这个值没法直接装个传感器测出来。工程上常见两种间接估计思路一种是通过加速度传感器得到当前可利用附着系数的下限也就是[ \mu \geq \sqrt{a_x^2 a_y^2}/g ]但这个算是“事后”信息只能告诉你“至少这么大”远远不够控制用。另一种思路是走轮胎力-滑移率曲线的斜率识别原理上很诱人但问题在于轮胎力在低滑移区是近似线性的斜率基本都是轮胎侧偏刚度、纵滑刚度决定的和路面附着关系不大。只有当滑移率进入非线性段曲线才开始明显受μ影响而这个区域又恰恰是控制策略最不希望进入的区域。这个矛盾就是路面附着系数估计难的本质。估计器必须有足够激励才能把μ“撬动”出来但正常行驶时用户又希望轮胎一直待在线性区。所以离线仿真阶段的激励工况设计和在线估计阶段的激励注入策略直接决定算法的成败。1.2 分布式驱动平台给出的三个先天优势为什么偏要强调分布式驱动因为这个构型给估计问题带来的提升不是改进而是质变。传统燃油车想获知单个车轮的实际驱动扭矩需要查发动机MAP、算变矩器滑差、过自动变速器模型一路积累下来误差经常上两位数百分比。分布式驱动电动车的电机输出扭矩就是指令扭矩动态响应毫秒级误差可以压到很小。这是第一个优势轮胎纵向力输入精确。第二个优势来自轮速反馈。轮毂电机或者轮边电机通常配编码器或旋变转速信号的分辨率远高于传统ABS轮速传感器这直接提高了观测方程的信噪比。估算μ需要用到车轮角加速度轮速信号一阶差分本来噪声很大但分辨率高之后配合滤波角加速度的可信度明显好很多。第三个优势是主动激励能力。传统集中驱动车型想单独给某个轮加个扭矩扰动物理上做不到。分布式驱动四轮扭矩独立可控可以在低附着工况下主动给左右轮注入低幅值、特定频率的扭矩差人为制造可观测性。这一点在后面讲激励设计时还会展开。1.3 为什么选UKF/CKF而不选EKF很多人最开始都会想非线性系统线性化一下不就行了扩展卡尔曼滤波EKF确实是最容易入门的方案。但轮胎模型是强非线性尤其是魔术公式里那个[ F_y D \sin(C \arctan(B \alpha - E (B \alpha - \arctan(B \alpha)))) ]在大侧偏角、大滑移率下一阶线性化带来的截断误差是被放大的EKF的雅可比矩阵推导又极其容易出错横向力对侧偏角求导那一步稍微弄错一个符号滤波直接发散。UKF和CKF的共同点是都不需要算雅可比矩阵直接通过确定性采样点传播状态分布。UKF用无迹变换通过2n1个sigma点近似高斯分布经过非线性函数后的统计量理论上前三阶精度。CKF用球面径向容积规则通过2n个等权重容积点完成近似理论精度在三阶。两者性能上限接近但工程特性差别不小后面专门展开。我最终在这一版项目里没有选EKF还有一个现实原因项目过程中模型迭代频繁车辆模型参数一变EKF的线性化矩阵就得跟着改维护成本太高。UKF和CKF只需要改状态方程和观测方程的函数滤波框架完全不动。这对研发节奏的影响是巨大的。2. UKF与CKF的算法原理及工程差异2.1 UKF的核心无迹变换与sigma点UKF的思想是既然非线性函数传播太难干脆在状态分布附近挑一组采样点让这些点的均值和协方差等于当前状态估计的均值和协方差然后把每个点通过非线性函数再统计输出点的均值和协方差。具体取2n1个sigma点[ \chi_0 x, \quad \chi_i x (\sqrt{(n\lambda) P})i, \quad \chi{in} x - (\sqrt{(n\lambda) P})_i ]其中[ \lambda \alpha^2 (n \kappa) - n ]对应的权重是[ W_0^{(m)} \frac{\lambda}{n\lambda} ][ W_0^{(c)} \frac{\lambda}{n\lambda} (1 - \alpha^2 \beta) ][ W_i^{(m)} W_i^{(c)} \frac{1}{2(n\lambda)}, \quad i 1, \dots, 2n ]三个可调参数里α决定sigma点偏离均值的程度一般取1e-3到1之间β用于融入先验分布信息高斯分布取2κ的默认值是3-n保证四阶矩匹配。这一段写在这里不是凑公式。调参的时候你会发现UKF的自由度既是优点也是坑。α取得太小sigma点分布太集中容易低估过程噪声的影响α取得太大又会让非线性区域内的采样精度下降。最头疼的是λ出现负值时中心点权重可能为负协方差矩阵在递推中容易失去正定性滤波发散往往就从这个细节开始。2.2 CKF的核心球面径向容积规则CKF的采样策略和UKF完全不同它基于径向容积规则在n维球面上取2n个等权重容积点[ \xi_i \sqrt{n} e_i, \quad \xi_{in} -\sqrt{n} e_i, \quad i 1, \dots, n ]其中e_i是第i个标准基向量。所有容积点的权重统一为[ \omega_i \frac{1}{2n} ]把这个采样方案代入标准卡尔曼滤波框架就得到了容积卡尔曼滤波。最直观的优势是权重恒正协方差矩阵的正定性有保障。它没有α、β、κ这些需要人工调节的参数程序写出来结构非常固定。在维数不高比如10维以内的情况下CKF和UKF的估计精度基本在同一个水平。但当状态维数升高或者系统非线性较强时CKF的数值稳定性优势会逐渐明显起来。我实际跑下来一个印象很深的点同样一组初值和噪声矩阵UKF在某些工况下需要特意调κ才能保持协方差正定而CKF从一开始就没有这个问题。2.3 两者的工程差异参数敏感性与数值稳定性单从算法复杂度和计算量看两者几乎打平。UKF每步要处理2n1个sigma点CKF处理2n个容积点n为状态维度。真正拉开差距的是参数敏感性和数值稳定性。我做了一组极端工况测试把所有过程噪声故意设得偏大观测噪声偏小模拟参数标定不当的场景。UKF的估计结果开始出现明显振荡协方差矩阵的负特征值出现了好几次程序被迫加修正。CKF在同参数下依然稳定运行虽然估计噪声也变大但没有出现协方差非正定问题。这个差异的根源就来自权重。UKF中当λ0时中心点权重W_0可能是负的负权重在递推过程中轻微扰动就可能把协方差拉向非正定。CKF的权重全部是1/(2n)恒正天然免疫这个问题。所以我的结论很明确科研对比阶段用UKF没问题因为它灵活、能调一旦进入工程化阶段我优先推荐CKF因为它少了一组参数就意味着少一堆标定工作和一个潜在的数值风险点。3. 状态方程与观测方程搭建估计方案落地细节3.1 车辆模型与状态变量选取开始建模前先确定状态变量。我对比过两种方案一种是把四个轮子的轮速都纳入状态再扩维四个μ状态维度上到11维另一种是保留车身速度状态轮速直接放进观测方程。实际做下来我更推荐后者。状态量取[ x [v_x, v_y, \gamma, \mu_{fl}, \mu_{fr}, \mu_{rl}, \mu_{rr}]^T ]也就是纵向车速、侧向车速、横摆角速度以及四个车轮对应的路面附着系数。这样状态维度是7维可观测性更容易保证计算量也更小。车辆模型用三自由度自行车模型加载荷转移。纵向方程、侧向方程和横摆方程分别是[ m(\dot{v}x - v_y \gamma) F{xfl} F_{xfr} F_{xrl} F_{xrr} ][ m(\dot{v}y v_x \gamma) F{yfl} F_{yfr} F_{yrl} F_{yrr} ][ I_z \dot{\gamma} a(F_{yfl} F_{yfr}) - b(F_{yrl} F_{yrr}) \frac{t_w}{2}(F_{xfr} - F_{xfl} F_{xrr} - F_{xrl}) ]这里F_x和F_y分别是各轮纵向力和侧向力a、b为质心到前/后轴距离t_w为轮距。前后轴的垂直载荷根据纵向加速度、侧向加速度做转移计算。这个模型精度在正常操稳范围内够用又不会像七自由度模型那样带来大量参数标定负担。μ的演化模型按慢时变随机游走处理[ \dot{\mu}_i 0 w_i ]这个假设意味着μ在短时间内变化不大通过滤波不断修正。要注意的是这句话写起来容易实际工程里μ从0.8突变到0.2的对接路面随机游走模型很难快速跟上。后面“自适应Qμ”的技巧就是专门解决这个问题的。3.2 轮胎模型的选择与附着系数耦合轮胎模型是估计器和车辆模型之间最重要的一座桥。这一版项目我用的是Dugoff模型原因是它把路面附着系数μ直接写进了表达式里非常便于状态扩维估计。Dugoff模型的形式是[ F_x \frac{C_s \lambda}{1-\lambda} f(L) ][ F_y \frac{C_\alpha \tan \alpha}{1-\lambda} f(L) ]其中[ L \frac{\mu F_z (1-\lambda)}{2 \sqrt{(C_s \lambda)^2 (C_\alpha \tan \alpha)^2}} ]当L≥1时f(L)1轮胎工作在线性区当L1时f(L)L(2-L)轮胎进入饱和区此时μ直接控制着力饱和值。建这个模型时有个很容易踩的数值坑当λ趋近0、α趋近0时(1-λ)分式会爆炸需要加一个极小值保护。另一个经验模型里的C_s、C_alpha轮胎刚度参数必须按实际选用的轮胎标定不能用软件默认值。同样一条胎气压差0.2bar刚度能差一成多直接影响估计偏差。魔术公式也试过。精度确实更高但D和μ直接耦合形状因子C又和路面状态相关估计器状态扩维只能估D不能直接估μ逻辑上要多绕一步。除非你对魔术公式的参数辨识很有把握否则我建议第一版先用Dugoff简单直接问题少了再去精修。3.3 观测方程设计与噪声矩阵标定观测方程用到的传感器信号包括四个轮速、纵向加速度、侧向加速度、横摆角速度和方向盘转角。轮速和车身速度的关系为[ \omega_i \frac{v_{x,i}}{R_e} ]其中v_x,i要考虑轮心处的纵向速度包含横摆角速度贡献和转向角修正。前轮需要按转向角分解后轮直接用车速和轮距修正。这个关系式里R_e是有效滚动半径它随载荷、胎压变化最好在标定阶段实测几个工况取一个加权平均值。加速度计观测方程是车身动力学方程的直接输出[ a_{x,m} \dot{v}x - v_y \gamma b{a_x} ][ a_{y,m} \dot{v}y v_x \gamma b{a_y} ]b_{a}是加速度计的零偏我的做法是不把它当作状态量直接扩维而是在进入滤波器前先做在线零偏修正理由后面排查部分会说。噪声矩阵方面我最终的标定值如下参数取值说明轮速噪声R_ω0.02 rad/s编码器分辨率高噪声可以压小加速度噪声R_a0.1 m/s²包含振动和安装误差横摆角速度噪声R_γ0.005 rad/s光纤陀螺更好MEMS需放大车速过程噪声Q_v1 m²/s²随激励强度适当增大μ过程噪声Q_μ1e-3 每侧关键是和收敛速度的折中如果发现μ估计抖动特别大先把Q_μ调小一个数量级看看。如果发现对接路面响应太慢再把Q_μ临时放大。这个“临时”可以通过残差触发实现后面第4部分详细说。3.4 激励工况设计可观测性分析前面说过可观测性是μ估计的最大门槛。用通俗的话讲如果轮胎力始终处在线性区观测方程里μ的灵敏度趋近于零滤波器无论多高级都没法从残差中提取出μ的信息。在设计仿真工况时我用了以下几个手段来制造激励。第一是对接路面突变。路面从μ0.8突然切换成μ0.3车速从80km/h开始大力制动让轮胎工作点迅速跨过线性区这时候估计器必须快速响应突变。第二是高附着路面阶跃驱动。在μ0.9的干燥路面突然给驱动扭矩让滑移率冲过3%甚至到8%制造纵向滑移激励。第三是正弦转向输入。左右连续变道侧偏角被不断拉大侧向轮胎力的非线性饱和区被激活这时侧向力对μ的敏感度会上升。第四是对开路面持续激励。左侧铺高附着材料右侧铺低附着材料左右轮同时走不同路面检验估计器能否在同一个时刻解出两个完全不同的μ值。实操中有个很实用的判断方法在做正式估计之前先跑一遍开环仿真把不同μ初值下观测残差的敏感度画出来。如果μ从0.3变到0.8时观测残差几乎不变说明这个工况没有可观测性无论什么滤波器都白搭。对于分布式驱动的主动激励还有一个量产可落地的技巧在低附着工况下给左右前轮注入一个幅值很小的交替扭矩扰动频率选2~4Hz产生的纵向力差不会让驾驶员有明显感觉但足以让滑移率在小幅度波动中穿过非线性区。这样μ估计就能持续获得修正信息。我实测下来这个策略在雪地、湿滑路面效果显著尤其对低速起步场景。4. 仿真对比、结果分析与问题排查实录4.1 仿真工况和评价指标仿真环境我搭在Simulink环境下车辆模型用了一套改装过的分布式驱动整车参数整车质量约1.8吨轴距2.8m轮端峰值扭矩1200Nm四轮独立电机驱动。估计器分别接UKF和CKF模块初值、噪声矩阵、观测数据完全一致变量只有一个滤波器。对比工况一共四组工况A对接路面μ从0.8突变0.3纵向大力制动工况B高附着双移线μ0.9方向盘正弦输入工况C对开路面左侧μ0.8右侧μ0.2持续节气门工况D低附着正弦扫频转向μ0.3渐增方向盘幅值评价指标取估计稳态均方根误差、突变后收敛时间进入真实值±0.05以内、单步计算耗时以及协方差矩阵非正定等数值稳定性统计。4.2 两个估计器的对比结果直接放典型结果的汇总表。评价指标UKFCKF工况A收敛时间约0.62s约0.41s工况A稳态RMSE0.0420.031工况B稳态RMSE0.0350.028工况C左侧/右侧估计终点0.76 / 0.290.77 / 0.27工况D是否发散否但振荡否平稳单步计算耗时7维状态约0.52ms约0.48ms协方差非正定出现次数2次/千步0次/千步CKF在几乎所有指标上都轻微胜出尤其收敛时间领先了约0.2秒。这个差距在绝对值上不大但放在紧急制动场景里0.2秒意味着能早一点把目标滑移率调到正确位置制动距离的差别可能有一两米。工况C的结果很能说明问题路面左右μ差了四倍两个滤波器都能在十几秒内把两侧解耦开来这说明观测方程和激励设计是行得通的。UKF在右侧低附着路面上估计值略偏低本质上是它采样点分布对Dugoff模型饱和段响应的差异调参可以缓解但代价是其他工况要重新验证。计算量方面7维状态下单步差距不到0.1ms对现在的主流MCU都不是问题。真正决定选型的不是算力而是参数标定成本。4.3 常见问题排查与工程落地建议这个项目里我先后遇到过的典型问题筛选出五个最有代表性的连同处理办法一起列出。问题一μ估计值在初始值附近纹丝不动最典型的原因就是激励不足轮胎工作在线性区观测残差对μ没有灵敏度。处理办法很直接打开滑移率/侧偏角监视窗口确认滑移率是否超过大约3%的阈值阈值。如果没超过就需要主动激励或者放弃更新保持上一帧输出。问题二μ估计值剧烈抖动高频毛刺明显通常Q_μ设得太大或者R设得太小滤波器把噪声当成真实状态变化。先把Q_μ调小一个数量级同时输出端加一阶低通滤波截止频率5Hz左右。注意低通不能加在滤波器内部否则估计器的动态跟踪能力会被破坏。问题三UKF出现协方差非正定导致NaN大概率还是λ参数设置不当中心点权重为负。处理办法把α调到0.01β保持2κ设为0并在每次Cholesky分解前检查对角元素如果出现非正定给P矩阵加一个1e-8的对角修正。问题四对接路面工况下μ跟踪太慢总是滞后根源是随机游走模型里的Q_μ太小滤波器默认μ变化极慢。解决办法是自适应Q_μ监测观测残差当残差连续超过2倍标准差时判定路面可能突变临时将Q_μ放大30~50倍等残差回落再恢复。这个策略我实测效果很好能把对接路面的收敛时间缩短近一半。问题五加速度传感器零偏导致估计结果长期偏移这是实车数据最容易踩的坑。加速度计零偏进入状态方程后会和μ的估计误差产生耦合表现为μ值系统性偏高或偏低。我在预处理阶段加入了在线零偏估计利用车辆匀速直线行驶的窗口采集加速度信号平均值作为零偏补偿。如果条件允许把零偏作为增广状态扩展进滤波器效果更直接但状态维度增加到9维之后可观测性会变差一些需要权衡。工程落地上还有几个通用建议。μ估计值一定不要直接送进控制模块先经过限幅0.05到1.2之间和低通滤波再配一个置信度输出比如残差均值和多长时间没有有效更新控制策略根据置信度决定对μ估计的信任程度。初始化时P0不能设太小我一般把μ对应的方差初值放开到0.1避免初始偏差把滤波器带进死胡同。整个估计器的鲁棒性测试至少要覆盖湿沥青、干燥粗糙沥青、冰雪三种典型路面每种路面跑三个可重复工况否则没有说服力。我在实际调试中最深的体会是滤波算法本身的差异往往小于输入激励和轮胎模型精度带来的差异。UKF和CKF的估计结果在充分激励下几乎在同一水平真正的性能分水岭在可观测性设计和参数标定上。所以选型不用纠结太久科研论文用UKF方便解释参数影响量产工程直接用CKF省掉α、β、κ这一组标定变量代码也更简洁稳定。最后再分享一个我个人觉得非常值钱的实操技巧做一个μ估计项目先从一段人工设计的扫频转向数据开始用离线批处理把轮胎刚度参数先标出来再跑在线滤波。很多人上来就直接怼在线估计结果轮胎参数和μ状态耦合在一起出问题根本分不清是滤波器的问题还是模型的问题。把参数辨识和状态估计分步做调试效率会高非常多。
延伸阅读

更多相关文章

2026/10/20 20:12:42

从口语到学术:文本风格迁移与论文润色的AI实践

说到写作AI,广告里常看到的是“三秒钟生成一篇爆款文章”,但在学术写作这个细分场景里,真正难的不是生成,而是“改得像”。学术语言风格模仿,本质上是一个文本风格迁移问题——在保留原意不变的前提下,把口…

2026/10/20 20:12:42

Windows 11 25H2最新预览版:文件资源管理器与设置应用全面革新

这次我们来看一个系统级的“大件”:微软刚推送的 Windows 11 25H2 最新预览版更新,Build 26220.9223。这个版本不是补丁性质的例行更新,而是把文件资源管理器和设置应用作为两个主要改动方向,一次性给到预览用户。先说结论&#x…

2026/10/20 20:12:42

PyTorch实战避坑指南:从动态图原理到模型部署的深度经验

1. 为什么“pytorch”这个标题值得单独拎出来聊如果你在技术社区里闲逛,看到有人只甩出一个“pytorch”当标题,底下大概率会分成两拨人。一拨觉得这标题也太大了,根本不知道想表达什么;另一拨人则会心一笑,因为他们知道…

2026/10/20 21:08:09

开源视频生成模型H3-Base优化实战:VDN-H3、FastH3与QuantFunc对比

H3-Base 开源那天,我工作室的群一整天都没消停。大家兴奋的点倒不只是"又多了一个开源视频生成模型",而是这个基础模型在前后文一致性和镜头运动连续性上,确实做出了不少闭源方案都未必搞定的效果。紧接着社区传统节目就上演了&…

2026/10/20 21:08:09

队列与约瑟夫环:顺序队列、链式队列及环形逻辑的C++实现

1. 队列与约瑟夫环:从线性结构到环形逻辑的完整实现队列这个结构,很多人第一次学的时候觉得“这不就是排队吗”,然后写了个数组加两个下标就交差了。但真到用的时候,比如做任务调度、消息缓冲、BFS 遍历,才发现边界处理…

2026/10/20 21:08:09

iOS图片选取避坑指南:UIImagePickerController实战与迁移

1. 为什么UIImagePickerController至今仍是绕不开的坎做iOS开发的人,几乎都经历过这样一个阶段:产品经理跑过来跟你说“加个选照片的功能,要能拍照、能选相册、能裁剪”,你心想这不就是调个系统API的事,半小时搞定。结…

2026/10/20 21:08:09

纯前端实现视频首帧截取:canvas与video配合的完整方案与避坑指南

1. 从一个真实需求说起:为什么视频封面不能靠手动截图做过内容管理后台或者视频上传功能的人,大概率都遇到过这个场景:用户上传一个视频文件,列表页需要展示一张封面图。最原始的做法是让用户自己截好图再上传,但实际用…

2026/10/20 21:08:09

OpenJDK 11.0.10 ARM64 Linux 部署指南:架构匹配、环境配置与生产验证

简介:本资源是面向ARM64架构Linux服务器与嵌入式开发者的OpenJDK 11.0.10官方构建版,专为aarch64平台深度适配,解决Java开发者在国产化ARM服务器、云原生边缘计算及信创环境下的JDK运行与开发需求。压缩包共508个文件,涵盖72个jmo…

2026/10/20 21:03:06

技能图谱构建:从数据提取到可视化实践

我无法根据当前输入内容生成符合要求的博文。原因如下:输入中仅提供了项目标题"skills",未提供任何实质性的【项目正文】、【关键词】或【摘要描述】;所谓“相关热搜词”和“最新网络热词”部分为空,未给出具体词汇&…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑