专家PID控制MATLAB程序代码:规则表与增量式PID融合实现
简介这份资源是面向自动化、控制工程方向学习者与科研人员的专家PID控制MATLAB程序代码文档适合已掌握常规PID、希望进一步理解智能控制策略的中高级读者。资源以PDF形式呈现共1个文件压缩包约85KB内容围绕专家PID这一直接型专家控制器展开无需被控对象精确模型依靠专家经验整定PID参数。文档结合典型二阶系统单位阶跃响应误差曲线将误差状态划分为五种情形分别给出开环控制、较强或一般控制、保持输出、极值处理以及引入积分消除稳态误差等规则并附完整MATLAB仿真代码涵盖传递函数建立、零阶保持器离散化、参数初始化与循环控制实现。已有271人学习可帮助读者对照规则理解控制逻辑快速复现仿真并迁移到自身课题中。1. 专家PID控制的MATLAB程序代码从规则表到可跑通的闭环如果你做过温控、电机调速或者液位调节大概率遇到过这种场景常规PID在设定值附近稳得住可一旦工况跳变——比如负载突然加重、环境温度骤降——超调就压不住或者响应慢得像蜗牛。这时候有人会提“专家PID”听起来玄学其实核心就一句话用一组if-else规则根据误差和误差变化率实时调整PID三个参数让控制器像有经验的老师傅一样“看情况下手”。标题里的“专家PID控制的MATLAB程序代码.pdf”本质是一份把专家规则和PID增量式算法揉在一起的实现文档。它解决的是固定参数PID在非线性、时变工况下适应性差的问题适合已经会写基础PID、想进一步做参数自整定的控制方向从业者。下面我按“规则怎么建→代码怎么写→参数怎么调→坑在哪”的顺序把这份方案拆成能直接复现的步骤。2. 专家PID的规则表怎么建误差与误差变化率的四象限划分2.1 为什么不用模糊PID而选专家规则模糊PID需要设计隶属度函数和模糊推理表调试周期长对新手不友好。专家PID直接用分段规则逻辑透明改一条规则就能看到对应效果。常见做法是把误差e和误差变化率ec分成若干区间每个区间对应一组Kp、Ki、Kd的调整策略。我一般会先把e和ec归一化到[-1,1]然后按四个象限处理e0且ec0误差在扩大、e0且ec0误差在收敛、e0且ec0反向误差在扩大、e0且ec0反向误差在收敛。每个象限里再按|e|大小分三档大误差、中误差、小误差。误差区间误差变化率Kp调整Ki调整Kd调整|e|0.8ec0增大置零减小|e|0.8ec0增大置零适中0.3|e|≤0.8任意适中小幅增大适中|e|≤0.3ec0减小增大增大|e|≤0.3ec0减小增大减小这张表不是死的实际调的时候先按这个骨架搭再根据被控对象惯性微调。惯性大的系统Kd可以整体偏大惯性小的系统Ki要压着点否则容易振荡。2.2 规则表的MATLAB表达方式把规则表写成矩阵比一堆if-else更清爽也方便后续改成查表法。下面这段是规则表的初始化代码% 专家规则表初始化 % 行误差区间 1大 2中 3小 % 列误差变化率方向 1同向(扩大) 2反向(收敛) % 每个单元格存 [Kp系数, Ki系数, Kd系数] rule_table zeros(3, 2, 3); % 大误差区Kp拉满Ki切掉Kd看方向 rule_table(1,1,:) [1.8, 0.0, 0.6]; % 大误差同向Kd压一点防超调 rule_table(1,2,:) [1.8, 0.0, 1.0]; % 大误差反向Kd正常 % 中误差区Kp适中Ki小幅介入 rule_table(2,1,:) [1.2, 0.3, 0.8]; rule_table(2,2,:) [1.2, 0.5, 0.8]; % 小误差区Kp收Ki推Kd细调 rule_table(3,1,:) [0.6, 1.2, 1.5]; % 小误差同向Kd加大抑制 rule_table(3,2,:) [0.6, 1.5, 0.9]; % 小误差反向Kd收一点逻辑说明rule_table的三个维度分别对应误差档位、误差变化率方向、三个PID系数。系数是相对于基准Kp0、Ki0、Kd0的倍率最终输出KpKp0*rule_table(i,j,1)。这样改基准值就能整体缩放不用逐条改规则。参数说明基准值Kp0、Ki0、Kd0建议先用常规PID整定法如Ziegler-Nichols得到一组能稳定的值再作为倍率基准。倍率范围一般控制在0.3到2.0之间超过2.0容易振荡低于0.3响应太肉。3. 增量式PID与专家规则的融合代码怎么写3.1 增量式PID的递推形式专家PID通常用增量式因为增量式不需要累加历史误差抗积分饱和天然有优势。公式是Δu Kp*(e(k)-e(k-1)) Kie(k) Kd(e(k)-2e(k-1)e(k-2))其中Ki实际是KpT/TiKd是KpTd/T代码里直接给Ki、Kd系数就行。% 增量式PID 专家规则主循环 % 输入setpoint设定值y实际输出Ts采样周期 % 输出u控制量 persistent e_prev e_prev2 u_prev if isempty(e_prev) e_prev 0; e_prev2 0; u_prev 0; end e setpoint - y; % 当前误差 ec (e - e_prev) / Ts; % 误差变化率 % 归一化误差和误差变化率 e_norm max(min(e / e_max, 1), -1); ec_norm max(min(ec / ec_max, 1), -1); % 查规则表 if abs(e_norm) 0.8 row 1; elseif abs(e_norm) 0.3 row 2; else row 3; end if sign(e_norm) sign(ec_norm) col 1; % 误差在扩大 else col 2; % 误差在收敛 end Kp Kp0 * rule_table(row, col, 1); Ki Ki0 * rule_table(row, col, 2); Kd Kd0 * rule_table(row, col, 3); % 增量式PID计算 du Kp*(e - e_prev) Ki*e Kd*(e - 2*e_prev e_prev2); u u_prev du; % 输出限幅 u max(min(u, u_max), u_min); % 更新历史值 e_prev2 e_prev; e_prev e; u_prev u;逻辑说明先算e和ec归一化后查表得到三个倍率再代入增量式公式。注意ec用差分除以TsTs要跟实际采样周期一致否则ec量纲不对规则表阈值全乱。参数说明e_max和ec_max是归一化基准一般取设定值的10%到20%作为e_maxec_max取e_max/Ts的1到2倍。u_max和u_min根据执行器范围定比如阀门0到100加热器0到220V对应的PWM占空比。3.2 规则表查表的边界处理查表时如果e_norm正好等于0.8或0.3按大于处理还是大于等于处理会影响切换瞬间的抖动。我一般用大于边界值归到下一档避免在阈值附近反复跳变。另外ec_norm为0时sign(0)0跟e_norm的sign比较会落到else分支也就是按收敛处理这个行为要心里有数。如果被控对象噪声大ec会抖得厉害查表结果也跟着抖。常见做法是给ec加一阶低通滤波% ec低通滤波 alpha 0.3; % 滤波系数越小越平滑但滞后越大 ec_filt alpha * ec (1 - alpha) * ec_filt_prev; ec_filt_prev ec_filt;alpha取0.2到0.4之间比较稳太小了响应迟钝太大了滤波没效果。4. 参数整定与仿真验证怎么判断规则表调对了4.1 基准PID参数的整定顺序专家规则是在基准参数上做倍率调整所以基准参数必须先整定好。顺序是先只开Kp加到系统开始等幅振荡记下临界增益Ku和振荡周期Tu然后按Ziegler-Nichols表取Kp0.6KuKi2Kp/TuKdKp*Tu/8。这组值作为Kp0、Ki0、Kd0。整定完基准后把专家规则使能观察阶跃响应。如果超调比纯PID还大说明大误差区的Kp倍率给高了如果响应变慢说明小误差区的Ki倍率不够。4.2 仿真对比纯PID vs 专家PID用MATLAB写一个二阶对象做对比% 被控对象二阶传递函数 s tf(s); G 1 / (s^2 2*s 1); % 临界阻尼对象 % 仿真设置 Ts 0.01; T_end 10; t 0:Ts:T_end; N length(t); % 纯PID参数 Kp_pure 2.0; Ki_pure 1.5; Kd_pure 0.5; % 专家PID基准参数 Kp0 2.0; Ki0 1.5; Kd0 0.5; % 预分配 y_pure zeros(1,N); y_expert zeros(1,N); u_pure zeros(1,N); u_expert zeros(1,N); e_pure_prev 0; e_pure_prev2 0; e_exp_prev 0; e_exp_prev2 0; for k 2:N % 纯PID e_p 1 - y_pure(k-1); du_p Kp_pure*(e_p - e_pure_prev) Ki_pure*e_p ... Kd_pure*(e_p - 2*e_pure_prev e_pure_prev2); u_pure(k) u_pure(k-1) du_p; u_pure(k) max(min(u_pure(k), 10), -10); % 对象离散化近似 y_pure(k) y_pure(k-1) Ts*(y_pure(k-1) - y_pure(k-1)^2 u_pure(k)); e_pure_prev2 e_pure_prev; e_pure_prev e_p; % 专家PID e_x 1 - y_expert(k-1); ec_x (e_x - e_exp_prev) / Ts; e_norm max(min(e_x / 0.5, 1), -1); ec_norm max(min(ec_x / 5, 1), -1); if abs(e_norm) 0.8 row 1; elseif abs(e_norm) 0.3 row 2; else row 3; end if sign(e_norm) sign(ec_norm) col 1; else col 2; end Kp_x Kp0 * rule_table(row, col, 1); Ki_x Ki0 * rule_table(row, col, 2); Kd_x Kd0 * rule_table(row, col, 3); du_x Kp_x*(e_x - e_exp_prev) Ki_x*e_x ... Kd_x*(e_x - 2*e_exp_prev e_exp_prev2); u_expert(k) u_expert(k-1) du_x; u_expert(k) max(min(u_expert(k), 10), -10); y_expert(k) y_expert(k-1) Ts*(y_expert(k-1) - y_expert(k-1)^2 u_expert(k)); e_exp_prev2 e_exp_prev; e_exp_prev e_x; end % 绘图 figure; plot(t, y_pure, b--, t, y_expert, r-, LineWidth, 1.5); legend(纯PID, 专家PID); xlabel(时间(s)); ylabel(输出); grid on;逻辑说明对象用离散化近似模拟纯PID和专家PID跑同一对象对比超调和调节时间。专家PID在大误差区Kp倍率1.8比纯PID的2.0小但Ki被切掉所以超调更小小误差区Ki倍率1.2到1.5收敛更快。参数说明e_max取0.5ec_max取5这两个值要根据实际对象调整。如果对象增益大e_max可以取小一点让规则更早介入。4.3 仿真结果怎么看跑完看三条超调量、调节时间、稳态误差。专家PID的超调量应该比纯PID小20%以上调节时间持平或略短。如果超调没降检查大误差区的Kd倍率是不是太小如果调节时间变长检查小误差区的Ki倍率是不是被压住了。5. 避坑与排查专家PID调参的五个血泪教训5.1 误差归一化基准设错导致规则表失效现象规则表明明写了三档但仿真时Kp一直不变像没生效。 原因e_max设得太大e_norm始终小于0.3永远落在小误差区。 解决先跑一次纯PID记录最大误差把e_max设成最大误差的1.2倍左右。ec_max同理用最大误差变化率的1.2倍。5.2 增量式PID的积分项理解偏差现象Ki倍率调大后稳态误差反而变大。 原因增量式里Kie这一项e是当前误差不是误差累加。如果e本身很小Ki再大也推不动。 解决增量式的积分作用体现在e的持续存在上如果稳态误差已经很小Ki倍率不用给太大。真要消稳态误差靠的是Kie在多个周期累积不是单周期猛推。5.3 规则表切换时的控制量跳变现象误差从大档切到中档时u突然跳一下执行器有异响。 原因两档的Kp倍率差太大比如1.8直接跳到1.2du计算出来突变。 解决在规则表里加过渡档或者对Kp、Ki、Kd做一阶低通滤波让倍率平滑过渡。滤波系数取0.1到0.2滞后可接受。5.4 ec符号判断在噪声下反复翻转现象col在1和2之间高频切换Kd倍率跟着抖。 原因ec被噪声污染sign(ec)频繁变号。 解决给ec加低通滤波或者加死区|ec|ec_deadzone时保持上一次的col值。ec_deadzone取ec_max的5%到10%。5.5 输出限幅位置放错导致积分饱和现象u已经到限幅值但误差还在退出限幅后响应迟钝。 原因限幅只加在u上没有反馈到积分项。增量式虽然抗饱和好一些但Ki*e项在限幅期间仍在累加。 解决限幅时把e清零或者用条件积分——当u达到限幅且du方向指向限幅外时跳过本次积分项。6. 进阶技巧把专家规则表做成可在线调整的参数6.1 用结构体管理规则表硬编码的rule_table改起来要动代码调试时很麻烦。我一般把它塞进结构体配合MATLAB的save/load调参不用重编译% 规则表结构体 expert_rule.table zeros(3,2,3); expert_rule.table(1,1,:) [1.8, 0.0, 0.6]; expert_rule.table(1,2,:) [1.8, 0.0, 1.0]; expert_rule.table(2,1,:) [1.2, 0.3, 0.8]; expert_rule.table(2,2,:) [1.2, 0.5, 0.8]; expert_rule.table(3,1,:) [0.6, 1.2, 1.5]; expert_rule.table(3,2,:) [0.6, 1.5, 0.9]; expert_rule.e_max 0.5; expert_rule.ec_max 5.0; expert_rule.ec_alpha 0.3; % 保存 save(expert_rule.mat, expert_rule); % 加载 load(expert_rule.mat);这样调参时只改mat文件主程序不动。如果要做在线调整可以把结构体挂到App Designer的滑块回调里实时改倍率看响应。6.2 用Simulink做快速验证MATLAB脚本跑仿真虽然灵活但改结构麻烦。Simulink里用MATLAB Function块把专家PID逻辑包进去输入e和ec输出du外面接被控对象。这样换对象只改Simulink模型规则逻辑复用。function du expert_pid(e, ec, rule_table, Kp0, Ki0, Kd0, e_max, ec_max) %#codegen e_norm max(min(e/e_max, 1), -1); ec_norm max(min(ec/ec_max, 1), -1); if abs(e_norm) 0.8 row 1; elseif abs(e_norm) 0.3 row 2; else row 3; end if sign(e_norm) sign(ec_norm) col 1; else col 2; end Kp Kp0 * rule_table(row, col, 1); Ki Ki0 * rule_table(row, col, 2); Kd Kd0 * rule_table(row, col, 3); persistent e_prev e_prev2 if isempty(e_prev) e_prev 0; e_prev2 0; end du Kp*(e - e_prev) Ki*e Kd*(e - 2*e_prev e_prev2); e_prev2 e_prev; e_prev e;注意MATLAB Function块里persistent变量在代码生成时支持但仿真时要勾选“支持可变大小”之类的选项具体看MATLAB版本。如果报错就把历史值改成输入端口传进来。6.3 一个验证规则表是否合理的快速方法不用跑完整仿真直接扫一遍e和ec的网格看Kp、Ki、Kd的曲面连不连续。如果曲面有断崖实际运行时控制量就会跳。下面这段扫网格的代码% 扫网格看参数曲面 e_vec linspace(-1, 1, 50); ec_vec linspace(-1, 1, 50); Kp_surf zeros(50, 50); for i 1:50 for j 1:50 e_norm e_vec(i); ec_norm ec_vec(j); if abs(e_norm) 0.8 row 1; elseif abs(e_norm) 0.3 row 2; else row 3; end if sign(e_norm) sign(ec_norm) col 1; else col 2; end Kp_surf(i,j) rule_table(row, col, 1); end end figure; surf(ec_vec, e_vec, Kp_surf); xlabel(ec归一化); ylabel(e归一化); zlabel(Kp倍率); title(Kp倍率曲面);如果曲面在e_norm0.8或0.3处有台阶说明规则表切换太硬。可以在台阶附近加线性插值让倍率平滑过渡。插值宽度取0.1左右既保留规则表的主体逻辑又消掉跳变。我自己的习惯是每次改完规则表先扫一遍曲面确认没有断崖再跑阶跃仿真。这个习惯帮我省了不少现场调试的时间——现场改参数可没有MATLAB那么方便能提前在仿真里发现的坑就别留到现场。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

深度学习如何提升视觉SLAM性能:从特征提取到不确定性建模

深度学习如何提升视觉SLAM性能:从特征提取到不确定性建模

1. 视觉SLAM的“眼睛”与“脑子”:为什么传统方法卡在精度和鲁棒性的死循环里 视觉SLAM(Simultaneous Localization and Mapping)不是个新概念,但直到今天,很多刚接触ROS小车建图、PX4无人机自主导航的朋友&#xff0c…

2026/10/15 11:00:08 阅读更多 →
Matlab实现车辆路径规划(VRP)算法详解

Matlab实现车辆路径规划(VRP)算法详解

1. 车辆路径规划问题概述 车辆路径规划(Vehicle Routing Problem, VRP)是运筹学中一个经典且实用的研究方向,主要解决如何在满足各种约束条件下,为车队设计最优的配送路线。这个问题最早由Dantzig和Ramser在1959年提出&#xff0c…

2026/10/15 11:00:08 阅读更多 →
专家PID控制MATLAB程序代码:规则表到闭环实现

专家PID控制MATLAB程序代码:规则表到闭环实现

简介:这份资源是面向自动化、控制工程方向学习者与科研人员的专家PID控制MATLAB程序代码文档,适合已掌握常规PID、希望进一步理解智能控制策略的中高级读者。资源以PDF形式呈现,共1个文件,压缩包约85KB,内容围绕专家PI…

2026/10/15 11:00:08 阅读更多 →

最新新闻

RHEL 8存储管理实战:Stratis与VDO的池化、去重与组合使用

RHEL 8存储管理实战:Stratis与VDO的池化、去重与组合使用

1. 为什么要在RHEL 8上折腾Stratis和VDORHEL 8把存储管理拆成了两条腿走路:一条是Stratis,面向本地磁盘池的"傻瓜式"卷管理;另一条是VDO,面向块设备的"压缩去重"层。很多人第一次听到这两个词的反应是"L…

2026/10/15 11:45:26 阅读更多 →
Kindle Fire Utility刷机实战:驱动、adb与fastboot救砖指南

Kindle Fire Utility刷机实战:驱动、adb与fastboot救砖指南

简介:Kindle Fire Utility v0.9.9刷机工具包是面向Amazon Kindle Fire HD用户的定制与修复工具,主要用于获取root权限、刷入自定义恢复系统以及应对设备无法正常开机等场景。压缩包共43个文件,约18.33MB,包括12个exe主程序和11个d…

2026/10/15 11:45:26 阅读更多 →
context-mode:日志排障与代码阅读的上下文利器

context-mode:日志排障与代码阅读的上下文利器

有一次线上报警,服务内存持续飙升。我翻日志文件,看到上百条孤零零的 OutOfMemoryError ,每一条都长得几乎一样,既看不出是哪条调用链触发的,也看不出当时的线程状态和参数。那会儿我只有一个想法:如果这…

2026/10/15 11:45:26 阅读更多 →
AI时代品牌流量基建:传播易GEO生成式引擎优化服务采购攻略

AI时代品牌流量基建:传播易GEO生成式引擎优化服务采购攻略

随着生成式AI大模型成为用户核心信息获取载体,品牌在AI问答场景中的可见度与可信度,已经成为决定B2B企业采购决策、B2C用户消费选择的核心因素。区别于传统搜索引擎营销,GEO(Generative Engine Optimization,生成式引擎优化)是适配…

2026/10/15 11:45:26 阅读更多 →
MCP协议中context-mode的本质与SQLite FTS5上下文索引实践

MCP协议中context-mode的本质与SQLite FTS5上下文索引实践

1. “context-mode”不是功能开关,而是MCP协议中上下文协商的运行态标识 最近在多个开发场景里反复看到“context-mode”这个词——它既不像传统软件里的“debug mode”或“production mode”那样直白,也不像HTTP头里的 X-Mode 那样有明确语义。我最初…

2026/10/15 11:45:26 阅读更多 →
14B视频世界模型如何实现零样本实时闭环机器人策略

14B视频世界模型如何实现零样本实时闭环机器人策略

1. 从一段标题说起:为什么“视频世界模型”突然成了机器人圈的热词第一次看到“把 14B 视频世界模型变成可实时闭环执行的零样本机器人策略”这个说法时,我脑子里冒出来的第一个念头是:这不就是把“看视频学做事”这件事,从离线训…

2026/10/15 11:44:23 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29: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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →