上海押注卫星互联网:一图读懂《卫星互联网产业创新发展行动方案(2027–2030)》

10 月 26 日,上海市经济和信息化委员会等六部门联合印发《上海市卫星互联网产业创新发展行动方案(2027—2030 年)》,并在市政府官网全文公布,方案自 2026 年 10 月 26 日起施行。这是继上海「十五五」战略性新兴产业规划之后,地方层面对卫星互联网产业最系统、也最「量化」的一次部署——把「在轨多少颗、产值多少亿、算力多少 POPS」都写进了硬指标。本文按「为什么出手 → 目标怎么定 → 四大行动拆什么 → 技术深水区在哪 → 集群怎么摆 → To C 意味着什么 → 底气从哪来」的顺序做一次解读。

一、为什么是现在、为什么是上海

把卫星互联网写进行动方案,背后是三重叠加:

  • 国家战略落子:10 月 23 日印发的《国家信息化「十五五」规划》明确「适时启动 6G 商用」「陆海空天立体化网络体系基本形成」,卫星互联网是这张立体网的空间段核心;
  • 产业拐点已至:低轨星座从「发射竞赛」转向「在轨服务」,天基算力、手机直连卫星从概念走向量产验证(上海本地已有千帆星座、明珠星座、星枢计划等工程在跑);
  • 地方禀赋成型:上海商业航天、集成电路、终端制造的产业链已经连成片,方案本质是给这条链「加一把火、定一张表」。

方案以「强技术、夯基础、优集群、拓应用」为主线,覆盖从空间段、地面段到用户段的主要环节。

二、一图读懂:2030 年的硬指标

方案对 2030 年给出了明确量化目标,大致可以分成五个维度:

维度 2030 年目标 读数
产业规模 核心产业规模突破 800 亿元 把统计范围锁定在核心环节(制造、载荷、终端、运营),不是泛泛的「关联产值」
空间段 在轨卫星总数超 3000 颗 对批产、发射组织、测运控、信关站形成系统性需求
创新转化 科研成果转化超 100 项 强调从研发到产品的工程化通道
市场主体 培育优质企业等主体超 100 家 把创新供给与市场承接放在同一目标体系
应用落地 打造「100+ 标杆示范应用」 强调可复制性与示范效应,To G / To B / To C 并举

另有几项「技术硬指标」尤其值得技术人关注,后面单列:

技术方向 量化指标
网络容量 力争 150 Tbps 以上,基于星间激光链路组网
星间激光通信 速率突破 400 Gbps
单星通信容量 达到 100 Gbps
相控阵天线 单阵面收发天线不少于 32 个波束
天基算力 AI 单星最高算力超 30 POPS
星间重路由 切换时延小于 5 毫秒、切换成功率大于 99.9%
测运控能力 巨型星座数字化测运控系统支持卫星管理不少于 3000 颗

三、四大行动主线拆解

1. 强技术:自主可控,卡住三大领域

围绕自主可控,方案把攻关目标收敛到网络架构、平台载荷、地面设备三大领域——说白了,就是「星座怎么组网、卫星载什么、地面用什么终端」。网络架构层主攻卫星手机直连、天基算力、空天地一体与通感算智融合;平台载荷层主攻星间激光、分布式核心网、大规模相控阵、EUHT 载荷;地面设备层主攻大型低轨星座地面系统、消费级直连多模终端、基于巨型星座的无人智慧应用。

2. 夯基础:把「地面段」当成底座来建

方案把基础设施与集群布局并列,体现的是「以设施承载产业、以集群汇聚主体」的思路。具体包括:推动低轨、中轨星座加速部署,探索多轨联动与算力星座规划;完成 VDES(甚高频数据交换系统)建设;支持企业全球规划建设信关站,适时部署星地互联中心;在浦东、松江建设新一代测运控中心,并建支持超万颗卫星的星座模拟仿真平台。

3. 优集群:市区协同,摆出「2+X」

松江集聚区沿长三角 G60 科创走廊,主打商业卫星批量化智能制造与卫星测运控中心,目标是「卫星、网络、终端、应用」全产业链生态;浦东集聚区以低轨商业系统关键技术、北斗规模及全空间无人体系应用为主,并以「超低轨」为特色赛道,带动配套芯片、载荷、终端全链条集聚;闵行、青浦、临港作为若干细分特色产业园区补位(闵行航天、青浦北斗均已成规模)。

4. 拓应用:To G / To B / To C 三箭齐发

应用侧不只是行业客户。To G 面向应急通信、海事管理;To B 面向远洋航运、民航、金融专网;To C 则明确「支持个人用户通过手机直连或便携终端接入卫星互联网,支持运营商推出优惠套餐」,让卫星连接从「特殊装备」变成大众消费级的「普通服务」。

四、技术深水区:三个值得盯的方向

4.1 网络架构——手机直连 + 天基算力 + 空天地一体

这是方案里「最像未来」的一块。它有两组硬指标:一组是星间重路由切换时延小于 5 毫秒、成功率大于 99.9%,要让大规模星座在单星失效或跨星切换时近乎无感;另一组是AI 单星最高算力超 30 POPS,把推理放到天上,数据「天数天算」而非先回地面再算。配套的「通感算智融合」意味着卫星不再是单纯转发管道,而是集通信、感知、计算于一体的在轨智能体。

观察者视角:30 POPS 单星算力、5 毫秒星间切换,都是 2030 年的「目标值」而非在轨实测值。真正难的不在指标本身,而在把这两件事同时跑稳——尤其当天基算力开始承担实时推理,热控、能源、星间光链路的余量会被迅速吃紧。

4.2 平台载荷——400Gbps 星间激光、100Gbps 单星、32 波束相控阵

载荷层给了四项攻坚:星间激光通信终端、星地分布式轻量化核心网、大规模相控阵、EUHT 载荷。指标里,星间激光速率突破 400 Gbps 决定星座骨干传输能力(低轨全球无缝覆盖、减少对地面信关站依赖的关键),单星通信容量 100 Gbps 与单阵面不少于 32 个波束则决定单星同时服务多用户、多区域的上限。EUHT 是国产高吞吐无线标准,放进载荷清单,信号很明确:核心空口也要自主。

4.3 地面终端——测运控要管 3000 颗,还要消费级直连终端

地面侧一项容易被忽视但极关键的指标:巨型星座数字化测运控系统要能管理不少于 3000 颗卫星。这相当于给整张星座配一套「交通指挥系统」。与此同时,方案点名「面向消费级卫星直连多模终端」的研制——没有好用的终端,手机直连就只是口号。

五、基础设施:多轨联动与 VDES

星座体系上,方案提出「探索多轨联动」,推动低轨、中轨加速部署,规划算力星座建设,构建「弹性互补、全域无缝」的天地融合网络。VDES 的纳入则把海事、航空的甚高频数据交换也并入天地一体框架。地面段支持企业全球建信关站、部署星地互联中心,并推动卫星互联网企业与通信运营商在地面基础设施上共建共享——这能显著压低业务开通的节奏成本。

六、应用落地:To C 才是真正的分水岭

过去卫星通信长期是应急、特种作业的「备胎」。方案把 To C 单独拎出来:个人用户用手机直连或便携终端接入,运营商推优惠套餐,目标是覆盖地面通信盲区、把卫星连接做成「无处不在的泛在连接」。这一步一旦跑通,商业模型就从「政府/行业买单」转向「数亿消费者日常订阅」,对整个产业链的估值逻辑都是重估。

七、底气从哪来:上海的产业底座

方案敢定 3000 颗、800 亿的目标,靠的是已经成型的底座:

  • 千帆星座在轨卫星已达 256 颗;
  • G60 卫星工厂单星生产仅需 1.5 天,批产能力已经验证;
  • 垣信卫星完成 B 轮融资约 70 亿元、投后估值约 500 亿元;
  • 浦东集聚 50 余家重点企业,闵行航天产业规模超 460 亿元,青浦北斗产业规模超 110 亿元;
  • 太空算力侧已有实质性工程:明珠星座计划(先导星「东方天算」号峰值算力约 2 PFLOPS、配 16TB 存储,长期目标吉瓦级天基计算星座)、星枢计划(首发星座含中心算力主星,单星 32P 在轨算力、400Gbps 激光、15kW 发电,商业运营阶段规划千星部署)、中国移动「天基智算载荷 1.0」(单星数十 TOPS,实测星地链路时延降至 5 毫秒)。

一句话:上海的打法不是「从零造星」,而是在已有星座、工厂、资本、算力载荷的骨架上,用一张量化时间表把它们串成「可投资、可验收、可落地」的产业工程。

八、观察者视角:三句话总结

  • 这是一份「工程清单」而非「愿景口号」:3000 颗、800 亿、30 POPS、5 毫秒切换,全部可量化、可考核;
  • 真正的胜负手在「地面段 + 终端 + To C」:空间段拼发射,地面段与消费级终端才决定网络能不能真正赚钱;
  • 天基算力是上海押的差异化赛道:当其他城市还在拼发射数量,上海把「在轨 AI 推理 + 空天地一体」写进硬指标,赌的是下一阶段的算力密度竞争。

对 IoT 与嵌入式从业者来说,这份方案意味着两件事会加速:一是卫星直连多模终端会催熟一批低功耗、小型化、支持卫星链路的芯片与模组;二是天基算力 + 边缘 AI 会让「端—边—天—云」的协同从论文走向产品。值得持续跟踪。

信息来源

  • 《上海市卫星互联网产业创新发展行动方案(2027—2030 年)》全文(上海市人民政府官网 / 上海市经济和信息化委员会等六部门印发)
  • 上海推动卫星互联网产业创新发展:聚力建设松江、浦东产业集聚区(澎湃新闻)
  • 上海六部门印发卫星互联网方案 2030 年规模突破 800 亿元(腾讯新闻)
  • 放大招!上海印发卫星互联网行动方案 2030 年核心产业规模突破 800 亿(C114 通信网)
  • 3000 颗卫星,800 亿产值目标背后:上海给出卫星全产业链提速时间表(界面新闻)
  • 上海六部门联合发文,押注卫星互联网(腾讯新闻 / 芯智讯)
  • 发力卫星互联网,上海出招(东方财富网)
  • 网络、算力上天入海「空天地海」一体化通信网加速成型(人民日报全国党媒信息公共平台)
  • 太空「天网」加速织就(经济日报)
  • 上海发布太空算力星座工程「星枢计划」,商业运营阶段将完成千星部署(IT之家)
  • 「东方天算」号卫星发射入轨,上海太空计算「明珠星座计划」迈出重要一步(人民网上海)
  • 「明珠星座计划」:一体化调度让天地算力各展所长(新华网)

本文为公开报道与官方文件整理,指标与结论以各机构官方发布为准。首发于 tech.iotcomeon.com(IoT前哨站),2026 年 10 月 27 日。

浏览器里仿真 Arduino 和 ESP32,有点东西

没板子 = 今天摸鱼?快递还在路上,代码已经亮灯。一块能开在浏览器标签页里的「云上开发板」—— Arduino · MicroPython · GPIO · I²C · OLED,背后是 Velxio · QEMU 仿真。

乐鑫刚放出 ESP32 模拟器,评论区都在喊「以后不用买板子了」。但浏览器里跑固件,早有人先做了。

它叫 Velxio,一块能开在标签页里的「云上 DevKit」。我拿它跑了点灯、DHT22、OLED、串口打印,结论先给:

教学、原型、面试 Demo、没板子救急,它比你想的好用;但别拿它代替射频和功耗测试。

01 · 不是「代码高亮」,是真在跑固件

CHIP · 跑的是什么

Velxio 背后是 QEMU + WASM 前端:ESP32 的 Xtensa 指令、FreeRTOS 任务、Arduino setup() / loop()、MicroPython REPL,都能在浏览器线程里真执行。

你看到的不是动画:

  1. pinMode(2, OUTPUT) → 虚拟 GPIO2 状态变高
  2. Wire.beginTransmission(0x3C) → I²C 总线里真有起始条件
  3. Serial.println("hello") → 右侧串口终端蹦出字符
  4. 延时、中断、定时器、看门狗 → 都按指令周期走

支持形态目前最实用的是三类:

  • Arduino-ESP32:拖 .ino 进去,点 Run
  • MicroPython:直接写 Python,串口变 REPL
  • ESP-IDF 轻量固件:高级玩家也能塞 ELF

以前是「没板子 = 今天摸鱼」,现在是「没板子 = 开个网页继续干」。

02 · 元件库才是杀招:拖个 OLED 就亮

PERIPHERALS · 虚拟硬件

这部分比纯 QEMU 爽太多。Velxio 前端像个 「Fritzing + 串口监视器 + 逻辑分析仪」 合体:

  • LED / 按键 / 电位器
  • DHT11 / DHT22
  • OLED 128×64(SSD1306)
  • I²C 传感器 / UART 桥 / 逻辑电平显示
  • 舵机 / 蜂鸣器 / WS2812(部分版本)

你接线不用杜邦线,鼠标拖一下就行。固件里写:

Adafruit_SSD1306 display(128, 64);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.print("Velxio OK");
display.display();

页面上 OLED 就亮了。

学生第一次见到「代码 → 总线 → 屏幕」,比老师讲三节课都管用。

03 · 接进工作流:教学 / 原型 / 远程面试

WORKFLOW · 怎么用

CASE 01 · 教学

老师发个链接:「今晚作业:让 OLED 显示温度,DHT22 随机跳 25°C 到 30°C。」学生不装 ESP-IDF、不买 DevKit、不被 CH340 驱动劝退。

CASE 02 · 需求评审前先演

产品说「做个配网按钮 + 状态灯」。你先在 Velxio 里把状态机跑出来:

IDLE → PRESS → CONNECTING → CONNECTED → ERROR

老板看懂了,真机才动手。

CASE 03 · 远程嵌入式面试

候选人共享标签页:「你用定时器让 LED 1Hz 闪,同时串口打 uptime。」比「口述 RTOS 抢占」诚实十倍。

CASE 04 · 没板子时救火

板子在产线、在客户那、在快递站。你本地改完 main.cpp,Velxio 里先确认:

  • 分区没崩
  • 任务没死锁
  • I²C 地址没写错
  • OLED 不黑屏

再烧真机。

04 · 两种上手方式:零安装 / 半专业

GET STARTED · 上手

STEP 01 · 网页版(零门槛)

打开 https://velxio.dev(或对应镜像),新建项目 → 选 ESP32 → 写 Arduino → Run。

固件在浏览器里跑,不上传服务器(具体看官网隐私说明)。适合:教学、Demo。

STEP 02 · 本地 QEMU 版(硬核)

idf.py build
qemu-system-xtensa -M esp32 -nographic

再用 GDB 调试:

xtensa-esp32-elf-gdb build/app.elf
(gdb) target remote:1234

适合:CI、GDB、FreeRTOS 调度分析、Perfetto 式追踪。

网页版管「看得懂」,本地 QEMU 管「查得深」。

05 · 用之前必须知道的 3 件事

CAVEATS · 别被爽到失智

  1. 没有真射频:Wi-Fi / BLE 是「模拟联网」,不是发 2.4GHz 包。配网 UI 能测,信道质量、丢包、同频干扰测不了。
  2. 外设是「模型」,不是「规格书」:OLED 亮了 ≠ 真 SSD1306 时序完全一致。ADC 读电压、SPI DMA、PSRAM 带宽,别信虚拟值。
  3. 固件能跑 ≠ 产品能出货:功耗、复位、ESD、Flash 寿命、看门狗喂狗慢 5ms 会不会炸 —— 这些只有真板子说话算数。

写在最后 · 适合用在哪里(结论)

SUMMARY · 谁该收藏

  • 嵌入式小白:先跑通「代码控制硬件」的直觉
  • 高校老师:实验课不用管 80 块板子丢了没
  • 创业者:需求没定之前,别先砸钱买 20 块 ESP32-S3
  • 老工程师:板子不在手边,逻辑先验完
  • 内容博主:录「ESP32 入门」再也不用举着杜邦线对焦

三个工具怎么选:

  • esp-emulator:乐鑫正宫 · Rust + WASM
  • Velxio:前端野路子 · 电路画布
  • QEMU:底层老黄牛 · GDB / CI

三层互补,不是三选一。三层加起来,嵌入式开发终于有点「软件工程样」了。

相关链接


本文首发于微信公众号「IoT前哨站」(作者:长空无名,2026 年 10 月 21 日)。

GitHub Copilot 架构升级:支持本地模型,实现云边协同编码

微软于 2026 年 10 月正式宣布 GitHub Copilot 完成架构级升级,将于10 月底全面开放本地 AI 模型推理能力。本次升级是 Copilot 从纯云端服务向「云端 + 本地边缘」混合部署架构的核心演进,基于 Project HydraFusion 编排体系扩展,实现了跨环境的智能任务调度与模型管理。

一、核心架构升级:从多模型编排到云边一体化调度

本次架构升级的核心是将原有的HydraFusion 多模型编排引擎从纯云端扩展到云边双环境,形成统一的跨层调度体系:

  1. 原有基础架构:2026 年 9 月推出的 Project HydraFusion 是一套运行时编排系统,可根据任务复杂度、成本、延迟指标,在多个云端模型之间自动选择「单模型直接求解、级联迭代、交叉评审」三种执行模式,在保持编码质量的同时降低推理成本。
  2. 升级后的扩展能力:调度器新增本地设备算力节点,可依据响应速度、计算成本、生成质量、设备性能、隐私要求等多维指标,自动将推理任务分配到云端或本地端,后台无缝协同两类计算资源,开发者无需感知底层基础设施差异。

二、本地模型的两种运行模式

用户可通过 VS Code 插件、Copilot CLI 命令行工具、独立桌面应用等入口,选择两种本地运行模式:

  • 自动编排模式:系统根据任务特性动态决策部署位置 —— 简单代码补全、语法检查等轻量任务优先走本地;复杂架构重构、跨文件逻辑分析等高阶任务自动调度到云端大模型,兼顾速度与质量。
  • 强制本地模式:全部推理过程完全在设备端完成,数据不经过云端服务器,满足敏感代码开发、离线环境、强合规场景的隐私需求。

三、支持的本地模型与兼容方案

1. 微软官方原生本地模型:MAI Code 1.1 Flash

微软同步推出专为本地编码优化的轻量级大模型,作为 Copilot 本地推理的官方默认选项:

  • 采用混合专家(MoE)架构,总参数量 1370 亿,每轮激活参数约 68 亿
  • 融合量化压缩与推测解码技术,在保留编码质量的同时降低内存占用、提升端到端响应速度
  • 支持最大 256k 上下文窗口,峰值内存占用 75.5GB,可在搭载 NVIDIA RTX AI 算力的 Windows 设备(如 Surface Laptop Ultra)上基于 Windows ML 原生加速运行

2. 第三方本地模型兼容

通过扩展 BYOK(Bring Your Own Key)机制,支持广泛的第三方本地部署模型:

  • 原生支持Ollama作为本地模型提供商,覆盖 VS Code、JetBrains 全系列 IDE、Copilot CLI 等所有终端,可直接选择 Ollama 本地运行的任意模型
  • 兼容所有符合OpenAI Chat Completions API 规范的本地端点,包括 vLLM、Foundry Local 等自部署服务
  • 支持自定义 URL 端点,企业可接入内部私有部署的专属模型,适配定制化开发流程

四、配套安全与能力保障

  • 安全沙箱隔离:微软推出 Microsoft Execution Containers(MXC)执行容器,为本地与云端的代理式编码会话提供隔离环境,精细化控制文件、网络、系统权限与凭证访问,保障本地运行时的系统安全与数据安全
  • 全功能对齐:本地模型完整支持 Copilot 的代码补全、逻辑解释、结构化重构、工具调用、流式输出、跨会话记忆等全部能力,与云端体验保持一致

五、覆盖的产品终端

本次本地模型支持将同步覆盖 GitHub Copilot 全产品线:

  • Visual Studio Code / Visual Studio 2026
  • GitHub Copilot CLI 命令行工具
  • GitHub Copilot 独立桌面应用
  • JetBrains 系列 IDE 插件(已提前上线 Ollama 本地接入能力)

六、升级的核心价值

  1. 隐私合规:敏感代码、内部项目无需上传云端,满足金融、政企等强合规场景的数据安全要求
  2. 离线可用:无网络环境下仍可使用完整的智能编码辅助能力,适配离线开发、内网开发场景
  3. 成本优化:高频轻量任务由本地算力承接,显著降低云端 Token 消耗与订阅成本
  4. 低延迟体验:本地代码补全响应不受网络波动影响,交互更流畅
  5. 灵活定制:开发者可自由选择模型与部署方式,适配不同技术栈与业务流程

Godot 4.6 + Android 真机跑通 AdMob 广告(横幅 / 插页 / 奖励)

这份文档里的每一步、每一个坑,都是在真机上一遍遍试出来的,不是照抄文档写的。
实测机型:Redmi 23013RK75C(Android 13 / Adreno 730),Godot 4.6.stable,
插件:Poing Studios godot-admob v4.0.1。

为什么值得专门写一份:这个插件在 Godot 4.6 上有 三个必须手动打补丁 的地方,
不打的话要么 403、要么 JNI 报错、要么横幅完全静默失败(最难查,本文重点)。


一、先说结论:要打三个补丁

# 症状 根因 补丁位置
1 广告请求返回 403,拿不到广告 插件写死 play-services-ads:24.9.0,该版本已被 Google 停服 addons/admob/android/bin/ads/poing_godot_admob_ads.gd
2 报错 Array[String] does not have the same element type Godot 4.6-stable 引擎 bug:java_class_wrapper.cpp:202 把 && 写成 \|\|,任何 typed Array 传 String[] 都失败 src/api/core/AdRequest.gd + 4 处调用点
3 横幅既不成功也不失败,SDK 一个网络包都不发 GDScript int 传给 Java 时被装箱成 Long,插件 aar 里是 checkcast Integer,抛异常后被 JNI 静默吞掉 src/api/AdView.gd

补丁 1、2 相对好查(有明确报错)。补丁 3 才是真正卡人的地方,下面第五节详细讲。


二、环境清单

项目 版本 / 说明
Godot 4.6.stable(用 _console.exe 版本,命令行能看到完整输出)
AdMob 插件 Poing Studios godot-admob v4.0.1
play-services-ads 25.5.0(跟随 Maven latest,不能用插件默认的 24.9.0)
渲染器 Mobile(Vulkan)
Android 构建模板 必须安装(Gradle 构建,约 200MB)
adb Android SDK platform-tools
测试机 开启 USB 调试,屏幕保持解锁

三、第 1 步:建项目

3.1 路径必须全 ASCII

✅ C:\Users\xxx\Documents\AdMobPortrait
❌ C:\Users\xxx\Documents\实验广告

Godot 导出到中文路径会失败,这是硬限制。

3.2 project.godot 的关键项

config/name="AdMobPortrait"
run/main_scene="res://Main.tscn"
config/features=PackedStringArray("4.6", "Mobile")
config/icon="res://icon.svg"          ; 不写会报 "No project icon specified"

[autoload]
AdManager="*res://AdManager.gd"

[display]
window/size/viewport_width=720
window/size/viewport_height=1280
window/handheld/orientation=1          ; 1 = 竖屏
window/stretch/mode="canvas_items"
window/stretch/aspect="expand"

[rendering]
renderer/rendering_method="mobile"
renderer/rendering_method.mobile="mobile"
textures/vram_compression/import_etc2_astc=true   ; ★ 缺了导出会失败

⚠ 坑:导出报 due to configuration errors: 但消息是空的

ERROR: Cannot export project with preset "portrait" due to configuration errors:
(后面什么都没有)

根因在引擎 platform/android/export/export_plugin.cpp:3047,
has_valid_project_configuration() 里有一段不写任何错误信息就直接置 false 的判定:

if (!ResourceImporterTextureSettings::should_import_etc2_astc()) {
    valid = false;      // ← 没有 r_error,所以错误消息为空
}

解决:补上 textures/vram_compression/import_etc2_astc=true。


四、第 2 步:装插件

4.1 放插件并启用

把 addons/admob 整个目录放进项目,然后 project.godot 加:

[editor_plugins]
enabled=PackedStringArray("res://addons/admob/plugin.cfg")

4.2 ★ 必须生成一次全局类名缓存

新建项目第一次打开时,脚本里的 AdView / MobileAds / AdRequest 等全局类名
全部报 “not declared”,因为 .godot/global_script_class_cache.cfg 还没生成。

godot --headless --editor --quit

跑一次(会自动生成缓存然后退出),再打开编辑器/导出就正常了。

4.3 安装 Android 构建模板

编辑器菜单:项目 → 安装 Android 构建模板,会生成 android/build/(约 200MB)。

如果从别的项目拷现成的 android/ 目录,要剔除 build/build、.gradle,
但 assetPackInstallTime 是模板自带的,别删。


五、第 3 步:三个必打的补丁 ★核心章节

补丁 1 —— play-services-ads 升到 25.5.0(解决 403)

文件:addons/admob/android/bin/ads/poing_godot_admob_ads.gd

# 原值 24.9.0 已被 Google 停服,服务端直接返回 403
var _dependency_library := ["com.google.android.gms:play-services-ads:25.5.0"]

版本号别写死,去
https://dl.google.com/dl/android/maven2/com/google/android/gms/play-services-ads/maven-metadata.xml
看 <latest> 是多少,跟着走。

补丁 2 —— typed Array 换 PackedStringArray(解决 JNI 报错)

根因:Godot 4.6-stable 的 platform/android/java_class_wrapper.cpp:202:

if (arr.is_typed() && (builtin != STRING || builtin != STRING_NAME))
//                                      ^^ 应该是 &&

|| 导致这个条件恒为真,于是任何 typed Array 传 String[] 都被拒。
(master / 4.7-dev 已修正为 &&。)

改法 —— 在 src/api/core/AdRequest.gd 加一个转换函数:

func jni_keywords() -> PackedStringArray:
    return PackedStringArray(keywords)

然后把 4 处调用点 的第 3 个参数改掉:

文件 行 改法
src/api/AdView.gd 89 ... ad_request.jni_keywords())
src/api/InterstitialAdLoader.gd 44 ad_request.jni_keywords()
src/api/RewardedAdLoader.gd 44 ad_request.jni_keywords()
src/api/RewardedInterstitialAdLoader.gd 44 ad_request.jni_keywords()

另外 src/api/MobileAds.gd:42 也要改:

_plugin.set_request_configuration(
    request_configuration.convert_to_dictionary(),
    PackedStringArray(request_configuration.test_device_ids))   # ← 加 PackedStringArray

补丁 3 —— Integer 装箱(解决横幅完全静默失败)★最难查

症状

插页、奖励都正常,只有横幅:发出加载请求之后,
既没有 on_ad_loaded,也没有 on_ad_failed_to_load,SDK 一个包都不发。
日志里干干净净,什么都不报错。

排查三步法(这套手法可以复用到别的插件问题)

第 1 步:对照插件日志找断点

adb logcat -d -v brief | grep -i "poing-godot-admob\|godot   "

正常应该看到 safeInsetRect 之后紧跟着:

D/poing-godot-admob: Safe Area of screen: Rect(...).
D/poing-godot-admob: marginTop: 0

如果 Safe Area of screen: 从没出现,说明 Banner 构造中途就断了。

第 2 步:看视图层级,确认 AdView 到底建出来没有

adb shell dumpsys activity top

往下找 godot_fragment_container,正常应该能看到
com.google.android.gms.ads.AdView。看不到就说明 addView 那段没执行。

第 3 步:反编译 aar 看字节码

unzip -o addons/admob/android/bin/ads/libs/poing-godot-admob-ads-release.aar
cd <解压目录> && unzip -o classes.jar
javap -p -c com/poingstudios/godot/admob/ads/adformats/Banner.class

在 Banner.<init> 的字节码里会看到:

63: checkcast  java/lang/Integer     // ad_position

convertToAdSize 里也有两处(width / height)。

根因

GDScript int  ──写进 Dictionary──▶  Godot 装箱成 java.lang.Long
                                            │
                                   Java 侧 checkcast java/lang/Integer
                                            │
                                   ClassCastException
                                            │
                                   被 JNI 层静默吞掉 → Banner 构造中断
                                            │
                              runOnUiThread{ 创建 AdView + addView } 永不执行
                                            │
                                   没有 AdView → 零网络请求 → 零回调

Godot 的 int 是 int64,装箱成 Long;而插件 aar 里的 Kotlin 是 this["ad_position"] as Int。
这个异常发生在 safeArea 属性初始化之后、runOnUiThread 之前,
所以 Banner 没被加进 banners 列表,后续 load_ad(uid) 取 banners[uid] 越界 —— 整条链静默。

注意:GitHub master 上的 DictionaryExtensions.kt 已经改成安全的
(this[key] as? Number)?.toInt(),但发布的 aar 4.0.1 仍是旧代码。
这就是为什么”看源码明明修过了,跑起来还是崩”。

修复代码

文件:addons/admob/src/api/AdView.gd

# Godot 的 JavaClass 构造器方法名 = 类的简单名
# (java_class_wrapper.cpp:1488: java_constructor_name = 类名最后一段)
# 所以是 Integer.Integer(v),走 env->NewObjectA(..., "<init>", ...),
# 返回 JavaObject;JavaObject 进 Dictionary 时引擎直接透传 jobject。
static var _integer_class = null
static var _integer_class_ready := false

static func _java_int(value: int):
    if not _integer_class_ready:
        _integer_class_ready = true
        if OS.get_name() == "Android":
            _integer_class = JavaClassWrapper.wrap("java.lang.Integer")
    if _integer_class == null:
        return value
    return _integer_class.Integer(value)

然后 _init() 里三个 int 全部走它:

var ad_view_dictionary := {
    "ad_unit_id": ad_unit_id,
    "ad_position": _java_int(ad_position),
    "ad_size": {
        "width": _java_int(ad_size.width),
        "height": _java_int(ad_size.height)
    }
}

为什么插页/奖励不受影响

它们的 AdRequest.convert_to_dictionary() 里只有 String 和空 Dictionary,
没有 int,碰不到这个 checkcast。这也解释了”为什么偏偏只有横幅坏”。


六、第 4 步:业务代码

6.1 官方测试广告单元 ID(任何包名下都能出测试广告)

const BANNER_ID       := "ca-app-pub-3940256099942544/6300978111"
const INTERSTITIAL_ID := "ca-app-pub-3940256099942544/1033173712"
const REWARDED_ID     := "ca-app-pub-3940256099942544/5224354917"

6.2 注册测试设备

真机上跑测试广告必须把设备注册成测试设备,否则拿不到测试广告。
设备哈希从 logcat 里 SDK 自己打印的那句取:

Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("599DD0E66111F3FAC24560DEABA32062"))
adb logcat -d | grep -i "setTestDeviceIds"

6.3 AdManager.gd(AutoLoad)

func _ready() -> void:
    if OS.get_name() != "Android" and OS.get_name() != "iOS":
        return

    # 1) 注册测试设备
    var cfg := RequestConfiguration.new()
    cfg.test_device_ids = [TEST_DEVICE_ID]
    MobileAds.set_request_configuration(cfg)

    # 2) 初始化(异步)
    var listener := OnInitializationCompleteListener.new()
    listener.on_initialization_complete = func(_status: InitializationStatus) -> void:
        _initialized = true
    MobileAds.initialize(listener)

横幅(贴在竖屏底部):

func load_banner() -> void:
    if _banner_view != null:
        _banner_view.destroy()
        _banner_view = null

    var ad_size := AdSize.get_current_orientation_anchored_adaptive_banner_ad_size(AdSize.FULL_WIDTH)
    var view := AdView.new(BANNER_ID, ad_size, AdPosition.Values.BOTTOM)

    view.ad_listener.on_ad_loaded = func() -> void:
        view.show()                      # 加载成功才 show
    view.ad_listener.on_ad_failed_to_load = func(err: LoadAdError) -> void:
        print("横幅失败 code=%d %s" % [err.code, err.message])

    _banner_view = view
    view.load_ad(AdRequest.new())

插页:

func load_interstitial() -> void:
    var cb := InterstitialAdLoadCallback.new()
    cb.on_ad_loaded = func(ad: InterstitialAd) -> void:
        _interstitial = ad
        ad.full_screen_content_callback.on_ad_dismissed_full_screen_content = func() -> void:
            _interstitial.destroy()
            _interstitial = null
            load_interstitial()          # 关闭后自动预加载下一则
    cb.on_ad_failed_to_load = func(err: LoadAdError) -> void:
        print("插页失败 code=%d %s" % [err.code, err.message])
    InterstitialAdLoader.new().load(INTERSTITIAL_ID, AdRequest.new(), cb)

奖励:

func show_rewarded() -> void:
    if _rewarded == null:
        load_rewarded()
        return
    var listener := OnUserEarnedRewardListener.new()
    listener.on_user_earned_reward = func(item: RewardedItem) -> void:
        print("发放奖励 type=%s amount=%d" % [item.type, item.amount])
    _rewarded.show(listener)

6.4 界面布局要点

横幅是 Android 原生 View,叠在 Godot 画面上方,会盖住底部内容。
所以 UI 底部要留白:

root.add_theme_constant_override("margin_bottom", 140)   # 给横幅留位

6.5 时序

MobileAds.initialize 是异步的,别在 _ready() 里立刻发请求:

await get_tree().create_timer(2.5).timeout
AdManager.load_interstitial()
AdManager.load_rewarded()
await get_tree().create_timer(3.0).timeout
AdManager.load_banner()

七、第 5 步:导出 APK

7.1 export_presets.cfg 最小配置

[preset.0]
name="portrait"
platform="Android"
export_path="./AdMobPortrait.apk"

[preset.0.options]
gradle_build/use_gradle_build=true
gradle_build/export_format=0
architectures/arm64-v8a=true
package/unique_name="com.example.admobportrait"
package/signed=true
version/code=1
version/name="1.0"
screen/immersive_mode=true

7.2 ★ 每次导出前先清 *.tmp

中断导出会留下
android/build/res/values-*/godot_project_name_string.xmlNNNN.tmp,
下次构建直接失败:

mergeStandardDebugResources FAILED - The file name must end with .xml
find android/build/res -name "*.tmp" -delete

7.3 导出命令

godot --headless --export-debug "portrait" "C:/path/to/AdMobPortrait.apk"

首次 Gradle 构建约 7~15 分钟(之后有缓存会快很多)。
APK 出现在 build/ 下时就已构建完成,Godot 进程可能还在做收尾。


八、第 6 步:装到手机

⚠ 坑:INSTALL_FAILED_USER_RESTRICTED: Install canceled by user

adb install -r -t app.apk
# → INSTALL_FAILED_USER_RESTRICTED: Install canceled by user

试过 keyevent 224 唤醒、wm dismiss-keyguard、pm install、文件管理器安装,都无效。
真正的原因是 AppOps 权限被关:

adb shell appops set com.android.shell REQUEST_INSTALL_PACKAGES allow
adb install -r -t app.apk
# → Success

在 Git Bash 下记得 export MSYS_NO_PATHCONV=1,否则 /data/local/tmp/...
这类路径会被自动转换。


九、第 7 步:验证广告真的出来了

9.1 抓日志

adb logcat -c                                        # 先清空
adb shell monkey -p com.example.admobportrait -c android.intent.category.LAUNCHER 1
sleep 14
adb logcat -d -v brief | grep -i "poing-godot-admob\|godot   "

9.2 健康日志长这样

[07:23:02] 正在初始化 MobileAds ...
[07:23:03] MobileAds 初始化完成 ✔
[07:23:06] 插页:已发起加载请求 ...
[07:23:06] 奖励:已发起加载请求 ...
[07:23:09] 横幅尺寸:411 x 64 dp
[07:23:09] 横幅:java.lang.Integer 装箱 ✔
D/poing-godot-admob: Safe Area of screen: Rect(0, 104 - 0, 0).
D/Ads: AdRequestServiceImpl: Sending request: .../mads/gma     ← 真的发出请求了
[07:23:11] 横幅:加载成功 ✔ → 自动展示
[07:23:11] 横幅:已展示(impression)
[07:23:11] 插页:加载成功 ✔ 可以展示了
[07:23:11] 奖励:加载成功 ✔ 可以展示了

9.3 自动点按钮

Godot 的按钮是自绘的,uiautomator 定位不到,只能用坐标点:

adb shell wm size            # 确认分辨率,例如 1080x2400
adb shell input tap 540 690  # 点"显示插页广告"

9.4 截图确认

adb exec-out screencap -p > screen.png

底部能看到 Google 测试横幅(「测试广告 / Nice job! This is a 320×50 test ad.」)即为成功。


十、排错速查表

现象 根因 解决
导出报 due to configuration errors: 消息为空 import_etc2_astc 未开 project.godot 加 textures/vram_compression/import_etc2_astc=true
脚本报 AdView / MobileAds not declared 全局类名缓存未生成 跑一次 godot --headless --editor --quit
No project icon specified 缺图标 加 config/icon="res://icon.svg"
mergeStandardDebugResources FAILED ... must end with .xml 上次导出中断留了 *.tmp find android/build/res -name "*.tmp" -delete
INSTALL_FAILED_USER_RESTRICTED AppOps 权限被关 adb shell appops set com.android.shell REQUEST_INSTALL_PACKAGES allow
广告请求 403 play-services-ads 版本停服 补丁 1,升到 Maven latest
Array[String] does not have the same element type Godot 4.6 typed-array bug 补丁 2,改 PackedStringArray
横幅无任何回调、SDK 不发请求 int 装箱成 Long,checkcast Integer 崩溃 补丁 3,_java_int()
插页/奖励一直”未准备好” 没等初始化完成就发请求 初始化回调后再等 2~3 秒
横幅盖住 UI 底部 原生 View 叠在画面上 UI 底部留 140px 空白

十一、换成自己的广告 ID 时要做什么

  1. AdMob 后台创建应用 + 三个广告单元,拿到真实 ID,替换 3 个常量。
  2. 把测试设备注册那段删掉或改成只在 debug 生效,否则线上用户拿不到真实广告。
  3. 改包名 package/unique_name 为你自己的域名反写。
  4. 发布前换成 release 导出(--export-release)并配置正式签名。
  5. 欧盟/英国用户需要接 UMP consent 流程(插件里 PoingGodotAdMobUserMessagingPlatform 已提供)。

附:本项目文件清单

AdMobPortrait/
├── project.godot              竖屏 + AutoLoad + import_etc2_astc
├── export_presets.cfg         preset 名 "portrait"
├── AdManager.gd               广告管理器(AutoLoad)
├── Main.gd / Main.tscn        竖屏演示 UI(纯代码搭建)
├── icon.svg
├── addons/admob/              插件(含 3 处补丁)
│   ├── src/api/AdView.gd                      ← 补丁 3
│   ├── src/api/core/AdRequest.gd              ← 补丁 2
│   ├── src/api/MobileAds.gd                   ← 补丁 2
│   ├── src/api/{Interstitial,Rewarded,RewardedInterstitial}AdLoader.gd  ← 补丁 2
│   └── android/bin/ads/poing_godot_admob_ads.gd   ← 补丁 1
├── android/                   Android 构建模板
└── build/
    ├── admob-portrait.apk     已验证可安装的 debug 包
    └── screen_*.png           真机验证截图

2025年流行的Python部署

传统的真机Python+pip部署方式早已被淘汰了。

而venv虚拟部署的方式还有很多人在用,也确实比传统真机部署好很多,但也再被渐渐淘汰。

目前较为流行的一种模式是:Conda+UV的组合方式。

conda:核心是环境管理工具,负责创建隔离的虚拟环境(可包含不同 Python 版本、系统级依赖甚至非 Python 包,如 C 库)。

uv:核心是Python 包管理器,专注于快速安装 / 管理 Python 包(类似 pip,但速度更快、依赖解析更高效),本身不管理环境,而是依赖于当前激活的 Python 环境。

建议在激活 conda 环境后安装 uv,避免全局安装导致的环境混淆。

pip install uv

uv的使用例子:

uv pip install transformers==4.24.0  # 安装指定版本
uv pip uninstall jieba  # 卸载包
uv sync  # 同步依赖(根据 pyproject.toml 或 requirements.txt)

注意事项(避免潜在问题):

1、不混用 conda 和 uv 安装同一 Python 包

例如,不要用 conda install pandas 后再用 uv pip install pandas,可能导致版本冲突(conda 和 pip/uv 管理的包路径虽然一致,但依赖解析逻辑不同)。

  • 优先用 uv 管理纯 Python 包(如 transformers、jieba);
  • 用 conda 管理含系统依赖的包(如 numpy、opencv,conda 会自动安装对应的 C 库)。

2、uv 不处理非 Python 依赖

uv 仅负责 Python 包,若包依赖系统级库(如 libssl、libffi),仍需通过 conda 或系统包管理器(apt)安装:

# 例如安装需要系统库的包,先用 conda 安装依赖 conda install -c conda-forge libsndfile # 安装音频处理的系统库 uv pip install soundfile # 再用 uv 安装依赖该库的 Python 包

3、环境迁移时需同步两者的配置

若要复制 conda 环境,除了用 conda env export,还需同步 uv/pip 管理的包(通过 uv pip freeze > requirements.txt 导出)。

总结

uv 和 conda 是互补工具:conda 负责环境隔离和系统级依赖,uv 负责高效管理 Python 包,在 conda 环境中使用 uv 不仅安全,还能显著提升包安装速度,推荐结合使用。

国内使用建议:

/.config/uv/uv.toml
index-url = “https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple”

另外,uv也是可以直接运行py文件的。如图所示。

用树莓派Pico和镍铬丝制作电烙铁

1. 硬件准备

  • 树莓派Pico: 作为控制核心。
  • 镍铬丝: 作为加热元件。
  • MOSFET(如IRF520): 用于控制镍铬丝的电流。
  • 电阻(如220Ω): 用于限制Pico GPIO引脚的电流。
  • 电源: 提供足够的电流和电压。
  • 导线: 耐高温导线。
  • 烙铁头(可选): 可以将铜丝弯曲成烙铁头形状。
  • 隔热材料: 用于包裹镍铬丝,防止烫伤。

2. 硬件连接

  • 将镍铬丝连接到MOSFET的漏极(Drain)。
  • 将MOSFET的源极(Source)连接到GND。
  • 将树莓派Pico的GPIO引脚(例如GPIO15)通过电阻连接到MOSFET的栅极(Gate)。
  • 连接电源到镍铬丝和MOSFET。
  • 将隔热材料包裹在镍铬丝周围。

3. MicroPython编程

  • Thonny IDE: 推荐使用Thonny IDE,方便编写和上传MicroPython代码。
  • GPIO控制: 使用MicroPython的machine库,控制GPIO引脚输出高低电平,控制MOSFET的导通和截止。

示例代码:

from machine import Pin
import time

fire_pin = Pin(15, Pin.OUT)  # 点火引脚,连接到MOSFET栅极

def fire():
    fire_pin.value(1)  # 开启加热
    print("Heating...")

def stop_fire():
    fire_pin.value(0) # 关闭加热
    print("Stop Heating.")

while True:
    input_value = input("Enter '1' to heat, '0' to stop: ")
    if input_value == '1':
        fire()
    elif input_value == '0':
        stop_fire()
    else:
        print("Invalid input.")

4. 安全注意事项

  • 高温风险: 镍铬丝工作时会产生高温,务必小心操作,防止烫伤。
  • 电路安全: 大电流电路存在风险,务必小心操作。
  • 防火措施: 准备灭火器材,防止火灾发生。
  • 测试验证: 在实际焊接前,进行充分的测试验证。
  • 警告:
    • 电烙铁具有一定的危险性,请在安全的环境下操作。
    • 制作和使用电烙铁时,务必遵守相关安全规范。
    • 如果对于电子电路不是十分了解,请勿自行制作。请寻找专业人员的帮助。

5. 补充说明

  • 根据镍铬丝的电阻和电源电压,选择合适的MOSFET。
  • 可以添加温度传感器和PID控制算法,实现温度控制功能。
  • 关于烙铁头的制作:
    • 可以找一段粗的铜丝,然后用锤子敲打铜丝的一端,敲打成扁平状,然后打磨成自己需要的烙铁头形状。
    • 铜具有非常优秀的导热性,所以铜是制作烙铁头的优秀材料。

江浙沪猫窝设计概要

最近弄了一个室外的猫窝,理解了猫科动物对于卧室的要求。

猫的特点:敏感、警惕性高、爱干净、不喜潮湿、不喜光线直射、怕吵、怕冻、喜欢纸盒。

江浙沪特点:多雨潮湿、夏热冬冷、蛇虫鼠蚁多。

对应猫窝要点:结构简单牢固、防雨防晒、排水良好、透气性好、隐蔽性好、安全性高。

于是,我找了个餐厅用的304不锈钢大桶作为基础。灵感来自集装箱做的房子。

第一个版本的猫窝,没有特别布置,只在里面加上硬纸板。结果位置较低,下雨后里面进水,猫弹射跑路。(失败)

第二个版本,将大桶下方垫上两砖的高度,门口加矮墙。结果只能防小雨,雨一大,还是进水。猫坚持了五分钟,雨一大马上弹射跑路。(失败)

第三个版本,在桶内加垫料,增加床(大纸盒)的高度,床下留出排水通道。同时增加纵深,免得离门口太近。纸盒底部用透明塑料带加一隔水层。最后外面再挂一块布做门帘,遮阳加挡雨。(成功)

终于,大雨倾盆也不怕了。外面暴雨,它在里面踏实躺着梳理毛发。

Json文件的加解密

HTTPS可以防止传输过程中数据被偷看,但无法阻止客户端本地的攻击。比如Json之类的文件,如果完全明文,可能会让一些黑客看到敏感信息。

是否可以对其进行一层简单的加密?

以Python为例子,用一个加密库就可以。

首先执行:pip install cryptography

然后开始编写如下代码。

from cryptography.fernet import Fernet
import json

# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# JSON 数据
data = {
    "name": "Alice",
    "age": 30,
    "city": "Wonderland"
}

# 将 JSON 数据转换为字符串
json_data = json.dumps(data)

# 加密 JSON 数据
encrypted_data = cipher_suite.encrypt(json_data.encode())

print("加密后的数据:", encrypted_data)
print("密钥:", key)

它会输出:

加密后的数据: b’gAAAAABmraTSlRWANyVFWRKm4CgjpoJEhyLID-ri64K3RP2yItbM-4POPid1dVh_1mWVItoSzZy-bPC_pObCCDUJ-ktuxWbi5zAcSn8VDrTiYiyqwXWvygLcBHmwToapDEDoqA6RjHQs_WeOCKAZqPnge5Q-J4xNpw==’
密钥: b’MvHuTCwAj3SNz93MZtI_1Ww_tHn9XVUFxyARGyGLTxQ=’

要解密的时候怎么办呢?

from cryptography.fernet import Fernet
import json
daa = b'gAAAAABmraTSlRWANyVFWRKm4CgjpoJEhyLID-ri64K3RP2yItbM-4POPid1dVh_1mWVItoSzZy-bPC_pObCCDUJ-ktuxWbi5zAcSn8VDrTiYiyqwXWvygLcBHmwToapDEDoqA6RjHQs_WeOCKAZqPnge5Q-J4xNpw=='
key = b'MvHuTCwAj3SNz93MZtI_1Ww_tHn9XVUFxyARGyGLTxQ='
decrypted_data = cipher_suite.decrypt(daa).decode()
json_data = json.loads(decrypted_data)
print(json_data)

它会输出:
{‘name’: ‘Alice’, ‘age’: 30, ‘city’: ‘Wonderland’}

以上代码使用了 Fernet 加密算法,这是对称加密的一种实现。Fernet 是一种基于 AES(高级加密标准) 的加密方案,具体来说,它使用 AES-128 在 CBC(密码分组链接)模式 下进行加密,并结合 PKCS7 填充 和 HMAC(基于哈希的消息认证码) 来确保数据的完整性和保密性。

树莓派AI 套件上市,带NPU售价 70 美元

如果你曾经想在 Raspberry Pi 5 上尝试神经网络、人工智能和机器学习的世界,树莓派这次推出了官方AI 套件。该 AI 套件是与 Hailo 合作开发的,它可将本地高效的推理能力,集成到各种应用程序中。现已上架 Raspberry Pi 的经销商网络,价格 70 美元。

Raspberry Pi AI 套件拆解

Raspberry Pi AI 套件包括我们的 M.2 HAT+ 和 Hailo-8L AI 加速器模块。AI 套件安装在 Raspberry Pi 5 上,可让你快速构建复杂的 AI 视觉应用程序,实时运行。具有低延迟和低功耗要求。用于对象检测、语义和实例分割、姿态估计和面部识别(仅举几例)的先进神经网络完全在 Hailo-8L 协处理器上运行,使 Raspberry Pi 5 CPU 可以自由地执行其它任务。

Raspberry Pi AI 套件的主要功能包括:

  • 每秒 13 万亿次运算 (TOPS) 的推理性能
  • 以 8Gbps 运行的单通道 PCIe 3.0 连接
  • 与 Raspberry Pi 图像软件子系统完全集成
  • 与第一方或第三方相机的兼容性
  • 加速器硬件的高效调度:在单个摄像头上运行多个神经网络,或者同时在两个摄像头上运行单个 / 多个神经网络

搭载AI Kit的树莓派5

Hailo创建了一个庞大的模型库,用户可以在这里找到各种各样的预训练神经网络模型,可以在AI Kit上部署和优化。

地址:

https://github.com/hailo-ai/hailo_model_zoo/tree/master/docs/public_models/HAILO8L

软件方面

最新版本的 Raspberry Pi OS 会自动检测 Hailo 模块,因此操作系统和利用该模块的应用程序可以立即使用它。rpicam-apps 套件现在有一个后处理模板,用于在摄像头管道中集成实时运行的神经网络推理。

“通过使用预安装的 Hailo Tappas 后处理库,仅几百行 C++ 代码就能创建基于 AI 的高级应用程序。类似级别的集成到我们的 Picamera2 框架中很快就会实现。”

除了可以在 rpicam-apps 或 Picamera2 中使用 Hailo-8L 协处理器外。Raspberry Pi AI Kit 中还打包了集成在 GStreamer 框架和本地 Python 或 C/C++ 应用程序中的 API。包括非摄像机用例,例如在预先录制的视频文件上运行推理。

近看Hailo模块

软件安装步骤非常简单。通过apt安装几个软件包,重新启动,你就可以在几分钟内尝试我们的一些AI演示。完整的说明可以在我们的入门指南中找到。下面是我们的一些演示的预览,你可以通过rpicam-apps运行。

详细步骤:

https://www.raspberrypi.com/documentation/accessories/ai-kit.html#getting-started

有了树莓派AI Kit,你不但可以在picam-apps或Picamera2中使用Hailo-8L协处理器。树莓派还打包了一个集成在GStreamer框架和本地Python或C/C++应用程序中的API。这包括非相机用例,例如在预先录制的视频文件上运行推理。