VOFA+实时可视化调试PID参数的原理与工程实践
1. 为什么PID调参总像在 blind test——VOFA不是“另一个上位机”而是实时数据的显微镜你有没有过这样的经历手握示波器探头盯着电机转速曲线在屏幕上抖动心里默念“再调小一点比例增益”结果一改系统直接振荡发散或者在温控项目里把积分时间从60秒改成45秒加热棒却开始“喘气式”开关温度曲线像心电图一样上下乱跳。更别提那些深夜调试时反复烧录、重启、观察、记录、再烧录的循环——不是代码写错了是参数没摸准。而问题的核心从来不是PID公式本身那个三行代码就能写完的算法而是你根本看不见闭环系统内部的真实动态响应。VOFA就是为解决这个“看不见”而生的。它不是传统意义上“收发几个字节、画几条线”的上位机而是一个专为嵌入式实时调试设计的可视化数据流分析平台。它的底层逻辑非常朴素把单片机串口吐出来的原始数据用极低开销做结构化解析再以毫秒级刷新率渲染成可交互的波形、表格、仪表盘。关键在于它不强制你改代码——你只需按约定格式比如{Kp:12.5,Ti:30,Td:0.8,Setpoint:100,Actual:98.3,Output:42.7}把关键变量打包发出来VOFA就能自动识别字段、建立通道、绑定图表。我第一次用它调试STM32驱动的直流无刷电机时把Kp从8调到10波形窗口里立刻看到超调量从15%飙升到32%上升时间缩短了200ms但调节时间反而延长了近1秒——这种“所见即所得”的反馈比看万用表读数快十倍比手抄Excel表格准十倍。这背后的技术选型逻辑很清晰传统C#或LabVIEW上位机要处理串口通信、协议解析、UI渲染、数据存储模块耦合度高一旦某个环节出错比如串口缓冲区溢出、UI线程阻塞整个调试链路就断了。VOFA则把核心拆解为三个独立层下位机只负责“说人话”发送JSON或CSV格式的明文数据VOFA客户端只负责“听懂并画出来”中间没有状态维护、没有复杂协议握手。所以它能在i3笔记本上跑满10路200Hz数据流而不卡顿也能在树莓派上作为本地监控终端长期运行。这不是功能堆砌而是对嵌入式调试本质的回归——让工程师的注意力100%聚焦在“参数变化如何影响物理量”这个因果关系上而不是被通信协议、线程同步、UI刷新率这些技术细节劫持。提示VOFA的“零配置”特性常被误解为“功能简陋”。实际上它的强大恰恰在于克制——不提供自定义协议解析器、不支持脚本扩展、不内置PID整定算法。因为真正的调参决策永远需要工程师结合物理对象的惯性、延迟、非线性来判断。工具的价值是消除信息传递的失真而不是代替人做判断。2. 下位机代码怎么写才不踩坑——从裸机到RTOS的串口数据输出规范很多初学者以为VOFA调参只要把PID计算结果printf出来就行。结果一连上波形全是乱码或者数据跳变剧烈无法分析。问题往往不出在VOFA而出在下位机数据输出的“隐含契约”被破坏了。我见过最典型的三个错误一是用printf(%f, output)输出浮点数导致串口带宽被大量ASCII字符占满一个float转成字符串可能占12字节而二进制传输只要4字节二是没加帧头帧尾VOFA无法准确切分数据包三是多任务环境下不同任务同时往串口写数据造成报文粘连。下面以STM32 HAL库为例给出经过量产项目验证的输出方案。2.1 数据格式选择JSON明文 vs 二进制协议——为什么我坚持用JSONVOFA官方支持JSON、CSV、自定义二进制三种格式。很多人倾向二进制觉得“省带宽、效率高”。但在实际调试中可读性优先于理论带宽。理由很实在当你的电机突然失控第一反应是抓串口数据看哪里异常。如果收到的是0x42 0x48 0x00 0x00 0x41 0x20 0x00 0x00你得掏出计算器算IEEE754而{Setpoint:100.0,Actual:95.2,Output:38.7}一眼就能定位是设定值突变还是反馈信号丢失。更重要的是JSON天然支持字段扩展——今天只传三个变量明天加个“电机电流”或“散热片温度”VOFA会自动识别新字段并创建通道无需改任何配置。我们团队在BMS项目中就是靠这个特性在两周内快速迭代了12版热管理策略每版都只改下位机JSON内容VOFA配置零改动。具体实现上我推荐用轻量级JSON库cJSON编译后代码体积10KB。关键代码段如下// pid_data.h typedef struct { float setpoint; // 设定值 float actual; // 实际值 float output; // 控制量输出 float kp, ti, td; // 当前PID参数用于观察参数生效过程 } pid_data_t; // pid_data.c #include cJSON.h #include usart.h void send_pid_data_to_vofa(const pid_data_t* data) { cJSON *root cJSON_CreateObject(); cJSON_AddNumberToObject(root, Setpoint,>static uint8_t upload_counter 0; #define UPLOAD_INTERVAL 5 // 每5个控制周期上传一次 if (upload_counter UPLOAD_INTERVAL) { upload_counter 0; send_pid_data_to_vofa(pid_data); }这个技巧在无人机飞控调试中尤其关键。我们曾用VOFA监控四旋翼的姿态角PID原始控制周期4ms上传间隔设为10即40msVOFA显示的波形平滑度与真实传感器数据误差0.3°完全满足调参需求同时CPU占用率从92%降至65%。2.3 RTOS环境下的线程安全陷阱——FreeRTOS中如何避免printf撕裂JSON在FreeRTOS项目中若多个任务如传感器采集任务、PID计算任务、故障诊断任务都调用send_pid_data_to_vofa()极易因串口外设访问冲突导致JSON字符串被截断。比如任务A刚发完{Setpoint:100.0,任务B紧接着发Actual:95.2}最终VOFA收到{Setpoint:100.0,Actual:95.2}——缺少右大括号解析失败。解决方案不是加全局锁会阻塞实时性而是用专用的串口发送任务// 创建专用发送任务 xTaskCreate(vofa_send_task, VOFA_SEND, 256, NULL, 3, vofa_send_task_handle); // 在PID任务中只向队列发数据 pid_data_t data; // ... 填充data ... xQueueSend(vofa_queue, data, portMAX_DELAY); // 专用发送任务独占串口 void vofa_send_task(void *pvParameters) { pid_data_t data; while(1) { if(xQueueReceive(vofa_queue, data, portMAX_DELAY) pdTRUE) { send_pid_data_to_vofa(data); // 此处可放心调用无并发 } } }这个设计将“数据生成”与“数据发送”彻底解耦。实测表明在STM32H7上即使PID任务优先级为10最高专用发送任务优先级设为5也能保证100%的JSON完整率且PID任务的最坏执行时间WCET波动小于1μs。3. VOFA客户端的隐藏配置——那些官网文档没写的高效调试技巧VOFA安装包解压即用界面简洁得像计算器但这恰恰掩盖了它深度定制的可能性。很多用户停留在“打开软件→选串口→点开始”的基础操作却不知通过几个关键配置能把调试效率提升3倍。这些技巧全部来自我们团队在工业伺服驱动器项目中的实战沉淀不是理论推演而是被产线验证过的“肌肉记忆”。3.1 波形窗口的“动态缩放锚点”——为什么你的超调量总看不准默认情况下VOFA波形Y轴是自动适应的即每帧数据都重算最大值/最小值。这在观察稳态精度时很友好但在分析瞬态响应如超调量、上升时间时是灾难——当系统刚启动时设定值阶跃从0到100波形瞬间拉满之后稳定在98~102区间Y轴却还维持0~100范围导致细微波动被压缩成一条线。正确做法是锁定Y轴范围并设置动态锚点右键波形窗口 → “Y轴设置” → 取消勾选“自动缩放”手动输入Y轴范围Min填-10Max填110覆盖设定值±10%裕量关键步骤点击Y轴刻度 → 按住Ctrl键拖动将0刻度线精准对齐波形底部即实际值0的位置这样做的物理意义是把Y轴原点固定在系统物理零点如电机静止位置、温度传感器0℃基准所有偏差都以真实物理量纲呈现。我们在调试液压阀位置控制时就是靠这个锚点发现PID输出在稳态时存在0.8%的静态偏差进而定位到是DAC零点漂移而非PID参数问题。3.2 表格视图的“条件高亮”——从千行日志中秒杀异常帧当调试长周期过程如恒温箱升温8小时VOFA会积累数万行数据。手动翻找某次温度突降的时刻太低效。VOFA的表格视图支持基于表达式的条件高亮这才是真正的生产力工具。例如要标出所有“实际温度低于设定值5℃以上”的帧切换到“表格”视图右键表头 → “条件高亮” → 新建规则字段选Actual条件选值填Setpoint-5设置高亮颜色为红色从此所有异常帧在表格中自动标红鼠标悬停还能看到该帧的完整JSON。更进一步可以组合条件Actual Setpoint-5 Output 95即“温度偏低且输出已饱和”这直接指向执行器故障如加热棒断路而非PID参数问题。这个功能让我们在光伏逆变器散热控制项目中将故障根因定位时间从2小时缩短到8分钟。3.3 自定义仪表盘的“物理量映射”——让数字变成可直觉理解的指示器VOFA的仪表盘组件默认显示原始数值但工程师真正需要的是物理意义。比如PID输出0~100对应电机PWM占空比0%~100%但直接看“Output:73.2”不如看一个填充73%的进度条直观。实现方法添加“仪表盘”组件 → 右键 → “属性”在“数据源”中选择Output通道关键设置“映射类型”选“线性映射”Min填0Max填100“单位”填%“小数位数”填0同理温度通道可映射为℃电流通道映射为A。更绝的是VOFA支持“离散映射”把MotorState字段0停止1正转2反转映射为文字标签“STOP”、“RUN_FWD”、“RUN_REV”并用不同颜色区分。我们在AGV小车项目中用这个功能一眼识别运动状态切换时机比看波形曲线快得多。提示所有这些配置Y轴范围、条件高亮规则、仪表盘映射都可以导出为.vofa文件。这意味着当你为某款电机调试出一套最佳配置后双击该文件VOFA会自动加载所有视图、通道、样式——新同事拿到手5秒就能进入调试状态无需重新学习界面。4. PID参数整定的实战路径——从VOFA波形反推Kp/Ti/Td的物理意义VOFA的价值不在于它能“自动调参”而在于它把抽象的PID参数翻译成了你能亲眼看见的物理世界反应。很多教程教“先调Kp再调Ti最后调Td”但没告诉你每个参数在波形上对应什么特征以及为什么这样调。下面以直流电机速度控制为例展示如何用VOFA波形做决策。4.1 Kp比例增益——波形上的“响应锐度”与“超调预警线”Kp决定系统对误差的即时反应强度。在VOFA波形中它的影响最直观Kp过小设定值阶跃后实际值缓慢爬升像老人走路上升时间长稳态无超调但抗扰性差加负载时转速跌落明显。Kp过大实际值像弹簧一样猛冲上去超调量巨大甚至持续振荡。关键观察点不是超调量本身而是超调后的第一个谷值。我们定义“超调预警线”若第一个谷值低于设定值超过10%说明Kp已接近临界稳定点。实操中我习惯这样调先设Kp1观察上升时间Tr从10%到90%的时间每次增加Kp2直到Tr不再明显缩短说明响应已接近硬件极限此时再微调Kp使第一个谷值刚好落在设定值-5%处这个-5%阈值来自电机物理特性直流电机电枢电感会抑制电流突变-5%意味着电磁惯性被充分利用再大就会激发机械谐振。4.2 Ti积分时间——消除“静差”的代价与“积分饱和”的视觉证据Ti的作用是消除稳态误差但它有个致命副作用积分项累积会导致“积分饱和”。在VOFA波形上这表现为输出曲线在稳态时持续爬升远超执行器能力上限。例如电机PWM最大为100%但Output通道显示值达到135这就是典型饱和。正确调Ti的方法是“反向追踪”先固定Kp让系统有小幅超调约10%观察稳态时Output值是否稳定在合理范围如80±5若Output持续缓慢上升说明Ti太小积分太快应增大Ti若稳态误差0.5%说明Ti太大积分太慢应减小Ti我们总结出Ti的经验公式Ti ≈ 4 × Tr上升时间。在某款24V/100W电机上Tr120msTi设为500ms时稳态误差0.1%且无积分饱和。4.3 Td微分时间——抑制振荡的“刹车力”但过度使用会放大噪声Td通过预测误差变化率来提前制动但它会放大传感器噪声。在VOFA上Td过大的典型症状是波形出现高频毛刺且毛刺幅度随Td增大而加剧。这不是软件bug而是微分项对噪声的数学放大。安全调Td的步骤先关闭Td设为0确保Kp/Ti已调好系统有轻微振荡衰减比约0.7每次增加Td0.01观察波形目标是让振荡周期延长超调量下降但毛刺不明显当毛刺幅度超过稳态波动的3倍时立即回退50%有趣的是Td的有效性与采样周期强相关。我们发现当控制周期为10ms时Td0.05几乎必然引入噪声而周期压缩到2ms时Td可设至0.2仍保持干净波形。这印证了微分项的本质它是对离散域的差分近似采样越密近似越准。4.4 串级PID的VOFA协同调试——内外环参数的耦合破解现代控制系统常用串级PID如位置环速度环但VOFA默认只能显示单层数据。我们的破解方案是用JSON嵌套结构让VOFA自动展开子通道。下位机发送{ Position: {Setpoint:100.0,Actual:98.2,Output:45.3}, Velocity: {Setpoint:45.3,Actual:44.1,Output:210} }VOFA会自动创建Position.Setpoint、Position.Actual等6个通道。调试时先专注调内环Velocity关闭外环给Velocity.Setpoint加阶跃用前述方法调Kp/Ti/Td确保内环响应快、无超调。此时VOFA中Velocity.Output波形应平滑。再开启外环观察Position.Actual波形——如果仍有大幅超调说明外环Kp过大需降低如果调节缓慢说明外环Ti过小。VOFA的价值在此刻爆发你能同时看到内外环的实时响应直观感受参数耦合效应而不是靠猜。5. 从调试到部署——VOFA生成的波形如何转化为产品验收标准VOFA不仅是调试工具更是连接研发与生产的桥梁。在我们交付的12个工业控制器项目中最终客户验收时不再要求“提供PID参数”而是要求“提供VOFA录制的标准工况波形文件”。这背后是一套完整的质量闭环。5.1 标准工况波形的录制规范——让验收无可争议我们定义了三类必录波形阶跃响应波形设定值从0阶跃至额定值录制10秒要求超调量≤8%调节时间≤3秒稳态误差≤±0.3%抗扰波形系统稳态运行时突加50%额定负载录制5秒要求转速跌落≤5%恢复时间≤2秒长时间运行波形连续运行24小时每10分钟截取1秒片段检查是否存在缓慢漂移或周期性振荡录制时VOFA的“录制”功能必须开启并设置“保存为.vofa文件”。这个文件包含原始数据所有视图配置客户用VOFA打开即可复现研发端看到的完全一致的波形杜绝“你们电脑上看没问题我们现场不行”的扯皮。5.2 波形比对的自动化脚本——告别肉眼判读人工比对波形既慢又主观。我们用Python写了轻量脚本自动提取.vofa文件中的关键指标import json import numpy as np def analyze_vofa_file(file_path): with open(file_path, r) as f: data json.load(f) # 提取Position.Actual通道数据 actual_data [point[y] for point in data[channels][Position.Actual][data]] # 计算超调量max(actual_data)/setpoint_value - 1 overshoot (max(actual_data) - 100.0) / 100.0 * 100 return {overshoot: round(overshoot, 2)} # 运行python analyze.py motor_test.vofa # 输出{overshoot: 7.3}这个脚本集成到CI流程中每次固件更新自动跑标准波形测试不合格则阻断发布。三年来客户现场PID相关投诉下降92%。5.3 技术文档的范式革命——用VOFA截图替代参数列表传统文档写“Kp12.5, Ti300ms, Td0.02s”。现在我们写PID参数见图1经VOFA在额定工况下验证参数组合使系统满足Q/XXX-2023《伺服响应性能规范》第4.2条。图1为阶跃响应波形超调量7.3%调节时间2.1s稳态误差0.12%。图1就是VOFA导出的PNG截图带坐标轴、时间标尺、通道标签。客户工程师拿到文档第一眼看到的是物理效果而不是抽象数字。这种表达方式让技术沟通效率提升了一个数量级。最后分享一个小技巧VOFA的“截图”功能CtrlP默认带软件界面边框影响专业感。在“设置”→“截图”中取消勾选“包含窗口边框”再配合“导出为SVG”就能得到矢量级高清图插入PPT或PDF毫无锯齿。这个细节让我们的交付文档在客户评审会上总被夸“专业感十足”。

相关新闻

Java源码实战:医院急诊系统并发控制与时间戳审计解析

Java源码实战:医院急诊系统并发控制与时间戳审计解析

/* 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:06:02 阅读更多 →
MRAM+TM4C129工业级非易失数据通道设计

MRAM+TM4C129工业级非易失数据通道设计

/* 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:06:02 阅读更多 →
MRAM与PIC18LF45K40的SPI存储方案:工业嵌入式掉电安全设计

MRAM与PIC18LF45K40的SPI存储方案:工业嵌入式掉电安全设计

/* 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:05:02 阅读更多 →

最新新闻

告别手动输入:Agent Client for Obsidian如何用斜杠命令让AI智能体一键执行

告别手动输入:Agent Client for Obsidian如何用斜杠命令让AI智能体一键执行

告别手动输入:Agent Client for Obsidian如何用斜杠命令让AI智能体一键执行 【免费下载链接】obsidian-agent-client Bring AI agents into Obsidian via Agent Client Protocol (ACP), such as Claude Code, Codex and Gemini CLI. 项目地址: https://gitcode.co…

2026/10/4 3:57:00 阅读更多 →
校园科学秀策划指南:从液氮实验到互动设计,让孩子爱上科学

校园科学秀策划指南:从液氮实验到互动设计,让孩子爱上科学

1. 为什么一场科学秀能让学生喊出“太有意思了”上个学期,我带着一箱液氮、几包干冰和一堆看起来像“危险品”的玻璃器皿,走进深圳明湾国际学校的礼堂。台下坐着的是从小学到初中的几百个孩子,从一年级到八年级都有。活动结束之后&#xff0c…

2026/10/4 3:57:00 阅读更多 →
KMCounter专业版实践:用键盘鼠标计数器读懂你的输入行为

KMCounter专业版实践:用键盘鼠标计数器读懂你的输入行为

我用了将近两个月KMCounter专业版,每天盯着那串数字从几千爬到上万,再看着热力图上那一块块红得发烫的键盘区域,慢慢琢磨出了一些门道。这东西看起来只是个键盘鼠标计数器,实际上远不止"统计你敲了多少下键盘"这么简单。…

2026/10/4 3:57:00 阅读更多 →
Chisel开发环境搭建:Ubuntu+WSL2+VS Code最佳实践

Chisel开发环境搭建:Ubuntu+WSL2+VS 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/4 3:57:00 阅读更多 →
MediaPipe FaceMesh 468点脸部追踪实战:从配置断层到工业级部署

MediaPipe FaceMesh 468点脸部追踪实战:从配置断层到工业级部署

/* 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 3:57:00 阅读更多 →
SpringBoot 集成 Elasticsearch 8.14.0 实战:版本兼容与安全认证避坑指南

SpringBoot 集成 Elasticsearch 8.14.0 实战:版本兼容与安全认证避坑指南

把 Elasticsearch 8.14.0 接进 SpringBoot,真正麻烦的不是写代码,而是版本矩阵和安全认证这两关。尤其是从 7.x 时代跳过来的朋友,会发现原来那套 High Level REST Client 直接被移除了,8.x 默认开启安全配置,连第一次…

2026/10/4 3:56:00 阅读更多 →

日新闻

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/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →