二阶弹簧-阻尼系统PID控制器设计:MATLAB仿真与参数整定实战
简介这份文档资料面向自动化、控制工程等专业的学生与工程师围绕二阶弹簧—阻尼系统系统讲解PID控制器的设计与参数整定方法适合作为课程设计参考或控制系统仿真的入门实践材料。资源为单个doc文档压缩包约979字节内容涵盖MATLAB发展背景与语言特点、比例/积分/比例积分/比例积分微分四类控制系统的原理分析以及基于SIMULINK的建模仿真、结果分析与结论、心得体会等完整章节。读者可借此掌握用MATLAB与SIMULINK搭建二阶系统模型、添加PID模块并观察阶跃响应的流程理解比例系数Kp、积分时间Ti与微分时间Td对超调、稳态误差、上升时间和调节时间的影响并接触极点配置、幅值相位裕量、Ziegler-Nichols等整定思路。目前已有551人学习适合需要完成课程设计报告或夯实PID参数整定基础的读者参考。1. 二阶弹簧—阻尼系统PID控制器设计从微分方程到能跑的仿真很多同学拿到“二阶弹簧—阻尼系统PID控制器设计及其参数整定”这个题目第一反应是去翻控制理论教材结果被拉普拉斯变换和劳斯判据绕晕最后仿真跑出来的曲线要么发散要么振荡到没法看。其实这个题目的核心就三件事把物理系统写成微分方程、把PID控制器搭成Simulink模型或脚本、把Kp/Ki/Kd三个参数调到让阶跃响应又快又稳。它适合正在做课程设计的学生也适合刚接触控制系统、想用MATLAB把“理论公式”变成“能看见的曲线”的工程师。我见过太多人卡在参数整定这一步明明模型没错但曲线就是不对——问题往往出在没搞清二阶系统的阻尼比和PID参数之间的耦合关系。下面按“建模→搭控制器→整定→避坑→进阶”的顺序把每个环节的细节拆开讲。2. 弹簧—阻尼系统建模从牛顿第二定律到传递函数2.1 物理方程怎么变成状态空间和传递函数弹簧—阻尼系统的标准形式是质量块连接弹簧和阻尼器外力F(t)驱动。根据牛顿第二定律位移x(t)满足m·x(t) c·x(t) k·x(t) F(t)其中m是质量c是阻尼系数k是弹簧刚度。两边取拉普拉斯变换零初始条件下得到传递函数G(s) X(s)/F(s) 1 / (m·s² c·s k)写成标准二阶形式G(s) (1/m) / (s² 2ζωₙs ωₙ²)其中ωₙ sqrt(k/m)是自然频率ζ c/(2·sqrt(m·k))是阻尼比。这两个参数决定了系统的开环动态ζ1欠阻尼阶跃响应有超调ζ1临界阻尼ζ1过阻尼。课程设计里通常取m1、c2、k10这类参数让ζ≈0.316这样开环响应有明显振荡方便观察PID的调节效果。在MATLAB里我一般先用脚本把模型建好而不是直接拖Simulink模块。脚本的好处是参数改起来方便而且能直接算闭环极点。% 二阶弹簧-阻尼系统参数 m 1.0; % 质量kg c 2.0; % 阻尼系数N·s/m k 10.0; % 弹簧刚度N/m % 传递函数 G(s) 1/(m*s^2 c*s k) num [1]; den [m, c, k]; G tf(num, den); % 计算自然频率和阻尼比 wn sqrt(k/m); zeta c / (2 * sqrt(m * k)); fprintf(自然频率 wn %.4f rad/s\n, wn); fprintf(阻尼比 zeta %.4f\n, zeta); % 开环阶跃响应 figure; step(G); title(开环阶跃响应); grid on;这段代码里tf函数直接根据分子分母系数建传递函数step画开环响应。运行后你会看到一条振荡收敛的曲线稳态值最终趋向1/k0.1。注意开环稳态值不是1因为传递函数直流增益是1/k。这意味着如果直接用单位阶跃输入系统最终停在0.1而不是1所以PID控制的目标是让闭环输出跟踪参考输入1而不是让开环输出等于1。2.2 为什么不能直接对开环系统加PID就完事有人会想既然开环有稳态误差那我加个PID不就行了问题在于PID是加在闭环回路里的不是简单串联。标准反馈结构是参考输入r(t)减去输出y(t)得到误差e(t)误差经过PID控制器产生控制量u(t)u(t)驱动被控对象G(s)产生输出。所以闭环传递函数是T(s) PID(s)·G(s) / (1 PID(s)·G(s))其中PID(s) Kp Ki/s Kd·s。如果直接用开环加PID那就变成前馈控制抗扰动能力差而且稳态误差消除不了。课程设计里必须用反馈结构这是第一个容易翻车的地方。另外纯微分项Kd·s在物理上不可实现因为微分器的增益随频率无限增大噪声会被放大。实际实现时要么加一个低通滤波器即近似微分要么用后向差分离散化。MATLAB的pid函数默认用带滤波的微分但如果你自己搭Simulink记得在微分项后面串一个一阶滤波器截止频率一般取ωₙ的5~10倍。3. PID控制器搭建从连续域到离散域的两种实现3.1 连续域PID的MATLAB脚本实现最直接的方法是用pid函数创建控制器对象然后feedback求闭环。% 连续域PID控制器 Kp 20; Ki 30; Kd 5; C pid(Kp, Ki, Kd); % 闭环系统 sys_cl feedback(C * G, 1); % 阶跃响应 figure; step(sys_cl); title(连续域PID闭环阶跃响应); grid on; % 计算性能指标 info stepinfo(sys_cl); fprintf(上升时间: %.4f s\n, info.RiseTime); fprintf(超调量: %.2f%%\n, info.Overshoot); fprintf(调节时间: %.4f s\n, info.SettlingTime);这里feedback(C*G, 1)表示前向通道是CG反馈通道是1单位负反馈。stepinfo自动算上升时间、超调量、调节时间。注意pid函数默认的微分项带一阶滤波滤波器时间常数是Kd/(KpN)N默认是100。如果你想要纯微分需要手动设C pid(Kp, Ki, Kd, IFormula, ForwardEuler, DFormula, ForwardEuler)但纯微分在仿真里容易出数值问题不建议。参数怎么设先用齐格勒-尼科尔斯法粗调令Ki0、Kd0逐渐增大Kp直到闭环系统等幅振荡记下临界增益Ku和振荡周期Tu。然后按表整定Kp0.6KuKi2Kp/TuKdKp·Tu/8。但这个方法对二阶系统往往超调偏大我一般会在此基础上把Kp降20%Ki降30%Kd适当增大来抑制超调。3.2 离散域实现为什么你的仿真步长会影响稳定性实际控制器是数字的所以课程设计里通常要求离散化。离散PID的表达式u[k] Kp·e[k] Ki·T·Σe[i] (Kd/T)·(e[k] - e[k-1])其中T是采样周期。这里有个坑T不能太大否则离散化误差会让系统不稳定。经验规则是T ≤ 1/(10·ωₙ)到1/(20·ωₙ)。对于ωₙ3.16 rad/sT取0.01~0.05秒比较合适。% 离散域PID实现 T 0.01; % 采样周期 Kp 20; Ki 30; Kd 5; % 离散PID对象 C_d pid(Kp, Ki, Kd, T); % 离散被控对象 G_d c2d(G, T, zoh); % 闭环 sys_cl_d feedback(C_d * G_d, 1); % 阶跃响应 figure; step(sys_cl_d); title(离散域PID闭环阶跃响应); grid on;c2d用零阶保持器把连续对象转成离散。注意pid函数在给定T时自动用后向差分法离散。如果你手写差分方程积分项用累加、微分项用后向差分效果类似。但手写时容易忘记初始化积分累加器和上一次误差导致第一步输出异常。提示离散仿真时如果T选得太大你会看到阶跃响应出现明显台阶甚至振荡发散。这时候先检查T是否满足采样定理再检查PID参数是否因为离散化而等效变大。4. 参数整定从齐格勒-尼科尔斯到试凑法的实操细节4.1 齐格勒-尼科尔斯法在二阶系统上的偏差齐格勒-尼科尔斯法原本是针对一阶加纯滞后系统提出的直接套到二阶系统上往往超调过大。我做过对比对于m1、c2、k10的系统用ZN法整定得到Kp18、Ki36、Kd2.25闭环超调量超过40%调节时间接近2秒。而手动把Kp降到12、Ki降到20、Kd升到4超调量降到15%以下调节时间缩短到1.2秒。为什么因为ZN法假设系统有纯滞后而二阶系统没有纯滞后相位裕度充足所以ZN法给出的增益偏大。修正方法是先按ZN法算出参数然后把Kp乘以0.6~0.7Ki乘以0.5~0.6Kd乘以1.2~1.5。这个经验系数对大多数二阶系统都适用。4.2 试凑法的顺序和观察指标试凑法不是瞎试顺序很重要先调Kp再调Kd最后调Ki。第一步Ki0、Kd0增大Kp直到阶跃响应出现等幅振荡记下此时的Kp为Ku。然后取Kp0.5Ku。第二步保持Kp不变增大Kd。Kd的作用是增加阻尼减小超调。但Kd太大会放大高频噪声而且会让上升时间变长。观察超调量降到10%左右时停止。第三步加入Ki消除稳态误差。Ki从0开始慢慢增大直到稳态误差在调节时间内消失。但Ki太大会引起低频振荡表现为响应曲线在稳态值附近缓慢摆动。% 试凑法参数扫描 Kp_range [8, 12, 16, 20]; Ki_range [10, 20, 30, 40]; Kd_range [2, 4, 6, 8]; best_overshoot inf; best_params [0, 0, 0]; for Kp Kp_range for Ki Ki_range for Kd Kd_range C pid(Kp, Ki, Kd); sys_cl feedback(C * G, 1); info stepinfo(sys_cl); if info.Overshoot best_overshoot info.SettlingTime 2.0 best_overshoot info.Overshoot; best_params [Kp, Ki, Kd]; end end end end fprintf(最优参数: Kp%.1f, Ki%.1f, Kd%.1f\n, best_params(1), best_params(2), best_params(3)); fprintf(超调量: %.2f%%\n, best_overshoot);这段代码用三重循环扫描参数组合找出超调量最小且调节时间小于2秒的组合。实际运行时可能比较慢因为每次都要算闭环阶跃响应。可以先用粗网格再在最优附近细调。注意stepinfo对振荡收敛的系统可能给出错误的调节时间因为它默认以2%误差带为准如果系统一直在2%附近波动调节时间会算得很大。这时候要手动看曲线。4.3 用根轨迹和频域法辅助整定除了试凑还可以用根轨迹看闭环极点位置。对于二阶系统闭环极点决定了响应形状实极点对应过阻尼共轭复极点对应欠阻尼。PID控制器引入一个零点来自微分项和一个极点来自积分项会改变根轨迹形状。% 根轨迹分析 figure; rlocus(G); title(开环根轨迹); grid on; % 加入PID后的根轨迹 C pid(12, 20, 4); figure; rlocus(C * G); title(PID补偿后的根轨迹); grid on;看根轨迹时目标是让闭环主导极点落在ζ0.7、ωₙ5 rad/s附近。这对应超调量约5%、调节时间约0.8秒。如果根轨迹不经过这个区域说明PID结构需要调整比如增加微分滤波或改用PI-D结构。注意根轨迹法假设增益可变但PID有三个参数根轨迹只能看一个参数变化。所以通常固定Ki和Kd画Kp变化的根轨迹或者用sisotool交互式调整。5. 避坑与排查课程设计里最容易翻车的五个地方5.1 仿真步长太大导致离散化失稳现象离散仿真时阶跃响应发散或剧烈振荡但连续仿真正常。 原因采样周期T不满足T ≤ 1/(10·ωₙ)离散化后等效增益变大相位裕度损失。 解决把T减小到0.01秒以下或者用c2d时选tustin方法而不是zoh。如果必须用大T就要重新整定PID参数降低Kp和Ki。5.2 微分项引入噪声放大现象仿真曲线在稳态附近有高频毛刺或者实际控制器输出抖动严重。 原因纯微分对高频噪声增益无穷大数值仿真里舍入误差被放大。 解决在微分项后串一阶低通滤波器截止频率取ωₙ的5~10倍。MATLAB的pid函数默认带滤波但如果你手写差分方程记得加滤波% 带滤波的离散PID T 0.01; Kp 12; Ki 20; Kd 4; N 100; % 滤波系数 tau_f Kd / (Kp * N); % 滤波时间常数 % 差分方程实现 e zeros(1, 1000); u zeros(1, 1000); integral 0; prev_e 0; prev_u 0; for k 2:1000 r 1; % 参考输入 y 0; % 需要从对象模型计算这里省略 e(k) r - y; integral integral e(k) * T; derivative (e(k) - prev_e) / T; % 滤波后的微分 filtered_derivative (tau_f * prev_u Kd * derivative) / (tau_f T); u(k) Kp * e(k) Ki * integral filtered_derivative; prev_e e(k); prev_u u(k); end这段代码里filtered_derivative用一阶滤波代替纯微分tau_f是滤波时间常数。注意prev_u在第一次循环时是0需要初始化。5.3 积分饱和导致超调过大现象阶跃响应上升很快但超调量远超预期而且回落很慢。 原因积分项在误差大时持续累加导致控制量饱和误差反向后积分项需要很长时间才能退饱和。 解决加积分限幅或者用抗饱和PID结构。简单做法是限制积分累加器的上下限integral integral e(k) * T; if integral 10 integral 10; elseif integral -10 integral -10; end限幅值根据控制量范围定一般取稳态控制量的2~3倍。5.4 参考输入突变导致微分冲击现象参考输入从0跳到1时微分项输出一个极大的尖峰控制量瞬间饱和。 原因微分项对误差的导数敏感参考输入突变时误差导数趋于无穷。 解决用PI-D结构即微分项只对输出y微分不对误差e微分。这样参考输入突变时微分项不响应避免冲击。MATLAB里可以用pid的IFormula和DFormula选项或者手动搭% PI-D结构微分只对输出 C_pid pid(Kp, Ki, Kd, DFormula, BackwardEuler); % 或者用setfield修改 C_pid setfield(C_pid, d, Output);5.5 性能指标计算错误现象stepinfo给出的调节时间很大但曲线看起来早就稳定了。 原因stepinfo默认用2%误差带如果系统有微小振荡调节时间会算到振荡消失为止。 解决手动指定误差带比如stepinfo(sys_cl, SettlingTimeThreshold, 0.05)或者直接看曲线估读。另外stepinfo对离散系统可能返回NaN这时候用step画图后手动读。6. 进阶技巧用Simulink快速验证和自动整定6.1 Simulink模型搭建的快捷方法脚本调参虽然灵活但Simulink更直观。我一般用pidTuner工具自动整定然后导出参数到Simulink。步骤在MATLAB命令行输入pidTuner(G)会打开交互界面拖动滑块就能看响应变化。调好后点“导出”把参数存到工作区Simulink里PID模块直接引用变量名。Simulink模型搭建时注意用Transfer Fcn模块表示G(s)PID Controller模块表示C(s)Sum模块做误差计算Scope看输出。仿真步长设成固定步长0.001秒求解器用ode4龙格-库塔。如果曲线有毛刺把步长再减小。6.2 自动整定函数pidtune的用法pidtune是MATLAB自带的自动整定函数比手动试凑快得多% 自动整定 C_auto pidtune(G, PID); fprintf(自动整定参数: Kp%.2f, Ki%.2f, Kd%.2f\n, C_auto.Kp, C_auto.Ki, C_auto.Kd); % 指定带宽 C_auto2 pidtune(G, PID, 5); % 带宽5 rad/s fprintf(指定带宽参数: Kp%.2f, Ki%.2f, Kd%.2f\n, C_auto2.Kp, C_auto2.Ki, C_auto2.Kd);pidtune默认以60度相位裕度为目标整定出的参数通常比较保守超调小但响应慢。如果你想要更快响应把带宽设大一点但注意不要超过系统自然频率的2倍否则容易振荡。6.3 从仿真到实物的三个检查点课程设计通常只要求仿真但如果你要接实物注意三点第一执行器饱和仿真里控制量可以无限大实物里电机电压有限所以积分限幅必须加第二传感器噪声实物里位移传感器有噪声微分项会放大所以滤波截止频率要调低第三采样延迟实物控制器有计算延迟离散模型里要加一个采样周期的延迟环节。我自己的习惯是先在脚本里用pidtune粗调再用pidTuner微调最后在Simulink里跑一遍确认。参数整定没有唯一解只要超调量小于20%、调节时间小于2秒、稳态误差为零就算合格。别追求完美曲线那个只存在于教科书里。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Java后端接入大模型API的Prompt注入防护与敏感信息过滤实战

Java后端接入大模型API的Prompt注入防护与敏感信息过滤实战

上个月我负责的Java后端服务接入了第三方大模型接口,本来以为只要按官方文档把API调通就行了,结果一条prompt给我上了一课。用户提交了一段很短的话,里面混了半句“忽略之前所有指令”之类的提示词注入,模型直接开始跟用户聊起了系…

2026/10/9 8:18:55 阅读更多 →
Java后端大模型接入实战:构建Prompt过滤与敏感信息脱敏防线

Java后端大模型接入实战:构建Prompt过滤与敏感信息脱敏防线

最近在做一个Java后端接入大模型的项目,先说个现象:用户这边觉得自己在和“智能助手”聊天,那边我们的服务实际上已经把用户输入的手机号、身份证号、银行卡号、家庭住址,连同prompt一起原封不动地发给了外部大模型API。更要命的是…

2026/10/9 8:18:55 阅读更多 →
SpringBoot实战:构建C2C二手交易保障系统

SpringBoot实战:构建C2C二手交易保障系统

1. 项目核心思路与系统设计做二手闲置交易系统,我是有备而来的。几年前我自己在闲鱼上买卖过几台相机和镜头,体验过"卖家挂出去没人问、买家私聊半天不敢付款"的尴尬,也见过同学在QQ群里卖旧书被骗子坑了押金。所以当接到这个"…

2026/10/9 8:18:55 阅读更多 →

最新新闻

t3code 深度解析:Electron + CLI + Homebrew/winget 跨平台工具链实战

t3code 深度解析:Electron + CLI + Homebrew/winget 跨平台工具链实战

1. 从 t3code 这个标题说起:它到底想解决什么问题第一次看到 “t3code” 这个标题,我脑子里蹦出来的第一反应是:这大概率是一个围绕命令行工具链做整合的项目,而且名字里的 “t3” 很可能对应着某种技术栈缩写或者版本代号。结合热…

2026/10/9 9:52:12 阅读更多 →
可靠性工程师:从失效分析到全生命周期质量保障

可靠性工程师:从失效分析到全生命周期质量保障

1. 先把这个岗位说清楚说实话,十年前我刚入行的时候,别人问我是干嘛的,我说做可靠性,十个人有九个会反问:“那是啥?”现在好多了,起码大家知道这个岗位跟产品质量沾边,但理解依然很有…

2026/10/9 9:52:12 阅读更多 →
opencode 工具系统深度解析:从设计到实战集成

opencode 工具系统深度解析:从设计到实战集成

1. 从“工具”这个词说起:opencode 的定位到底特殊在哪聊 opencode 的工具系统之前,得先把一个容易混淆的概念掰扯清楚。很多人第一次接触 opencode,看到“工具”两个字,脑子里第一反应是插件市场里那种装完就多一个按钮的东西。但…

2026/10/9 9:52:12 阅读更多 →
私域团购区域招商实战:平台与供应链联合模式及团长运营指南

私域团购区域招商实战:平台与供应链联合模式及团长运营指南

1. 一场招商大会背后,私域团购正在发生什么变化私域团购这个词,这两年从朋友圈里的零星拼单,一路演变成了一个有着完整上下游的渠道体系。我关注这个领域大概有三年多,从最早的社群接龙、快团团工具,到后来各种区域平台…

2026/10/9 9:52:12 阅读更多 →
改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论文复现】

改进的多目标差分进化算法在电力系统环境经济调度中的应用(Python代码实现)【电气期刊论文复现】

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/9 9:52:12 阅读更多 →
MiFlashi专业刷机工具深度解析:fastboot兼容与小米OEM指令支持

MiFlashi专业刷机工具深度解析:fastboot兼容与小米OEM指令支持

1. 刷机不是“点一下就完事”:为什么小米用户需要真正专业的刷机工具“MiFlashi”这个名字一出现,老米粉心里基本就有数了——它不是那种点开就弹窗、点下一步就报错的“一键傻瓜式”工具。我接触过太多案例:某位A同学想给闲置的小米Note 3刷…

2026/10/9 9:51:10 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/8 15:26:40 阅读更多 →
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/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →