PID自整定原理与实战:从继电器反馈到参数优化
1. 项目概述从“玄学调参”到“科学整定”的跨越PID控制器这三个字母在工业自动化、机器人、无人机乃至我们日常用的恒温热水壶里几乎无处不在。比例P、积分I、微分D这三个环节的组合构成了控制领域最经典、最经久不衰的算法骨架。然而但凡亲手调过PID参数的人都经历过那种“玄学”般的折磨P大了震荡P小了响应慢I大了超调I小了静差消不掉D用不好直接系统发散。传统的“试凑法”不仅耗时费力严重依赖工程师的经验而且在面对复杂、非线性或时变系统时往往调出一组能用的参数就谢天谢地根本谈不上最优。“PID自整定”技术的出现正是为了终结这种低效的“手动艺术”将其转变为可重复、可优化的“科学工程”。它本质上是一套方法论和算法的集合其核心目标是让控制器自身或上位机软件通过施加特定的测试信号或分析系统的实时运行数据自动地辨识出被控对象的动态特性如增益、时间常数、滞后时间等进而根据某种预定的规则或优化目标计算并设定出一组“合适”的P、I、D参数。这个过程就是把老师傅的“手感”和“经验”编码成数学公式和逻辑判断让机器自己学会“调参”。对于自动化工程师、嵌入式开发者、机器人算法工程师乃至热衷DIY智能硬件的极客而言掌握PID自整定意味着什么它意味着你能快速让一个新系统稳定运行大幅缩短项目调试周期意味着你的产品能自适应不同的负载或环境变化提升鲁棒性更意味着你能从繁琐的重复劳动中解放出来去关注更上层的逻辑与优化。无论是面对一个崭新的温控箱一台需要精准定位的机械臂还是一架在空中摇晃的无人机自整定都能为你提供一个高起点的参数基准让“从零到一”的过程不再充满不确定性。2. 自整定核心原理与主流方法深度拆解自整定不是魔法其背后是坚实的控制理论和系统辨识理论作为支撑。所有自整定方法都基于一个共同的前提我们需要先了解被控对象即“系统”的脾气秉性才能为它量身定制控制器的“药方”。这个了解的过程就是系统辨识。2.1 系统辨识如何“听懂”系统的语言在自整定开始前或进行中控制器需要主动或被动地获取系统的动态响应信息。最经典的激励信号是阶跃响应。手动或让控制器输出一个阶跃变化然后测量系统输出如温度、速度、位置随时间变化的曲线。从这条曲线上我们可以提取出几个关键特征参数稳态增益K输出变化量与输入变化量的最终比值。它告诉你系统对控制作用的“放大倍数”。时间常数T系统输出达到最终变化量63.2%所需的时间。它反映了系统的“惯性”大小惯性越大响应越慢。纯滞后时间τ从输入阶跃变化开始到系统输出开始产生可观测变化之间的时间。这通常由传输延迟、传感器安装位置等因素造成是PID控制中最难对付的因素之一。除了阶跃响应另一种常见方法是继电器反馈法这是许多商业控制器内置自整定功能的核心。其原理巧妙而实用它用一个带有滞环的继电器可以简单理解为一个带死区的开关临时替代PID控制器。当系统输出低于设定值时继电器输出正的最大控制量当输出高于设定值时输出负的最大控制量。这样一来系统就会在设定值附近产生一个稳定的等幅振荡。注意使用继电器反馈法前必须确保系统允许在设定值附近进行有限幅度的振荡且振荡不会引发安全问题。对于某些精密或危险过程此方法需慎用。分析这个振荡的幅度和周期就能推算出系统在振荡频率下的临界增益和临界周期这正是经典的齐格勒-尼科尔斯Z-N整定公式所需要的关键参数。2.2 主流自整定策略优劣对比基于不同的辨识方法和整定目标衍生出了多种自整定策略各有其适用场景和优缺点。1. 基于模型的整定法这是最“正统”的方法。先通过阶跃响应、继电器振荡或其他信号激励辨识出一个尽可能准确的系统数学模型常用一阶加纯滞后模型或二阶模型。然后根据这个模型应用特定的整定公式如 Cohen-Coon、IAE/ITAE最优整定、λ整定等计算出PID参数。优点理论严谨整定目标明确如使积分误差最小能预估闭环性能。缺点对模型准确性依赖高。实际系统往往非线性、时变简单模型难以精确描述导致“纸上得来终觉浅”。辨识过程可能需要系统离线或大幅扰动。2. 基于规则的整定法专家系统这种方法模仿人类专家的经验。它将工程师的调参规则如“如果响应超调大则增大微分时间或减小比例增益”编码成一系列的“IF-THEN”规则。自整定过程中观察系统的响应特征如超调量、振荡次数、稳定时间触发相应的规则来调整参数。优点不依赖精确数学模型鲁棒性强更贴近人工调参的思维。缺点规则库的设计和优化非常复杂需要深厚的领域知识。且规则之间可能存在冲突需要设计巧妙的仲裁机制。3. 基于优化的整定法将参数整定问题转化为一个优化问题。定义一个目标函数或称代价函数例如超调量 调节时间 × 权重 积分绝对误差。然后使用优化算法如梯度下降、遗传算法、粒子群算法等在参数空间内搜索寻找使目标函数最小的那组PID参数。优点非常灵活可以定义复杂的、多目标的性能指标理论上能找到全局最优或局部最优解。缺点计算量大耗时可能很长尤其在线整定时对控制器算力有要求。优化过程可能陷入局部最优且需要反复在真实系统上试验可能影响正常生产。4. 自适应/自整定PID这是更高级的形式它不满足于一次整定。控制器会持续或周期性地监测系统性能当检测到对象特性变化导致控制品质下降时自动重新启动整定过程或微调参数。这相当于给PID装上了“自动驾驶”模式能应对时变系统。优点能长期维持最优控制性能应对环境变化、设备老化、负载波动等挑战。缺点算法极其复杂稳定性和可靠性验证难度大多用于高端或特定场合。在实际的工业控制器或开源算法库如 Arduino 的 PID_AutoTune 库中最常遇到的是继电器反馈结合Z-N公式的整定法因为它实现相对简单无需精确模型且能自动进行。3. 手把手实操基于继电器反馈的PID自整定全流程我们以一个具体的场景为例为一个电加热水温控制系统例如一个用加热棒的小水箱整定PID参数。假设我们已有一个基本的PID控制程序现在要为其加入自整定功能。3.1 整定前的关键准备与安全确认自整定不是一键万能不当的操作可能损坏设备或引发事故。开始前必须完成以下步骤设定值Setpoint选择选择一个安全的、处于系统正常工作范围中段的设定值。例如水温常温是25℃最高可加热到80℃那么可以选择50℃作为整定目标。绝对避免在接近极限值如5℃或75℃附近启动自整定。输出限幅Output Limiting检查确保PID控制器的输出被严格限制在执行器加热棒的安全工作范围内。例如加热棒的驱动是PWM占空比应限制在0%-100%。在自整定期间继电器反馈法会输出正负最大控制量必须通过此限幅来确保安全。采样周期Sample Time设定这是一个极易被忽视但至关重要的参数。它必须与被控对象的时间尺度匹配。对于水温这种慢过程采样周期1-5秒可能合适对于电机速度控制可能需要10-100毫秒。采样太快会引入噪声太慢会丢失动态信息。一个经验法则是采样周期应约为系统时间常数的1/10到1/5。继电器参数设置需要设定两个关键值。输出幅值Output Amplitude即自整定时输出的正负控制量大小。通常设置为安全限幅值的70%-80%为控制留有余地。例如加热棒最大PWM为100%这里可设为80%。滞环宽度Hysteresis Band为了在存在测量噪声时防止继电器频繁动作需要设置一个死区。通常设为系统允许波动范围的1-2倍。例如我们希望温度波动在±0.5℃内滞环可设为1℃。滞环不能为零否则在理论平衡点会无限震荡切换。3.2 整定算法核心步骤与代码逻辑剖析自整定过程是一个状态机其典型流程如下我们可以用伪代码来理解// 定义状态 enum AutoTuneState { IDLE, RELAY_UP, RELAY_DOWN, CALCULATING, DONE }; // 关键变量 double setpoint; // 整定目标值 double outputAmplitude; // 继电器输出幅值 double hysteresis; // 滞环宽度 double peakHigh, peakLow; // 记录振荡波峰和波谷 unsigned long lastPeakTime; int peakCount; double Ku, Pu; // 临界增益和临界周期 AutoTuneState state IDLE; void autoTuneRuntime(double input, double *output) { switch(state) { case IDLE: // 等待启动命令 break; case RELAY_UP: *output outputAmplitude; // 输出正最大 if(input setpoint hysteresis/2) { state RELAY_DOWN; recordPeak(input); // 记录一个波峰 } break; case RELAY_DOWN: *output -outputAmplitude; // 输出负最大 if(input setpoint - hysteresis/2) { state RELAY_UP; recordPeak(input); // 记录一个波谷 } break; case CALCULATING: // 停止激励分析记录的峰谷值和时间计算Ku, Pu // Ku (4 * outputAmplitude) / (π * A) 其中A为振荡幅值 // Pu 平均的振荡周期 // 然后根据Z-N公式计算PID参数 // Kp 0.6 * Ku; // Ti Pu / 2; // 积分时间 // Td Pu / 8; // 微分时间 state DONE; break; case DONE: // 整定完成返回计算好的参数或切换回PID模式 *output computePID(input); // 使用新参数计算PID输出 break; } } void recordPeak(double value) { // 记录峰值和峰值时间用于计算振荡幅值和周期 // 通常需要记录多个周期如3-4个后取平均以提高准确性 }实操心得在RELAY_UP和RELAY_DOWN状态切换时系统并不会立刻在设定点切换而是会超过一点由滞环决定。这个设计非常关键它确保了系统能持续振荡起来。整定算法需要耐心等待至少2-3个完整的振荡周期再进入CALCULATING状态以确保数据的可靠性。3.3 整定结果验证与参数微调自整定算法给出的参数如Z-N公式算出的Kp0.6Ku, TiPu/2, TdPu/8是一个非常激进的起点。它对应的是“临界阻尼”附近的响应在实际应用中往往超调会比较大。首次验证将自整定得到的参数填入PID控制器将设定值调整到整定时的目标值如50℃观察系统响应。典型问题与微调问题响应很快但超调很大如冲到55℃才回落。微调这说明比例作用过强。等比例减小所有参数是一个安全有效的初始策略。尝试将Kp, Ti, Td同时乘以一个小于1的系数例如0.7或0.8。这能在保持动态响应形状的同时降低增益减少超调。问题超调尚可但稳定到设定值的时间非常长存在静差。微调积分作用可能不足。可以尝试适当减小积分时间Ti注意Ti越小积分作用越强或者检查积分是否因为输出饱和而被“冻结”。问题响应曲线在接近设定值时非常缓慢像“爬”上去一样。微调可能是微分作用过强或噪声被放大。可以尝试减小微分时间Td并确认是否对测量输入进行了有效的低通滤波。重要原则每次只调整一个参数或一组关联参数如同时缩放P/I/D观察效果做好记录。微调的过程正是你理解这三个参数对系统具体影响的最佳实践课。4. 进阶话题自整定的局限性与应对策略自整定并非万能钥匙理解其局限性才能更好地运用它。4.1 哪些系统不适合经典自整定非线性极强的系统例如控制阀门的开度与流量关系可能不是线性的有死区、饱和、回差。继电器反馈法得到的线性模型在整定工作点附近有效但当设定值大幅变化时同一组参数可能不再最优。大滞后系统纯滞后时间τ远大于时间常数T的系统。标准的PID对滞后补偿能力有限自整定出的参数可能效果很差此时需要考虑史密斯预估器等高级控制策略。不稳定开环系统有些系统本身开环就是不稳定的如倒立摆必须先手动 stabilizing 到一个可工作的范围才能进行自整定。约束严格、不允许振荡的过程某些化工或精密加工过程任何超出允许范围的波动都是不可接受的。继电器反馈法在此类场景中禁用。4.2 测量噪声与干扰的挑战真实的工业环境充满噪声。测量噪声会严重干扰自整定过程对继电器反馈的影响噪声可能导致继电器在滞环边缘频繁误动作破坏正常的等幅振荡。对策是合理设置滞环宽度使其大于主要噪声的幅值并对测量信号进行滤波但需注意滤波会引入相位滞后。对阶跃响应辨识的影响噪声会掩盖真实的阶跃响应曲线使特征参数提取困难。对策是进行多次测试取平均或使用更先进的信号处理技术如相关分析法从噪声中提取信号。4.3 从“自整定”到“自适应”应对时变系统如果系统特性会随时间或工作点变化如烤箱随着内部物品多少热容变化无人机随着电池电量下降动力特性变化一次性的自整定就不够了。这就需要自适应PID。一种简单的思路是增益调度预先在不同的工作点如不同温度设定值、不同飞行模式进行自整定得到多组PID参数形成一张表。运行时根据当前工作点查表切换参数。更复杂的做法是在线实时更新模型并重新计算参数这对算法和算力要求很高。5. 常见问题排查与实战技巧实录即使按照流程操作自整定过程也可能出问题。下面是我在多个项目中踩坑后总结的排查清单。问题现象可能原因排查步骤与解决方案自整定无法引发振荡1. 输出幅值设置过小。2. 系统惯性极大振荡周期远超观察时间。3. 滞环设置过大系统在未触及切换边界时就已达到平衡。1.逐步增大输出幅值在安全限幅内观察系统是否有响应趋势。2.大幅延长观察时间对于温度等慢过程等待十几分钟甚至更久是正常的。3.适当减小滞环宽度但需确保其仍大于测量噪声幅值。振荡幅度过大或失控1. 输出幅值设置过大。2. 系统增益本身很高例如加热功率很大。3. 未正确设置输出限幅。1.立即中断自整定切换回手动安全模式。2.检查硬件限幅和软件限幅是否双重生效。3.显著降低输出幅值后重试。振荡不对称上下振幅不等1. 系统非线性如加热和冷却的功率不对称。2. 设定点不在系统动态范围的中间。1. 这是正常现象取上下峰值的平均值作为振荡幅值A进行计算。2. 尝试在另一个设定点重新整定对比结果。自整定出的参数效果很差1. 辨识期间干扰大数据不准。2. 系统不满足经典自整定的假设如非线性、大滞后。3. 采样周期设置不合理。1.在环境稳定时重新整定或进行多次整定取参数平均。2.手动微调将其作为初始值进行优化。3.复查采样周期确保其与系统速度匹配。可尝试以2倍或0.5倍调整采样周期后重试。切换到PID模式后立即饱和积分项I在自整定期间累积了很大的误差Windup。在从自整定模式切换到PID模式的瞬间清除积分项累积值积分复位或者使用PID的“初始化手动”功能进行无扰切换。独家避坑技巧“两步整定法”对于特别陌生或敏感的系统不要一开始就在目标设定值整定。可以先在一个安全的、远离正常值的设定点例如温控系统先设在室温10℃进行第一次整定。这次的目的不是得到最终参数而是测试系统的动态范围、观察振荡是否安全、验证整定流程。确认无误后再到真正的目标设定值进行正式整定。记录数据曲线务必保存自整定过程中的输入PV、输出OUT随时间变化的曲线。这张图是宝贵的诊断工具。从曲线上你可以直观看到振荡是否建立、是否对称、周期多大比任何日志文字都管用。理解Z-N公式的“家族”齐格勒-尼科尔斯公式有很多变种除了经典的“四分之一衰减”型Kp0.6Ku, TiPu/2, TdPu/8还有“无超调”型Kp0.33Ku, TiPu, TdPu/3等。如果你的自整定算法允许选择根据你对超调的容忍度来选。经典公式响应快但超调大“无超调”型更平缓。PID自整定将我们从参数调试的苦海中拯救出来但它给出的不是终点而是一个高质量的起点。真正的精通在于理解其原理后能根据具体系统的细微特征和实际性能要求对初始参数进行精准的微调。这个过程依然是理论与实践结合的艺术。当你成功地将一个难以驾驭的系统通过自整定快速驯服并看着它平稳精准地跟随设定值时那种成就感正是控制工程师和开发者们乐此不疲的源泉。

相关新闻

暗黑2存档编辑器完整实战指南:零基础5分钟改出你的梦幻角色

暗黑2存档编辑器完整实战指南:零基础5分钟改出你的梦幻角色

暗黑2存档编辑器完整实战指南:零基础5分钟改出你的梦幻角色 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 凌晨一点,你的法师卡在地狱难度第三幕,仓库里躺着十几件"差一点点"的装备…

2026/10/1 10:48:05 阅读更多 →
试点期的成本、收益与风险:客户成功总监给CFO的一份账本

试点期的成本、收益与风险:客户成功总监给CFO的一份账本

导语 复盘过去几年我们参与和观察过的BI试点项目,一个反常识的结论逐渐清晰:大多数试点走不出"试"这个阶段,问题不在技术选型,而在账没算清。技术POC跑通了、样板看板做出来了、几位业务同事也认可了——但当财务和一把…

2026/10/1 3:19:45 阅读更多 →
SQL四大核心操作:INSERT、SELECT、UPDATE、DELETE实战详解

SQL四大核心操作:INSERT、SELECT、UPDATE、DELETE实战详解

1. 背景与核心概念在上一篇文章中,我们初步认识了SQL(Structured Query Language)及其在数据操作中的基础地位。如果说上一章是“认识工具”,那么本章将进入“使用工具”的阶段。对于任何希望与数据库打交道的开发者、数据分析师或…

2026/9/26 8:22:20 阅读更多 →

最新新闻

插件加载失败如何排查?从插件机制、生命周期到通用方法

插件加载失败如何排查?从插件机制、生命周期到通用方法

这几年我不管是在 IDE 里折腾扩展功能、给播放器挂个音源,还是在服务器上追测试 harness 的启动日志,最后都会回到同一个词:plugins。你可能也遇到过一长串英文报错,比如failed to load plugins web boot: 2 entries did not acti…

2026/10/4 10:32:12 阅读更多 →
TFLite Micro 资源变量(Resource Variables)指南:VAR_HANDLE / ASSIGN_VARIABLE / READ_VARIABLE 算子与跨子图状态管理的完整实践

TFLite Micro 资源变量(Resource Variables)指南:VAR_HANDLE / ASSIGN_VARIABLE / READ_VARIABLE 算子与跨子图状态管理的完整实践

人工智能深度学习推理引擎本地部署嵌入式物联网 【免费下载链接】tflite-micro Infrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors). 项目地址: h…

2026/10/4 10:32:12 阅读更多 →
MR25H40CDF+MK64FX512VDC12工业级实时数据缓存架构

MR25H40CDF+MK64FX512VDC12工业级实时数据缓存架构

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 MK64FX512VDC12 做数据存储?我在产线调试边缘数据采集模块时,反复被一个问题卡住:PLC周期性上报的传感器采样值(温度、振动、电流谐波),必须…

2026/10/4 10:32:12 阅读更多 →
AI硬件设计辅助系统:PrintWindow抓屏实现与Electron实践

AI硬件设计辅助系统:PrintWindow抓屏实现与Electron实践

1. 从“看不见”到“看得见”:AI 硬件设计辅助系统的关键一步做过硬件设计的朋友都知道,画原理图、摆器件、连网络、查封装,这些活儿琐碎且耗时。尤其是当你面对一块已经画好的板子,想快速理清某个模块的走线逻辑,或者…

2026/10/4 10:32:12 阅读更多 →
用MRAM替代Flash/EEPROM:TM4C1294 SPI驱动实践

用MRAM替代Flash/EEPROM:TM4C1294 SPI驱动实践

前阵子帮客户排查一台伺服驱动器,故障现象非常典型:设备上电后偶尔恢复出厂参数,跑了一年的运行次数莫名其妙清零。查来查去,最后问题落在EEPROM上——一天频繁写几百次运行数据,寿命先到顶了。我手边正好有Everspin的…

2026/10/4 10:32:12 阅读更多 →
AI编程插件本质:可验证服务节点与SDK契约体系

AI编程插件本质:可验证服务节点与SDK契约体系

1. “plugins”不是功能模块,而是现代AI编程工具的神经突触你点开Cursor、Codex或Zcode这类AI编程工具的设置页,看到“Plugins”那一栏时,第一反应可能是——这不就是VS Code里装个Prettier、ESLint那种插件?点几下安装完事。但实…

2026/10/4 10:31:11 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/3 9:42:36 阅读更多 →