news 2026/9/30 6:18:43

轮腿穿越组技术全解析:英飞凌TC264、FOC控制与串级PID调参实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
轮腿穿越组技术全解析:英飞凌TC264、FOC控制与串级PID调参实践

第21届智能汽车竞赛总决赛现场,轮腿穿越组的调试区永远是最热闹的地方。车模不再只是四平八稳地贴地跑,而是靠两条轮子立起来,过弯时车身倾斜,遇到矮障碍还能迈腿跨过去,发车瞬间那股“站起来就跑”的劲头,和旁边传统竞速组完全是两种画风。作为赛事里最能整活的组别之一,轮腿穿越组既考验机械结构设计,又把平衡控制、路径规划、动力匹配这些硬骨头全塞进了一辆车里,难度天花板基本就是它。

这两天我在现场蹲了不少队伍,发现车上有几个元素几乎是标配:英飞凌的芯片、无刷电机加驱动板、自制的轮腿机构,以及一套反复调了不知道多少个通宵的平衡算法。这篇内容不打算写成项目复盘报告,就把我在现场采访到的、观察到的,以及自己这些年折腾智能车积累下来的经验揉在一起,聊聊这个组别背后的技术点、选型逻辑和那些只有真正上手才知道的坑。

1. 赛项解读:轮腿穿越组到底在“穿越”什么

1.1 赛题设定与得分逻辑

轮腿穿越组最直观的特征是“轮腿结合”:正常跑动时,车模依靠轮子高速行驶,重心高度相对较高,姿态接近倒立摆;遇到障碍或需要特殊动作时,腿式机构介入,通过改变支撑点、抬腿或跳越完成穿越动作。和传统四轮车相比,它多了一个非常重要的维度——动态平衡。

从比赛规则的角度看,赛道上的元素往往不只有弯道和直道,还可能出现类似坡道起伏、低矮障碍物、限宽门等结构。纯轮式车要过去,基本只能靠速度冲或者绕行,轮腿车则多了一条路径:减速、调整腿部姿态、抬高底盘通过。这就等于给策略层加了一个可操作的自由度,也让机械设计有了更大的发挥空间。

得分逻辑本质上依然是“完成赛道耗时越短越好”,但前提是动作必须稳定。我在现场看到不少队伍在“穿越”动作上花的心思远大于高速跑圈部分,因为动作一旦失败,轻则扣时间,重则直接翻车甚至损坏车辆。一个稳妥的动作策略,往往比单纯拉直线速度更能拉开差距。

1.2 为什么轮腿组是近几年难度天花板

如果只谈控制难度,两轮平衡车已经不算新鲜,但轮腿组把问题复杂化的地方在于:平衡不是在固定结构上完成的,腿部的伸缩、摆动会实时改变重心位置和转动惯量。这意味着控制系统的模型参数一直在变化,用固定PID参数很难从头稳到尾。

现场采访中,不少队员跟我提到同一个感受:车在平路上调稳了,一上坡或者一做抬腿动作,原来的参数就失效了。“腿一动,车就开始抖,抖完就倒。”这句话很形象。原因倒也好理解,腿的位置一变,等效摆长变长,系统极点位置漂移,控制裕量不够就会震荡。

再加上比赛环境里电池电压随负载波动、轮胎打滑、结构件形变这些现实因素,轮腿组几乎把一辆小车能遇到的工程问题全凑齐了。这也是为什么我向来觉得,能在这个组别稳定完赛的队伍,综合素质是真的很能打。

2. 主控平台:英飞凌AURIX TC264与开发环境

2.1 为什么组委会和队伍都选TC264

轮腿穿越组用的主控芯片,这几年基本绕不开英飞凌。大家在现场能看到车模主板上那颗芯片,很大概率就是AURIX TC264。这颗芯片的核心优势不只是算力,而是它整个外设架构就是冲着“实时控制”去的。

TC264是双核架构,主频能跑到200MHz,在车模这种对功耗和散热有要求的场景里非常合适。更重要的是,它内置了GTM(Generic Timer Module)、高精度ADC、多路CAN和丰富的PWM通道,这些东西对电机控制来说就是“刚需外设”。一颗芯片同时管姿态解算、路径识别、速度环和通信,不用额外加协处理器,布线也干净很多。

有些队伍会纠结要不要用更高端的TC3xx系列,我在现场问了几支车队的意见,大家普遍的观点是:TC264够用且资料成熟,社区里能参考的开源工程多,遇到问题好查。比赛准备周期就几个月,折腾不熟悉芯片的风险远大于收益。

2.2 ADS开发环境与工程搭建

英飞凌官方的免费IDE是AURIX Development Studio,简称ADS,基于Eclipse开发的,界面长得很“经典”,但功能上完全够用。对新队伍来说,最大的门槛反而不是写代码,而是环境搭建。

第一步是下载安装ADS,安装包在英飞凌官网可以拿到。这里要提醒一句:路径中间尽量不要带中文和空格,否则后续编译经常出现一些莫名其妙的头文件找不到问题。装完之后下载调试器驱动,常见的是DAS驱动,不装驱动的话,调试器插上电脑完全没有反应,很多人第一步就卡在这。

用ADS建工程有两种路子:一种是直接用官方例程模板改,这也是我推荐新手走的路。工程里已经把TC264的启动代码、时钟配置、GTM初始化都写好了,你只需要找到自己的业务逻辑入口,在循环或者中断里加控制代码。另一种是从零手写寄存器配置,适合想把底层吃透的老手,但比赛场景下不是最优解。

在ADS里烧录程序,一般是点那个小虫子图标进入调试模式,程序会Download到Flash,然后按复位运行。容易犯的错是:代码编译下载成功,但车没反应,最后发现是复位引脚没接或者调试器选的复位模式不对。

提示:ADS默认的编译优化等级有时候会是O0,纯调试阶段没问题,但等到跑全速代码的时候,建议把优化等级打开,否则中断处理耗时可能让控制频率上不去。当然,开了优化之后,全局变量、寄存器操作的代码要格外小心,容易出时序问题。

2.3 GTM定时器与PWM输出

GTM是TC264上一块很多人没吃透但又特别重要的外设。简单理解,它是一组功能很强的定时器模块,可以产生多路互补PWM、支持中心对齐和边沿对齐模式,还能做输入捕获、测频率。对轮腿组来说,电机的PWM控制信号、编码器回馈的测频、舵机驱动信号,全都可以挂在GTM下面。

传统单片机用普通定时器做PWM,比较头疼的问题是通道数有限,频率和占空比调节不够灵活。GTM的Atomic Compare单元可以在一组TIMER的基础上扩展出多路PWM,而且硬件级同步,几路PWM之间不会有相位漂移。这对FOC驱动机器非常重要,因为三相PWM如果不同步,电流波形会很难看,电机噪声大,控制精度也上不去。

另外GTM也能实现输入捕获,比如读取编码器脉冲周期来换算出电机转速。我在现场看到很多队伍把编码器信号直接接到GTM通道上,由硬件完成计数和捕获,CPU只负责读寄存器结果,效率很高。

GTM的坑主要是配置复杂,寄存器层级多。我的建议是:不要一上来就自己配置,先跑通官方的GTM例程,在例程基础上改周期和占空比参数,理解每个配置模块在数据手册里的位置,再考虑做多通道扩展,这样少走很多弯路。

3. 动力系统:电驱方案与PMSM应用

3.1 轮腿组的电机选择

动力是轮腿组的根基,电机选型直接决定整车的极限性能。现场转了一圈,轮腿组用无刷直流电机(BLDC)或者永磁同步电机(PMSM)的队伍占了大多数,还在用有刷直流电机的相对较少。原因很简单:轮腿车既要跑得快,又要能随时应对抬腿、平衡这类大力矩工况,有刷电机的响应速度和扭矩密度都跟不上。

BLDC和PMSM本质上都属于永磁电机,控制上也有很多相通的地方。PMSM更强调正弦波驱动、低转矩脉动,在高动态响应场景下表现更好,所以很多冲名次的队伍会选择PMSM方案。英飞凌在电机驱动这块是传统强项,MCU侧有PWM和ADC的硬件协同,驱动侧有各种集成预驱和智能功率模块。现场采访中,几支用PMSM的队伍都提到一个词——FOC(磁场定向控制),这是让PMSM跑顺的关键。

3.2 驱动系统架构:从MCU到电机

一套完整的PMSM驱动链路大概是这样的:TC264通过GTM产生三相互补PWM信号,送到栅极驱动器(Gate Driver),驱动芯片再把逻辑信号转换成足以打开MOSFET的高压驱动信号,三相全桥电路输出U/V/W三相电,电机转动。电流回路里,通常用采样电阻搭配运放把相电流转成ADC能量测的电压值,反馈给MCU做闭环。

英飞凌方案里,栅极驱动器可以选择类似MOTIX系列或外部独立驱动芯片,功率MOSFET则可以根据电流需求选型。轮腿电机峰值电流往往不小,MOSFET的电流余量建议留到1.5倍以上,否则堵转或者启动瞬间很容易烧管。

FOC控制的核心是把三相交流量通过Clark变换和Park变换变成两轴直流分量:一个控制磁通(d轴),一个控制转矩(q轴)。然后用两个PI调节器分别稳住d轴电流和q轴电流,经过逆Park变换和SVPWM算法输出三相占空比。说起来就几句话,但实际调起来,光是电流采样极性和编码器零点对齐就能卡掉一两天。

3.3 电流环调试经验

电流环是FOC最内层的环,也是所有控制的基础。现场采访中,真正把电流环调好的队伍其实不多,因为这块特别容易犯细节错误。

第一是电流采样的零点校准。采样电阻、运放偏置都会引入零点偏差,如果不在上电时做一次自动校准,d/q轴电流会出现固定偏置,电机在静止状态就会嗡嗡响,发热明显。比较稳妥的做法是初始化时短路电机三相,连续采样多次取平均作为零点值存起来。

第二是电流环PI参数的整定。可以先用手动方式给定一个小的q轴电流指令,观察电流响应是否快速跟上且无振荡。电流环的带宽通常要远高于速度环和位置环,一般整定到几十到几百Hz的带宽,让它在速度环眼里就是个“瞬时响应”的环节。

第三是保护机制。程序里必须做母线电流或相电流的硬件过流保护,不能只靠软件判断。轮腿组这车动作粗暴,一旦机械卡死或者落地姿态不对,堵转电流几倍于额定值,软件响应不及时,功率管说烧就烧。现场不止一个队伍跟我吐槽,调试周期里烧掉的驱动板和电机,加起来都够再买一辆新车了。

注意:不要把电流环作用期望值拉得太高。它本质上是让电机输出力矩线性可控,但轮胎打滑、机械结构弹性这些问题,它解决不了。那些属于上层控制要考虑的。

4. 机械与控制算法:轮腿平衡的“立鸡蛋”难题

4.1 轮腿系统的运动学理解

轮腿车的基本模型可以近似成一个倒立摆:车体是摆杆,车轮是移动底座。要保持平衡,本质上就是通过控制车轮前后加速,让重心落在轮子与地面的支撑区域内。类比一下,就是你在手掌上立一把扫帚,手掌必须跟着扫帚倾倒的方向不断移动。

轮腿车辆的难处在于腿的结构可以改变支撑姿态。当腿部收缩或伸展时,车身质心高度、绕轮轴的距离、转动惯量都会变化。用控制语言说,就是被控对象参数随时间变化,固定增益控制器天然不占优势。因此很多队伍会在常规PID之外,加入简单的增益调度:根据腿部角度或者姿态模式,切换不同的PID参数组。

这里我给新手一个建议:不要一上来就上自适应控制、滑模控制这类花活,先老老实实把线性PID调明白,让车在固定姿态下能稳定站立,再去处理变参数问题。现场的大部分强队,本质上也只是把参数调度做细了,算法本身依然简洁,但工程细节非常扎实。

4.2 传感器与姿态解算

姿态解算靠的是IMU,一般包含陀螺仪和加速度计。陀螺仪瞬时角度变化率测量准确,但存在零漂,长时间积分会飘;加速度计能测出重力方向,但容易受运动加速度干扰,不能直接用来做角度。常规做法是融合二者,常用的有互补滤波和卡尔曼滤波。

互补滤波简单理解就是:低频段相信加速度计,高频段相信陀螺仪,用一对高低通滤波器组合出综合角度估计。它的优势是计算量小、参数直观,适合在嵌入式小资源环境下跑。现场很多车用的是一个全姿态模块,再在代码里跑一阶互补滤波,效果已经够稳。

卡尔曼滤波精度更高,能处理噪声相关性问题,但调噪声矩阵参数需要经验,而且计算开销大。我的建议是:先用互补滤波把整个控制链路调通,确认机械结构没问题,再视情况换卡尔曼。如果一上来就调卡尔曼,出了问题根本分不清是滤波器的问题还是控制的问题。

陀螺仪的安装位置也很讲究,尽量靠近整车质心,并且固定牢靠。现场我看到有的车陀螺仪固定在一块软绵绵的泡棉上,车一跑,传感器跟着共振,角度输出全是毛刺,这种细节最容易翻车。

4.3 串级PID:直立环、速度环、转向环

轮腿平衡控制的基本框架是串级PID,分三层:最外环是速度环,中间是直立环(角度环),最内是电流环或者直接电压输出。为什么这么串?可以这样理解:速度环负责“车要往前走多快”,它输出的不是直接PWM,而是目标倾角;直立环拿到这个目标倾角,再结合当前实际倾角,通过PD运算输出PWM让车体往那个角度靠。车一前倾,车轮就加速追过去,跑起来不倒。

这样设计的好处是逻辑清晰,各环任务单一。调试顺序也有讲究:先只调直立环,把车放在桌上通电,手扶着,让它能原地站稳;然后调节速度环,试着让车匀速前进和后退;最后才加转向环。千万不要一上来三个环一起调,出了问题根本定位不了。

给一个常见的起始参数参考(仅作范围示例):

环路PID备注
直立环2000-60000100-300D要谨慎,过大抖动剧烈
速度环20-801-50积分环节防止静态误差
转向环100-400010-50转向和速度联动,低速加大

注意这只是量级参考,实际参数跟机械结构、电机性能、控制周期强相关。轮腿组的直立环控制周期一般做到1ms到5ms之间,太快会频繁触发中断导致CPU忙不过来,太慢则平衡稳不住。

速度环要实现闭环,轮子转速的反馈很重要。一般轮侧电机带编码器,通过GTM捕获正交编码信号换算转速。腿部的摆腿电机,可以用角度传感器或编码器做位置闭环,有些队伍用大扭矩舵机直接驱动腿部,其实也可以,只不过柔顺性差一些。

4.4 动态前瞻与路径策略

路径策略上,有两个点值得单独拿出来讲。一个是动态前瞻,这是近几届竞赛里大家提得很多的概念。简单说,路径识别系统不能老盯着车前一个固定距离的目标点跑,而要跟着车速动态调整:车越快,看得越远;车越慢,看得越近。道理很朴素,高速时如果看太近,来不及转弯;低速时看太远,反而会因为图像信息冗余造成转向敏感抖动。

动态前瞻可以用一个简单的分段函数实现:前瞻距离L随速度v变化,低速段保持最小值,高速段线性增加,超过上限后封顶。示意图就是一条带饱和特性的直线。代码层面也不复杂,查表或者直接算都行。关键是要把速度预估做准,不能直接用速度环目标值去算,用实测速度更稳。

另一个是动作与路径的协同。轮腿车在过障碍前,要先检测到障碍类型,提前减速,调整腿部姿态,然后执行穿越动作。这个过程里,姿态控制和路径跟踪是并发执行的,很容易互相干扰。比较好的做法是设计一个状态机:常规巡航态、减速接近态、动作执行态、恢复巡航态。动作执行态里降低速度环增益,或者暂时切换成位置模式,让车以极低速度通过,保证动作成功率比速度更重要。

我现场看到一条紫黑色涂装的车,动作成功率特别高,采访之后发现他们其实没有多复杂的算法,就是状态机切换做得很细,每次动作结束后还要执行一小段“稳定等待”,等车身完全静止再加速。这个细节非常值得学习。

5. 采访实录:现场队伍的真实调试心得

5.1 备赛节奏与时间分配

采访了好几支队伍,发现一个规律:备赛前期花在机械结构上的时间远高于写代码的时间。轮腿组的机械结构好不好,直接决定控制算法能不能调出来。有的队用3D打印做腿部结构,轻巧但强度有限;有的队用碳板加铝合金件,刚性高但后期改起来费劲。

普遍的打法是:第一版机械尽量简单,只要能跑起来、能站稳就可以,让算法团队先有车可调;随后机械和算法并行迭代,机械出结构方案,算法同时调参数,两边在最痛的地方对接。最怕的是一群人上来就追求完美结构,连车都没动起来,控制算法一个都没验证过,最后时间全没了。

赛前一到两周,所有队伍都在干同一件事:疯狂跑耐久。现场就能看出来,反复跑圈的队伍,机械连接处已经松动过好几轮,螺丝胶、扎带、热熔胶满天飞。真正稳的队,在耐久测试中会记录电池电压变化、电机温度、驱动板温度,这些数据决定正式比赛时采用什么节奏策略。

5.2 现场采访中反复出现的高频问题

我把现场听到的共性故障整理了一遍,基本集中在四个方面:

第一是陀螺仪漂移。典型场景是车放一会,角度输出慢慢变大,导致车自动往一边倒。解法是上电后保持车身静止2到3秒,软件做零偏校准;比赛发车时尽量轻拿轻放,不要在空中乱翻。

第二是电机的堵转和过热。轮腿动作时经常需要大力矩输出,如果腿部限位设置不当,电机容易憋住,电流飙升。很多队伍给腿部电机加了机械限位和软件限流,双保险。

第三是电池电压带来的动力变化。充满电的电池和快没电的电池,相同PWM输出对应的车速和力矩差别很大。强队通常在算法里做母线电压补偿,用实时电压折算占空比,让车在电量下降时动力表现尽量一致。

第四是结构松动。车跑几圈后螺丝松动,重心漂移,直立环开始震荡。这一点看着小,实际是很多队伍在线决赛现场“忽然变疯”的根本原因。建议每次发车前都检查一下关键紧固点。

5.3 观察强队的“细节控”

现场看强队调车有个明显的感受:他们手里永远有一台上位机,实时看角度曲线、速度曲线、PWM输出。调参不是靠“感觉”,而是看曲线找规律。比如直立环的P给大了,角度曲线会有明显的高频振荡;速度环I给大了,会出现周期性穿梭。把每种现象和曲线特征对应起来,调参效率会高很多。

另外一个细节是线束整理。看着不起眼,但印象很深。强队的线束都是编好的,走线避开电机和陀螺仪,活动关节处留足余量。弱队的线经常缠进轮腿机构里,跑着跑着卡一下,直接翻车。这类问题不在算法层面,却实实在在决定车的可靠性。

还有一点关于比赛策略:强的队伍在正式比赛时往往不是跑最激进参数的,而是留了稳定余量。采访中有人告诉我,他们正赛参数会比测试时略微保守一点,“确保不翻车才是第一位的,翻一次什么都完了。”这句话我觉得所有玩车的人都该听一听。

6. 常见问题排查与避坑指南

6.1 经典故障速查表

现象可能原因排查与对策
车模高频抖动、嗡嗡响直立环P过大或D过大降低比例/微分增益,检查陀螺仪安装是否松动
车向一个方向偏转陀螺仪零漂未校准上电静止校准;检查IMU安装朝向和代码轴定义
原地打转/转向环失效编码器信号接反或断线检查正交编码接线,确认A/B相极性
上坡无力或原地倒电流环输出饱和或电压补偿缺失查看q轴电流是否顶到限幅,增加电压前馈
跑一会长时间死机供电跌落导致单片机复位示波器测5V电源纹波,加大电容,检查驱动板干扰
动作执行时剧烈晃倒姿态与路径控制抢占冲突状态机切换时机靠后,动作时降低速度环作用
电机异常发烫电流零点未校准或PI过激重新校准零点,降低q轴PI比例系数

这张表不可能覆盖所有问题,但它是我在现场采访中听到频率最高的几种。学会“对着现象定位层级”很重要:先判断是机械问题、硬件问题还是算法问题,再进行针对性排查。最忌讳的是怀疑哪个环节就乱调哪个环节的参数,一把梭,最后越调越乱。

6.2 几个容易被忽略的细节

第一个是电源地的处理。电机驱动是大电流回路,控制电路是弱信号回路,二者如果共地走线不合理,驱动产生的尖峰噪声会直接串入传感器和MCU复位引脚。建议硬件上做单点接地或者星型接地,软件上给ADC采样增加一点硬件RC滤波。

第二个是程序里所有的关键变量都要能做上位机实时查看。尤其是角度估计值、速度估计值、PWM占空比这三样。很多队调的怀疑人生,就是因为看不到内部状态,全靠车跑起来的表现盲猜。花一个晚上把通信调好,后面省下的时间是以周计的。

第三个是代码版本管理。比赛调试节奏快,经常出现“昨天还能跑,今天改了十行代码跑不了了”的情况。建议哪怕只有一个人写代码,也要用Git做版本管理,至少要有版本备份,这样参数回退和代码回退都很方便,不至于锤胸顿足重写一遍。

第四个是关注编译器的警告信息。现场我看到不少人编译出一堆warning照样跑,有些警告确实是噪音,但有些是未初始化变量、类型溢出这类隐患,高速动态下可能就爆雷。设置编译选项把警告等级调高,养成强迫症级别的代码洁癖,关键时刻能救命。

6.3 一点个人建议

如果让我给下一届准备参加轮腿穿越组的人一个建议,我会说:先别急着买最贵的电机和碳纤维件,把一辆简易的、能动的平台先拼出来,跑到调平衡那一步,再回头反思机械设计。控制算法这一关人人要过,与其在图纸上纠结理论,不如早早在实物上验证。调试平衡的过程很痛苦,但也是收获最大的一环。

现场采访这届比赛,最触动我的其实是那些在备赛区守着烧坏的驱动板默默焊电路的同学。很多人觉得智能车竞赛比的是谁更有钱、谁的硬件更好,但看多了就知道,最终跑得稳的,往往是调试细节做得最足、流程管理最清楚的队伍。搞工程就是这样,懂得多不如踩过坑,踩过坑不如有记录。把这些记录下来,来年就是你们最值钱的资产。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 6:18:09

BigQuant平台实现质量优选低波动多因子策略实战解析

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

作者头像 李华
网站建设 2026/9/30 6:17:10

Python教学质量评价系统毕业设计:架构拆解与部署避坑指南

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

作者头像 李华
网站建设 2026/9/30 6:17:10

图形学基本变换全解析:从矩阵推导到工程实践

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

作者头像 李华
网站建设 2026/9/30 6:16:45

tweens运动:让运动数据活起来的插值引擎

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

作者头像 李华
网站建设 2026/9/30 6:16:41

Linux进程六种状态详解:D状态与僵尸进程排查实战

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

作者头像 李华
网站建设 2026/9/30 6:15:51

深入理解Shell:交互式与脚本式两种进入方式详解

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

作者头像 李华