ROS与Arduino舵机控制实战:从固件配置到话题发布与排错
前后搞过轮式机器人、也帮朋友调过机械臂的朋友应该都绕不开一个场景舵机明明单独用Arduino驱动挺正常一接进ROS就乱了套要么话题接不上要么控制不连续。后来我用ros_arduino_bridge把整套舵机控制串起来才算是把这块理顺了。这篇文章就把这个过程完整复盘一遍从固件配置、上位机通讯到话题发布和排错适合用Arduino做底层驱动、又想让舵机在ROS里被统一调度的开发者参考。1. 项目边界ros_arduino_bridge到底替我们干了什么先说清楚一件事ros_arduino_bridge不是一个“写了就能让舵机转”的魔法程序它是一套由三部分组成的通信体系Arduino端固件、串口协议、上位机ROS驱动。三者的关系就像你雇了一个传话的中间人Arduino只负责按指令执行PWM输出ROS这边只负责发布抽象的话题和服务真正的“翻译规则”被定义在固件与驱动共用的那套串口协议里。我最早接触这个包的时候以为它就是封装了串口读写的库后来翻源码才看明白它本质上是把Arduino当作一个可以从ROS侧远程配置和执行命令的“外设服务器”。你在上位机用rostopic pub往某个话题里塞一个角度值驱动层把角度换算成目标脉宽再按协议帧打包发到串口Arduino端解析后调用Servo库去更新PWM波。这和我过去习惯的“Arduino自己跑一个循环、舵机按时间表转动”是完全不同的思路。这个设计最大的价值在于舵机从“单片机本地控制”变成了“机器人系统里的一个标准执行器”。你可以把舵机控制和差速底盘、传感器数据全部统一到一套launch文件里用同一个时钟去调度。比如某项目里需要按导航状态切换舵机角度直接在机器人状态机里发话题就行不用再绕到串口去和Arduino搞私有协议维护成本一下子降了很多。当然它也有适用范围。如果你只是做一个单舵机摇头的小玩具用这个桥接方案反而显得重这时直接用原生的串口通信就够了。但如果你想做的是多舵机机械臂、带底盘的复合机器人或者需要多个节点协同控制那ros_arduino_bridge的“话题即接口”模式就比手写解析划算得多。另外有个容易误解的地方ros_arduino_bridge虽然名字里带arduino但它的协议设计并不只在Arduino上能用。固件部分支持常见的AVR和STM32开发板只要你自己移植好串口收发和Servo相关接口上位机驱动逻辑是完全可以复用的。我自己在测试某些新板子时就直接沿用了这套协议框架只是重写了底层引脚映射。顺带说一句如果你之前用惯了ROS自带串行通信那套也别急着替换。两者定位不太一样。自带方案擅长把数据流双向接到话题上适合传传感器数据但执行器控制往往需要更明确的命令帧和校验机制ros_arduino_bridge在这块更贴近工程实践。选择哪个取决于你的舵机数量和实时性要求。2. Arduino端固件配置先让舵机和协议对上话2.1 固件源码结构和关键宏定义这个包的Arduino端固件通常叫ROSArduinoBridge本质就是一个可以按需裁剪的.ino工程。第一步不是急着写逻辑而是把源码放到Arduino IDE的库目录里然后打开主文件看顶部的宏配置区。舵机控制相关的几个宏是整份配置的核心。常见的有SERVO_NUM登记你要控制的舵机数量改这里会决定后续命令帧里能容纳几个通道。servoPins每个舵机信号线接的Arduino引脚编号按数组顺序排列。SERVO_MIN、SERVO_MAX舵机角度与脉宽映射的上下边界值。SERVO_STEP每次角度更新的最大步进量用来限制舵机转速避免剧烈跳变。我一般会先把SERVO_NUM设置为实际需要的通道数而不是为“以后可能扩展”多留几个因为固件内部会为这些通道分配索引通道多了反而增加解析负担。servoPins这行如果接在9号引脚上就写9接在10号上就写10顺序最好和你上位机配置里的舵机索引保持一致不然后期排查时脑子和线序对不上非常折磨人。2.2 为什么固件走的是“配置编译”路线很多第一次接触的人会问为什么不能像动态参数那样直接在运行期改舵机数量答案和Arduino的资源模型有关。AVR系列单片机的定时器资源有限Servo库本质上是借用定时器中断产生PWM信号每多一个舵机就会多占用一组定时器通道。如果你在运行期随意增删舵机固件根本没法安全地重新分配定时器资源所以只能通过编译期宏一次性确定。理解这点之后你在选板子的时候就要提前算账。比如标准Servo库在同一块普通Arduino板上通常能稳定驱动8到12路舵机具体看引脚是否有定时器冲突。如果你计划控制15路以上建议换用带独立舵机驱动模块的方案而不是硬塞进一颗普通MCU里。2.3 固件上传后的自检配置改好之后先别急着连ROS直接通过串口监视器验证固件是否正常。发送字符g具体命令含义要看固件源码里processCommand的定义如果串口返回固件版本号、波特率、硬件信息说明串口通路和协议解析已经工作。这一步很重要因为后续所有ROS话题控制的底层都依赖这条串口链路链路本身不通上层怎么调都没用。如果串口没有任何返回我会先检查三件事波特率是否和串口监视器一致、板子类型是否选对、servo相关代码是否因为宏定义冲突而编译失败。编译失败是最容易忽略的Arduino IDE有时不会把错误提示显示得很明显需要滚动日志找到“Servo”或“pin”关键字相关的报错。2.4 引脚冲突与舵机信号线的接线习惯关于接线舵机信号线要接在支持PWM输出的引脚上同时尽量避免和I2C、串口等复用引脚冲突。我的经验是如果你在同一个项目里既用舵机又用到模拟传感器优先把舵机分配到Timer控制的引脚上把模拟输入留给ADC通道独立的引脚这样能把干扰降到最低。还有一个小习惯舵机信号线尽量短而且不要和电机电源线扎在一起走线。我在某次调试中遇到过舵机轻微抖动排查半天才发现是信号线绕过了电机驱动板的大电流线把线分开之后抖动立刻消失。这种问题在单独写Arduino程序时不容易暴露但接进ROS系统、话题刷新频率提高之后电磁干扰对PWM信号的影响会被放大。3. 上位机连接与参数对齐串口、波特率和话题服务的建立3.1 驱动包的安装与工作区配置上位机部分通常是把ros_arduino_python这个Python驱动包放到你的catkin工作区里然后编译。这个过程不算复杂但有一个坑很多人在没编译整个工作区的情况下直接source了旧的setup.bash导致节点启动时找不到新装的包。我习惯每次增删包之后都重新编译并source一遍工作区环境宁可多花十几秒也不要卡在import错误上反复怀疑人生。编译完后最重要的是建一个用于描述机器人硬件参数的yaml配置文件或者直接修改示例配置。端口号、波特率、舵机数量、频率都写在这里。下面是一份我常用的参考配置port: /dev/ttyUSB0 baud: 115200 timeout: 0.1 rate: 50 servo_rate: 20 use_servos: true num_servos: 23.2 为什么这些参数必须对得严丝合缝port指Arduino板在Linux下映射出的设备文件一般是/dev/ttyUSB0或/dev/ttyACM0。baud必须和固件里的BAUDRATE宏一致不一致的表现通常是上位机反复报超时、话题时有时无。rate是驱动轮询串口数据的频率太高会让CPU无谓消耗太低则会让舵机响应变迟钝。servo_rate则单独控制舵机命令的发布频率我建议先设成20Hz够用且不容易把串口占满。有一点我想专门提醒use_servos这个开关很容易被忽略。某次我在配置里写好了舵机参数但忘了打开这个开关结果话题列表里根本没有舵机相关话题当时还以为是硬件坏了。后来查源码才意识到这个布尔量会直接决定驱动是否注册舵机话题和服务。你如果启用舵机控制一定要确认它是true。3.3 启动launch文件与话题自检配置完成后启动launch文件。启动后别急着发命令先做一轮话题自检rostopic list rostopic info /servos/command/servos/command是常用的舵机控制话题具体名称随版本略有差异但信息类型一般可以通过rostopic info看到。如果你没有看到任何servo话题优先回头检查配置里的use_servos其次是num_servos是否大于0。这时候还建议检查驱动节点有没有在重复打印串口打开失败的日志。串口打开失败有一个经典原因当前用户不在dialout用户组里没有访问串口设备的权限。处理方式是把用户加入相应用户组后重新登录或者临时用sudo chmod改变设备权限。长期项目建议写udev规则给板子固定一个设备别名比如/dev/ttyArduino省得每次插拔都在换设备名。3.4 驱动节点输出与串口数据的呼应在驱动节点正常运行的时候你可以同时开着Arduino IDE的串口监视器观察是否有来自上位机的命令帧在持续刷新。正常情况下只要ROS侧有节点在发布话题串口监视器里就能看到规律性的命令数据。这条“证据链”能帮助你快速判断问题出在上位机到串口这一段还是串口固件到舵机这一段。很多时候ROS侧一切正常、舵机就是不动问题恰恰不在ROS而是Arduino板完全没有收到数据或者收到了但命令类型不匹配。串口监视器看实际流量是破除这类“假性正常”最直接的手段。4. 让舵机真正动起来话题发布与服务调用的完整操作4.1 用rostopic pub快速验收一切就绪后最痛快的时刻就是直接发话题让舵机转动。假设你的驱动里配置了2个舵机使用std_msgs/UInt16MultiArray类型、按角度值0到180发送可以这样操作rostopic pub -1 /servos/command std_msgs/UInt16MultiArray data: [90, 90]这条命令会把两个舵机同时设为90度。如果舵机没有反应先用rostopic echo /servos/command看有没有其他节点在往这个话题里灌数据再用串口监视器确任固件有没有收到对应命令。这里有一个小细节-1表示只发一次如果你想持续控制需要写一个循环发布的节点。4.2 写一个简单的Python控制节点工程上当然不会一直敲命令行通常要写一个控制节点。下面是一个很轻量的Python示例它会每隔几秒切换一次角度import rospy from std_msgs.msg import UInt16MultiArray rospy.init_node(servo_demo_node) pub rospy.Publisher(/servos/command, UInt16MultiArray, queue_size10) rate rospy.Rate(20) angle 0 while not rospy.is_shutdown(): msg UInt16MultiArray() msg.data [angle, 180 - angle] pub.publish(msg) angle (angle 5) % 181 rate.sleep()这段代码的核心是不断构造包含目标角度的数组并发布出去。驱动收到后会按照servo_rate刷新率把命令转给固件。你在实际项目里当然可以把这段逻辑替换成机械臂逆解、跟随算法或者手柄按键映射发布接口完全一样。4.3 消息类型不是唯一答案时怎么办有一点要注意不同版本的ros_arduino_bridge、不同fork分支对舵机话题的消息类型定义并不完全相同。不只是UInt16MultiArray有的版本会用Float64MultiArray也有版本支持单独控制某个舵机的话题。我建议启动节点之后先执行rostopic info /servos/command看到类型定义再选择对应代码。直接用错类型发布者会发现话题根本发不进去或者驱动节点静默丢弃消息。如果版本支持服务调用通常也可以看到类似/servos/relax这样的服务用于让舵机进入释放状态。这在需要手动掰动机械臂、或者舵机过载保护的时候很有用。我一般会让程序在退出时主动调用这个服务让机械结构回到可手动调整的状态而不是一直保持刚性锁定。4.4 多舵机同步与刷新率的取舍多个舵机同时控制时命令数组里的元素顺序要与固件里的servoPins顺序严格对应。我习惯在代码注释里写明每个索引对应的物理位置比如索引0是肩部、索引1是肘部、索引2是腕部。项目间隔久了再回来看代码这份注释能救你命。servo_rate设得太高不一定是好事。假设你配置了8个舵机以50Hz刷新率发送每个命令帧还有校验开销串口的有效数据吞吐会被占掉不少反而可能拖慢其他传感器数据的传递。我一般控制在20到30Hz肉眼基本感觉不到延迟但系统稳定性提升不少。5. 实测排查与工程化建议供电、校准、权限与稳定性5.1 舵机供电永远是最先要检查的物理问题软件调通了舵机依然可能出现抖动、无力、甚至完全不动十有八九是供电问题。舵机启动和堵转瞬间电流是很大的如果直接从Arduino的5V引脚取电板载稳压器很容易被拉垮导致整个板子复位。正确的做法是给舵机单独配电源并把舵机电源地线和Arduino的GND连接在一起这就是所谓“共地”。我在某次带两个大扭矩舵机的调试中亲眼见过一启动舵机串口就断开重连的现象。后来用独立电源模块供电、单独给舵机供电回路加了一个大电容问题立刻消失。这里多说一句如果你用电池供电调试记得先把电池充满电压不足时舵机表现出来的是“动作软绵绵”不懂的人往往会误判成PWM信号不对。5.2 角度校准和脉宽边界舵机标称0到180度但实际能可靠到达的角度范围往往比标称略小。你如果强行发送180度一些舵机会一直顶着限位发出嗡嗡声几秒钟就发烫。所以我会在固件里先设置一个保守的SERVO_MIN和SERVO_MAX实际测试后逐渐扩大范围直到舵机既不抖动也不撞限位。校准步骤不复杂先在Arduino端直接写一个临时测试程序让舵机依次走到最小和最大脉宽记下稳定角度。然后把边界值更新到固件配置里。这个办法比在ROS侧盲猜角度值高效得多而且能避免把上位机参数改乱。5.3 串口设备名漂移与权限问题设备管理这块我吃过一次亏。板子原本是/dev/ttyUSB0经过几次插拔之后突然变成/dev/ttyUSB1导致launch文件里写死的端口找不到设备驱动节点一直报错。解决办法是用板子的USB硬件ID写udev规则把设备固定映射成一个稳定名称。这样不管插在哪个USB口端口路径都不会变。权限问题的表现则是另一个画风节点能启动但一收数据就报“Permission denied”。最省事的处理方式是把当前用户添加进dialout或uucp组然后注销重新登录。也有人喜欢用临时chmod但那只对当场有效一重启又要重新弄所以我还是推荐用户组方式一劳永逸。5.4 善用分层定位法别在ROS层瞎猜调试这套系统我总结下来最有效的思路是分层定位。第一层用串口监视器直接给固件发原始命令确认Arduino能响应第二层不启动ROS驱动直接用Python读串口写串口确认串口链路和配置参数没问题第三层再启动ROS驱动看话题和控制指令是否正常。哪一层断了就修哪一层不要拿着rostopic echo去查硬件问题也不要用万用表去量软件Bug。如果第一层就失败优先检查波特率、固件是否烧录成功、接线是否松动如果第一层通而第二层失败多半是权限、设备路径或Python串口参数的问题如果前两层都通而第三层失败再去看配置yaml、消息类型和节点运行日志。这个顺序看起来很简单但真的能省掉大量无效排查时间。5.5 从调试demo到稳定系统的再思考不要把“舵机能转”和“舵机系统可靠”混为一谈。demo阶段你可以尝到话题控制的甜头但真正放到长时间运行的机器人上还有几件事要提前考虑。首先是看门狗机制。长时间运行中串口偶发超时并不罕见驱动节点如果网络状况不好可能会在话题侧产生延迟。我的做法是在应用层定时检查舵机话题最后一条消息的时间戳超过一定阈值就触发安全动作比如把舵机回到中位而不是让机械臂悬在未知角度傻等。其次是命令平滑。很多项目里直接发布目标角度舵机会以最大速度猛甩过去容易造成机械冲击。固件里的SERVO_STEP就是为此设计的把它设成一个比较小的值舵机就会以步进方式逐步逼近目标角度效果相当于加了限速。这个参数在机械臂场景下尤其重要调好了能明显减少末端抖动。再说说日志。建议在控制节点内部记录每次角度指令的时间、目标值和是否被驱动接收。这部分日志可以是简单的csv文件也可以是rosbag。真遇到舵机偶发偏移问题时这些记录能帮你判断是控制端算错了角度还是执行端没跟上。最后是我的一个个人习惯在正式部署前让舵机在目标角度范围内来回扫动至少几百次观察是否有累计偏移或发热异常。有些舵机的电位器磨损在短时间测试里根本看不出来只有长时间循环测试才能暴露。别嫌费时间这个环节相当于给整个执行链路上个保险。这段时间用下来的体会是ros_arduino_bridge这套方案真正帮我把精力从“逐字节解析串口协议”里解放了出来让我可以直接用ROS的思维去设计机器人行为。无论是单舵机实验还是多自由度机械结构顺着固件配置、驱动参数、话题接口这条主线走大部分问题都能在半小时内定位到具体环节。如果你正准备往自己的Arduino项目里加ROS控制不妨先从一个舵机开始把这条链路的每一个层级都亲手测一遍通了之后再扩展通道数。这样一旦出问题你心里会对“到底坏在哪”有一个非常清晰的判断而不是对着满屏日志发呆。

相关新闻

分布式日志系统架构设计与生产落地实战

分布式日志系统架构设计与生产落地实战

做后端七八年,我越来越觉得,日志系统是最容易被低估的基础设施。单体应用时期,出了问题直接上服务器 grep 日志,运气好几分钟能找到,运气不好连日志文件都被 logrotate 干掉了。等服务拆成几十个模块、分布式部署之后&…

2026/10/17 9:45:44 阅读更多 →
Shiro权限框架实战:过滤器链、Realm与会话管理的深坑排查

Shiro权限框架实战:过滤器链、Realm与会话管理的深坑排查

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

2026/10/17 9:45:44 阅读更多 →
VisionPro图像预处理实战:从去噪增强到阈值分割的完整链路

VisionPro图像预处理实战:从去噪增强到阈值分割的完整链路

我做过一个连接器针脚检测项目。生产节拍很紧,图像采回来一推,针脚和塑料基底的反光混在一起,边缘还有一圈虚影。当时我的第一反应是去调后面定位工具的参数,结果分数怎么拉都上不去。后来把问题拆开看,真正卡住定位的…

2026/10/17 9:45:44 阅读更多 →

最新新闻

双节锂电池主动均衡设计:MP2642GR-Z与ATmega324P工程实践

双节锂电池主动均衡设计:MP2642GR-Z与ATmega324P工程实践

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

2026/10/17 10:24:03 阅读更多 →
人工智能引论课件这样设计:学科地图+案例驱动,学生更容易记住

人工智能引论课件这样设计:学科地图+案例驱动,学生更容易记住

简介:《人工智能引论课件》是一份面向AI初学者的系统化教学PPT,聚焦人工智能基本概念、分布式人工智能、智能Agent及多Agent系统等核心主题。内容从DAI系统特色与优点入手,详解分布式问题求解的分类与协作方式,并深入讲解Agent的强…

2026/10/17 10:24:03 阅读更多 →
从概念到产业:一文读懂OpenClaw自适应抓取技术

从概念到产业:一文读懂OpenClaw自适应抓取技术

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

2026/10/17 10:24:03 阅读更多 →
三维可视化实战:从点云到可交互模型的完整链路与性能调优

三维可视化实战:从点云到可交互模型的完整链路与性能调优

简介:VisualizeObjectModel3D 是一份面向三维可视化入门与 Halcon 点云显示实践的学习型工程源码包,适合正在接触三维对象模型渲染、机器视觉上位机开发的初学者与工程师参考。资源围绕三维模型的可视化展示展开,涉及点云显示、窗体界面搭建与…

2026/10/17 10:24:03 阅读更多 →
并行编程实战——TBB的安装与TaoToken环境配置

并行编程实战——TBB的安装与TaoToken环境配置

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

2026/10/17 10:24:03 阅读更多 →
Python复刻植物大战僵尸:pygame塔防游戏源码解析与实战

Python复刻植物大战僵尸:pygame塔防游戏源码解析与实战

简介:这是一份以pygame库实现的《植物大战僵尸》Python游戏源码包,适合正在学习Python基础与游戏开发的初学者,以及希望将面向对象编程运用于实际项目的开发者。代码中涵盖了植物与僵尸的类设计、继承与多态、基于Rectangle的碰撞检测、典型游…

2026/10/17 10:23:02 阅读更多 →

日新闻

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 阅读更多 →