扫地机器人双脑架构:Linux与MCU如何分工保障安全与实时性
1. 从一次撞墙不回头的实测说起扫地机器人撞墙这件事看起来是个小问题但如果你拆过几台不同价位的机器会发现一个很有意思的现象便宜的机器撞墙之后会愣一下然后退回来重新找方向贵的机器在距离墙面还有几厘米的时候就开始减速转向整个过程行云流水。这个差异背后其实不是传感器好坏的问题而是决策权放在哪颗芯片上的问题。我最早接触扫地机器人的电控架构是在一个朋友的小团队里他们当时用一颗主频1.2GHz的Linux SoC同时跑SLAM建图、路径规划和电机控制。听起来很合理对吧算力强、生态好、开发快。结果实测下来机器人在空旷区域跑得很漂亮但一遇到深色地毯、玻璃门、悬空台阶这些边界场景就会出现该停不停、该转不转的情况。最惊险的一次是机器人在楼梯边缘犹豫了大概0.8秒才后退那0.8秒在Linux的世界里可能只是一次GC或者一次调度延迟但在物理世界里机器人的轮子已经悬空了一半。这件事让我彻底想明白了一个道理扫地机器人的大脑和小脑必须分开而且安全相关的决策绝对不能交给Linux。这就是现在越来越多中高端扫地机器人采用的双脑架构——一颗Linux SoC负责感知、建图、规划这些聪明活一颗MCU通常是STM32系列负责电机控制、碰撞检测、悬崖检测、急停这些保命活。这篇文章我会从实际工程角度把双脑架构的设计逻辑、MCU侧的关键实现、Linux和MCU之间的通信协议、以及我踩过的那些坑完整地讲一遍。如果你正在做扫地机器人、AGV、或者任何移动机器人的电控系统这篇内容应该能帮你少走不少弯路。即使你只是对嵌入式架构感兴趣里面关于实时性、任务划分、通信可靠性的思路也是通用的。2. 为什么Linux在安全决策上不靠谱2.1 Linux的调度延迟到底有多大很多人对Linux的实时性有一个误解觉得用了PREEMPT_RT补丁就能做硬实时。我实测过在一颗四核A53跑Linux 5.10RT补丁的板子上用cyclictest测出来的最坏延迟大概在80到150微秒之间。这个数字看起来还不错但问题是这是空载情况下的数据。当你的SLAM线程在跑、WiFi在传图、日志在写eMMC的时候最坏延迟轻松突破5毫秒极端情况下能到20毫秒以上。20毫秒是什么概念扫地机器人以0.3米/秒的速度前进20毫秒就是6毫米。听起来不多对吧但如果机器人正在以0.5米/秒的速度冲向楼梯从传感器检测到悬崖到MCU执行刹车中间如果经过Linux绕一圈这6到10毫米的额外延迟可能就意味着轮子已经出去了。而且这还只是延迟没算上Linux上任务优先级反转、内存页错误、中断风暴这些更糟糕的情况。2.2 一个真实的Linux卡顿案例我印象最深的一次调试是机器人会在某个特定位置反复出现原地转圈的bug。查了三天最后发现是Linux侧的WiFi驱动在扫描AP的时候会持有自旋锁大概30毫秒这期间负责下发速度指令的线程被阻塞MCU收不到新的速度指令就按照通信超时的默认策略执行了急停。然后Linux恢复后又下发正常指令机器人就表现为走一下停一下在路径规划算法看来就是位置更新异常于是触发重规划表现出来就是原地转圈。这个bug在实验室里几乎复现不了因为实验室WiFi环境干净。到了用户家里周围几十个AP问题就出来了。这就是Linux做安全决策的典型风险你永远不知道哪个子系统会在什么时候给你来一下。2.3 MCU的确定性从哪来相比之下STM32这类MCU的确定性是刻在骨子里的。以STM32F4系列为例168MHz主频中断响应延迟是12个时钟周期也就是约71纳秒。即使算上中断服务程序的入栈出栈从外部中断触发到执行第一条用户代码通常也在1微秒以内。而且这个数字是确定的不会因为你同时开了几个外设就变慢。更关键的是MCU上你跑的是裸机程序或者RTOS任务调度是你自己写的优先级是你自己定的内存是你自己管的。没有虚拟内存没有页错误没有不可预测的GC。对于检测到悬崖必须立即刹车这种需求MCU可以在几十微秒内完成从检测到执行的全过程这个确定性是Linux给不了的。这里要澄清一个常见误区不是说Linux不能用而是说安全关键路径不能经过Linux。Linux做感知和规划是极好的但最终的执行许可必须由MCU来把关。3. 双脑架构的任务划分谁该干什么3.1 一张表看清职责边界双脑架构的核心不是两颗芯片而是职责的清晰划分。我在实际项目中总结的划分原则是这样的任务类别执行单元实时性要求典型任务感知与建图Linux SoC软实时50-100ms激光雷达数据处理、SLAM、地图更新路径规划Linux SoC软实时100-500ms全局路径、局部避障、区域划分人机交互Linux SoC非实时WiFi通信、APP交互、语音、OTA电机控制MCU硬实时1ms轮速闭环、PID、电流控制安全监控MCU硬实时100us悬崖检测、碰撞检测、急停传感器采集MCU硬实时1-10ms陀螺仪、里程计、红外、超声电源管理MCU硬实时1ms电池监测、充电控制、过流保护这张表的关键在于最后三行。你会发现所有**如果出错会立刻造成物理伤害或设备损坏的任务全部放在MCU侧。而所有如果慢一点只是体验差一点**的任务放在Linux侧。3.2 为什么悬崖检测必须放MCU悬崖检测是扫地机器人最典型的安全功能。原理很简单底部有几个红外传感器往下照如果收到的反射光强度低于阈值说明下面是悬空的。但这个简单的功能对实时性要求极高。假设机器人以0.3米/秒前进悬崖传感器安装在机器人前部距离轮子大概5厘米。从传感器检测到悬崖到轮子到达悬崖边缘只有约167毫秒。这167毫秒里要完成传感器采样、滤波、阈值判断、决策、电机减速、电机停止。如果这个链路经过Linux光是调度延迟就可能吃掉一半时间再加上通信往返基本就来不及了。而放在MCU上整个链路可以做到传感器每1毫秒采样一次连续3次超阈值触发中断中断服务程序里直接操作电机PWM寄存器整个过程不超过500微秒。剩下的166.5毫秒足够机器人平稳停下。3.3 Linux侧该做什么聪明活Linux侧的价值在于算力和生态。扫地机器人需要跑SLAM需要处理激光雷达的点云数据需要做路径规划需要连WiFi和云端通信这些任务用MCU做要么做不了要么开发成本极高。以SLAM为例一个典型的激光雷达每秒产生2000到4000个点每个点要做坐标变换、匹配、地图更新。这个计算量在STM32上跑帧率可能只有几Hz根本没法用。但在Linux上用一颗A53或者A72可以轻松跑到10Hz以上建图效果和实时性都能保证。所以双脑架构的本质是让专业的芯片做专业的事Linux负责思考MCU负责反射。就像人的大脑负责思考脊髓负责膝跳反射一样两者缺一不可但绝不能混用。4. MCU侧的关键实现细节4.1 选型为什么是STM32在MCU选型上STM32几乎是扫地机器人行业的标准答案。我经手的项目里STM32F1、F4、G0、G4、H7都用过各有各的场景。对于入门级扫地机器人STM32F103或者G0系列就够了主频72MHz到64MHz带CAN或者UART几路PWM和ADC成本能压到几块钱。中高端的话STM32F405或者G474比较合适主频168MHz带FPU可以跑浮点PID外设也丰富。如果是多电机多传感器的高端机型STM32H743这种带双核或者高主频的会更从容。选STM32的另一个重要原因是生态。HAL库、LL库、CubeMX配置工具、丰富的参考设计这些能大幅缩短开发周期。而且STM32的定时器、ADC、DMA这些外设的组合非常灵活做电机控制和传感器采集很顺手。4.2 电机控制的实时闭环扫地机器人通常有左右两个驱动轮有些还有边刷和滚刷电机。驱动轮一般用有刷直流电机或者无刷电机配合编码器做速度闭环。在MCU上速度环的控制周期通常是1毫秒。这个周期里要完成读取编码器计数、计算当前速度、和目標速度做PID、更新PWM占空比。用STM32的定时器编码器模式读编码器用另一个定时器产生PWMPID计算在定时器中断里做整个流程非常成熟。// 简化的速度环PID结构 typedef struct { float target; float actual; float error; float integral; float kp, ki, kd; float output; } PID_TypeDef; void PID_Update(PID_TypeDef *pid, float actual, float dt) { pid-actual actual; pid-error pid-target - actual; pid-integral pid-error * dt; // 积分限幅防止饱和 if (pid-integral INTEGRAL_MAX) pid-integral INTEGRAL_MAX; if (pid-integral -INTEGRAL_MAX) pid-integral -INTEGRAL_MAX; pid-output pid-kp * pid-error pid-ki * pid-integral pid-kd * (pid-error - pid-last_error) / dt; pid-last_error pid-error; }这里有个实操经验积分限幅一定要做。我见过不少项目因为没做积分限幅机器人在被卡住的时候PID积分项疯狂累积一旦脱困就猛冲出去非常危险。限幅值要根据电机最大电流和轮子打滑极限来定一般取额定输出的1.5到2倍。4.3 安全监控的看门狗设计MCU侧除了控制还有一个重要职责是监控Linux是否还活着。这个机制通常叫心跳或者看门狗。具体做法是Linux侧每隔固定时间比如100毫秒通过UART或者SPI向MCU发一个心跳包。MCU侧如果连续3次没收到心跳300毫秒就认为Linux挂了立即执行安全策略停止所有电机、关闭激光雷达电源、进入待机状态。这个机制救过我一次。当时Linux侧的一个应用程序内存泄漏把系统内存吃光了OOM Killer把主控进程杀了但系统本身还在跑。如果没有心跳机制机器人就会保持最后的速度指令一直往前冲。有了心跳MCU在300毫秒内就检测到异常并停车了。注意心跳超时时间不能设太短否则Linux正常的高负载场景会误触发也不能太长否则安全响应太慢。100毫秒心跳、300毫秒超时是我实测下来比较平衡的参数。4.4 通信协议的设计要点Linux和MCU之间的通信通常用UART或者SPI。UART简单、可靠、成本低SPI速度快但需要更多引脚。对于扫地机器人UART 115200或者460800波特率基本够用。协议设计上我建议用定长帧校验序号的结构字段长度说明帧头2字节0xAA 0x55序号1字节0-255循环用于检测丢帧命令1字节速度指令、查询、配置等数据N字节具体载荷CRC162字节校验序号字段很关键。我遇到过UART因为电磁干扰丢帧的情况如果没有序号Linux侧不知道MCU有没有收到指令就会一直重发或者状态不同步。有了序号MCU可以检测到丢帧并请求重传Linux也可以根据序号确认指令是否被执行。5. 双脑之间的边界怎么划5.1 速度指令的安全钳位Linux侧算出来的速度指令不能直接透传给电机。MCU必须做一层安全钳位。具体来说MCU收到Linux下发的目标速度后要做几件事第一检查速度值是否在允许范围内比如最大0.5米/秒超出就截断第二检查加速度是否超过限制比如最大1米/秒²防止机器人猛冲第三检查当前安全状态悬崖、碰撞、低电量如果安全状态不允许运动直接忽略指令。这层钳位是双脑架构的精髓。Linux可以想让机器人跑多快但MCU决定允许它跑多快。即使Linux侧的规划算法出了bug下发了10米/秒的速度MCU也只会执行0.5米/秒。5.2 传感器数据的双向校验MCU采集的传感器数据里程计、陀螺仪、悬崖状态要上传给Linux做建图和规划。但这里有个问题如果MCU上传的数据有误Linux的建图就会错。我的做法是双向校验。MCU上传里程计数据时同时上传原始编码器计数和时间戳。Linux侧根据编码器计数自己算一遍里程和MCU算的做对比。如果差异超过阈值说明有一方算错了Linux会触发告警并降级使用比如暂时只用陀螺仪做航向估计。这个机制在调试阶段特别有用。有一次MCU的编码器中断优先级设错了导致高速时丢计数Linux侧立刻发现里程计和编码器原始值对不上我们很快就定位到了问题。5.3 故障降级的分级策略双脑架构还要考虑一方挂了怎么办。我的经验是分三级第一级Linux挂了但MCU正常。MCU执行安全停车保持传感器采集等待Linux重启。如果Linux在10秒内重启成功可以继续工作否则进入待机等用户干预。第二级MCU部分外设挂了但核心功能正常。比如某个悬崖传感器坏了MCU可以上报故障Linux侧调整策略比如降低速度、避开边缘区域继续工作但限制能力。第三级MCU核心功能挂了。这种情况比较少见但要有兜底。通常是硬件看门狗复位MCU如果复位后自检不通过就切断电机电源进入安全状态。6. 那些年我踩过的坑6.1 通信粘包导致的指令错乱早期做UART通信的时候我没做帧同步结果Linux侧快速下发指令时MCU的接收缓冲区里会出现半包和粘包。比如两条指令AA 55 01 10 ...和AA 55 02 20 ...MCU可能读成AA 55 01 10 ... AA 55 02 20 ...如果解析逻辑不严谨就会把第二条的帧头当成第一条的数据。解决办法是状态机解析MCU的UART接收中断里不直接解析而是把字节丢进环形缓冲区主循环里用状态机逐字节解析。状态机遇到0xAA进入等待0x55状态收到0x55进入接收帧头状态然后按长度收完整个帧再做CRC校验。这样无论怎么粘包半包都能正确解析。6.2 中断优先级配置错误引发的幽灵刹车STM32的中断优先级配置是个容易翻车的地方。我有一次把UART接收中断的优先级设得比定时器中断高结果UART数据量大的时候定时器中断被频繁打断电机控制周期从1毫秒变成了1.5毫秒甚至2毫秒。PID参数是按1毫秒整定的周期一变控制效果就变差机器人会偶尔出现顿挫。后来我把优先级重新排了电机控制定时器 安全传感器中断 编码器 UART接收 其他。安全永远最高控制次之通信最低。这个顺序在大多数移动机器人项目里都适用。6.3 Linux侧优雅关闭没做好导致的数据损坏还有一个坑是Linux侧的程序退出时没有正确关闭和MCU的通信。正常运行时Linux会定期下发速度指令。如果程序崩溃或者被kill最后一条速度指令可能还留在MCU的执行队列里机器人就会保持那个速度继续跑。解决办法是指令带超时。MCU侧维护一个最后收到速度指令的时间戳如果超过200毫秒没有新指令就自动把目标速度设为0。这样即使Linux突然挂了MCU也会在200毫秒内停车。这个机制和心跳是互补的心跳检测Linux是否活着指令超时检测速度指令是否新鲜。6.4 电源波动导致的MCU复位扫地机器人在电机启动、急停、过坎的时候电源会有比较大的波动。如果MCU的供电设计不好可能会被拉低到复位阈值以下导致MCU意外复位。我的经验是MCU的供电一定要加LC滤波大电容而且要和电机供电分开走线。电机驱动的大电流路径不要经过MCU的电源平面。另外STM32的BOR欠压复位阈值要设合适太低容易在电压跌落时跑飞太高又容易误复位。一般设2.7V或者2.9V比较稳妥。7. 写给正在做双脑架构的你双脑架构不是简单的两颗芯片各干各的而是一套职责划分、通信协议、安全策略、故障降级的完整设计。Linux的算力和生态是扫地机器人智能化的基础但安全这条底线必须由MCU来守。如果你正在设计类似的系统我的建议是先把所有任务列出来按出错后果和实时性要求两个维度分类凡是后果严重或者实时性要求高的一律放MCU。然后设计通信协议时一定要考虑丢帧、粘包、超时、校验这些异常情况。最后安全策略要做成分级的不要只有正常和停车两个状态。我在实际项目里最深的一个体会是双脑架构的价值不在于性能而在于确定性。Linux可以今天跑得快明天跑得慢但MCU必须每次都一样快。这种确定性才是机器人敢在用户家里自由移动的底气。最后分享一个小技巧调试双脑通信的时候一定要做一个通信日志功能把Linux下发的指令和MCU的执行结果都记录下来带时间戳。出问题的时候这份日志能帮你快速定位是Linux发错了还是MCU执行错了还是中间通信丢了。这个功能开发成本很低但省下来的调试时间是以天计算的。

相关新闻

ARS408毫米波雷达点云在RVIZ中的实时可视化全流程解析

ARS408毫米波雷达点云在RVIZ中的实时可视化全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:42:32 阅读更多 →
告别“啃”论文的痛苦:用 Cursor Skill 打造专属 AI 论文阅读助手,TaoToken 统一 Key 接入实战

告别“啃”论文的痛苦:用 Cursor Skill 打造专属 AI 论文阅读助手,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/7 14:42:32 阅读更多 →
Claude Code 快速安装并接入 DeepSeek-V4-pro 教程:用 cc-switch 管理多模型配置

Claude Code 快速安装并接入 DeepSeek-V4-pro 教程:用 cc-switch 管理多模型配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:42:32 阅读更多 →

最新新闻

ISO3082DWR芯片手册深度解读:从电气参数到PCB设计的工程实践指南

ISO3082DWR芯片手册深度解读:从电气参数到PCB设计的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:57:24 阅读更多 →
运放与比较器的工程分界:参数交叉与物理实现

运放与比较器的工程分界:参数交叉与物理实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:57:24 阅读更多 →
速腾多激光雷达点云同步与RVIZ可视化实战指南

速腾多激光雷达点云同步与RVIZ可视化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:57:24 阅读更多 →
运筹学期末冲刺:填空题与计算题高频考点及避坑指南

运筹学期末冲刺:填空题与计算题高频考点及避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:57:24 阅读更多 →
工业视频链路EMC设计实战:FlatLink与LVDS信号完整性优化

工业视频链路EMC设计实战:FlatLink与LVDS信号完整性优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:57:24 阅读更多 →
JavaWeb网上购物书城课设:JSP+Servlet+JDBC完整项目解析与答辩指南

JavaWeb网上购物书城课设:JSP+Servlet+JDBC完整项目解析与答辩指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:56:23 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02: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/7 14:34:12 阅读更多 →
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/7 14:34:13 阅读更多 →
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/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/7 14:34:12 阅读更多 →
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/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练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/7 13:34:55 阅读更多 →