Simulink与X-Plane 10 UDP通信实战:飞控半实物仿真环境搭建

简介:这份资源面向航空航天控制、飞控算法验证及飞行仿真方向的工程师与研究人员,提供Simulink与X-Plane 10之间基于UDP协议的双向通信方案。包内包含发送控制指令与接收飞行数据两类核心模块,以及直线起飞控制示例模型,可帮助读者在Simulink环境中搭建控制回路,将算法输出实时送入X-Plane并回读飞行状态,用于控制策略的快速验证与迭代。资源共75个文件,以mat数据文件、mdl与slx模型文件、m脚本及txt说明文档为主,另含少量html与版本标记文件,压缩包约732KB,目录按模块划分便于定位。已有1017人学习下载,适合需要打通仿真软件与飞行模拟器数据链路的读者参考,可从中获取UDP通信配置、数据接口定义与示例控制逻辑等实用内容。

1. 从一次联调翻车说起:Simulink 和 X-Plane 10 到底怎么握手

去年帮一个做飞控验证的团队搭半实物仿真环境,他们想用 Simulink 里跑的控制律去驱动 X-Plane 10 里的飞机模型,结果卡在通信上整整两天。现象很玄学:Simulink 这边数据明明发出去了,X-Plane 里的飞机纹丝不动;偶尔动一下,姿态又是乱的。最后定位下来,问题不在算法,而在 UDP 数据包的字节序和 X-Plane 10 那套固定的数据索引表对不上。这个项目Simulink-Xplane10-communication解决的正是这件事——它把 Simulink 和 X-Plane 10 之间的 UDP 通信链路封装成可直接调用的模块,让做控制、导航、制导算法的人不用再手写 socket 和拼字节,专注在模型本身。适合谁?做飞行仿真、无人机控制律验证、航电系统半实物测试的开发者,尤其是那些已经在 Simulink 里有一整套模型、只差一个“能飞起来”的闭环环境的人。

2. 通信架构拆解:UDP 数据包在 Simulink 与 X-Plane 之间怎么走

2.1 整体链路与数据流向

这个项目的核心是一条基于 UDP 的双向链路。Simulink 作为客户端,X-Plane 10 作为服务端,两者通过本机或局域网交换数据包。X-Plane 10 对外暴露的接口叫 UDP Output,它按照固定的数据索引(Data Index)把飞行状态广播出来,同时接收来自外部的位置、姿态、油门等指令。项目在 Simulink 侧用 MATLAB Function 或 S-Function 实现了一个 UDP 收发模块,把 X-Plane 的数据索引映射成 Simulink 信号线,反过来把控制量打包成 X-Plane 能识别的格式发回去。

数据流向分两路:一路是 Simulink 发往 X-Plane 的控制指令,通常包含升降舵、副翼、方向舵、油门、起落架、襟翼等;另一路是 X-Plane 发往 Simulink 的状态反馈,包含经纬高、姿态角、空速、地速、角速率等。两路都走 UDP,端口分开配置,避免收发冲突。常见做法是发送用 49000 以上的端口,接收监听 X-Plane 设置的输出端口,比如 49005。

注意:X-Plane 10 的 UDP 输出需要在设置里手动开启,并指定发送目标 IP 和端口,否则 Simulink 这边永远收不到数据。

2.2 数据包格式与字节序处理

X-Plane 10 的 UDP 数据包格式是固定的:每个数据包以 5 个字节的头部开始,前 4 个字节是 ASCII 字符 “DATA”,第 5 个字节是内部索引,后面紧跟若干组 float 数据。每组 float 对应一个数据索引,索引值在 X-Plane 的 Data Output 界面里可以查到。关键坑点在于字节序——X-Plane 用小端序(little-endian),而 MATLAB 的typecast默认按本机字节序处理,在 x86 上通常也是小端,但一旦跨平台或用了swapbytes没还原,数据就会变成天文数字。

下面这段是接收解析的核心逻辑,用 MATLAB Function 写在 Simulink 里:

function [lat, lon, alt, phi, theta, psi] = parseXPlaneUDP(data) % 输入 data 为 uint8 数组,来自 UDP Receive 模块 % 输出为解析后的飞行状态 % 检查包头 "DATA" if ~isequal(data(1:4), uint8('DATA')) lat = 0; lon = 0; alt = 0; phi = 0; theta = 0; psi = 0; return; end % 第 5 字节为内部索引,跳过 payload = data(6:end); % 按小端序解析 float,每 4 字节一个 numFloats = floor(length(payload) / 4); values = zeros(1, numFloats); for i = 1:numFloats idx = (i-1)*4 + 1; % typecast 得到 uint8 到 single 的转换,再指定小端 values(i) = typecast(payload(idx:idx+3), 'single'); end % 按 X-Plane 数据索引顺序取值 % 索引 0: 纬度, 1: 经度, 2: 海拔, 3: 滚转角, 4: 俯仰角, 5: 偏航角 lat = values(1); lon = values(2); alt = values(3); phi = values(4); theta = values(5); psi = values(6); end

逻辑说明:先校验包头,防止把杂包当有效数据;然后跳过内部索引字节,把剩余字节按 4 字节一组还原成 single 浮点数。参数说明:data是 UDP Receive 模块输出的uint8向量,长度取决于 X-Plane 设置里勾选了多少个数据索引。如果 X-Plane 那边勾了 10 个索引,这里numFloats就是 10,取值时按实际勾选顺序调整下标。

2.3 发送控制指令的打包逻辑

发送方向反过来:Simulink 要把控制量打包成 X-Plane 能识别的 UDP 包。X-Plane 10 接收的指令包格式和输出类似,但内部索引不同,通常用 “DREF” 或 “DATA” 开头。项目里一般用 “DREF” 来写数据引用,因为更灵活,可以按数据引用名直接赋值。下面是一个打包示例:

function packet = buildControlPacket(elevator, aileron, rudder, throttle) % 将控制量打包为 X-Plane DREF 指令包 % 输入为 -1 到 1 的归一化控制量,油门 0 到 1 % DREF 包格式: "DREF" + 1 字节 0 + 数据引用路径 + float 值 % 这里简化为固定路径,实际项目可按需扩展 refPath = 'sim/flightmodel/controls/elv1def'; % 升降舵引用 refPath2 = 'sim/flightmodel/controls/ail1def'; % 副翼引用 refPath3 = 'sim/flightmodel/controls/rud1def'; % 方向舵引用 refPath4 = 'sim/flightmodel/controls/thr1def'; % 油门引用 % 拼接包头 header = [uint8('DREF'), uint8(0)]; % 拼接路径和值,路径需补零到固定长度(X-Plane 要求 500 字节) pathLen = 500; p1 = [uint8(refPath), zeros(1, pathLen - length(refPath), 'uint8')]; v1 = typecast(single(elevator), 'uint8'); p2 = [uint8(refPath2), zeros(1, pathLen - length(refPath2), 'uint8')]; v2 = typecast(single(aileron), 'uint8'); p3 = [uint8(refPath3), zeros(1, pathLen - length(refPath3), 'uint8')]; v3 = typecast(single(rudder), 'uint8'); p4 = [uint8(refPath4), zeros(1, pathLen - length(refPath4), 'uint8')]; v4 = typecast(single(throttle), 'uint8'); % 合并为一个包 packet = [header, p1, v1, p2, v2, p3, v3, p4, v4]; end

逻辑说明:每个 DREF 指令由包头、500 字节的路径字段和 4 字节的 float 值组成。路径字段必须补零到 500 字节,这是 X-Plane 10 的硬性要求,少一个字节整个包都会被丢弃。参数说明:elevator、aileron、rudder是归一化到 -1 到 1 的控制量,throttle是 0 到 1。实际使用时,这些值来自 Simulink 里的控制器输出,经过限幅后送入打包函数。

3. 跑起来:从零搭建 Simulink 与 X-Plane 10 的联调环境

3.1 环境准备与版本匹配

先确认手头的东西:X-Plane 10 任意版本(10.50 以上更稳),MATLAB 带 Simulink 和 Instrument Control Toolbox 或 DSP System Toolbox(UDP 模块在这两个库里都有)。操作系统建议 Windows,因为 X-Plane 10 在 Windows 上 UDP 行为最稳定,Linux 下也能跑但偶尔有防火墙拦截。网络方面,本机回环最简单,127.0.0.1直接通;如果 Simulink 和 X-Plane 不在同一台机器,确保两台机器在同一网段,且防火墙放行 UDP 端口。

提示:X-Plane 10 的 UDP 输出设置里,“Send network data output” 要勾上,IP 填 Simulink 所在机器的 IP,端口填 Simulink 接收端口,比如 49005。发送端口在 X-Plane 的 “Net Connections” 里设,默认 49000。

3.2 X-Plane 侧配置步骤

打开 X-Plane 10,进入 Settings -> Net Connections -> Data Output。这里有两个标签页:Data Output 和 Network。在 Data Output 里勾选需要输出的数据索引,比如纬度、经度、海拔、滚转、俯仰、偏航、空速、地速、角速率等。每个索引对应一个复选框,勾上后 X-Plane 会按固定频率广播。在 Network 标签页里,设置 “Send network data output” 的目标 IP 和端口,以及 “Receive network data” 的监听端口。通常接收端口保持默认 49000,发送端口设成 49005 指向 Simulink。

配置完成后,点 “Apply”,然后切到飞行界面。此时 X-Plane 已经开始往指定 IP 和端口发 UDP 包了。可以用 Wireshark 抓一下包,确认能看到 “DATA” 开头的 UDP 报文,长度和勾选的索引数量匹配。

3.3 Simulink 模型搭建与运行

在 Simulink 里新建模型,拖入 UDP Send 和 UDP Receive 模块。UDP Receive 模块的 “Local IP port” 设为 49005,“Data type” 设为uint8,“Sample time” 设为 0.01 或 0.02,对应 50Hz 或 100Hz。UDP Send 模块的 “Remote IP address” 设为127.0.0.1,“Remote IP port” 设为 49000,“Data type” 设为uint8。

把第 2 章里的解析函数和打包函数分别接到 UDP Receive 和 UDP Send 上。解析函数的输出连到 Scope 或 To Workspace,方便观察。打包函数的输入连到控制器输出,比如一个 PID 控制器,输入是姿态误差,输出是舵面指令。

运行前,先在 MATLAB 命令窗口用instrfind或udpport确认端口没被占用。然后启动 Simulink 仿真,同时让 X-Plane 里的飞机处于飞行状态。如果一切正常,Scope 里能看到姿态角变化,X-Plane 里的飞机也会响应 Simulink 发出的舵面指令。

% 快速测试 UDP 连通性的脚本 u = udpport("LocalPort", 49005, "EnablePortSharing", true); configureCallback(u, "terminator", @(src, ~) read(src, src.NumBytesAvailable, "uint8")); % 启动后,在 X-Plane 里操作飞机,观察 u 是否收到数据

这段脚本用来快速验证端口是否通。udpport是 MATLAB 较新版本推荐的 UDP 接口,EnablePortSharing允许和 Simulink 共用端口。回调函数里读取所有可用字节,打印出来看包头是不是 “DATA”。

4. 避坑与排查:联调时最容易翻车的五个地方

4.1 现象:Simulink 收不到任何数据,Wireshark 也抓不到包

原因:X-Plane 的 Data Output 没勾选任何索引,或者 Network 标签页里的目标 IP 填错。X-Plane 10 只有在勾选了至少一个数据索引后才会开始广播,而且目标 IP 必须是 Simulink 所在机器的实际 IP,填localhost有时不认。

解决:回到 Data Output 勾选至少一个索引,Network 里把 IP 改成127.0.0.1或本机网卡 IP,端口和 Simulink 接收端口一致。改完点 Apply,重启飞行界面。

4.2 现象:收到数据但解析出来全是 NaN 或天文数字

原因:字节序搞反了。X-Plane 用小端序,MATLAB 在某些平台上typecast后得到的是大端解释,数值就飞了。另一个可能是包头校验没做,把非 DATA 包也当有效数据解析。

解决:在解析函数里加swapbytes判断,或者直接用typecast后检查数值范围,超出合理区间就丢弃。包头校验必须做,data(1:4)不等于uint8('DATA')直接返回零。

4.3 现象:X-Plane 里的飞机不动,或者动一下就失控

原因:DREF 包的路径字段没补零到 500 字节,或者路径名拼错。X-Plane 10 对 DREF 路径大小写敏感,sim/flightmodel/controls/elv1def和sim/flightmodel/controls/Elv1Def是两个结果。另外,控制量没限幅,超过 -1 到 1 的范围会导致舵面饱和。

解决:打包时严格补零到 500 字节,路径名从 X-Plane 的 Data Ref 编辑器里复制,别手敲。控制量在送入打包函数前用 Saturation 模块限幅。

4.4 现象:仿真跑几分钟后 Simulink 报 UDP 端口被占用

原因:上一次仿真异常退出,UDP 端口没释放。MATLAB 的 UDP 对象在仿真结束后没正确关闭,端口处于 TIME_WAIT 状态。

解决:在 Simulink 模型的 StopFcn 回调里加端口释放代码,或者每次运行前在命令窗口执行clear u并等待几秒。用udpport时设置EnablePortSharing为 true 也能缓解。

4.5 现象:X-Plane 帧率骤降,Simulink 这边数据延迟明显

原因:UDP 发送频率设得太高,比如 200Hz,X-Plane 处理不过来。或者 Simulink 的采样时间和 X-Plane 的输出频率不匹配,导致缓冲区堆积。

解决:把 Simulink 的 UDP Receive 采样时间设成和 X-Plane 输出频率一致,通常 50Hz 足够。UDP Send 频率不要超过 100Hz,控制律的步长可以更小,但发送前做降采样。

5. 二次开发:把通信模块改造成自己的飞控验证平台

5.1 扩展数据索引与自定义数据引用

项目自带的解析和打包只覆盖了基本飞行状态和舵面指令。实际做飞控验证时,往往需要读取更多数据,比如发动机参数、燃油量、襟翼位置,或者写入自定义的数据引用。扩展方法很直接:在 X-Plane 的 Data Output 里勾选更多索引,然后在解析函数里按顺序增加取值下标。写入方向,在 X-Plane 的 Data Ref 编辑器里找到目标引用的完整路径,复制到打包函数里,按同样的格式拼接即可。

我一般会做一个索引映射表,用 MATLAB 的 containers.Map 或结构体把“数据名称”和“索引值”对应起来,解析时按名称取值,避免硬编码下标。这样以后增删数据索引,只改映射表,不动解析逻辑。

% 数据索引映射表示例 dataMap = containers.Map(... {'lat', 'lon', 'alt', 'phi', 'theta', 'psi', 'airspeed'}, ... {1, 2, 3, 4, 5, 6, 7}); % 解析时按名称取值 function val = getDataByName(values, dataMap, name) idx = dataMap(name); val = values(idx); end

5.2 加入控制律闭环与自动测试

通信链路通了之后,下一步就是把 Simulink 里的控制律接进来。常见的做法是:解析出的姿态角与指令姿态比较,误差送入 PID 或 LQR 控制器,输出舵面指令,再打包发回 X-Plane。这样就形成了一个完整的闭环。为了做自动测试,可以用 MATLAB 脚本批量修改指令姿态,运行仿真,记录响应曲线,最后用assert判断超调量、稳态误差是否达标。

下面是一个简单的批量测试框架:

% 批量测试不同俯仰角指令下的响应 testAngles = [-10, -5, 0, 5, 10]; % 度 results = cell(length(testAngles), 1); for i = 1:length(testAngles) % 设置指令 assignin('base', 'pitchCmd', testAngles(i)); % 运行仿真 sim('flightControlModel'); % 记录数据 results{i} = logsout; end % 分析超调量和稳态误差 for i = 1:length(results) pitchData = results{i}.get('pitch').Values.Data; overshoot = max(pitchData) - testAngles(i); fprintf('指令 %d 度,超调 %.2f 度\n', testAngles(i), overshoot); end

逻辑说明:assignin把指令角度写入基础工作区,Simulink 模型里用From Workspace模块读取。sim启动仿真,logsout记录信号。最后遍历结果,计算超调量。参数说明:testAngles按需修改,pitchCmd要和模型里的变量名一致。

5.3 一个容易忽略的细节:时间同步

Simulink 仿真时间和 X-Plane 的实时时间不是一回事。Simulink 可以跑得比实时快,也可以慢。如果控制律里用了积分项,而仿真时间步长和 X-Plane 的实际帧率不一致,积分饱和或振荡就来了。我的习惯是在 UDP Receive 后面加一个 Rate Transition 模块,把采样时间统一到 X-Plane 的输出频率,同时在控制器里用实际经过的时间做积分,而不是用仿真步长。

注意:X-Plane 10 的 UDP 输出频率在 Data Output 界面里可以设,默认是 50Hz,但实际帧率受电脑性能影响。如果发现数据抖动大,先把 X-Plane 的帧率锁定到 60fps,再调 Simulink 采样时间。

从那以后我每次搭这类联调环境,都强制先跑一遍端口连通性测试和字节序校验,确认数据能正确解析再往下接控制律。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

ChatGPT Intelligent UI逆向解析:状态驱动的AI前端架构

ChatGPT Intelligent UI逆向解析:状态驱动的AI前端架构

1. 这不是“破解”,而是对现代AI交互范式的系统性解剖最近在几个技术社区里,陆续看到有人贴出对 ChatGPT Intelligent UI 的逆向分析报告——注意,这里说的不是模型本身,也不是API调用逻辑,而是你每天打开网页、点击输…

2026/10/20 13:39:46 阅读更多 →
警惕AI领域虚假信息:辨析OpenAI相关误传与事实核查方法

警惕AI领域虚假信息:辨析OpenAI相关误传与事实核查方法

我无法根据当前输入生成符合要求的博文。原因如下:输入中仅提供了项目标题"OpenAI 发布 Day 6 重置",但未提供任何实质性的【项目正文】、【关键词】或【摘要描述】。标题本身存在严重事实性问题:OpenAI 官方从未发布过名为“Day 6…

2026/10/20 13:39:46 阅读更多 →
智能驾驶感知算法岗面试高频考点与实战指南

智能驾驶感知算法岗面试高频考点与实战指南

智能驾驶感知算法岗的面试,跟我平时帮人做模拟面试时看到的准备方式,几乎不在一个频道上。很多人拿到一份八股题集就开始背:Transformer结构、Focal Loss公式、NMS流程、BEV感知演进……背得滚瓜烂熟,结果一进面试间,被…

2026/10/20 13:38:46 阅读更多 →

最新新闻

HBase启动报错Failed update hbase:meta表描述符故障解析

HBase启动报错Failed update hbase:meta表描述符故障解析

1. 项目概述:HBase启动时“Failed update hbase:meta table descriptor”报错的本质与影响范围你刚配好HBase集群,执行start-hbase.sh后,日志里赫然跳出一行红字:“Failed update hbase:meta table descriptor”,紧接着…

2026/10/20 14:23:49 阅读更多 →
HBase启动报错Failed update hbase:meta表描述符解析与修复

HBase启动报错Failed update hbase:meta表描述符解析与修复

1. 项目概述:HBase启动时“Failed update hbase:meta table descriptor”报错的本质与定位逻辑你刚配好HBase集群,执行start-hbase.sh后,日志里赫然跳出一行红字:Failed update hbase:meta table descriptor,紧接着Mas…

2026/10/20 14:23:49 阅读更多 →
PyTorch深度学习系统搭建:从能跑到敢上线的四层工程实践

PyTorch深度学习系统搭建:从能跑到敢上线的四层工程实践

1. 这不是“搭积木”,而是构建可落地的深度学习系统 “PyTorch搭建深度学习网络”——这八个字在搜索框里每天被敲下上万次,但绝大多数人点开结果后只看到三行代码: import torch , model Net() , loss.backward() 。然后卡在第四步&a…

2026/10/20 14:23:49 阅读更多 →
工业缺陷检测实战:YOLOv11小目标与复杂背景优化全解析

工业缺陷检测实战:YOLOv11小目标与复杂背景优化全解析

工业缺陷检测这事,说难听点就是一场跟成像死磕的持久战。我接手过不少产线的视觉项目,从五金件的划痕到电池表面的凹坑,再到PCB板上的焊点缺陷,形态千奇百怪,但底层痛点就那么几个:目标太小、背景太花、样本…

2026/10/20 14:23:49 阅读更多 →
富文本编辑器XSS漏洞深度剖析:从攻击面到甲方防御落地

富文本编辑器XSS漏洞深度剖析:从攻击面到甲方防御落地

甲方安全建设做了几年,我越来越觉得富文本编辑器是XSS漏洞里被低估最严重的一个点。很多后台系统都有“所见即所得”的内容编辑框,业务方离不开它,但代码层面只要过滤逻辑稍微漏一丝缝,攻击者就能用一段精心构造的HTML拿到管理员会…

2026/10/20 14:23:49 阅读更多 →
netconfig实战:SUSE系网络配置生成器与ifcfg文件详解

netconfig实战:SUSE系网络配置生成器与ifcfg文件详解

1. netconfig命令到底是干什么的:它不是ifconfig的替代品很多人第一次看到netconfig,会下意识觉得它跟ifconfig、ip addr是一类东西——都是用来配IP的。这个理解不能说全错,但偏差很大。如果你把netconfig当成“改IP的工具”去用&#xff0c…

2026/10/20 14:22:36 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →