PID算法实战指南:从仿真调参到硬件部署避坑
简介本资源是一套面向嵌入式开发初学者与单片机工程师的PID控制算法实战代码库聚焦STM32平台闭环控制场景解决电机调速、温控系统、姿态稳定等典型应用中控制器设计与移植难题。压缩包共394个文件以99个C源文件和102个头文件.c/.h构成核心算法实现辅以45个编译中间文件.o/.d、42个调试符号文件.crf及Keil工程相关配置.uvprojx/.uvoptx/.sct等完整覆盖编译、调试、烧录全流程包体大小为16.29MB。已有1535人学习下载体现较强实践参考价值。读者可直接获取三种工业级PID变体——位置型适用于连续输出场景、增量型专为单片机资源受限环境优化及积分分离型抑制超调与振荡并基于已验证的STM32F10x外设驱动如tim.c、flash.c快速集成到自有项目所有代码均通过Keil MDK实测含axf可执行镜像与hex烧录文件开箱即用。1. PID算法代码.zip不是拿来就跑的“万能解”而是要亲手调参、看曲线、盯误差的控制黑匣子你双击打开PID算法代码.zip里面是几个.py或.c文件可能还带个README.md——但别急着python main.py。这包代码不是端到端AI模型那种“喂数据→出结果”的傻瓜式工具它是一套实时闭环控制的骨架核心价值不在“能跑”而在“能控”让电机转速稳在1200rpm不飘±5让水箱液位卡在85cm不动如山让四旋翼悬停时姿态角抖动小于0.3°。它解决的是动态系统中“想让它停在哪它真就停在哪”的问题而不是图像识别或文本生成这类开环任务。适合正在做嵌入式控制、运动平台调试、温控/压控硬件开发的工程师也适合自动化/机器人方向的学生做课程设计——但前提是你得愿意花3小时盯着阶跃响应曲线改三个数字Kp/Ki/Kd而不是指望一键收敛。很多新手翻车不是因为代码写错而是把PID当成“自动调参神器”忘了它本质是用数学语言翻译人类操作经验比例项像人手推得快慢积分项像人记性好坏微分项像人预判能力。这个zip包就是给你一支可擦写的铅笔不是直接印好答案的试卷。2. 从零跑通用Pythonmatplotlib复现经典阶跃响应验证代码逻辑是否可信PID控制器的落地第一关不是接硬件而是在纯软件里看见它的呼吸。我们用最轻量的方式Python matplotlibscipy不依赖任何RTOS或单片机先让代码在桌面环境“活”起来。目标明确输入一个单位阶跃信号t1s时从0跳到1输出被控对象这里选一阶惯性环节时间常数T2s的响应曲线并叠加PID调节后的效果。这步不为性能只为确认三件事代码里PID计算逻辑没写反、离散化公式没搞错、采样周期和参数量纲匹配。2.1 搭建最小仿真环境50行代码跑出响应曲线import numpy as np import matplotlib.pyplot as plt from scipy.integrate import solve_ivp # 被控对象一阶惯性环节 G(s) 1/(2s1) def plant_model(t, y, u): return (u - y) / 2.0 # dy/dt (u-y)/T, T2 # PID控制器位置式离散化 class PIDController: def __init__(self, Kp, Ki, Kd, dt): self.Kp, self.Ki, self.Kd Kp, Ki, Kd self.dt dt self.error_last 0.0 self.integral 0.0 def compute(self, setpoint, pv): error setpoint - pv self.integral error * self.dt derivative (error - self.error_last) / self.dt output self.Kp * error self.Ki * self.integral self.Kd * derivative self.error_last error return output # 仿真主流程 dt 0.01 # 采样周期 10ms t_span (0, 20) # 仿真20秒 t_eval np.arange(0, 20, dt) # 初始化 pid PIDController(Kp1.2, Ki0.5, Kd0.1, dtdt) y0 [0.0] # 初始状态 u_history [] y_history [] # 仿真循环显式欧拉便于理解 for t in t_eval: setpoint 1.0 if t 1.0 else 0.0 # t1s时阶跃 u pid.compute(setpoint, y0[0]) u_history.append(u) # 求解被控对象微分方程 sol solve_ivp(plant_model, [t, tdt], y0, args(u,), t_eval[tdt], methodRK45, rtol1e-6) y0 sol.y[:, -1] y_history.append(y0[0]) # 绘图 plt.figure(figsize(10, 6)) plt.plot(t_eval, y_history, b-, labelOutput (PV)) plt.plot(t_eval, [1.0 if t1 else 0.0 for t in t_eval], r--, labelSetpoint) plt.xlabel(Time (s)) plt.ylabel(Output) plt.title(PID Step Response: Kp1.2, Ki0.5, Kd0.1) plt.grid(True) plt.legend() plt.show()逻辑说明这段代码刻意避开高级库如control包用solve_ivp求解被控对象微分方程用显式离散PID公式计算控制量。关键点在于dt必须与Kp/Ki/Kd的量纲对齐——Ki的单位是1/s所以Ki * integral中integral是error * dt的累加而非单纯error累加Kd的单位是s所以derivative必须是(error - error_last)/dt。这是新手最容易写反的地方。2.2 参数初值怎么定从物理意义出发的三步锚定法不要盲目试参。PID三个参数有清晰的物理角色初值应从被控对象特性反推参数物理意义初值估算方法典型影响现象Kp比例增益误差越大动作越猛先设为0.5~1.0观察响应速度若超调大降Kp若响应慢升KpKp↑ → 响应快、超调大、易振荡Kp↓ → 响应慢、稳态误差大Ki积分增益消除历史误差的“记性”初始设0待Kp稳定后从0.01开始缓慢增加直到稳态误差消失Ki↑ → 消除静差快但易积分饱和、引起大幅超调或震荡Ki0则必有静差Kd微分增益抑制变化率的“预判力”初始设0若系统有高频抖动或超调后反复震荡再加0.01~0.1Kd↑ → 抑制超调、加快收敛但放大噪声、可能引发高频振荡Kd过大系统发“硬”实操口诀先调Kp看速度再加Ki消静差最后Kd压超调。每次只动一个参数记录曲线变化。我一般会把Kp从0.1开始每轮0.2画5条曲线叠在一起对比——比单次调参直观十倍。3. 真机部署避坑串口通信丢帧、ADC采样噪声、执行器死区让纸上PID集体翻车仿真跑通≠硬件能用。我在某高校机器人实验室带学生调试两轮平衡小车时发现90%的“PID不收敛”问题根源不在算法本身而在物理世界对数字信号的扭曲。PID算法代码.zip里的.c文件可能直接用了TIMx_IRQHandler做定时中断但没处理中断优先级冲突.py脚本可能用serial.read()读传感器却没加超时和校验。以下是真实踩过的5个坑按发生频率排序3.1 现象控制输出突变跳变电机“咯噔”一下原因ADC采样值受电源噪声干扰原始数据含±5LSB毛刺PID直接拿毛刺算微分项Kd放大噪声导致输出剧烈抖动。解决在PID输入前加中值滤波滑动平均。例如对连续5次ADC采样取中值再对最近10个中值做均值。代码片段// C语言示例ADC采样后滤波 uint16_t adc_raw[10]; uint16_t adc_filtered; // ... 采集10次到adc_raw[] qsort(adc_raw, 10, sizeof(uint16_t), cmp_uint16); // 排序 adc_filtered (adc_raw[4] adc_raw[5]) / 2; // 取第5、6个中值平均注意滤波会引入相位滞后若系统带宽高如无刷电调1kHz改用一阶低通滤波器y[n] α*x[n] (1-α)*y[n-1]α0.8~0.95。3.2 现象阶跃响应永远差2%不到设定值调Ki也没用原因执行器如PWM驱动的直流电机存在死区电压——低于某个占空比如8%电机根本不转。PID积分项累加的误差全耗在填死区上输出饱和在阈值附近。解决在PID输出后加死区补偿。检测到输出在死区边界时强制抬升至阈值以上# Python伪代码 dead_zone_low 0.08 # 8%占空比 dead_zone_high 0.92 if output dead_zone_low and setpoint pv: output dead_zone_low * 1.2 # 强制略高于下限 elif output dead_zone_high and setpoint pv: output dead_zone_high * 0.8 # 强制略低于上限3.3 现象串口接收控制指令时偶尔丢失1~2帧导致控制断续原因PID算法代码.zip中的串口接收函数用阻塞式read()未设超时一旦上位机发送间隔抖动接收缓冲区溢出或阻塞超时。解决改用非阻塞环形缓冲区帧头帧尾校验。关键点帧格式0xAA LEN DATA CRC8 0x55接收中断中只存字节到环形缓冲区主循环解析完整帧解析失败时丢弃整帧不残留错误字节3.4 现象多任务系统中PID响应延迟明显超调增大原因RTOS中PID任务优先级低于GUI刷新或网络任务导致控制周期严重抖动标称10ms实际在5~25ms间跳变。解决将PID任务设为最高优先级并禁用所有可能阻塞的操作如printf、malloc。在FreeRTOS中// 创建任务时指定 xTaskCreate(PID_Task, PID, configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY 4, NULL); // 优先级必须高于其他任务3.5 现象温度控制中加热棒启停频繁“哒哒”声不断原因温度传感器分辨率不足如DS18B20默认12位0.0625℃PID对微小误差过度反应造成执行器“振铃”。解决误差死区Error Deadband——当|setpoint - pv| threshold时PID输出置零。阈值设为传感器分辨率的2~3倍#define TEMP_DEADBAND 0.15f // 0.15℃约2.4个LSB if (fabs(error) TEMP_DEADBAND) { output 0.0f; } else { output Kp*error Ki*integral Kd*derivative; }4. 工程化进阶抗积分饱和、变速积分、微分先行让PID在真实场景不“玄学”仿真里调好的PID一上真实设备就失效往往是因为忽略了物理约束。比如电机最大转速、阀门开度范围、加热功率上限——这些硬限制会让PID的积分项疯狂累加形成“积分饱和”一旦误差反向系统需要很久才能退出饱和区表现为严重超调或响应迟钝。PID算法代码.zip里的基础实现通常不包含这些保护机制必须手动加固。4.1 抗积分饱和Anti-Windup给积分项加个“泄压阀”核心思想当控制器输出已达物理极限如PWM100%就暂停积分累加防止“记忆过载”。常用方法是积分分离与反馈限幅// C语言实现积分分离法 float output Kp * error; if (fabs(error) integral_threshold) { // 仅在误差较小时启用积分 integral error * dt; output Ki * integral; } else { integral 0; // 误差大时清零积分避免饱和 } output Kd * derivative; // 输出限幅必须 if (output output_max) output output_max; if (output output_min) output output_min;参数说明integral_threshold建议设为稳态误差的2~3倍如温度控制设0.5℃output_max/min必须严格等于执行器物理极限如PWM 0~255。4.2 变速积分Variable Integral Speed让小误差“慢积”大误差“快积”传统PID积分速度恒定但工程中更合理的是误差大时快速消除防超调误差小时精细调节防振荡。实现简单让Ki随误差绝对值动态变化# Python示例Ki随|error|增大而增大 def get_adaptive_Ki(error, base_Ki0.1, max_Ki2.0, threshold0.5): abs_error abs(error) if abs_error threshold: return base_Ki * (abs_error / threshold) # 线性增长 else: return max_Ki # 达到上限 # 在PID compute()中调用 Ki_effective get_adaptive_Ki(error) output Kp*error Ki_effective*integral Kd*derivative4.3 微分先行Derivative on Measurement避免设定值跳变引发的冲击标准PID对设定值setpoint跳变敏感——阶跃瞬间微分项爆炸导致执行器猛打。微分先行只对过程变量PV微分不对其设定值微分彻底规避此问题// 标准PID微分项有问题 derivative (error - error_last) / dt; // error sp - pv // 微分先行推荐 derivative (pv_last - pv_current) / dt; // 只对PV微分 output Kp*error Ki*integral - Kd*derivative; // 注意符号为负为什么符号变负因为PV上升意味着系统在向设定值靠近此时应减小输出PV下降则加大输出。这是物理直觉的直接映射。4.4 实战参数表不同场景下的典型Kp/Ki/Kd范围基于10ms采样控制场景被控对象近似模型Kp范围Ki范围Kd范围关键调整提示直流电机转速带编码器二阶欠阻尼0.8~3.00.05~0.50.01~0.1重点防机械共振Kd勿超0.08水箱液位泵阀门一阶惯性纯滞后1.5~5.00.1~1.00.0~0.05纯滞后大Kd基本不用靠Ki消除静差LED亮度PWM调光一阶RC0.5~2.00.01~0.20.0~0.02人眼对亮度变化不敏感Kp可稍小四旋翼姿态角MPU6050二阶振荡4.0~12.00.5~3.00.1~0.5必须用微分先行否则遥控杆一动就抖血泪经验表格数值只是起点。我调试某跨平台系统时发现同一组参数在STM32F4和ESP32上表现差异极大——F4的浮点运算精度高Ki可设到0.8ESP32的FPU弱Ki超过0.3就积分溢出。永远以你的硬件实测为准参数表只是帮你少走50%弯路。5. 验证与调优用Bode图看相位裕度用阶跃实验抓超调率拒绝“看起来还行”调参不能靠肉眼“感觉稳”必须量化。PID算法代码.zip里大概率没有分析工具但我们可以用极简方式自己构建验证闭环用真实硬件跑阶跃实验用逻辑分析仪或串口打印抓数据用Python重绘响应曲线并计算指标。这才是工程师该有的闭环。5.1 阶跃实验标准化流程3次测量取中位数准备确保电源稳定纹波50mV传感器固定无松动环境温度恒定触发用GPIO引脚在阶跃时刻拉高逻辑分析仪同步捕获采集串口以100Hz速率打印timestamp, setpoint, pv, output持续30秒处理用Python脚本清洗数据剔除串口乱码、插值补齐丢帧计算超调率Overshoot(peak_value - setpoint) / setpoint × 100%调节时间Ts输出进入±2% setpoint并不再越界的最短时间稳态误差Ess|final_value - setpoint|# Python数据处理核心代码 import pandas as pd df pd.read_csv(pid_log.csv) setpoint df[setpoint].iloc[0] pv df[pv].values # 计算超调率 peak_idx np.argmax(pv) overshoot (pv[peak_idx] - setpoint) / setpoint * 100 # 计算调节时间2%准则 tolerance setpoint * 0.02 ts_idx np.where(np.abs(pv - setpoint) tolerance)[0] if len(ts_idx) 0: ts df[timestamp].iloc[ts_idx[0]] - df[timestamp].iloc[0] print(fOvershoot: {overshoot:.2f}%, Ts: {ts:.3f}s)5.2 Bode图辅助分析用频域视角看稳定性边界虽然PID是时域算法但稳定性本质由频域决定。我们可以用继电反馈法Relay Feedback激发系统极限振荡测出临界增益Ku和振荡周期Tu再用Ziegler-Nichols经验公式反推PID参数——这比纯试凑快得多方法操作步骤公式Z-N适用性继电反馈法将PID切换为继电器模式输出M/-M使系统自激振荡测Ku临界增益、Tu振荡周期Kp0.6Ku, Ki1.2Ku/Tu, Kd0.075KuTu适用于无法离线建模的黑盒系统实测最可靠Cohen-Coon基于阶跃响应测得过程增益Kp0、滞后时间L、时间常数TKp0.9T/(Kp0L), Ki0.27L, Kd0.27LT/(L0.1T)需准确辨识一阶滞后模型对纯滞后大系统效果好实操技巧用示波器看继电反馈振荡波形时务必开启“测量→周期”功能直接读TuKu不是继电器幅值而是使振荡刚好维持的最小继电器增益——需从低往高调找到振幅不再衰减也不发散的那个点。5.3 我的调参工作流从“能用”到“可靠”的四步迭代Step 1仿真锚定——用2.1节代码Kp从0.5起步Ki0Kd0跑出无超调但有静差的响应记下Kp值Step 2硬件初调——烧录到板子用万用表测执行器电压确认输出在合理范围用串口打印PV肉眼确认趋势正确Step 3量化验证——执行5.1节阶跃实验计算超调率/调节时间若超调20%降Kp若Ts3s适度升Kp或加KiStep 4鲁棒性测试——在设定值上叠加±10%扰动或手动轻推被控体如晃动云台观察恢复能力若恢复慢加Kd若恢复时抖动降Kd或启用微分先行最后说句实在话我见过太多人把PID当成“调参玄学”调三天没结果就换LQR或模糊控制。其实90%的失败源于没做3.1节的ADC滤波、没加4.1节的抗饱和、没跑5.1节的量化实验。PID算法代码.zip的价值不在于它多精巧而在于它逼你直面物理世界的粗糙——噪声、延迟、死区、饱和。当你亲手给积分项加了泄压阀给微分项换了先行路径看着示波器上那条抖动的曲线终于变得平滑那一刻你才真正“拥有”了PID。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

reladraw美化指南:自定义SVG图标、badge徽章与14种主题打造专属图表风格

reladraw美化指南:自定义SVG图标、badge徽章与14种主题打造专属图表风格

开发工具CLIAI 技能 【免费下载链接】reladraw 项目地址: https://gitcode.com/gh_mirrors/re/reladraw 点击查看 免费下载 reladraw 是一款用纯文本描述布局的图表语言:它把 .reladraw 文件渲染成独立 SVG,无需手动拖拽坐标。本文是面向新手…

2026/10/15 15:49:04 阅读更多 →
Southstreet Critical CSS深度解析:内联关键样式消除渲染阻塞,首屏1秒内可用

Southstreet Critical CSS深度解析:内联关键样式消除渲染阻塞,首屏1秒内可用

文档/教程示例工程 【免费下载链接】Southstreet Filament Groups core tools & workflow for delivering rich cross-device web applications 项目地址: https://gitcode.com/gh_mirrors/so/Southstreet 点击查看 免费下载 Southstreet 是 Filament Group 打…

2026/10/15 15:49:04 阅读更多 →
深入auto_reg核心架构:FastAPI+React+APScheduler的任务调度与插件注册表设计

深入auto_reg核心架构:FastAPI+React+APScheduler的任务调度与插件注册表设计

【免费下载链接】auto_reg codex全自动注册机 项目地址: https://gitcode.com/gh_mirrors/au/auto_reg 点击查看 免费下载 auto_reg 是一个多平台账号自动注册与管理系统,其核心架构由 FastAPI 后端、React 前端和插件注册表三大支柱构成。理解 auto_re…

2026/10/15 15:49:04 阅读更多 →

最新新闻

STM32+华为云IoT+Qt:智能家居全栈开发实战

STM32+华为云IoT+Qt:智能家居全栈开发实战

1. 项目缘起与整体架构拆解智能家居这个词已经被说烂了,但真正自己动手从零搭一套完整系统的人并不多。大部分人要么停留在用现成模组点个灯的阶段,要么卡在设备上云这一步就放弃了。我当初做这个项目的出发点很简单:家里有几台老式空调和加湿…

2026/10/15 16:28:41 阅读更多 →
储能EMS社招面试全攻略:核心考点与避坑指南

储能EMS社招面试全攻略:核心考点与避坑指南

1. 储能EMS社招面试到底在考什么储能EMS,全称Energy Management System,直译过来就是能量管理系统。放在储能行业里,它是一套负责调度、监控、优化储能电站充放电策略的软件系统。社招面试和校招面试最大的区别在于:校招可以容忍你…

2026/10/15 16:28:41 阅读更多 →
Oppia 测试模块映射体系全解析:core/tests/test-modules-mappings 如何驱动 GitHub CI 精准测试

Oppia 测试模块映射体系全解析:core/tests/test-modules-mappings 如何驱动 GitHub CI 精准测试

教育后端前端 【免费下载链接】oppia A free, online learning platform to make quality education accessible for all. 项目地址: https://gitcode.com/gh_mirrors/op/oppia 点击查看 免费下载 在 Oppia 的 CI 流程中,每一次 Pull Request 并不会盲目…

2026/10/15 16:28:41 阅读更多 →
编译原理基础:从语言定义到文法分类与语法分析

编译原理基础:从语言定义到文法分类与语法分析

1. 项目概述语言的定义是整个编译原理的起点,也是最容易被初学者一带而过的部分。很多人学编译原理一上来就啃词法分析、语法分析,结果看到自动机、文法推导就懵了,根子就在于没有真正理解“语言”到底是个什么东西。哈工大这套课程把语言的定…

2026/10/15 16:28:41 阅读更多 →
Qt低功耗蓝牙开发实战:从GATT通信到MTU协商与Notify订阅

Qt低功耗蓝牙开发实战:从GATT通信到MTU协商与Notify订阅

简介:本资源是一套基于Qt框架的低功耗蓝牙(BLE)特征值读写测试例程,面向嵌入式开发、物联网应用及跨平台桌面端BLE通信初学者与进阶开发者,解决BLE设备调试中服务发现、GATT特征交互、异步读写响应等核心实践难点。压缩…

2026/10/15 16:28:41 阅读更多 →
AP-0316语音处理模组实战:回声消除与波束成形调试指南

AP-0316语音处理模组实战:回声消除与波束成形调试指南

1. 这块模组到底解决了什么问题语音交互这件事,看起来简单,做起来处处是坑。你对着设备喊一句话,设备听到的可能是:你自己的声音、隔壁房间的电视声、空调出风口的呼呼声、桌面共振的低频嗡嗡声,以及电路本身产生的底噪…

2026/10/15 16:27:40 阅读更多 →

日新闻

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/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →