AirSim与ROS桥接:Wrapper安装、编译与高频报错排查
在无人机、小车这类机器人项目里仿真和真机之间的代码复用一直是个让人又爱又恨的话题。爱的是仿真环境能帮你把感知、控制、规划算法反复跑上千遍不烧一块电池恨的是仿真和真机之间总是隔着一层“翻译”每次迁移代码都得重新接数据。Microsoft 的 AirSim 配合上 ROS Wrapper正好把这一层翻译工作标准化了。这篇博文就围绕 AirSim 动态更新背景下如何安装 ROS 包装器AirSim ROS Wrapper完整展开从版本匹配讲到编译启动再到高频报错排查争取让你照着走一遍就能跑通。AirSim ROS Wrapper 解决的核心问题很直接它让你在 AirSim 仿真器里跑的任何传感器数据、控制指令都变成标准 ROS 话题。也就是说你在仿真里写完的路径规划节点、视觉检测节点拿到真机上之后只需要把话题来源换成真机驱动算法逻辑基本不用动。这篇文章适合两类人看一类是刚把 AirSim 跑起来、想在 ROS 里做算法验证的同学另一类是已经在用 AirSim 但一直被“自定义 socket 通信代码”困扰的开发者。读完你会发现官方 Wrapper 不是万能银弹但确实能替你省掉一大半重复劳动。1. 90秒搞清楚AirSim ROS Wrapper 到底是什么1.1 从仿真到真机的桥梁AirSim ROS Wrapper 是一组 ROS 功能包的集合核心作用可以概括成两个方向把 AirSim 仿真器拿到的图像、IMU、GPS、里程计、碰撞状态等数据转换成 ROS 标准消息格式发布出来同时把 ROS 侧下发的速度指令、姿态指令转成 AirSim 的 API 调用送进仿真器。这一来一回就构成了一条双向通道。打个比方你原来如果直接用 AirSim 的 Python API图像是一个 numpy 数组IMU 是一个自定义数据结构控制指令还得自己封装成 AirSim API 要求的格式。每次写新节点都要重新处理这些细节。但有了 Wrapper 之后一切变成了你熟悉的sensor_msgs/Image、sensor_msgs/Imu、geometry_msgs/Twist。你在 ROS 生态里积累的工具链比如 rviz 可视化、rosbag 回放、tf 坐标变换、move_base 导航栈全都可以直接接上来。这个设计的核心价值在于“迁移路径短”。仿真里验证完的算法部署到真机上时大多数 ROS 节点根本不需要改逻辑。你只需要把话题的来源从/airsim/...换成真机驱动发布的/camera/...、/imu/data这一类接口剩下的感知融合、状态估计、决策控制部分原封不动。这也是整个机器人社区强调“仿真与真机共用一套代码”的底气所在。1.2 一个动态生态版本配合比代码本身更重要标题里“动态”这两个字细想是有原因的。AirSim 并不是按部就班地一年发一个大版本而是主仓库持续迭代API 经常调整。这就带来一个很现实的问题Wrapper 的代码总是跟着 AirSim 主仓走你今天在 master 分支下载的 Wrapper可能只匹配同样从 master 编译的 AirSim。一旦两边版本有偏差轻则编译报错重则编译过了但启动后消息对不上。AirSim 官方把 ROS Wrapper 独立维护在airsim/airsim_ros_pkgs仓库里并且用分支和 tag 来对应 AirSim 主仓库的版本。比如 Wrapper 的 master 分支通常对应 AirSim 的 master 分支而一些特性分支会明确标注对应的 Unreal Engine 版本。所以安装 Wrapper 之前最重要的一个动作不是敲命令而是先去确认你的 AirSim 是从哪个分支编译出来的。这一步如果省了后面你会陷入无穷无尽的“为什么我编译不过”“为什么启动没话题”的泥潭。我见过太多人一上来就git clone两份 master 代码然后对着报错一脸茫然。先停一下翻一翻你本地的 AirSim 仓库是在哪个 commit再决定 Wrapper 拉哪个分支这才是正确顺序。2. 安装前把这三件事确认清楚省得后面返工2.1 ROS 发行版与 Ubuntu 的对应关系怎么选AirSim ROS Wrapper 官方支持 ROS 1 的 Melodic、Noetic以及 ROS 2 的 Foxy、Humble。很多人忽略的是ROS 版本和 Ubuntu 版本是强绑定的不是说你喜欢哪个就用哪个。Melodic 绑 Ubuntu 18.04Noetic 绑 Ubuntu 20.04Foxy 绑 Ubuntu 20.04Humble 绑 Ubuntu 22.04。一旦 Ubuntu 版本和 ROS 版本不匹配apt 源里连基础依赖都装不齐那时候排查起来特别痛苦。如果你还没装 ROS我个人建议优先考虑 Ubuntu 20.04 配 Noetic或者 Ubuntu 22.04 配 Humble。Noetic 是 ROS 1 的最后一个长期支持版本资料最多遇到问题基本都能搜到答案Humble 则是 ROS 2 里当前社区最活跃的版本之一适合想一步到位往 ROS 2 走的团队。如果你想省事用鱼香ROS一键安装脚本也能很快把基础 ROS 环境准备好装完之后自己再确认一下环境变量没问题就行。这里有一个容易被忽视的细节Wrapper 官方对 ROS 2 的支持虽然已经可用但部分功能尤其是相机图像话题这块ROS 1 版本下踩过的人更少资料也更全。如果你是第一次接触 AirSim ROS Wrapper建议先拿 ROS 1 Noetic 跑通全流程再考虑迁移到 ROS 2。2.2 AirSim 本身得先能跑检查清单在这里Wrapper 只是中间层它依赖 AirSim 本身已经能正常工作。什么算“正常工作”不是说你能打开一个地图飞两下就算而是 AirSim 的 RPC 接口、图像接口、运动指令接口都稳定可用。建议动手安装前先做一个快速自检启动 AirSim 之后跑一下官方 Python 示例里的hello_drone.py或hello_car.py。确保能连上仿真器、能读到图像帧、能下发一个简单的起飞或运动指令。这一步几秒钟就能完成却能把后面“连不上仿真器”“图像话题没数据”等问题提前排掉一大半。还有个小坑AirSim 编译模式最好保持 Release。如果你之前为了调试改过编译选项用 Debug 模式编译的 AirSim 与 Wrapper 之间的 RPC 通信偶尔会出现超时或者序列化错误。这个坑不太容易一眼看出来因为它报错信息有时候是RPC connection failed有时候干脆无响应。建议统一在 Release 模式下编译。2.3 依赖工具链别小看 rosdep 和编译环境安装 Wrapper 需要准备的基础工具包括catkin_tools 或 catkin_makeROS 1、colconROS 2、常规编译工具链 gcc/g/make。此外最重要的一点是Wrapper 的编译会依赖 AirSim 的头文件所以 AirSim 源码必须存在本地并且你要清楚它的路径。我建议正式编译之前先做两件事跑一遍rosdep update刷新一下依赖数据库再把 ROS 基础包完整装一遍比如 ROS Noetic 对应的ros-noetic-desktop-full。很多“编译报找不到某个库”的问题其实根本不是代码的问题而是同一个报错在别人机器上能通过是因为别人已经装好了对应依赖。你照着命令敲依赖缺失的地方没补上当然过不去。另外如果你用的工作空间里同时放了很多其他功能包建议编译时只针对airsim_ros_pkgs这一个包来 build避免 catkin 把工作空间里所有东西都当成功能包处理。这一点后面会细说。3. 以 ROS 1 Noetic 为例完整安装流程记录3.1 第一步准备 catkin 工作空间并下载源码下面这套流程我以 Ubuntu 20.04 ROS Noetic AirSim master 分支为例。先创建工作空间然后拉取代码。AirSim 和 Wrapper 放在同一个工作空间下是我试过最容易管理的方式。mkdir -p ~/airsim_ws/src cd ~/airsim_ws/src git clone https://github.com/microsoft/AirSim.git git clone https://github.com/airsim/airsim_ros_pkgs.git cd ~/airsim_ws catkin init注意这里有个细节。AirSim仓库本身不是 ROS 功能包但airsim_ros_pkgs里面有些脚本会引用相对路径所以把它们放在同一个src目录下最稳妥。如果你把 AirSim 放在别的位置后续需要在~/.bashrc里配置AIRSIM_ROOT环境变量指向它否则编译时找不到头文件。关于分支选择如果你想稳定一点先进入 AirSim 目录查看当前分支和最近提交比如git branch -a、git log --oneline -5然后在airsim_ros_pkgs里切到对应版本。cd ~/airsim_ws/src/AirSim git checkout master cd ~/airsim_ws/src/airsim_ros_pkgs git checkout master如果是想锁定版本建议参考官方文档里给出的 tag 对应关系尽量让两边落在同一时期。AirSim 更新太快master 对 master 其实只能保证“大概率没问题”锁定到具体 commit 才是稳的。3.2 第二步编译 AirSim 与 WrapperAirSim 本体需要先编译。这一步的目的是生成 C 客户端库和可执行文件Wrapper 编译时也会依赖这些。cd ~/airsim_ws/src/AirSim ./setup.sh ./build.shsetup.sh会安装一些系统依赖包括 Unreal Engine 所需的库这一步耗时取决于网络状况耐心等。build.sh会编译 AirSim 的 C 模块完成后你会看到AirSim/lib目录下生成了对应的库文件。接下来编译 Wrapper。我习惯用 catkin_tools因为它输出更清晰也更容易控制具体编译哪个包cd ~/airsim_ws catkin config --install catkin build airsim_ros_pkgs如果你用的是传统 catkin_make命令对应为cd ~/airsim_ws catkin_make不过用 catkin_make 时如果工作空间里还有其他包它会把所有包一起编译容易产生一些干扰。所以我还是推荐 catkin_tools。编译过程中如果看到诸如“找不到airsim_msgs/...”或者“找不到geometry_msgs/...”这类错误先不要慌多数是依赖缺失补装对应 ROS 基础包再重新编译就行。编译完成后需要 source 一下工作空间环境source ~/airsim_ws/install/setup.bash3.3 第三步环境变量与启动顺序启动前需要确认两个东西一是AIRSIM_ROOT是否指向 AirSim 源码路径二是 ROS 环境是否已经加载。我习惯在~/.bashrc末尾写上source /opt/ros/noetic/setup.bash source ~/airsim_ws/install/setup.bash export AIRSIM_ROOT~/airsim_ws/src/AirSim然后启动顺序很关键。很多人一上来就roslaunch airsim_ros_pkgs airsim_node.launch结果日志里报连不上仿真器。正确顺序是先启动 AirSim 仿真器等场景完全加载出来再启动 Wrapper 节点。AirSim 仿真器的启动方式看你自己的工程通常是打开 Unreal 工程后点击 Play或者直接运行打包好的可执行文件。等场景画面稳定后另开终端运行roslaunch airsim_ros_pkgs airsim_node.launch如果你想让 Wrapper 在某些非默认命名空间下运行可以在 launch 文件里修改namespace参数。默认情况下所有话题会出现在airsim命名空间下。还有一种情况是你只想先验证通信链路那可以用官方自带的一个简单 launchroslaunch airsim_ros_pkgs airsim_demo.launch这个 demo 模式会启动一个简单的键盘控制节点方便快速确认整条链路。3.4 第四步用 rostopic 验证是否跑通Wrapper 启动后我通常会立刻验证三件事。第一件事确认节点存在rosnode list正常会看到/airsim_node这类节点。第二件事看话题是否发布rostopic list | grep airsim如果看到类似/airsim/camera/left/image_raw、/airsim/imu/imu、/airsim/gps/gps的话题说明传感器数据链路已经通了。第三件事实际看一眼图像有没有内容rqt_image_view /airsim/camera/left/image_raw图像窗口弹出来并且能看到仿真画面说明整个 Wrapper 安装基本成功。这时候再去做飞行控制、路径规划心里就踏实了。4. 节点与话题拆解你将要面对的消息世界4.1 airsim_node 主节点和 demo 节点各管什么Wrapper 最常用的节点是airsim_node。这个节点负责连接 AirSim 仿真器、读取传感器状态、发布 ROS 话题同时接收控制指令并写回仿真器。它是整个封装的核心。还有一个airsim_demo节点可以把它理解成一个最简单的验证节点。它通常会发布一个简单的速度指令序列或者订阅键盘输入用于确认整套链路工作正常。实际项目中你自己写的控制节点会完全替代 demo 节点。如果你是 ROS 2 用户节点的名字还是类似的airsim_node但话题会带上命名空间前缀消息类型也会有细微差别。特别是图像消息ROS 2 里的cv_bridge版本和 ROS 1 不完全一样这部分需要额外留意。4.2 话题、消息类型与用途速查表下表列的是 ROS 1 Noetic 下最常用的话题。记住这些你写节点时就不用来回翻源码。话题名消息类型用途/airsim/camera/left/image_rawsensor_msgs/Image左侧相机原始图像/airsim/camera/depth/image_rawsensor_msgs/Image深度图/airsim/imu/imusensor_msgs/ImuIMU 加速度、角速度、姿态/airsim/gps/gpssensor_msgs/NavSatFixGPS 经纬度、海拔/airsim/posegeometry_msgs/PoseStamped当前位姿/airsim/cmd_velgeometry_msgs/Twist速度控制指令/airsim/odomnav_msgs/Odometry里程计信息各话题实际发布情况会受settings.json配置影响。比如你有三目相机话题里就会多出center、right等命名的图像如果你没有打开深度相机深度图话题就不会出现。4.3 动作服务与坐标系除了话题Wrapper 还提供了一些动作服务比如起飞、降落、解锁等。在 ROS 1 里它们通常以rosaction或 service 形式暴露出来。拿多旋翼开发来说常用的有takeoff、land、arm。你可以用rosservice list查看当前可用的服务再通过rosservice call测试。坐标系这块容易被忽略。AirSim 内部用的是 NED北东地坐标系ROS 里常用的则是 ENU东北天或者 FLU前左上的前视坐标系。Wrapper 在转发消息时做了部分转换但如果你在 rviz 里发现坐标轴方向怪怪的别急着怀疑硬件先看一下 tf 树里 map、base_link、odom 这几个坐标系的定义。仿真和真机在坐标约定上总会有差异理解这一点能省去很多排查时间。5. 实测高频问题与排查思路5.1 编译阶段多数坑出在路径和依赖我在多个环境里编译过这套 Wrapper遇到最多的编译问题集中在三类。第一类找不到 AirSim 头文件。系统提示类似fatal error: AirSim.h: No such file or directory。原因基本就是AIRSIM_ROOT环境变量没设置或者 Wrapper 编译时找不到 AirSim 源码路径。老老实实检查~/.bashrc里的export语句确认路径真实存在。第二类找不到 ROS 基础消息头文件。比如geometry_msgs、sensor_msgs、nav_msgs的依赖缺失。这通常不是代码问题而是你安装 ROS 时选的是最小化安装。解决方式很简单装完整版sudo apt install ros-noetic-desktop-full第三类catkin 在构建时把 AirSim 主仓库也当成功能包处理了。导致出现No CMakeLists.txt in AirSim之类的报错。建议编译时只指定目标包catkin build airsim_ros_pkgs如果用的是 catkin_make那就尽量保证工作空间里只放 Wrapper 相关包别把无关代码堆进来。5.2 启动阶段连不上仿真器、无话题、命名空间错位启动阶段最经典的错误是RPC connection failed或者Unable to connect to Unreal。第一次遇到这个报错我第一反应往往是返工重装后来发现十次有八次是顺序问题AirSim 场景还没加载完你就启动了 Wrapper。正确做法是等场景完整出现再启动节点。如果连上了但rostopic list看不到预期话题优先检查命名空间。Wrapper 默认在airsim命名空间下发布话题如果你的 launch 文件里改了 node name 或者 namespace话题路径会相应变化。用rostopic list全量看一下别只 grep 固定关键词。还有一个小概率但确实存在的情况settings.json里改了传感器配置但 Wrapper 缓存没有刷新。重启一下仿真器或者删除 Wrapper 的日志缓存问题往往就能解决。5.3 运行阶段图像卡顿、数据异常、控制无响应图像卡顿这个坑我在四相机场景下踩过。一启动多个图像订阅CPU 占用直接飙高话题频率跌到一两赫兹。后来发现 Wrapper 的图像发布默认用的是非压缩格式4K 分辨率下带宽压力很大。解决办法是在settings.json里调低相机分辨率、降低帧率或者使用压缩图像传输。对于目标检测这类任务分辨率不需要拉满调低一档整个链路就流畅很多。传感器数据为空的场景也很常见。IMU 话题有发布但数值全零多半是场景处于暂停状态AirSim 里的物理引擎没有真正跑起来点击 Play 后就会正常。GPS 坐标看起来非常离谱通常是因为settings.json里没有设置 OriginGeodetic 起始经纬度。这个不设置的话GPS 输出就是一个相对偏移量看起来会像在几千米高空。控制无响应是另一个高频问题。你往/airsim/cmd_vel发了速度但无人机纹丝不动。这时候先检查有没有解锁多旋翼在 AirSim 里默认上电后是锁桨状态需要先调用 arm 服务再检查控制的模式cmd_vel在有的场景下只接受特定坐标系的速度。还有一点确认你控制的是 drone 还是 car两者接收的指令类型不同搞混了节点不会报错但设备就纹丝不动。最后分享一个我实际调试时觉得特别顺手的小技巧把 Wrapper 节点的日志级别调到 debug它打印出来的原始 RPC 消息长度可以作为判断依据。如果 RPC 层收到的数据长度正常但 ROS 话题里的数据是空的问题大概率在外层解析反过来如果 RPC 层就连不通那问题大概率在 AirSim 本身或者网络配置。这个定位思路在仿真和真机开发里都适用。AirSim ROS Wrapper 这套东西真正难的不是安装命令本身而是理解它在你整个开发流程里的位置。它本质上是在替你做“协议转换”和“代码复用”这两件事。跑通一遍之后后续自己扩展传感器、加控制模式就都顺理成章了。希望这篇记录能让你少走几步弯路。

相关新闻

Netty服务端:客户端收不到消息的常见原因与排查指南

Netty服务端:客户端收不到消息的常见原因与排查指南

做Netty服务端开发,我估计不少人都经历过这种“灵异事件”:客户端明明连上了,服务端日志也显示连接建立成功,你用ctx.writeAndFlush("hello")往客户端发字符串,客户端那边就是没反应,既不报错也没…

2026/10/5 3:44:12 阅读更多 →
ArcGIS地形起伏度计算与DEM地貌分类实操指南

ArcGIS地形起伏度计算与DEM地貌分类实操指南

我们拿到一块地、一个县、一条流域,经常会被问到一个问题:这地方到底是山地还是丘陵?是平原还是高原?如果没有现成的地貌图,很多人第一反应是用DEM看看海拔。但实际上,单纯看海拔很容易误判——同样是海拔5…

2026/10/5 3:43:11 阅读更多 →
ClickHouse Bitmap 实战:从精确去重到留存圈选的全场景指南

ClickHouse Bitmap 实战:从精确去重到留存圈选的全场景指南

做数据分析的人大概都经历过这种需求:销售要一份当天的精确订单用户数,字面意义上的"一个不能多、一个不能少"。你最开始会写uniqExact,发现还能忍;可一旦要算次日留存、连续 7 天活跃、不同渠道的人群重合,…

2026/10/5 3:43:11 阅读更多 →

最新新闻

WorkBuddy实战:智能家居竞品调研从三天压缩到三小时

WorkBuddy实战:智能家居竞品调研从三天压缩到三小时

前两天临时接到一个任务,要在三天内给领导交一份智能家居行业的竞品调研报告。换作以前,这种活意味着我要在十几个网站之间来回切换,翻官网、查财报、扒第三方数据,光收集资料就能耗掉一整天,更不用说整理成结构清晰的…

2026/10/5 5:01:44 阅读更多 →
HDFS读写原理与Java API实战:从NameNode到DataNode的完整链路

HDFS读写原理与Java API实战:从NameNode到DataNode的完整链路

简介:《云计算技术实验报告四:HDFS文件的读写》是一份计算机科学专业《云计算技术》课程的实验报告,面向正在学习Hadoop生态系统的学生,重点演示HDFS分布式文件系统文件的上传、下载与合并编程实现。资源包共1个文件,为…

2026/10/5 5:01:44 阅读更多 →
HDFS文件读写原理与Java API实战:从架构到实验避坑指南

HDFS文件读写原理与Java API实战:从架构到实验避坑指南

简介:本资源为计算机系《云计算技术》课程配套实验报告,聚焦HDFS分布式文件系统的读写、合并与上传下载实践,适合正在学习Hadoop生态、需要完成同类实验或理解HDFS编程接口的高校学生。报告完整展示了在Linux环境下安装Eclipse、配置Hadoop连…

2026/10/5 5:01:44 阅读更多 →
MRAM与PIC32工业存储方案:MR25H40CDF驱动与可靠性设计

MRAM与PIC32工业存储方案:MR25H40CDF驱动与可靠性设计

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

2026/10/5 5:01:44 阅读更多 →
一键开关机芯片选型指南:从按键逻辑到待机功耗的四个维度

一键开关机芯片选型指南:从按键逻辑到待机功耗的四个维度

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

2026/10/5 5:01:44 阅读更多 →
Ubuntu下OpenOCD与GDB联合调试STM32:从命令行到断点的完整实战

Ubuntu下OpenOCD与GDB联合调试STM32:从命令行到断点的完整实战

“一键调试”按钮的背后:Ubuntu下OpenOCD与GDB的联合调试如果你用过STM32CubeIDE、Keil或者IAR,你大概率从来没有直接碰过OpenOCD和GDB。你看到的只是一个“Debug”按钮,点了之后程序就跑起来了,断点也停了,一切顺理成…

2026/10/5 5:00:44 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 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/5 0:00:23 阅读更多 →

周新闻

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/5 1:10:22 阅读更多 →
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/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练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/4 20:14:29 阅读更多 →