飞控RGB灯色自定义:APM固件参数驱动改造指南
飞控上那颗RGB指示灯默认逻辑其实挺死板的解锁了变绿GPS锁定了变蓝返航了变黄闪低电压了变红闪颜色全写在固件的“事件映射表”里。想让它显示自己想要的灯色比如FPV夜航时左红右绿的航向灯、或者纯粹想让机身灯色和涂装搭配传统做法要么外接一块单独的LED控制板要么改一版固件重新编译刷机。这两条路我都走过前者多一块硬件、多一路供电走线乱糟糟后者每次想微调颜色都得重刷一遍固件效率低到怀疑人生。这篇博文记录的是我后来一直沿用的第三种方案——在APM系开源飞控固件里新增一个用户参数把RGB灯颜色的控制权从“事件驱动”改成“参数驱动”在地面站改个数字灯色立刻跟着变。适合谁看对APM代码结构有一定了解、想自定义LED灯色但又不想大动干戈的开发者。我会把代码链路、参数注册、编译烧录、排查踩坑完整写出来尽量做到你能照着重现。1. 为什么要把RGB灯的颜色控制权交到参数手里1.1 默认灯色逻辑的“够用”和“不够用”先列一下APM系固件默认的LED状态逻辑大家应该都很眼熟飞行状态典型灯色待机/搜星中慢闪紫或蓝GPS 3D锁定蓝色常亮解锁后绿色常亮返航RTL黄色慢闪低电压报警红色快闪失控保护红白交替闪烁这套逻辑对飞手来说确实有意义它回答的是“系统现在怎么了”。但问题是它完全不回答“我希望机身怎么显示”。比如夜间飞固定翼想用左红右绿指示航向默认逻辑做不到编队飞行时想用特定颜色区分不同机位默认逻辑也做不到。很多朋友最后都是把RGB灯当成“状态灯”用放弃了自定义需求其实挺可惜的。1.2 三种自定义方案的横向对比我之前试过几种自定义灯色的路子各有利弊先摆个对比表方案新增硬件灵活性实时性维护成本默认固件无差颜色固定不可调零外接LED控制板需要额外模块、供电、接线高实时高多一块硬件多一份故障源改代码重编译无中每次调色要重刷固件差中反复编译烧录参数控制本文方案无中高常亮/闪烁均可扩展地面站实时调低一次改好长期用外接控制板最灵活但如果你只是想让飞控自带RGB灯换个颜色为这个多挂一块板子属实不划算。改代码重编译则是最“硬核”但也最折腾的路我第一次就是这么干的改了颜色映射表编译完刷进去发现想再调亮一点又得重新来一遍。直到后来把颜色值抽成参数才感觉这条路走通了。1.3 参数驱动为什么是性价比最高的切入点APM的参数系统是现成的地面站通过MAVLink协议读写参数固件端只需要把新参数正确注册进去地面站“全部参数表”里就能看到它。而RGB LED的颜色最终不过是三个整数——红、绿、蓝各自的亮度值把参数值和这三个整数建立映射即可。整个过程不用改通信协议、不动硬件、不影响原有飞行控制逻辑风险面非常小。更重要的是这个方案是在原设计上“开一个口子”而不是推翻原设计。默认的事件灯色逻辑保留在代码里只是新增了一个用户覆盖层参数关闭时一切照旧参数打开时用户颜色优先输出。用生活类比就是默认灯色是系统自动设置的壁纸参数控制就像用户手动换壁纸系统弹窗提醒时可以重新覆盖但用户随时能再换回来。这种“可插拔”的设计思路比直接改死默认颜色要优雅得多。2. APM灯控代码里颜色到底是怎么流出来的2.1 一次灯色变化的完整链路要在正确的位置插入参数控制先得搞明白灯色是怎么从“事件”变成“光”的。APM的通知模块叫AP_Notify它维护了一堆事件标志比如解锁、GPS锁定、返航、低电压。整个链路大致是这样的某个飞行事件发生解锁、锁星、返航……事件标志位置位。AP_Notify的update循环每帧运行读取当前事件标志。遍历注册好的NotifyDevice设备内置RGB灯、外部I2C LED、WS2812灯带等。每个设备类的update_events方法把“事件”翻译成具体颜色调用set_rgb(r, g, b)。设备类内部再把RGB数值转成底层驱动信号——PWM占空比、I2C命令或者串口数据最终点亮LED。所以颜色数据流本质是“事件 → 颜色映射 → 驱动信号”三段式。我们要做的参数控制就是在“颜色映射”和“驱动信号”之间加一道用户覆盖。2.2 默认颜色映射表的真面目打开任意一个RGBLed设备类的源码基本都能看到类似这样的一段逻辑void RGBLed::update_events() { if (event AP_NOTIFY_EVENT_UNLOCK) { _red 0; _green 255; _blue 0; // 解锁 - 绿 } else if (event AP_NOTIFY_EVENT_GPS_LOCK) { _red 0; _green 0; _blue 255; // GPS锁定 - 蓝 } else if (event AP_NOTIFY_EVENT_RTL) { _red 255; _green 255; _blue 0; // 返航 - 黄 } }有的固件版本里这些值不是0~255而是0.0~1.0的浮点或者0~100的百分比形式会变但本质都是查表映射。这张表每次update都会被调用一次而且事件是有优先级的——比如低电压判断如果排在前面一旦触发就会先把颜色刷成红色后面的用户颜色如果不做处理就会被挤掉。这个特性后面调试时会是个大坑我先记在这里。2.3 自定义参数应该插在哪一层我理想中的插入点有三个选择事件层、设备层、总线层。逐个说下我的判断。改事件层就是在update_events的映射表里加一个分支如果参数开启就用参数颜色替代事件颜色。好处是改动集中坏处是侵入性太强以后上游更新代码时容易冲突。改总线层直接去改PWM或I2C的驱动输出。这样能控制最底层的波形但完全绕过了AP_Notify的封装代码耦合度极高不推荐。我最终选的是设备层。在设备类的update流程末尾颜色已经过事件映射生成RGB值此时判断用户参数是否启用如果启用就直接用参数值覆盖当前RGB。这样做干净、隔离后续想砍掉这个功能也容易只要删掉覆盖段不影响默认行为。2.4 为什么很多网上教程改完灯不亮我见过不少照网上教程改灯色失败的案例出问题的点高度集中只注册了参数没在设备层读参数或者参数读了但被事件映射抢先覆盖还有的是改了参数但设备类里的缓存没有更新新值根本没进入LED输出链路。这几个坑会在第4章的排查链路里详细展开这里先记住一个结论参数注册只是第一步真正决定成败的是“读取位置”和“覆盖时机”。3. 加参数的核心改动参数定义、参数读取与颜色覆盖3.1 参数注册老式参数表与新式pdefAPM系固件的参数定义这些年有过一次大的迁移。老版本是在parameters.h和parameters.cpp里手工维护参数表新版本统一用apm.pdef.xml加自动代码生成器参数表结构清晰很多。我建议新项目一律走新式pdef旧分支改造时再考虑手工表。新版定义一个用户参数大致是这样param nameRGB_CUSTOM_ENABLE/name default0/default increment1/increment values0Disable 1Enable/values descriptionEnable user custom RGB color/description /param param nameRGB_CUSTOM_RED/name default0/default increment1/increment range0,255/range descriptionCustom red level 0-255/description /param对应的绿、蓝参数同理RGB_CUSTOM_GREEN和RGB_CUSTOM_BLUE。有几个规范必须注意参数名全局唯一最多16个字符只能大写字母、数字和下划线range要写清楚否则地面站会对非法输入报错description最好写全否则以后你自己都忘了这个参数是干嘛的。3.2 在设备层读取参数并覆盖颜色参数注册完只是第一步真正改变灯色的是下面这段逻辑。示意代码如下接口调用细节以你固件版本的AP_Param API为准void AP_Notify::update(void) { // 先执行默认事件处理 _led.update_events(); // 用户参数覆盖启用后强制使用自定义RGB if (get_rgb_custom_enable()) { _led.set_rgb(get_rgb_custom_red(), get_rgb_custom_green(), get_rgb_custom_blue()); } }这段代码放在AP_Notify的update循环末尾。先跑默认事件映射再用用户参数覆盖好处是即使事件系统在跑只要参数开启最终输出的还是用户颜色。如果你想保留“事件优先”把两个调用顺序反过来就行——先set_rgb用户颜色再update_events事件一发生就会覆盖用户颜色。这两种优先级策略在工程上都有用取决于你要“用户灯效优先”还是“安全状态灯优先”。3.3 别每帧都读参数缓存与回调一个很容易犯的毛病是直接在update循环里写get_rgb_custom_red()这样的参数访问函数。APM的参数访问本质是查表虽然单次开销不大但LED刷新频率并不低高频循环里反复查参数表会白白吃掉CPU时间还可能因为参数存储区IO时序问题引入偶发卡顿。正确做法是参数值落进缓存变量更新时机有两个一是固件启动初始化时加载一次二是地面站写参数时触发回调把新值同步到缓存。示意一下static uint8_t s_custom_enable; static uint8_t s_custom_red; void rgb_custom_param_update(void) { s_custom_enable (uint8_t)AP_Param::get(RGB_CUSTOM_ENABLE)-get(); s_custom_red (uint8_t)AP_Param::get(RGB_CUSTOM_RED)-get(); }update循环里只读s_custom_enable和s_custom_red不直接碰参数表。这样既保证实时性又不会给参数系统增加压力。顺带一提参数写入Flash是有寿命的像遥控器拨杆连续切换灯色这种场景如果每次都下写参数Flash可能提前报废。缓存方案能把这个风险降为零。3.4 参数名、范围与默认值怎么设计我在设计参数时吃过亏这里把几条经验一次说清第一启用开关单独一个参数不要试图把“关闭”塞进颜色参数里比如用-1表示不启用。APM的参数范围校验一般从0开始负值会带来一堆兼容问题而且语义混乱。第二RGB三通道默认值设成0不要设成255。因为一旦参数注册成功如果误开启全白RGB全255的电流冲击可能烧LED或者拖垮供电全黑反而不会出问题。第三搞清楚固件里的颜色范围。有的RGBLed子类set_rgb接收0~255有的接收0~100的百分比还有些老设备驱动内部会再转一次PWM占空比。调色前先确认固件版本里对应驱动类的取值范围否则你把255写进去实际输出可能直接是溢出值灯光亮度肉眼可见地不对。4. 编译烧录与地面站调试参数从写入到灯色变化的完整链路4.1 编译前的环境准备这些坑我基本每次都踩编译APM固件首先要有一个能跑通工具链的Linux环境WSL也行但我在WSL里踩过USB设备透传的坑后来干脆用一台独立的Ubuntu机器专门编译。以下几步基本是必做cd ardupilot git submodule update --init --recursive子模块不拉全编译到一半必然报缺头文件。这个坑我见过太多人踩报错信息五花八门根因其实就是子模块没同步。另外工具链版本不要装最新版我固定用手头验证过的GCC ARM工具链版本用系统自带的update-alternatives在多个版本间切换编译稳定很多。4.2 编译构建与烧录新版本固件用waf构建系统大致流程是这样的./waf configure --boardBOARD_NAME ./waf build ./waf uploadBOARD_NAME换成你实际飞控板对应的boards目录目标名。板卡选错是最隐蔽的坑参数系统没问题编译也能过但LED驱动引脚可能对应不上刷进去灯压根不亮。另外如果编译时提示“invalid param entry”或“unknown param name”十有八九是apm.pdef.xml里参数格式写错了或者参数名重复了去检查XML语法比瞎改代码更高效。4.3 地面站参数调试过程固件刷好之后接上开源地面站调色步骤其实很短用USB连接飞控地面站识别到飞控后进入“全部参数表”页面。点击刷新参数列表搜索RGB_CUSTOM确认新增参数已经出现。先把RGB_CUSTOM_ENABLE设为1并写入理论上灯色会变成参数默认值全黑或你设的颜色。把RGB_CUSTOM_RED设为255写入灯应立即变红。继续调绿色、蓝色直到组合出目标颜色。白色是RGB全拉高黄色是红色高、绿色中、蓝色低夜航左红右绿就是左右两颗灯分别设纯红和纯绿。调试时我习惯用纯红255,0,0作为第一测试因为默认解锁是绿色用红色最容易看出“参数覆盖是否生效”。如果第一步改Enable灯没任何变化别急着调颜色先走下面的排查链路。4.4 参数不生效的完整排查链路这里把我在调试中遇到的现象、根因和处置方式整理成一张表按图索骥会快很多现象大概率根因排查/处理地面站里搜不到RGB_CUSTOM参数刷入的不是新固件或参数定义没被编译进去确认编译产物版本检查pdef里参数格式和命名参数能改写入也提示成功灯色不变设备类里读取的是旧缓存新值没同步检查参数写入回调是否触发缓存变量是否被update循环使用颜色变了但一解锁就恢复默认事件映射优先级高于用户覆盖调整代码顺序让用户覆盖在update_events之后执行重启飞控后参数回到默认参数没有成功写入存储区或参数ID被占用用地面站强制写一遍确认存储区正常检查参数ID冲突灯亮但亮度明显不对颜色范围没对齐0~255和0~100混用查对应RGBLed子类的set_rgb接收范围换算后重设参数我遇到最隐蔽的一次是低电压事件判断每帧都在跑虽然电池电压远没到报警阈值但状态机内部会把颜色状态机刷新掉导致用户颜色“偶尔自动变回默认”。后来在用户覆盖分支里跳过了默认事件刷新逻辑才彻底解决。这类问题如果不走到“排查链路”层面光看参数和代码很难定位所以强烈建议按上面表格逐层排查。5. 扩展玩法遥控器通道调色、闪烁模式与避坑散记5.1 从参数到遥控器通道一个调色“旋钮”参数控制解决了“地面站调色”的问题但有些场景下你人在外场手上只有遥控器不想掏手机开地面站。这时候可以把RC通道值映射到颜色参数上。思路不复杂注册一个遥控器通道功能号代码里读取对应通道的PWM值把1000~2000us的区间映射成0~255的颜色值。// 示意读取AUX通道PWM映射到红色亮度 uint16_t pwm rc_channel-get_radio_in(); s_custom_red constrain_value((pwm - 1000) * 255 / 1000, 0, 255);这里有个特别重要的细节遥控器拨杆产生的颜色变化只写缓存绝不直接写参数存储区。频繁写入Flash会严重磨损飞控的参数存储器件时间长了参数丢失、存储区损坏都是有可能的。我把这个原则写进代码注释里防止自己以后手贱改回去。5.2 从常亮到闪烁利用系统自带定时器常亮调色只是基础很多人还想要闪烁效果。闪烁的本质就是在两个颜色状态之间切换APM的调度循环里拿毫秒级时间戳做切换判断就行if ((AP_HAL::millis() / 500) % 2) { _led.set_rgb(s_flash_r1, s_flash_g1, s_flash_b1); } else { _led.set_rgb(s_flash_r2, s_flash_g2, s_flash_b2); }500毫秒切换一次就是每秒两闪想快想慢改除数就行。我扩展了一套闪烁参数RGB_CUSTOM_FLASH_ENABLE、RGB_CUSTOM_FLASH_R1/G1/B1和R2/G2/B2总共没几个参数却能让灯色模式瞬间丰富起来。闪烁模式下同样要注意事件优先级尤其低电压报警的红色快闪那是安全信号建议无论如何都要保留最高优先级。5.3 我在实测中踩过的几个坑最后分享几个常态化出现的坑希望能帮你少走点弯路。第一个是供电问题。颜色调到全白时红绿蓝三路全开电流比单色常亮大得多飞控板载5V输出经常扛不住表现就是灯亮度跳动、颜色漂移。我的解决办法是外接独立BEC给灯带供电飞控只负责信号问题立刻消失。第二个是WS2812类灯带的刷新时序。这类灯带对数据刷新时序非常敏感APM的LED驱动框架在不同版本上表现不太一样我在某个基于STM32F4的板子上遇到过空中断导致灯带前半段颜色正常、后半段颜色错乱的问题。最后是靠确认外设库版本、调整DMA缓冲更新方式解决的如果你也用灯带一定要先跑一段连续点亮测试再上机。第三个是关于“保留安全灯效”的潜意识。我做参数化方案的过程中一度把所有事件灯色都覆盖掉结果飞着飞着低电压报警变成“用户自定义的蓝色闪烁”差点误判。后来我强制自己遵守一条规则飞行安全相关的事件灯色永远不能被用户参数覆盖用户自定义只能覆盖非安全类颜色。这条规则后来救了我一次现在写进了我所有固件改动方案的必读清单。我自己现在的使用习惯是把RGB_CUSTOM_ENABLE挂在地面站预设里起飞前保持关闭让系统事件灯色正常工作需要夜航或编队识别时打开自定义模式切到预设好的颜色落地后再关掉。这套流程跑顺之后我再也没为灯色重刷过固件。如果你也准备动手建议先拿一块闲置飞控板验证参数ID和范围确认无误后再移植到实际要飞的板子上——我当初就是图省事直接上了主力机结果参数范围没对齐灯色异常还差点误判飞行状态属实不值得。

相关新闻

DRN深度重照明原理与飞桨实战:从物理建模到可微分渲染

DRN深度重照明原理与飞桨实战:从物理建模到可微分渲染

1. 项目概述:为什么重照明不是“调亮度”,而是让图像自己学会“打光”最近在某高校实验室带一个图像生成方向的模拟项目X,有位A同学拿着一张在昏暗走廊里拍的手机照片来问:“老师,能不能让这张图看起来像开了补光灯一样…

2026/10/16 13:56:40 阅读更多 →
存边计算COMB:重构大模型推理的物理契约

存边计算COMB:重构大模型推理的物理契约

简介:本资源是一篇聚焦AI大模型硬件加速前沿技术的学术论文,面向芯片架构师、AI系统工程师及高校相关研究者,重点解决大语言模型部署中因“内存墙”导致的数据传输带宽瓶颈与高能耗难题。论文提出基于存算一体集成芯粒(Chiplet&am…

2026/10/16 13:56:40 阅读更多 →
SpringBoot整合MQTT从入门到实践:原理、配置与五大避坑指南

SpringBoot整合MQTT从入门到实践:原理、配置与五大避坑指南

面对“设备上报延迟高、后台下发指令要靠轮询”这类老问题,我最初也没想到用MQTT,直到有一次做设备管理后台,才真正体会到SpringBoot整合MQTT带来的实时性红利。这篇文章是我把整套流程跑通之后整理出来的完整笔记,覆盖依赖引入、…

2026/10/17 15:36:27 阅读更多 →

最新新闻

Nmap NSE脚本实战:从端口扫描到网络审计的进阶指南

Nmap NSE脚本实战:从端口扫描到网络审计的进阶指南

1. 为什么我劝你别只把Nmap当端口扫描器用 很多人第一次接触Nmap,都是从一条 nmap 192.168.1.1 开始的。扫出一堆开放端口,看到22、80、443,然后呢?然后就没有然后了。如果你也停在这一步,那说实话,你只用…

2026/10/17 16:02:21 阅读更多 →
PHP整站源码带数据库部署指南:从环境配置到Docker容器化

PHP整站源码带数据库部署指南:从环境配置到Docker容器化

简介:这是一套基于PHPMySQL开发的六合类网站完整源码,采用phpMyAdmin管理数据库,系统划分为后台管理、代理与会员三大模块,适合有一定PHP基础、希望研究整站架构与数据库设计的开发者用于技术学习与二次开发参考。压缩包共1086个文…

2026/10/17 16:02:21 阅读更多 →
OpenCV特征区域分析:几何、矩、形状与纹理特征值计算与稳定性实战

OpenCV特征区域分析:几何、矩、形状与纹理特征值计算与稳定性实战

1. 从"能跑通"到"测得准":特征区域特征值到底在算什么很多人第一次接触特征区域分析,都是被一个很朴素的需求推着走的:图里有一块我关心的区域,我想知道它到底"长什么样"。这个"长什么样"…

2026/10/17 16:02:21 阅读更多 →
高级前端面试官视角:从状态管理到工程化的出题逻辑与刷题策略

高级前端面试官视角:从状态管理到工程化的出题逻辑与刷题策略

我断断续续做过一段时间前端面试官,部门里让我整理一套高级前端开发工程师的面试题,用来筛人和给内部晋升做参考。那段时间我一边出题一边复盘,最直观的感受是:很多候选人简历写得很漂亮,基础题也能答得不错&#xff0…

2026/10/17 16:02:21 阅读更多 →
不卖的天价胸罩:用锚定效应打造品牌营销核武器

不卖的天价胸罩:用锚定效应打造品牌营销核武器

如果你在一个公开场合,看到一件标价上千万美元的内衣被锁在防弹玻璃柜里,由专人看护、媒体围着拍,你会不会下意识地问一句:这东西到底卖给谁? 我第一次关注到维多利亚的秘密那件“Fantasy Bra”时,就是带着…

2026/10/17 16:02:21 阅读更多 →
STM32寄存器编程实战:GPIO、定时器与串口

STM32寄存器编程实战:GPIO、定时器与串口

每次看到论坛里有人说“寄存器难”,我都想拉住他聊五分钟。我入行那几年也被寄存器折磨过,直到有一次调一个功耗敏感的项目,手里的库函数版本和例程对不上,底层配置出来的引脚电平就是不对。从那以后我翻烂了参考手册,…

2026/10/17 16:01:21 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →