文号
952514
阅读
669
回复
4
收藏
3
本文包含AI生成内容,并经过作者严格考据审查,作者对AI生成内容的品质和可靠性负责。
“银之星”探空火箭航电平台发布
陈 惠德黄 曦杰
2026/10/12
IP:广东
摘要:SilverStar 是一套面向探空火箭的开源、可扩展航电软件平台,由工程配置与生成工具 SCG、地面遥测交互工具 GSHC 和日志分析工具 FLP 组成,覆盖硬件配置、固件生成、地面监测与离线分析流程。平台通过插件组织传感器、通信设备和导航算法,降低软件与具体硬件、任务配置之间的耦合,并关联保存工程配置、组件版本与日志解码信息,支持测试复现和异常追溯。 平台提供纯惯导、SF6、KF6 和 ESKF15 等导航方案,实现采样、校准、初始对准、导航解算、开伞与着陆判定及日志记录,并支持遥测交互、日志可视化和离线复算对比。 本文介绍平台架构、主要实现机制、通信协议、示例硬件及基本使用流程,结合手持与抛体外场测试,以记录 000062 为主要案例分析运行结果。
文章说明:SilverStar是一个采用插件式架构的开源航电项目,我是被PX4启发开始构建的,之前做的飞控固件代码均已经作为中间层融合进去了。另外,本文于10.12发布,是亚雷斯塔的151岁生日哦!这算是我给她的生日礼物吧()另外10.15是辰星引力成立四周年,会有一次UNDERLINE的更新。顺带一说,感谢辰星梦人给我的生日礼物,封面图是他找画师约的稿!

前言

在目前部分社区开源的探空火箭航电项目中,飞控的主要功能仍集中于开伞判断,通常采用 IMU 原始读数、固定阈值和延时完成控制。这类方案简单实用,但在箭体姿态剧烈变化或任务条件改变时,适用性可能受到限制。同时,传感器数据处理、导航状态估计、遥测与日志记录等功能的不完善,也会增加飞行数据分析和故障定位的难度。另一个问题是软硬件耦合较紧密,更换主控、传感器或任务方案往往需要大幅修改代码。考虑到业余探空火箭发射周期较长、不同任务的实验目标各异,这些问题使已有成果难以持续复用。

受 PX4 等开源飞控平台的启发,SilverStar 尝试为探空火箭建立一套模块化、可配置、可扩展的航电软件平台。目前主要面向无控探空火箭,通过将硬件驱动、导航算法、通信和任务逻辑分离,支持不同硬件与任务方案的灵活组合,减少重复开发。同时,引入惯性导航、多传感器融合及较完整的数据记录与分析机制,以提高飞行状态估计能力和实验数据的可追溯性,为后续故障分析、算法改进和任务拓展提供基础。

平台由三款软件组成:SCG 负责硬件与任务配置、工程生成;GSHC 负责地面通信、实时监控与任务交互;FLP 负责日志解析、数据分析及导航算法离线复算。三者共同覆盖从飞控配置、实验执行到数据分析的完整流程,并通过统一的配置与记录机制关联固件、算法及实验结果。

本次发布的 v0.1.2 是项目的阶段性成果,目前已完成软件检查、室内调试及手持外场测试,尚未进行实际火箭飞行验证。文章将介绍平台设计、典型使用流程、硬件方案、测试结果及导航算法原理。项目仍在持续开发,欢迎社区参与测试、交流与改进。

本文在文字整理、数学推导及部分图示制作中使用了 AI 辅助工具,相关内容均经过人工审查与修改,如有疏漏,欢迎指出。

仓库:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

最新发布:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

资源

本栏目给出本文会用到的资源,即0.1.2版本的win压缩包和最终测试工程文件夹压缩包。

attachment iconSilverStar_0_1_2_Windows_Portable.zip210.46MBZIP3次下载

attachment iconSS_0_5_TEST_FINAL.zip100.74MBZIP1次下载

(注:该工程的4次测试分别对应日志000060-000063,但是工程中只加入了最具代表性的000062,后续也以此为基准分析,其他日志情况见附录D)

目录

第一部分:认识与使用

  1. SilverStar 项目概览
    1.1 项目目标与适用场景
    1.2 SCG、GSHC 与 FLP 的分工
    1.3 从工程配置到任务数据分析
    1.4 本次发布内容与测试情况

  2. SCG 系统配置与工程生成
    2.1 打开软件与示例工程
    2.2 项目配置与资源档位
    2.3 传感器、通信与任务配置
    2.4 导航算法与参数设置
    2.5 硬件资源配置与工程生成

    2.6 固件编译与工程文件管理

  3. GSHC 地面站操作与后期处理
    3.1 连接地面站与检查通信
    3.2 校准、初始对准与任务启动
    3.3 实时遥测与任务状态
    3.4 历史会话与后期处理

  4. FLP 日志分析与导出
    4.1 打开示例工程与日志
    4.2 日志概览与完整性检查
    4.3 轨迹、速度、姿态与任务事件
    4.4 导航状态与质量诊断
    4.5 离线复算与结果对比
    4.6 数据导出与分析工程保存

  5. 通信协议与数据接口
    5.1 通信结构与协议分工
    5.2 AIR:飞控与地面站的遥测和命令
    5.3 GSP:地面站与电脑的数据封装
    5.4 维护串口:配置、查询与诊断
    5.5 SSLOG 与 .ssdecoder:机载日志与解码
    5.6 命令确认、执行状态与异常处理
    5.7 协议版本与兼容扩展

  6. 实测记录与结果分析
    6.1 测试条件与数据来源
    6.2 000062:轨迹与任务过程
    6.3 GNSS 质量与导航诊断
    6.4 其他测试记录与历史对照
    6.5 测试总结与后续改进

  7. 常见问题与排查
    7.1 软件启动与文件路径
    7.2 SCG 配置、生成与编译
    7.3 地面站连接与通信异常
    7.4 校准、初始对准与 START
    7.5 GNSS 与导航异常
    7.6 FLP 日志导入、复算与导出
    7.7 问题反馈与资料准备

第二部分:硬件与实现

  1. PCB与硬件设计
    8.1 PCB 设计规范与建议
    8.2 SSFC0.5 实验飞控板
    8.3 SSGS0.5 实验地面站
    8.4 SSFCm0.5 集成飞控板
    8.5 ssopcb 集成飞控板

  2. 固件组成与运行机制
    9.1 固件总体架构与模块分层
    9.2 FreeRTOS 任务调度与内存管理
    9.3 设备驱动、数据采集与时间管理
    9.4 系统启动、校准与初始对准
    9.5 惯性导航与融合估计
    9.6 任务状态机与执行逻辑
    9.7 遥测通信与机载日志
    9.8 异常处理、资源检查与系统可靠性

第三部分:数学原理与扩展

  1. 惯导与融合算法的数学推导
    10.1 坐标系、单位与基本约定
    10.2 四元数与姿态更新
    10.3 传感器校准与初始对准
    10.4 参考原点与外部观测
    10.5 惯性机械化与 Pure INS
    10.6 SF6 固定增益融合
    10.7 KF6 六状态卡尔曼滤波
    10.8 ESKF15 名义状态与误差传播
    10.9 ESKF15 观测更新与误差注入
    10.10 时间对齐与延迟观测处理
    10.11 观测质量、NIS 与一致性检查
    10.12 融合超时与恢复

  2. 插件、许可与社区
    11.1 插件体系与扩展方式
    11.2 SCG 设备与算法插件开发
    11.3 FLP 日志与离线算法扩展
    11.4 开源许可与社区协作

    11.5 已知限制与未来计划


附录 A:源码与开发环境
附录 B:主要符号、公式与实现速查
附录 C:术语与常见文件

附录 D:测试日志与解析器

参考文献和原始数据见文末,原始数据需根据附录D提供的日志配置文件打开。

第一部分:认识与使用

1.SilverStar 项目概览

1.1 项目目标与适用场景

SilverStar 主要面向无控探空火箭的航电开发与实验研究,尝试以模块化方式组织硬件驱动、导航算法、任务逻辑和数据接口,使不同硬件平台及任务方案能够复用已有的软件组件。平台不仅用于完成传感器采集、导航状态估计、遥测和开伞等任务,也注重实验配置与数据记录的完整性,为不同方案的对比及故障分析提供依据。

SilverStar 将系统配置、设备运行与实验复核连接为一套工作流程。飞控板(Flight)负责传感器采集、惯性导航与数据融合、任务状态管理及日志记录;地面站板(Ground)负责空地无线通信与电脑接口之间的数据转发;配套上位机分别承担工程生成、地面监控和日志分析。项目目前仍处于开发与验证阶段,主要面向具备一定嵌入式开发基础的使用者,具体硬件和任务方案需结合实际条件独立测试。

1.2 三款软件的分工

SCG(System Configuration & Generation,系统配置与生成)负责硬件与任务配置、工程生成和构建检查。它将目标 MCU、传感器、接口、算法、参数和协议组织在同一项目中,并检查不同组件之间的兼容性,减少更换硬件或调整任务时所需的重复开发。

F05_scg_final_devices.png

图 1-1 SCG 飞控设备配置界面

GSHC 的GSHC(Ground Station Host Computer,地面站上位机)负责地面站连接、实时遥测、任务状态监控和命令交互。软件将通信连接、命令确认与飞控实际执行状态分别处理,避免将消息发送成功误认为任务操作已经完成,同时支持地面遥测会话的保存与后期处理。

F12_gshc_disconnected_preflight.png

图 1-2 GSHC 预飞行监控界面

FLP(Flight Log Processor,飞行日志处理器)负责机载日志解析、数据分析及导航算法离线复算。它使用与固件配置匹配的解码包读取日志,并区分原始记录、离线复算和参数试验结果,为飞行轨迹分析、算法比较及故障定位提供工具。

image.jpg

图 1-3 FLP 日志概览界面

1.3 从配置到分析的完整流程

SilverStar 的使用通常从 SCG 创建项目开始。使用者根据实际需求选择硬件平台、传感器、导航算法、通信方式及任务参数,再生成相应的飞控(Flight)与地面站(Ground)固件工程。完成编译和烧录后,即可使用对应硬件开展调试与测试。

为关联不同阶段的工程与数据,SilverStar 采用统一的项目目录组织配置文件、固件工程和实验日志。如图 1-4 所示,项目根目录包含配置文件.ssproject、飞控与地面站工程目录,以及用于保存日志的Log文件夹。生成工程时还可以提供与固件配置对应的.ssdecoder解码包,使后续日志分析能够使用匹配的记录定义。

image.jpg

图 1-4 SilverStar 项目目录结构示例

系统运行时,Flight 完成传感器采集、导航计算、任务控制与机载日志记录,并通过 AIR 协议与 Ground 交换遥测及命令消息。Ground 作为通信网关,通过 GSP 协议与电脑上的 GSHC 交互。GSHC 负责呈现设备状态、实时遥测和任务事件,并提供校准、初始对准及任务启动等操作。

任务结束后,使用者可以将 TF/SD 卡中的机载日志导入 FLP,并通过匹配的解码配置还原记录内容。FLP 支持轨迹、速度、姿态及导航诊断分析,也可以对导航算法进行离线复算和结果对比。GSHC 保存的地面遥测会话则能够作为另一类数据来源,与机载日志分析相互补充。

通过上述流程,平台将配置、生成、监控、记录与分析联系起来,使实验结果能够追溯到对应的硬件配置、固件及算法版本,同时为后续实验提供可复用的数据基础。具体的软件操作将在第 2~4 章结合示例介绍。

1.4 本次发布与测试情况

SilverStar v0.1.2 提供 Windows 便携版和源代码,包含 SCG、GSHC、FLP 三款软件,以及配套的固件生成模板、插件、通信协议和技术文档。Windows 便携版可直接解压运行三款上位机软件;固件编译与烧录仍需相应开发环境和硬件工具。

目前项目主要以 STM32F407VET6 飞控和 STM32F103C8T6 地面站作为实际测试平台,同时保留其他 MCU、传感器及通信设备的适配和扩展机制。导航方面提供纯惯性导航(Pure INS)、六维固定增益融合算法(SF6)、六维卡尔曼滤波算法(KF6)及十五维误差状态扩展卡尔曼滤波算法(ESKF15),以适应不同的硬件资源与估计需求。

本次发布前,三款上位机软件已开展相应的软件检查,固件也进行了编译、静态检查、室内调试和部分外场测试。其中,基于 STM32F407VET6 与 STM32F103C8T6 的测试组合已有实际运行记录,KF6 已获得手持外场测试数据。ESKF15 在本次 F407 测试配置下尚未完成满足实时性要求的成功运行验证,相关计算结果主要通过 FLP 离线复算检查。其他硬件组合的适配程度和验证范围并不完全相同,部分原生 USB 虚拟串口地面站方案仍属于实验性适配。

2.SCG 系统配置与工程生成

SCG(System Configuration & Generation)用于将任务需求转化为可构建的飞控与地面站工程。它将设备驱动、硬件资源、导航算法、任务策略和通信参数组织在统一的配置体系中,并通过插件和资源检查机制减少不同工程之间的重复开发。本章使用 SS_0_5_TEST_FINAL 示例工程介绍主要设计与功能。

2.1 打开软件与示例工程

SCG 支持新建项目或打开已有项目,项目配置保存于 SilverStar.ssproject。载入示例工程后,可以查看设备、飞行任务、导航、遥测、硬件及构建检查等页面。

image.jpg

图 2-1 SCG 项目与飞控设备配置界面

新建项目时,SCG 会建立独立的项目目录,以便统一保存配置、固件工程和后续生成结果。不同项目之间可以复用设备及算法插件,而不必重复编写完整固件。

image.jpg

图 2-2 SCG 新建项目界面

程序具有默认目录,可在“文件”->"默认工程根目录…"下配置,已方便后续新建工程。

2.2 项目配置与资源档位

SilverStar 提供完整、标准、轻量和最简四种资源档位,以适应不同 MCU 的硬件资源和探空火箭任务需求。不同档位主要通过限制导航算法、传感器数量及部分附加功能,降低固件对 Flash、SRAM 和计算性能的要求。

完整档位:保留全部导航算法及较丰富的设备、日志和功能配置,允许使用 ESKF15 等计算量和内存需求较高的算法,适合复杂任务与高性能 MCU,推荐 H7 系列。由于 ESKF15 还涉及十五维协方差计算及延迟观测回放,实际运行能力仍取决于主频、内存和任务负荷。

标准档位:主要限制 ESKF15,仍可使用 KF6、SF6 和纯惯性导航,保留较完整的传感器、遥测和日志功能。适用于 STM32F407 等具有一定计算能力和存储资源的 MCU。需要注意,部分 F4 型号的 SRAM 容量较小,不能仅凭所属系列判断是否满足要求。

轻量档位:进一步禁用 KF6 和 ESKF15,主要使用 SF6 或纯惯性导航,同时将各类传感器和遥测设备限制为单实例,减少资源占用。该档位适合成本较低、存储资源有限的 MCU,例如具有较大 Flash 容量的 STM32F103RFT6 等型号。

最简档位:在轻量档位的基础上禁用 GNSS 和维护串口,进一步减少设备及通信资源需求,但仍保留必要的机载日志与存储机制。该档位主要面向资源更加有限、任务功能较为简单的系统,可考虑 STM32F103RET6 等型号。

需要说明的是,资源档位并不与特定 MCU 固定绑定,上述芯片仅作为配置参考。SCG 会根据实际芯片的 Flash、SRAM、CCMRAM 和外设资源检查工程配置,最终仍需通过编译、资源分析及实机测试确认可用性。


image.jpg

图 2-3 SCG 资源档位选择

切换档位后,SCG 会按照相应规则调整可用配置。例如,切换到轻量或最简档位时,部分多实例设备可能被移除;重新切换回完整档位也不会自动恢复这些设备。因此,修改档位后应重新检查设备列表和导航配置。

对于已经保存的工程,通常可以直接沿用原有档位,再根据需要修改,不必在每次打开时重新选择。

2.3 传感器、通信与任务配置

设备配置页面用于管理 IMU、GNSS、气压计、无线通信模块及其他外部设备。本例使用 JY901B 惯性测量模块、NEO-M9N GNSS 接收机和 E28-2G4M12SX 无线模块,可以分别设置设备实例、通信接口及安装方向等参数。

SCG 支持为同类传感器配置多个实例,并设置数据源优先级。当高优先级设备离线或状态异常时,系统可以根据设备类型和运行条件选用其他数据源,但当前版本尚不支持多个 IMU 同时参与融合,任务开始后也不能切换 IMU。部分设备能够同时提供多类测量数据,SCG 则通过设备能力与数据来源配置,将实际传感器对应到系统需要的测量通道。

image.jpg

图 2-4 示例工程的传感器配置

image.jpg

图 2-5 示例工程的传感器配置(续)

当前SCG内置了较SCG 内置了多种常用传感器驱动,并通过插件机制扩展支持范围。以 IMU 为例,当前提供 JY901B、BMI088 等设备选项,便于根据精度、采样率和成本选择硬件,而不必重新编写上层导航逻辑。

image.jpg

图 2-6 SCG 内置 IMU 设备选项

飞行配置页面负责校准、任务状态、开伞、着陆及日志记录等功能。开伞策略支持多种触发条件,各条件之间采用“或”逻辑,满足任意已启用条件即可触发;着陆判断则推荐结合气压高度变化与 IMU 静止窗口,减少单一传感器误判的可能性。

image.jpg

图 2-7 飞行任务与开伞策略配置

日志配置可以选择记录任务信息、传感器数据、导航状态及融合算法诊断信息。日志项目分为必须、推荐和可选等类别,并区分正常飞行与测试用途。更完整的日志有利于后续复算和故障分析,但也会增加存储与写入负担,因此需要根据任务需求进行选择。

image.jpg

图 2-8 机载日志记录配置

遥测配置用于管理 Flight 与 Ground 之间的无线链路,以及 Ground 与电脑之间的通信接口。本例两端采用 E28-2G4M12SX,无线参数需要保持一致,地面站通过串口连接电脑。SCG 也提供 NRF24L01+ 设备选项,但由于当前协议帧长及拆包重组问题,该版本暂未开放使用。

image.jpg

图 2-9 无线链路与地面站通信配置

地面站与电脑之间还可以采用 USB CDC 虚拟串口,减少外部 USB 转串口芯片。不过,当前 F103、C071 等原生 USB CDC 方案仍处于实验性适配阶段,尚未完成通用生成流程的全部验证。具体通信协议将在第 5 章介绍。

2.4 导航算法与参数设置

校准与初始对准是导航配置的重要部分。校准用于补偿惯性传感器的零偏和部分比例误差,支持恒等校准(不额外进行采样校准)、单面校准和六面校准。初始对准则用于确定任务开始时的姿态,可使用 JY901B 等设备提供的外部四元数,也可以使用重力与已知方向构成的双矢量对准。

过去的多次测试中,双矢量对准的效果较好,因此示例工程采用该方式。由于所用 JY901B 的磁力计表现未达到预期,当前主要通过已知方向确定初始航向,后续会进一步考虑独立磁力计等其他方向参考。

image.jpg

图 2-10 惯性传感器校准与初始对准配置

SilverStar 当前提供四种导航算法:

Pure INS(纯惯性导航):通过 IMU 积分得到姿态、速度和位置,不使用外部观测持续修正。

SF6(六维固定增益融合算法):利用固定增益融合 GNSS、气压等观测,计算简单,资源占用较低。

KF6(六维卡尔曼滤波算法):估计位置和速度,通过协方差描述误差,并根据预测与观测的不确定度计算融合增益。

ESKF15(十五维误差状态扩展卡尔曼滤波算法):进一步估计姿态误差及陀螺仪、加速度计的残余零偏,能够描述更多误差来源,但需要更高的计算与存储资源。

本例选择 KF6,并采用 Coning2/Sculling2 二子样圆锥与划桨误差补偿,提高旋转运动下惯性增量的积分精度。

image.jpg

图 2-11 KF6 导航算法及参数配置

导航参数包括过程噪声、初始协方差、GNSS 测量精度及滤波门限等。配置时需要区分标准差与方差,并结合传感器性能和实际测试结果调整。SCG 提供参数说明与默认值恢复功能;推荐参数经过多次实验,在缺少充分测试依据时,可以先采用推荐参数,再根据实验数据优化。

四种算法的状态模型、误差传播与观测融合原理将在第 10 章介绍。

2.5 硬件资源配置与工程生成

完成设备与算法配置后,还需要将各个软件组件对应到 MCU 的实际引脚和外设资源。SCG 支持内置板卡配置,也允许导入自定义 STM32CubeMX 工程,并将确认后的硬件配置保存以供后续复用。

本例飞控采用 STM32F407VET6,地面站采用 STM32F103C8T6。飞控的 IMU、GNSS 和无线模块分别使用对应的串口或 SPI 资源,TF 卡则通过 SDIO 接口连接。

image.jpg

图 2-12 STM32F407 飞控硬件资源配置

对于自定义硬件,需要导入包含 .ioc、HAL 初始化代码及相关工程文件的完整 CubeMX 工程,而不仅是单独的 .ioc 文件。SCG 会分析 MCU 型号、时钟、GPIO、UART、SPI、I²C、DMA、中断等资源,并检查已知的冲突与配置缺失。由于检查无法覆盖全部电气和板级问题,生成前仍应人工核对实际原理图及外设配置。

配置完成后,可以分别生成 Flight Controller 和 Ground Station 工程,也可以根据任务需要不生成地面站工程。生成内容包括固件源码、构建文件及开发环境配置;启用机载日志时还会生成对应的 .ssdecoder 解码包,供 FLP 按实际工程配置解析日志。

2.6 固件编译与工程文件管理

SCG 生成的 Flight_Controller 和 Ground_Station 是相互独立的固件工程,可以使用 VS Code、EIDE 或命令行工具开发和编译。通常只需打开生成的 VS Code 工作区,再通过 EIDE 插件完成编译与烧录。

SCG 的构建检查页面也提供工具检测、编译和部分质量检查功能。编译需要 Arm GNU 工具链、GNU Make 以及对应的 STM32 HAL、CMSIS 等依赖,部分检查项目还需要额外工具。

image.jpg

图 2-13 SCG 固件构建与检查界面

编译成功后可得到 ELF、HEX、BIN 等文件。HEX 和 BIN 主要用于固件烧录,ELF 则保留调试信息。编译通过只能说明工程满足相应构建条件,实际运行仍需上板测试。

SCG 将工程配置与生成代码分开管理。正常重新生成时,系统会保护由使用者维护的源码,避免更新配置直接覆盖已有修改;如果需要使用新版生成模板,则应确认文件归属并完成必要的迁移。

正式测试时,建议同时保留 SilverStar.ssproject、实际烧录的固件、对应的 .ssdecoder 及原始日志,以便在 FLP 中准确还原实验环境和算法配置。

至此,Flight 与 Ground 的固件工程已完成生成和构建准备。接下来即可使用 GSHC 与实际设备通信,进行校准、任务操作和遥测数据采集。

3.GSHC 地面站操作与后期处理

GSHC(Ground Station Host Computer)是 SilverStar 的地面站上位机,负责飞控通信、实时遥测、任务命令和历史数据管理。软件分为预飞行、飞行和后期处理三个主要页面,分别对应任务准备、实时监控和数据分析。

由于 000063 测试后设备遭受较大冲击,IMU、PCB 或焊点可能受损,具体原因尚未确定,因此本章不再连接实机,主要介绍软件功能并展示此前保存的遥测数据。

3.1 连接地面站与检查通信

GSHC 通过电脑串口与 Ground 建立连接,再由 Ground 通过无线链路与 Flight 通信。本例采用 STM32F103C8T6 地面站,电脑侧串口波特率为 230400,实际使用时应与生成的 Ground 固件配置一致。

image.jpg

图 3-1 GSHC 预飞行与通信状态界面

连接建立后,GSHC 根据飞控发送的 Capability 信息识别协议和可用操作,并完成相应握手。软件将电脑与 Ground 的串口连接、Ground 与 Flight 的无线通信分别管理,因此电脑成功打开串口并不代表飞控已经在线。

出现通信异常时,可以通过链路详情查看串口收发、无线通信及飞控应答状态,结合消息时间和状态反馈判断异常发生的位置,而不只是反复尝试重新连接。

3.2 校准、初始对准与任务启动

预飞行流程主要包括传感器校准、初始姿态对准、任务准备和 START。GSHC 根据固件实际支持的功能提供相应选项。

传感器校准可以使用已有的校正参数,也可以进行单面或六面采样校准。单面校准需要保持设备静止,六面校准则要求按不同方向放置设备,以获得相应的测量数据。初始对准用于确定任务开始时的姿态,本例采用 SCG 配置的双矢量对准,其计算原理见第 10 章。

GSHC 将命令确认与执行状态分开处理:ACK 表示飞控对命令作出了响应,校准和对准是否完成仍需根据后续状态判断。只有满足任务准备条件后,才能解锁并发送 START。任务开始后,软件通常自动切换至飞行页面。

若是测试,开始前还应检查执行器连接和任务配置,避免调试过程中误触发开伞等动作。

3.3 实时遥测与任务状态

飞行页面集中展示姿态、位置、速度、任务状态和实时曲线,并通过三维火箭模型表现箭体姿态。

image.jpg

图 3-2 GSHC 飞行监控与姿态显示界面

SilverStar 将任务启动、发射、开伞和着陆等状态作为不同事件管理,GSHC 根据飞控上报的消息更新界面,而不是仅依靠高度或速度曲线判断任务阶段。

受无线带宽及协议限制,遥测更新频率通常低于飞控内部的传感器采样频率,因此实时数据主要用于监控和趋势观察,详细运动分析仍需结合机载日志。

实时曲线只显示一定时间范围内的数据,但不会因此裁剪已保存的完整遥测会话。通信中断时,界面也可能保留最后一次接收的数值,应结合消息时间和链路状态判断数据是否仍在更新。

3.4 历史会话与后期处理

GSHC 会将电脑实际接收到的遥测保存为 JSONL 会话文件,供后期处理页面独立分析。软件支持按时间范围导出任务摘要、数据表格、加速度、角速度、速度、位置及无线链路曲线,也可以生成二维轨迹和三维 GIF 动画。

image.jpg

图 3-3 GSHC 历史会话与数据导出界面

统计和处理后的数据可保存为 TXT 文件,曲线与轨迹可导出为 PNG 图片。较长的时间序列支持分页导出;三维 GIF 如果对应超过 30 s 的过程,则通过加速播放将动画时长控制在 30 s 内。

以下展示与 000062 机载日志对应的部分地面遥测结果。由于 GIF 文件较大,本文只展示二维轨迹和无线链路质量曲线,其余图表及动画保存在配套压缩包中。

horizontal_trajectory_000000.000-000135.672_ZH.png

图 3-4 000062 地面遥测二维轨迹

link_quality_000120.000-000135.672_ZH.png

图 3-5 000062 遥测会话末段无线链路质量

000062日志对应的遥测日志:

attachment iconfc_session_20261009_230035_993666_09.jsonl1.79MBJSONL0次下载

000062日志对应的遥测日志解析结果:

attachment icon2026-10-10-1.zip93.58MBZIP0次下载

历史会话可用于查看任务事件、运动变化和通信异常。但 GSHC 只能保存实际收到的数据,无法恢复无线传输过程中丢失的消息。TF/SD 卡中的机载日志属于另一条独立数据链路,通常具有更完整的高频记录,需要使用 FLP 进行分析。

第 4 章 FLP 日志分析与导出

FLP(Flight Log Processor)主要用于读取飞控保存的机载日志,展示导航状态、任务事件和相关诊断信息,并提供离线复算、结果比较及数据导FLP(Flight Log Processor)负责解析飞控保存的机载日志,展示导航状态、任务事件和算法诊断信息,并提供离线复算、结果对比及数据导出功能。

本章继续使用 SS_0_5_TEST_FINAL 工程中的 000062 日志。该日志来自手持移动与抛体测试,详细实验条件和结果将在第 6 章介绍。

4.1 打开示例工程与日志

FLP 支持打开完整的 SilverStar 项目目录,也可以单独导入机载日志及对应的 .ssdecoder 解码包。

以 SS_0_5_TEST_FINAL 为例,FLP 可以自动查找项目中的解码配置与 Log 文件夹下的日志。本章选择编号为 000062 的记录,并使用 SS_0_5_TEST_FINAL.ssdecoder 进行解析。

image.jpg

图 4-1 FLP 工程与日志导入界面

.ssdecoder 保存了对应工程的记录格式、字段、设备和算法配置信息,使 FLP 能够根据实际固件定义解析日志。不同工程或算法版本的记录格式可能不同,因此需要检查日志与解码包是否匹配,而不能仅凭文件名判断。

成功导入后,FLP 会建立相应数据集。后续的数据浏览、复算和导出不会修改原始日志。

4.2 日志概览与完整性检查

FLP 主要分为概览(Overview)、复算(Replay)、飞行(Flight)、状态估计(State Estimation)和数据浏览(Data Explorer)五个页面。

概览页面用于查看任务时长、导航结果、记录通道及事件统计,便于了解日志的整体情况。

image.jpg

图 4-2 000062 日志概览与任务统计

image.jpg

图 4-3 000062 日志概览与任务统计(续)

FLP 会检查 CRC 错误、文件截断、记录序号缺口等问题,以识别可能的数据损坏或记录丢失。不同通道还保留各自的实际时间戳,例如 IMU、GNSS 和任务事件有不同记录频率。

4.3 轨迹、速度、姿态

飞行页面用于展示位置、速度、加速度、角速度和姿态等数据。通常可以在复算页面中不改变默认选择 Recorded,即飞控实际保存的导航结果,先观察日志记录的结果,再做离线复算并与复算数据进行比较。

SilverStar 使用局部 ENU 坐标系,其中 E、N、U 分别代表东、北、上。FLP 可以将各轴运动数据表示为时间序列,也可以通过二维或三维轨迹观察运动过程。

image.jpg

图 4-4 导航速度分量变化曲线

image.jpg

图 4-5 导航位置分量变化曲线

对于姿态变化较大的运动,仅查看四元数数值不够直观。FLP 提供三维姿态模型和轨迹显示,可将箭体方向与运动路径结合观察。

image.jpg

图 4-6 FLP 三维姿态与运动轨迹显示

image.jpg

图 4-7 000062 水平运动轨迹


4.4 导航状态与质量诊断

状态估计页面主要用于分析滤波器的内部计算过程,包括误差协方差、量测创新、归一化创新平方(NIS)、GNSS 观测及其他导航诊断信息。

对于 KF6 和 ESKF15,协方差反映滤波器对自身估计误差的判断。图 4-8 展示了根据位置协方差计算的标准差,可以看到初始阶段迅速下降,之后随惯性预测和外部观测更新而变化。

image.jpg

图 4-8 KF6 位置估计标准差变化

NIS 则将量测创新与其预测协方差结合,用于检查观测与滤波模型是否一致。图 4-9 展示了 GNSS 水平位置观测的 NIS 及软、硬门限,可用于判断异常观测及量测接纳情况。

image.jpg

图 4-9 KF6 水平位置观测 NIS 及门限

FLP 还提供 GNSS 位置与速度一致性分析,通过比较位置变化和速度积分,检查接收机输出是否相互符合。根据多次实验的经验,当前水平诊断采用分时完成的统计窗口,因此结果一般呈阶梯状;竖直诊断采用逐样本累计方式,曲线通常更加连续。相关分析将在第 6 章结合测试结果展开。

对于需要进一步排查的问题,Data Explorer 可以直接查看记录通道、原始字段及时间戳,便于定位异常输入和对应的导航结果。

image.jpg

图 4-10 FLP 原始记录与字段浏览界面

4.5 离线复算与结果对比

FLP 的另一项主要功能是导航算法离线复算。软件可以使用日志中保存的惯性输入、外部观测及相关配置重新计算导航状态,以比较不同算法或参数下的结果。

FLP 区分四种主要的数据及配置来源:

Recorded:飞控实际保存的导航结果。

Recomputed:利用记录中的实际算法配置与输入重新计算。

Offline:采用对应离线算法的默认参数进行计算。

What-if:修改算法或参数,观察结果变化。

这种区分能够避免将试验参数得到的结果与飞控实际输出混淆,也便于对比不同配置的影响。

image.jpg

图 4-11 FLP 使用 ESKF15 进行离线复算

本例在同一份日志上分别进行 KF6 与 ESKF15 分析。由于 ESKF15 需要处理十五维误差状态及协方差,计算量较大,离线复算耗时也相对较长。

image.jpg

图 4-12 ESKF15 离线复算完成后的配置界面

FLP 支持保留多个复算结果,并通过主、副数据源进行轨迹、位置、速度和其他数据对比。图 4-13 展示了 000062 日志中 KF6 与 ESKF15 的全程位置估计。两者在部分时段存在较明显的差异,ESKF15 的结束位置也更接近起始位置。

image.jpg

图 4-13 000062 的 KF6 与 ESKF15 位置估计对比

测试实验位置最终接近起点,这个复算结果可以佐证 ESKF15 的定位精度更高。

此外,部分算法需要完整的初始化状态、惯性输入和参数记录。如果日志缺少必要数据,FLP 不会将推测出的配置视为真实记录。四种导航算法的数学模型将在第 10 章介绍。

4.6 数据导出与分析工程保存

FLP 支持导出 CSV 表格、PNG 图片及 GIF 动画,并可以选择数据来源、时间范围、语言和主题。对于较长的任务,时间序列图片支持分页导出,三维姿态和轨迹则可使用 GIF 展示动态变化。

image.jpg

图 4-14 FLP 数据导出配置界面

本次示例工程的完整分析结果已包含在 SS_0_5_TEST_FINAL 压缩包中,以下展示部分具有代表性的导出文件。

Flight_Replay_ZH.gif

图 4-15 FLP 三维姿态与轨迹回放动画

Trajectory_3D_ZH.png

图 4-16 000062 三维运动轨迹

Horizontal_Trajectory_000000.000-000135.672_ZH.png

图 4-17 000062 水平运动轨迹

对于需要长期保存的分析过程,FLP 支持创建 .ssflp 工程文件,记录原始日志与解码包引用、分析设置以及复算结果等信息。根据保存内容,还可以建立配套的 .ssflp.artifacts 目录,用于保存已解析和计算的数据,以减少重新打开时的重复处理,但也会增加首次保存所需的时间和空间。

重新打开分析工程后,可以继续已有的分析工作。由于工程仍依赖相应的原始日志和解码包,移动或分享时应保持文件对应关系。

至此,SilverStar 从系统配置、固件生成、地面遥测到机载日志分析的基本工作流程已经介绍完成。后续章节将进一步讨论通信协议、实际测试结果及系统的软硬件实现。

5.通信协议与数据接口

SilverStar 需要在飞控、地面站和电脑之间传递命令与遥测数据,同时将运行过程中的重要信息保存下来。不同数据的用途、传输条件和记录频率并不相同,因此系统分别设计了 AIR、GSP、维护串口和 SSLOG 等协议。

本章主要介绍 AIR、GSP、维护串口及 SSLOG 的协议分工、数据结构和通信机制。完整字段定义与实现细节可参考项目 GitHub 仓库中 docs/public/GSHC、docs/public/FLP 和 docs/public/shared 目录下的协议文档。

5.1 通信结构与协议分工

SilverStar 的通信系统可以分为空地通信、电脑通信、设备维护和机载日志四个部分。

空地通信采用 AIR 协议,负责 Flight 与地面端之间的遥测和控制命令。飞控通过无线模块发送状态信息,地面站接收后转发给电脑;电脑发出的命令则沿相反方向传输。

地面站与电脑之间采用 GSP 协议。它负责在串口或 USB 虚拟串口等字节流接口中封装消息,并传递地面站自身的通信状态。Ground 主要承担数据转发工作,不负责解释飞控的任务逻辑。

维护串口是另一套独立接口,使用文本命令直接查询飞控的配置、设备和运行状态,适合硬件调试与故障诊断。SSLOG 则用于将飞控运行过程中的数据写入存储介质,供 FLP 在任务结束后进行分析。

file_0000000002388230837abd2001c63250.png

图 5-1 SilverStar 通信协议与数据接口架构

这几种协议可以同时存在,但各自用途不同。例如,GSHC 接收到的是无线链路传输的遥测消息,而 FLP 读取的是飞控保存的机载日志,两者的数据内容和更新频率并不完全相同。

5.2 AIR:飞控与地面站的遥测和命令

AIR 是 SilverStar 的空地应用层协议,当前采用 M0(wire Profile 0)。考虑到小功率、远距离无线通信的带宽限制,M0 使用固定长度的二进制消息,避免通用可变长帧头带来的额外开销,并通过定点数压缩等方式减少数据量,例如将四元数的四个分量分别编码为 int16_t。不同消息根据内容采用 9、26 或 50 字节的固定帧长,应用层不额外添加 CRC 字段。

AIR M0 的主要消息包括以下几类:

FLIGHT_STATE:任务开始后的飞行状态,包含姿态、速度和位置等信息,长度为 50 字节。

PREFLIGHT_STATE:任务开始前的主要状态与惯性、姿态信息,长度为 26 字节。

CAPABILITY、PREFLIGHT_STATUS 和 SENSOR_STATUS:用于能力识别、准备状态和传感器信息,均为 9 字节。

STATUS:用于发送校准、对准和任务事件等状态变化,长度为 9 字节。

CMD 和 ACK:分别用于发送控制命令及返回命令处理结果,均为 9 字节。

正常运行时,预飞行状态和飞行状态采用周期发送方式,当前 M0 的主状态计划频率为 5 Hz。能力识别、传感器快照和任务事件则按照各自的触发条件发送,实际接收间隔还会受到无线链路和发送队列的影响。

file_00000000b50481f7ab91e2ba49566f0e.png

图 5-2 AIR M0 数据帧结构

GSHC 连接飞控后,首先通过 CAPABILITY 完成协议和能力识别,再根据飞控返回的信息开放相应操作。系统支持 START、LOCK、UNLOCK、校准和初始对准等命令,但具体命令是否允许执行仍取决于飞控当前状态。

AIR M0 使用小端字节序和明确规定的字段长度,不直接传输 C 语言结构体的内存布局。其 9~50 字节应用层消息由无线传输层作为载荷发送。当前 E28-2G4M12SX 使用 SX128x 的 LoRa 数据包模式,启用了显式包头与硬件 CRC,由无线芯片完成空口数据包的封装和完整性检查,因此 AIR 应用层不再重复设置 CRC。无线包的实际长度除 AIR 载荷外,还取决于 LoRa 物理层的包头、同步和校验配置;这些部分并非 AIR 应用协议字段。如果未来更换无线传输方式,仍需由新的传输层提供相应的完整性保护。

需要注意,AIR M0 主要传输实时监控所需的数据,并不包含全部导航诊断或高频传感器记录。历史实验中曾设计 NAV_CAPABILITY、NAV_PREPARATION 和 NAV_HEALTH 等扩展消息,但 v0.1.2 的常规发送仍采用原有 M0 八类报文,详细导航信息主要通过维护接口和机载日志获取。

5.3 GSP:地面站与电脑的数据封装

当前 GSP-MIN 数据帧由帧头、消息类型、数据长度、有效载荷和 CRC16 校验组成。帧头固定为 A5 5A,随后为 1 字节消息类型、1 字节载荷长度和最多 64 字节的有效载荷,末尾使用 2 字节 CRC16/CCITT-FALSE 校验。CRC 覆盖消息类型、长度和有效载荷,不包含帧头;校验多项式为 0x1021,初始值为 0xFFFF。注意 GSP 和 AIR 属于不同协议层,GSP CRC 只保护 Ground 与电脑之间的封装数据。

file_000000009538823082592ec29266fbc5.png

图 5-3 GSP-MIN 数据帧结构

GSP 的主要消息包括地面站状态 GS_STATUS、无线接收数据 AIR_RX、无线发送请求 AIR_TX,以及本地通信确认 ACK。

例如,当 Ground 收到飞控的 AIR 遥测帧时,可以将原始 AIR 数据放入 AIR_RX 消息,并附带可用的 RSSI、SNR 等无线接收信息,再通过电脑接口发送给 GSHC。GSHC 先解析 GSP 外层,再将其中的 AIR 帧交给相应协议处理模块。

反过来,GSHC 发出命令时,Ground 通过 AIR_TX 接收相应数据,并交给无线模块发送。Ground 不需要重新解释或修改 AIR 命令内容。

因此,AIR 与 GSP 可以理解为不同层次的协议:AIR 描述飞控与上位机之间的业务消息,GSP 则负责将这些消息可靠地组织在电脑与地面站之间的字节流中。

5.4 维护串口:配置、查询与诊断

除无线遥测外,SilverStar 还提供独立的维护串口协议,方便开发者使用串口终端直接检查飞控。

维护协议采用 ASCII 文本形式,命令使用大写英文关键词,以空格分隔,并以换行结束。与 AIR 的二进制遥测不同,维护命令可以直接阅读和输入,更适合调试过程。

例如,可以发送 SYSTEM STATUS 查看系统状态,使用 SYSTEM READY 查看准备条件,通过 IMU 0 STATUS 查看惯性传感器状态,或使用 GNSS 0 SAMPLE DETAIL 查看 GNSS 当前的定位与质量信息。LOG STATUS 则可用于检查日志存储状态。

file_00000000e8f88230b57df2e3961e65e8.png

图 5-4 维护串口协议结构与示例

维护协议将系统模块与设备实例区分开来。SYSTEM、CAL、ALIGN 和 ESTIMATOR 等属于系统级命令;IMU、GNSS、BARO 等设备能力则需要指定实例编号,例如 IMU 0 或 GNSS 0。对于支持多个实例的配置,可以先使用相应模块的 LIST 命令查看当前实际存在的设备。

维护接口还可以查询设备配置,但需要区分软件配置与硬件实际状态。例如,GNSS 0 CONFIG SHOW 展示软件侧保存的有效或目标配置,而 GNSS 0 CONFIG READ 则会尝试从真实 GNSS 硬件读取配置。两者不能直接视为同一结果。

多数状态查询不会改变设备运行状态,部分校准、配置应用及任务命令则可能改变系统行为。因此,使用维护串口时也应注意命令权限及任务阶段。完整命令列表见仓库中的 MAINTENANCE_XXXXXXXXXXX。

5.5 SSLOG 与 .ssdecoder:机载日志与解码

SSLOG 是 SilverStar 的机载日志格式,用于保存传感器、导航、任务状态和系统诊断等运行数据。

当前 SSLOG 0.0 容器由 64 字节文件头及后续记录组成。每条记录包含 24 字节公共记录头、实际数据载荷和 4 字节 CRC32 校验。记录头中保存记录类型、版本、长度、序号、时间戳和有效性等信息。

与实时遥测相比,SSLOG 可以根据项目配置记录更多数据,例如惯性测量、GNSS 原始观测、滤波器状态和任务事件等。具体记录哪些内容,由 SCG 中的日志配置和实际生成的固件决定。

由于不同设备和算法具有不同的数据字段,仅识别 SSLOG 容器还不足以解释全部记录。因此,SCG 在生成启用日志的 Flight 工程时,会同时生成 .ssdecoder 解码包。

当前 .ssdecoder 1.2 是一个包含声明式数据的 ZIP 格式文件,主要由 manifest.json、record_catalog.json、project_semantics.json、checksums.sha256 和 XXXXXXXXX 构成。它描述各类记录的结构、字段含义、设备实例和项目配置,而不包含需要在 FLP 中执行的程序代码。

file_000000005e3c8230a5a5ab893af12652.png

图 5-5 SSLOG与.ssdecoder的匹配关系

FLP 打开日志时,会根据日志中的 Descriptor 检查解码包的格式、记录目录、项目语义和生成身份。只有精确匹配,才能继续将对应数据解析成可供分析的通道。

这种方式使日志格式可以随着设备和算法扩展,而不必要求 FLP 为每一种工程预先写死一套解析规则。同时,日志中的记录序号、时间戳和 CRC 也为检查数据完整性提供了依据。

5.6 命令确认、执行状态与异常处理

SilverStar 的命令发送涉及多个通信环节,因此需要区分消息已经发送、得到确认以及实际执行完成这几种情况。

以 GSHC 向飞控发送命令为例,电脑首先通过 GSP 将 AIR 命令交给 Ground,Ground 再通过无线模块发送给 Flight。Ground 返回的 GSP ACK 只能说明本地这一段请求的处理结果,并不代表飞控已经收到命令。

当 Flight 收到并处理 AIR 命令后,会通过 AIR ACK 返回对应命令的序号及处理结果。ACK 可能表示接受,也可能返回 BUSY、BAD_STATE、REJECTED 等错误。

即使 AIR ACK 返回 OK,也不意味着相关操作已经全部完成。例如,开始校准或初始对准后,飞控还需要采集数据、执行计算并更新准备状态。GSHC 应继续等待相应的状态消息,而不是收到 ACK 后立即认定操作成功。

file_00000000d7f08230a26dc6593c76c169.png

图 5-6 命令发送、确认与执行状态

对于通信超时,软件可以按照协议规定进行有限重试,并通过后续状态消息确认命令结果。如果通信中断后重新连接,则应重新检查当前会话和设备状态,避免将上一会话的确认结果误用于新的操作。

当前 AIR M0 主要面向低功率、远距离的遥测通信,CMD 帧固定为 9 字节,其中除消息类型和序号外,其余 7 字节用于命令标识、token 和参数。考虑到 M0 采用 PREFLIGHT_ONLY 命令策略,上行命令仅在任务开始前处理;START 后飞控不再解析、执行或确认上行 CMD,飞行过程不依赖持续的地面控制。任务前的命令通过无线链路 CRC、AIR ACK、状态反馈和有限重试保证基本可靠性,因此当前未额外加入 BCH 等前向纠错编码。不过,任务前命令仍可能受到丢包和通信中断影响,实测的确会出现,但是在当前设计的流程中不影响后续的任务。后续 M1 等协议可在保持帧开销可控的前提下,评估前向纠错、更完整的命令可靠传输及其他机制。

此外,CRC 主要用于检查传输过程中的数据损坏,命令 token 用于降低格式错误或误触发的风险。它们并不等同于加密或身份认证,实际系统仍需结合通信环境与操作权限进行设计。

5.7 协议版本与兼容扩展

SilverStar 将软件产品版本与各类协议版本分别管理。v0.1.2 是整套软件的发布版本,而 AIR M0、维护协议 0.0、SSLOG 0.0 和 .ssdecoder 1.2 分别描述不同接口的格式与兼容关系。

这种设计允许软件、硬件和算法分别升级,而不必在每次更新时都修改所有协议。例如,更换一种 IMU 或增加普通传感器实例时,可以继续使用 AIR M0 已有的 SENSOR_STATUS 结构传递设备状态;只要没有改变现有消息格式,就不一定需要新的 AIR Profile。

对于日志,新增记录类型或修改记录结构时,可以通过新的记录版本和 .ssdecoder 描述其含义。FLP 仍会依据匹配关系选择解析方式,而不会仅凭产品版本或相似文件名推断兼容。

如果未来需要修改无线应用层的整体封装、引入多机寻址、前向纠错或新的认证机制,则可以在 M1 等后续协议中重新设计相关结构。通过独立管理产品版本、协议版本和日志定义,SilverStar 能够在逐步扩展硬件与算法的同时,保留已有设备和历史数据的兼容关系。

6.实测记录与结果分析

在完成系统配置和软件功能介绍后,本章结合 SilverStar 的实际测试记录,展示飞控在真实运动条件下采集的数据,以及使用 FLP 对导航结果进行分析的方法。

本章以 SS_0_5_TEST_FINAL 工程中的 000062 日志为主要案例,并结合其他测试记录介绍 GNSS、导航估计和任务状态中观察到的现象。

6.1 测试条件与数据来源

2026 年 10 月 9 日,SilverStar 使用与本次发布对应的 SS_0_5_TEST_FINAL 工程进行了多次室外测试。测试地点为大沙河河堤,主要采用手持移动和短时抛体等方式,使飞控经历静止、平移、转动及短时加速,观察传感器采集、惯性导航、GNSS 融合、遥测和日志记录等功能。

飞控采用 STM32F407VET6,搭载 JY901B 惯性测量模块、NEO-M9N GNSS 接收机和 E28-2G4M12SX 无线模块,地面站使用 STM32F103C8T6。导航算法选择 KF6,惯性机械化采用 Coning2/Sculling2 二子样补偿。测试硬件如图所示,PCB 主要用于实验室开发和不同 MCU 的对比测试,并非最终上箭版本。配套测试支架通过三维建模和打印制作,相关硬件工程将在第 8 章介绍。

IMG_20261012_130711.jpg

图 6-1 飞控 PCB 与实验测试支架

IMG_20261012_130717.jpg

图 6-2 STM32F407 核心板

IMG_20261012_130728.jpg

图 6-3 地面站外壳与无线天线

IMG_20261012_130740.jpg

图 6-4 STM32F103 地面站内部结构

本次保存的主要任务记录包括 000060、000061、000062 和 000063。每次任务具有独立的原始日志,记录了传感器数据、导航结果、状态变化及部分系统诊断信息。

这些日志见附录D和文末原始数据,读者可以按照第 4 章的方法,使用匹配的 .ssdecoder 在 FLP 中打开。

6.2 000062:轨迹与任务过程

000062 是本章的主要分析案例。该任务记录了较完整的运动过程,可以同时查看位置、速度、高度、GNSS 质量以及任务事件等信息。

日志解析后共接受 103668 条记录,CRC 错误、文件截断和记录序号缺口均为 0。这表明本次保存的文件具有良好的记录完整性,为后续分析提供了较完整的数据基础。

image.jpg

图 6-5 000062 导航速度变化

image.jpg

图 6-6 000062 导航位置变化

image.jpg

图 6-7 000062 三维姿态与轨迹

image.jpg

图 6-8 000062 水平运动轨迹

从 Recorded 导航结果可以看到,任务在 START 后逐渐离开初始位置,经历了一段较明显的水平运动和姿态变化。

本次记录的最大水平半径约为 161.78 m,出现在 START 后 69.36 s 左右;最大导航速度约为 6.33 m/s,最高记录高度约为 3.89 m。对应的 GNSS 参考水平半径最大约为 162.90 m。

任务中还记录了开伞与着陆相关状态事件。其中开伞事件发生在 START 后约 69.65 s,着陆确认发生在约 135.67 s。这些事件来自飞控的任务状态机,用于说明程序在相应时刻做出了什么判定,并不代表本次手持测试中实际完成了火箭开伞动作。

image.jpg

图 6-9 开伞事件及触发信息

image.jpg

图 6-10 着陆判断

值得注意的是,着陆确认附近的导航速度仍约为 2.30 m/s,而测试中飞控实际已回到起点附近约 1 m 的范围内,说明任务状态与导航估计之间存在一定差异。KF6 的六维状态仅包含位置和速度,不估计姿态误差及 IMU 残余零偏,因此在长时间转动或剧烈运动后,姿态误差可能持续影响惯性速度增量,使导航结果出现漂移。该现象也可能与 GNSS 观测质量、融合权重及其他误差来源有关,需要通过后续实验进一步区分。

为了分析这一问题,使用 FLP 对同一份日志进行了 ESKF15 离线复算。图中展示了最后 30 s 的速度与位置变化。两种算法在竖直方向上的结果差异较小,但水平方向存在明显区别,其中 ESKF15 的末段位置更接近实际测试的起点。这说明 ESKF15 对姿态误差和残余零偏的联合估计具有一定的应用价值,但仍需要独立参考轨迹及更多动态测试,才能进一步量化两种算法的定位精度差异。

image.jpg

图 6-11 KF6 与 ESKF15 末段速度对比

image.jpg

图 6-12 KF6 与 ESKF15 末段位置对比

这里可以得出ESKF15在剧烈姿态变化和长导航时间下有很大价值。

6.3 GNSS 质量与导航诊断

GNSS 是 KF6 位置和速度修正的重要外部观测来源,其实际数据质量会直接影响导航结果。

000062 共记录了 3391 个 GNSS_NATIVE 样本,其中 842 个样本的位置质量标记为不可用,约占 24.83%。这说明 GNSS 接收机虽然持续输出数据,但部分时段未能提供满足导航融合条件的位置结果。测试中曾多次改变飞控姿态,可能导致天线朝向和卫星接收条件发生变化;周围环境中的多路径反射也可能产生影响,但现有记录尚无法确定具体原因。

KF6 在使用 GNSS 观测时,还会根据有效性、测量不确定度和 NIS 等条件决定是否进行更新。000062 中记录了 80 次竖直位置量测的 NIS 拒绝,说明部分观测未能通过对应的滤波门限。图中展示了 000062 日志中 GNSS 竖直位置观测的 NIS 变化及对应门限。

image.jpg

图 6-13 GNSS 竖直位置量测 NIS

除常规量测诊断外,SilverStar 还通过比较 GNSS 水平位置变化和速度积分,检查接收机内部数据的一致性。当前采用两个长度为 10 s、起点错开 5 s 的水平统计窗口,计算窗口内的位置变化与速度积分之间的闭合差。当闭合差超过设定范围时,系统会相应放大 GNSS 水平位置量测的协方差,降低该观测对 KF6 的影响。

这一机制来自开发过程中观察到的 GNSS 位置与速度不一致现象,可能与多路径反射及接收机不同测量量的误差特性有关。此前测试中,竖直方向采用类似方法未观察到明确改善,因此当前仅将该策略用于水平位置。每个窗口完成后更新一次闭合差和方差倍率,其余时间保留最近的有效结果,因此 FLP 中的水平诊断曲线呈阶梯状,而不是每个 GNSS 样本都产生新的统计结果。

000062 共得到 26 次有效窗口完成记录,最大水平闭合差约为 15.72 m,对应的窗口位置方差倍率约为 2.47。这表示系统在该窗口内发现 GNSS 位置变化与速度积分之间存在一定差异,并据此提高相应位置观测的不确定度。

image.jpg

图 6-14 GNSS 水平位置与速度积分一致性诊断

FLP 还提供竖直方向的位置与速度积分一致性诊断,但它使用逐样本累计和局部参考重置方式,与水平窗口的统计方法不同。因此,两类图像的外观和数值不能直接作为水平、竖直导航精度的对比。

6.4 其他测试记录与历史对照

除 000062 外,本次测试中的其他日志也记录了一些值得关注的现象。

000060 在 START 前未能建立有效的 GNSS 位置原点,任务开始后因此无法正常进行 GNSS 位置融合,随着运动时间增加,缺少外部位置修正的惯性导航结果出现明显漂移。这反映了当前预飞流程中的一个遗留问题:GNSS 接收机在线并不代表导航原点已经建立,任务开始后即使重新获得有效定位,也不会自动更改已经冻结的导航原点。

目前可以在初始对准结束后适当等待,并确认 GNSS 原点已准备完成再启动任务;此前测试中等待约 5 s 可以完全避免这一问题。后续计划进一步完善预飞行准入和状态提示,使这一问题不再依赖使用者主动规避。

000061 可以作为本轮其他运动记录的参考。由于具体运动路径和姿态变化并未通过独立设备同步记录,分析时更适合检查日志和导航状态的变化,而不宜仅根据轨迹形状与 000062 比较算法精度。

000063 中观察到了较早的 LAND 判定,日志中的静止条件确认窗口约为 3.00 s。该次测试同时经历了较剧烈的碰撞,后续设备检查及测试出现了一些异常,通过维护串口获取的信息把错误指向了IMU,因此怀疑 IMU、PCB 或焊接连接受到损伤。

项目还保留了历史编号 000028 的外场日志,该记录来自不同的软件版本与测试过程,最大水平半径约为 227.57 m,末段导航残余速度约为 3.57 m/s。由于部分算法实现和导出格式经过调整,本文保留该次测试的原始导出图,并提供对应的 SS_0_5_TEST_5 工程及解码配置,供读者按当时的版本和数据条件进行分析。

attachment iconSS_0_5_TEST_5.zip196.57MBZIP0次下载

Flight_Replay_ZH.gif


图 6-15 000028导出的姿态与三维轨迹GIF

Trajectory_3D_ZH.png

图 6-16 000028导出的三维轨迹

Horizontal_Trajectory_000000.000-000347.784_ZH.png

图 6-16 000028导出的水平轨迹

6.5 测试总结与后续改进

通过本轮测试,SilverStar 获得了较完整的实际运动数据,并完成了机载日志记录、精确解码、导航曲线展示和多项状态诊断。KF6 在测试过程中形成了可供分析的导航结果,FLP 也能够利用这些数据进一步查看 GNSS 质量、融合情况和任务事件。

与此同时,测试发现了一些值得继续研究的问题,包括 GNSS 原点未建立时的导航漂移、部分 GNSS 观测被拒绝、着陆判定与导航残余速度之间的差异,以及不同运动条件下的估计稳定性。

后续将主要围绕以下方向完善:

预飞准备与导航可靠性:完善 GNSS 原点准入、导航状态检查和异常提示,继续研究 GNSS 质量变化、观测降权与失联恢复机制。

动态测试与算法验证:引入更可靠的参考轨迹,并尝试结合 AI、机械臂及其他运动平台开展自动化室内测试,进一步比较不同导航算法的表现。

高性能硬件与导航拓展:评估 STM32H7 等 MCU,优化 ESKF15 的实时运行能力,完善杆臂补偿和相关传感器支持。

实际飞行测试:推动航电系统在辰星引力后续的小型探空火箭任务中进行飞行验证,并根据实际飞行记录改进设计。

仿真与控制研究:规划名为 TreeDiagram(树状图)的仿真软件,逐步研究有控探空火箭的导航与控制方案。

总体而言,这些记录展示了 SilverStar 从传感器采集、导航计算到日志分析的完整工作过程,也为后续改进提供了实际数据依据。导航算法的数学模型、误差传播和融合方法将在第 10 章详细介绍。

7.常见问题与排查

在配置、编译、通信和日志分析过程中,可能遇到软件无法启动、设备连接失败、任务准备不完成或日志解析异常等问题。本章整理了一些常见现象及其排查方法,帮助使用者快速定位问题。

排查时建议先确认具体出错的环节,再检查对应的配置、状态和提示信息。尽量保留首次出现的错误,而不是在不清楚原因的情况下反复修改多个参数。

7.1 软件启动与文件路径

如果 SCG、GSHC 或 FLP 无法正常启动,首先确认下载的是适用于当前系统的 Windows 便携版,并且已经将整个压缩包完整解压。

三个 EXE 需要与共用的 _internal 等目录保持原有关系,不能只复制可执行文件,也不要随意删除其中的依赖。便携版已经包含运行所需的 Python 环境,正常使用不需要另外安装 Python。

软件和项目应放在具有读写权限的目录,避免因系统权限或路径长度限制导致保存失败。GSHC 默认将数据保存在 D:\SilverStar_GSHC_Data,也可以在软件设置中更换目录,或通过 SILVERSTAR_GSHC_DATA_ROOT 环境变量指定。FLP 处理较大的分析工程时,建议使用较短的项目名称和目录路径,以减少 Windows 路径长度问题。

7.2 SCG 配置、生成与编译

SCG 无法生成工程时,首先检查配置页面或生成检查中显示的错误信息。常见问题包括设备缺少必要的数据来源、外设资源冲突、硬件配置不完整,以及所选 MCU 与功能组合不匹配。

例如,两个独立设备不能在没有相应共享机制的情况下同时占用同一独占串口。对于自定义 CubeMX 工程,还需要检查 MCU 型号、封装、时钟、GPIO、DMA 和中断等配置,确保软件中的资源绑定与实际工程一致。

如果问题出现在编译阶段,则应先确认 Arm GNU 工具链、GNU Make 和对应的 HAL/CMSIS 文件是否齐全,并查看编译输出中最早出现的实质错误。

需要区分工程生成与固件编译。生成成功只能说明 SCG 已经输出相应源码和构建文件,并不代表这些文件已经完成编译或能够直接烧录。

对于已经修改过源码的项目,SCG 正常重新生成时会保护由使用者维护的文件,不会强制覆盖全部源码。但如果某次更新涉及生成模板或已有组件的实现,需要确认实际工程是否已经应用对应修改,不能仅根据 SCG 的版本判断。对于普通硬件与任务配置,建议优先使用 SCG 提供的配置功能;需要修改源码时,则应通过 Git 等版本管理工具保留修改记录,便于后续升级和排查。

7.3 地面站连接与通信异常

GSHC 无法连接设备时,可以按照电脑串口、Ground、无线链路和 Flight 的顺序逐层检查。

首先确认电脑识别到了正确的串口,端口没有被其他软件占用,通信参数与实际 Ground 固件一致。本例地面站使用 230400 波特率,但其他硬件应按其生成配置设置。

如果电脑已经收到 Ground 状态,却始终没有飞控信息,可以进一步检查两端无线模块的型号、频率、调制参数和天线连接,并观察地面站的发送、接收及错误计数。

如果可以收到飞控数据,却无法完成握手或发送命令,则应查看 Capability 信息、AIR 协议兼容性和命令反馈。GSHC 的“飞控 AIR 链路”详情可以展示多层通信状态,有助于区分本地串口正常、无线发送失败或飞控未应答等情况。

image.jpg

图 7-1 GSHC 空地链路与通信诊断信息

如果 START 前通信正常,但 START 后遥测突然停止,应结合 Ground 是否继续运行、Flight 是否仍在发送、无线错误计数和固件任务状态进行分析。此前在 STM32F407VET6 上运行 ESKF15 时,曾出现 START 后遥测停止的情况,排查发现导航任务计算负荷较大,影响了其他任务的执行。

对于计算量较大的导航配置,需要重点检查各任务的执行时间、优先级、栈空间和 CPU 负荷。可以通过优化算法计算、减少不必要的重复运算或调整任务调度改善性能;如果硬件资源仍不足,再考虑使用更高性能的 MCU。相关固件运行机制将在第 9 章介绍。

7.4 校准、初始对准与 START

如果校准长时间无法完成,首先确认当前使用的校准模式及其操作条件。

单面和六面校准需要满足相应的姿态、静止时间及测量质量要求。若设备仍在运动、放置方向错误或采样间隔异常,飞控可能继续等待有效数据。可以结合 GSHC 的诊断提示或维护串口中的 CAL STATUS、CAL DETAIL 查看原因。

需要注意,选择默认校正(NONE)与完成单面、六面采样校准并不是同一个过程。最终是否 READY,应以飞控实际返回的校准状态为准。

如果初始对准无法完成,应先确认校准已经就绪,并检查当前对准方法所需的传感器及参考条件。对于双矢量约束等方法,还需要确保给定方向与实际放置情况一致。

如果完成初始对准后移动了设备,系统可能将对准状态标记为 STALE。此时需要在合适的静止条件下重新执行初始对准,不能仅因为设备后来恢复静止就直接使用旧结果。

START 按钮无法使用或命令被拒绝时,应检查 Capability 握手、校准、对准、解锁和系统准备状态,并根据实际返回的错误原因定位问题。

如果 START 命令出现 ACK 超时,也要观察是否已经收到 MISSION_START 或任务开始后的 FLIGHT_STATE。部分情况下,飞控可能已经执行 START,只是确认消息未能及时到达,因此不宜在未检查任务状态时反复发送命令。

7.5 GNSS 与导航异常

GNSS 问题需要区分设备是否在线、是否获得定位、观测能否用于导航,以及融合器是否真正接受了观测。

例如,GNSS 模块能够持续发送数据,并不意味着已经具有有效的位置和速度。可以通过 GNSS 0 STATUS、GNSS 0 SAMPLE DETAIL 或 ESTIMATOR GNSS 查看接收机状态、有效字段、观测质量和融合情况。

在室内环境中,GNSS 无法正常定位较为常见。如果所选导航与任务配置允许,可以在没有有效 GNSS 的条件下进行相应惯性与气压功能测试,但不能将这种测试等同于完整 GNSS 融合测试。

如果 START 前没有建立有效的 GNSS 原点,本次任务可能无法使用 GNSS 位置融合,任务开始后也不会自动重新建立原点。000060 日志曾出现这一问题,具体情况见第 6.4 节。因此,任务启动前应检查实际 GNSS 原点准备状态,而不能只确认接收机在线。

如果 GNSS 已经有效,但融合结果仍没有明显修正,则需要继续查看估计器状态、NIS 拒绝和观测时间等信息。某些观测可能由于质量或统计门限未被接受,而不是通信链路出现问题。

对于明显的惯导漂移,还应检查 IMU 安装方向、校准、初始姿态、重力补偿、实际采样间隔和惯性数据质量。不同原因可能产生相似的轨迹现象,需要结合原始数据和诊断信息区分。

7.6 FLP 日志导入、复算与导出

如果 FLP 无法打开日志,首先确认输入的是机载 .BIN 或 .sslog 文件,而不是 GSHC 的 JSONL 遥测会话,并检查是否使用了匹配的 .ssdecoder 解码包,SilverStar 要求日志中的 Descriptor 与解码包精确对应。

如果日志能够打开但某些曲线没有数据,可以先查看通道列表、实际记录数量、有效时间范围和完整性诊断,确认对应数据是否真实存在。

CRC 错误、文件截断和记录序号缺口是不同的问题。FLP 可以在一定条件下继续读取损坏区间之后的有效记录,但无法恢复原本没有写入或已经损坏的数据。

如果离线复算显示不可用,应检查所选算法是否具备必要的原始输入、初始状态、实际参数和操作记录。不同算法需要的日志内容不同,日志能够正常显示 Recorded 结果,并不代表一定可以完整复算所有算法。

如果导出的图片缺少某段曲线,也应检查数据来源、时间范围和通道有效性。部分空白可能来自真实的记录间断,而不是绘图故障。

对于保存工程或批量导出时的长时间操作,可以观察进度阶段和处理数量。GIF 动画及大型数值工件可能需要较长处理时间;只有完成最终保存后,才应认为相应文件已经成功生成。

7.7 问题反馈与资料准备

如果按照上述方法仍无法定位问题,欢迎通过 SilverStar GitHub 仓库提交 Issue,也可以在本文评论区、通过私信或邮件反馈。

反馈时建议说明使用的软件版本、目标 MCU 和板卡、具体配置、操作步骤,以及预期结果与实际现象。如果出现错误提示,应尽量保留完整文字,并说明问题发生在启动、生成、编译、通信还是日志分析阶段。

对于 SCG 的问题,可以附上项目配置和相关生成或编译信息;对于 GSHC 的问题,可以附上必要的通信状态、错误计数和会话记录;对于 FLP 的问题,则建议提供原始日志、匹配的 .ssdecoder,以及出现异常的页面和数据范围。

公开提交日志或工程文件前,应检查其中的位置坐标、设备信息及其他不希望公开的内容。相比单独提供异常截图,完整的复现步骤、配置和相关日志通常更有助于确定问题原因,也便于开发者复现与修复。

第二部分:硬件与实现

8.PCB 与硬件设计

PCB 是电子系统的硬件基础,其设计质量直接影响供电稳定性、信号完整性、测量精度和设备可靠性。对于探空火箭航电系统,电路板还需要适应加速度、振动、冲击及环境温度变化等条件,因此在满足基本电气功能的同时,还应充分考虑机械结构、装配和故障恢复。

本章首先介绍常见嵌入式电子系统的 PCB 设计规范与建议,再结合 SilverStar 项目中的四套硬件工程,说明不同阶段的设计思路。其中 SSFC0.5 和 SSGS0.5 主要用于实验与开发,SSFCm0.5 和 ssopcb 则面向更加紧凑的集成安装需求。

8.1 PCB 设计规范与建议

PCB 的设计质量直接影响电源稳定性、信号完整性、测量精度及设备可靠性。对于探空火箭航电系统,还需要考虑振动、冲击、温度变化和机械安装等条件。以下结合常见 MCU、传感器和无线通信电路,简要介绍 PCB 设计中需要注意的主要问题。具体参数仍应以器件手册、参考设计和制造商工艺要求为准。

一、明确系统需求与接口分配

绘制原理图前,应先确定 MCU、电源、传感器、通信、存储及执行器等模块的需求,包括供电电压、通信速率和接口数量,并检查 GPIO 复用、DMA、中断及定时器通道是否存在冲突。部分 MCU 外设只能使用指定引脚或 DMA 通道,如果在布线完成后才发现资源不兼容,可能需要重新设计 PCB。

对于后续可能增加的功能,可以适当预留接口和 GPIO,但应在扩展能力、面积与成本之间取得平衡。

二、电源架构与负载预算

电源设计需要考虑输入电压范围、各路负载的持续电流与峰值电流,尤其是无线发射、存储写入和执行器动作时的瞬态负载。稳压器及供电线路能力不足,可能引起 MCU 复位、传感器通信异常或日志写入失败。

LDO 适合部分压差较小、功率较低的场景,但需要关注压差和发热,其功率损耗可近似写为:

P ≈ (Vin − Vout) × Iout

例如,5 V 降至 3.3 V、输出电流为 300 mA 时,损耗约为 0.51 W。对于较大压差或电流,DC-DC 通常具有更高效率,但需要处理开关噪声及布局问题。关键逻辑电源与大电流执行器供电也应合理分配,并根据需要加入短路、反接和过流保护。

三、去耦电容与电源完整性

MCU、传感器及无线模块的电源引脚附近应按照数据手册配置去耦电容,并尽量缩短电源与地的连接路径。小型陶瓷电容主要用于降低高频供电阻抗,较大的储能电容则有助于应对相对较慢的负载变化。

以 STM32F407 为例,普通 VDD 引脚、VCAP、VDDA、VREF 及 VBAT 等引脚具有不同的供电要求,不能采用完全相同的处理方式。同时,还需考虑陶瓷电容的直流偏压效应,以及稳压器对输出电容和 ESR 的要求,电容并不是越大越好。

四、接地、PCB 层叠与电流回流

变化较快的信号需要连续、低阻抗的回流路径。建议尽量使用完整的 GND 参考平面,避免高速信号跨越地平面分割区域,否则回流电流绕行可能增加电磁干扰。

对于包含射频、高速接口和敏感传感器的 PCB,可以考虑四层或更多层结构,例如顶层信号、内层完整 GND、辅助电源与信号层、底层信号。双层板也应合理铺铜和设置接地过孔。模拟、数字及功率部分可以在布局上分区,但不宜不加分析地将地平面切开。

五、走线宽度、间距与过孔

电源走线应根据最大电流、铜厚、允许温升和压降确定线宽;高速及射频走线还需考虑特性阻抗。普通短距离 GPIO、UART 等信号通常不需要严格阻抗控制,但仍应检查接口电平和干扰条件。

过孔能够用于正常的跨层布线,但会引入寄生参数。高速或射频信号换层时,应注意参考地和回流路径的连续性。泪滴可以改善部分焊盘与细走线连接处的制造裕量,但不能替代合理的阻抗及机械设计。

六、SPI、I²C、UART 与 SDIO 等数字接口

SPI 应关注时钟线长度、信号边沿、参考地和必要的串联阻尼;I²C 需要按照总线电容和通信速率选择上拉电阻;UART 在跨板连接时应注意电平兼容、共地和线缆干扰,必要时改用差分接口。

SDIO/SDMMC 连接 TF/SD 卡时,需要关注时钟完整性、连续参考地、走线长度及各信号间的时序关系。信号可以通过过孔换层,短距离、较低速率的接口也不一定需要严格等长;但高速模式应进一步检查传播延迟差异和信号质量。卡座还应具有足够的机械固定能力,避免振动中接触不良。

七、无线通信与射频布局

无线模块与天线之间的射频馈线通常需要按 50 Ω 目标阻抗设计。实际线宽取决于 PCB 层叠、介质厚度、铜厚、参考地及共面地间隙,可使用板厂阻抗计算工具进行设计,并结合需要进行实测。

如果使用接地共面波导,馈线两侧地铜应通过接地过孔与参考地连接。对于集成 PCB 天线的模块,则应遵守厂商规定的天线净空区和地平面要求。金属外壳、电池、螺钉及线缆也可能影响天线性能,因此需要在实际装配状态下验证通信效果。

无线模块的发射电流可能产生较大的瞬态变化,供电去耦和射频布局也应与传感器及主控部分协调设计。

八、GNSS 天线与接收机布局

GNSS 信号较弱,应尽量减小射频馈线损耗,并使接收机和天线远离开关电源、高速数字接口及无线发射等干扰源。外置天线还需要考虑安装方向、馈线固定、地平面及结构遮挡。

NEO-M9N 内部具有低噪声放大器,支持直接使用性能合适的无源天线,无源天线不需要直流偏置供电。本项目当前采用无源 GNSS 天线,因此未设计额外的有源天线偏置供电电路。

如果后续改用有源天线,或使用其他需要有源天线供电的 GNSS 接收机,则应根据模块及天线规格提供相应的直流偏置,并考虑滤波、限流、静电保护及射频隔离。对于 NEO-M9N,也可以按照官方参考设计使用 VCC_RF 或外部电源实现有源天线供电。

此外,GNSS 模块的温度变化、天线增益及安装环境均可能影响接收表现,应结合整机装配进行测试。

九、IMU 布局、机械应力与坐标方向

IMU 应尽量远离较大的热源、电源开关节点及容易发生 PCB 弯曲的位置。MEMS 传感器可能受到焊接残余应力、机械变形和温度变化的影响,因此不宜仅以电路连接正常判断其测量性能。

IMU 不一定必须布置在 PCB 几何中心,更重要的是安装稳定、轴向明确,并记录其相对于导航参考点的安装位置。明显旋转运动下,传感器与参考点之间的距离还可能引入杆臂效应。

PCB 或结构图中应标明 IMU 坐标轴与箭体机体系的对应关系,软件也必须采用正确的安装方向变换,否则可能造成姿态和重力补偿错误。

十、气压传感器与环境压力测量

BMP390 等气压传感器需要保证压力感测入口不被胶水、涂层或结构件堵塞,并避免靠近明显热源。若传感器安装在外壳内部,应设计合理的通气或取压结构,使内部压力能够反映外界静压变化。

完全密封可能造成高度响应滞后,而直接暴露于高速气流又可能受到动压干扰。因此,气压传感器的实际测量效果不仅取决于 PCB,也与整机气动和取压设计有关。

十一、外部接口与静电保护

USB、外部串口、电源和传感器连接器等接口应根据电压、信号频率及使用环境设置必要的保护。TVS 器件应尽量靠近连接器,并提供低阻抗泄放路径;高速接口还需要考虑 TVS 结电容对信号的影响。

对于外部连接器,应核对电源极性、引脚顺序、电平兼容及防反插措施。较长线缆还可能引入机械拉力和共模干扰,需要根据实际情况增加固定结构或改用更适合的通信方式。

十二、机械固定与振动可靠性

PCB 设计应与整机结构同步考虑,包括板卡尺寸、固定孔、器件高度、连接器方向及安装空间。螺钉和垫片附近需要保留足够的电气间隙,较重器件、天线及电池也应具有独立的固定措施,避免焊点直接承受机械载荷。

对于火箭航电,尤其应检查 TF 卡、排针、板间连接器及外部线缆在振动和冲击下的松脱风险。机械固定产生的局部应力也应尽量避开 MEMS 传感器。

十三、焊接、制造与可维护性

PCB 的线宽、线距、孔径和阻焊间距应满足实际板厂工艺要求,器件封装及引脚方向则必须与采购型号一致。

实验板可以适当增加器件间距和测试点,方便焊接与维修;集成板则需要在尺寸、装配可靠性和返修难度之间权衡。对于 QFN、LGA 等封装,还应遵守焊盘、钢网、焊接和清洗要求。板上建议保留硬件版本号、关键引脚方向及主要电源标识。

十四、调试接口、测试点与故障恢复

STM32 系统建议保留 SWD 调试接口,包括 SWDIO、SWCLK、GND、目标电压参考,并根据需要连接 NRST,以便在程序无法正常启动时进行调试和恢复。

关键电源轨与重要通信信号也可以预留测试点,方便测量电压、波形和时序。不过,高速或射频线路不宜随意增加较长测试支路,以免影响原有信号质量。

十五、设计检查与样机验证

打样前应进行 ERC、DRC 及人工复核,检查原理图、PCB、BOM、引脚配置和固件工程之间的一致性。ERC 和 DRC 可以发现许多电气及制造规则问题,但无法判断全部功能连接是否正确。

样机完成后,应逐步进行短路检查、限流上电、电源测试、程序下载、传感器通信、存储及无线收发测试。对于实际飞行使用的板卡,还需要结合任务环境开展振动、冲击、温度等适用性测试,并记录硬件、固件版本及测试条件。

示例图可见以下四个PCB的解析。

8.2 SSFC0.5 实验飞控板

attachment iconSSFC0.5.epro2150.01KBEPRO20次下载

SSFC0.5 是 SilverStar 早期开发和实验使用的飞控板,主要用于验证 MCU、惯性传感器、GNSS、无线通信和任务输出之间的硬件连接,以及对应固件的运行情况。

该板以 STM32F407VET6 为主控,搭配 JY901B 惯性测量模块、GNSS 接收模块和 E28-2G4M12SX 无线模块。主控负责传感器数据采集、导航计算和任务状态管理,外部设备通过 UART、SPI 等接口与 MCU 通信。

从原理图可以看到,板卡还包含 TLV1117LV33 稳压器、电源输入接口、调试接口和由 MOSFET 控制的外部功率输出电路。这些部分使板卡不仅能够进行导航算法测试,也能够用于验证基本的任务输出逻辑。

本版采用支持无源天线的 NEO-M9N GNSS 模块,实际使用的天线不需要额外的直流偏置供电。若更换为有源 GNSS 天线,则应根据天线工作电压、电流及接收机接口设计相应的供电电路,不能直接沿用当前无源天线的连接方案。

屏幕截图 2026-10-12 154846.png

图 8-1 SSFC0.5 电源与外部输出电路原理图

屏幕截图 2026-10-12 154900.png

图 8-2 SSFC0.5 主控及外设接口原理图

相比专门为上箭设计的紧凑型 PCB,SSFC0.5 的重点在于开发和调试便利性。实际测试时可以连接调试器、无线模块和其他外设,方便观察初始化、传感器状态及任务流程。

这种方案的优点是各功能模块较容易检查,出现问题时可以分别排查 MCU、传感器、无线和供电等部分。缺点是外部连接、安装空间和整体结构更偏向实验环境,在振动、冲击及有限安装空间下,还需要进一步考虑结构固定和连接可靠性。

图 8-3 展示了 SSFC0.5 的 PCB 布局,其中可以观察主控附近的去耦电容和外围接口布置。需要注意,该版本底部三个接口的正负极方向存在设计错误,样机通过调整接口焊接方向进行了临时处理。所提供的工程文件保留了这一历史问题,重新制作时应先修正并核对接口极性,不能直接按照原设计连接外部负载。

屏幕截图 2026-10-12 154917.png

图 8-3 SSFC0.5 PCB 布局

IMG_20260704_180825.jpg

图 8-4 SSFC0.5 实验飞控板实物

SSFC0.5 在 SilverStar 的固件开发和外场测试中承担了重要作用。后续集成板的设计也在一定程度上沿用了这一硬件方案,使软件能够继续使用熟悉的外设接口与设备组合。

8.3 SSGS0.5 实验地面站

attachment iconSSGS0.5.epro259.41KBEPRO20次下载

SSGS0.5 是与 SSFC0.5 配套的实验地面站硬件,其主要任务是接收飞控发送的无线消息,并通过串口接口将数据传输给电脑,同时转发电脑发出的控制命令。

该板采用 STM32F103C8T6 核心板和 E28-2G4M12SX 无线模块。无线模块通过 SPI 与 MCU 通信,配合复位、忙状态及中断等信号完成收发控制。

image.jpg

图 8-5 SSGS0.5 地面站原理图

SSGS0.5 的设计相对简单,不需要复杂的导航传感器和数据存储系统。地面站 MCU 主要承担通信协议封装、无线数据转发和必要的链路状态统计,导航计算和数据可视化由电脑端的 GSHC 完成。

这种分工能够减少地面站 MCU 的处理负担,也使上位机功能能够独立更新,而不必每次修改图表或数据显示方式时都重新设计地面硬件。

当前实验板通过串口连接电脑,必要时使用外部 USB 转串口接口。对于后续小型化地面站,可以考虑采用具备 USB Device 功能的 MCU,通过 USB CDC 直接向电脑提供虚拟串口,从而减少外部转换模块。

不过,USB CDC 需要 MCU、时钟、USB 外设及相应固件共同支持,不能仅通过更换连接器实现。

image.jpg

图 8-6 SSGS0.5 地面站 PCB 布局

QQ图片20260312192341.jpg

图 8-7 SSGS0.5 地面站实物及外接天线

SSGS0.5 主要用于验证空地无线链路、电脑接口和 GSHC 数据解析功能。后续地面站可以在保留 AIR、GSP 协议兼容性的基础上,进一步优化 MCU、供电、板卡尺寸及 USB 接口,减少外围元件和连接模块。

8.4 SSFCm0.5 集成飞控板

attachment iconSSFCm0.5.eprj25.85MBEPRJ20次下载

SSFCm0.5 是在 SSFC0.5 基础上进行集成化设计的版本,主要硬件方案与实验飞控板保持相近,但更加重视在火箭内部的安装和空间利用。

与实验板相比,该工程采用了适合圆形安装空间的 PCB 外形,并重新组织 MCU、传感器、无线、电源及接口布局。设计文件中包含核心板和传感器相关板级内容,可根据实际装配方式组织各个功能模块。

image.jpg

图 8-8 SSFCm0.5 传感器及外围接口原理图

image.jpg

图 8-9 SSFCm0.5 主控电路原理图

这种结构的主要考虑是适应火箭内部有限的横截面空间。圆形板轮廓可以更方便地结合筒形舱段布置,但实际外径、固定点和板间距离仍需要与箭体结构及连接器尺寸配合设计。

集成化之后,板卡不再只是考虑实验台上的操作便利性,还需要重点检查装配方向、连接器固定、外部线缆走向和维修空间。

例如,核心板与其他功能板之间如果通过板间连接器传输信号,那么接口接触质量和机械固定方式会直接影响整机可靠性。即使两个板卡分别能够正常运行,也不能忽略振动条件下的板间连接问题。

image.jpg

图 8-10 SSFCm0.5 传感器板 PCB 布局

image.jpg

图 8-11 SSFCm0.5 主控板 PCB 布局

SSFCm0.5 保留了与原实验方案相近的惯性测量、GNSS、无线及任务输出功能,因此可以在一定程度上沿用已有的固件与测试方法。

SSFCm0.5 延续了实验板的主要设备和接口设计,并针对圆形箭体舱段调整了 PCB 外形与布局。本版采用无源 GNSS 天线,不需要额外的天线偏置供电;如果后续更换有源天线,则需要重新检查 GNSS 射频接口和供电路径。该工程主要体现集成化设计方案,板间连接、安装固定和振动可靠性仍需结合实际结构进一步验证。

这也是其设计价值之一:在不完全改变软件架构的情况下,通过调整 PCB 外形和硬件组织方式,使原有实验方案逐步接近实际安装需求。

8.5 ssopcb 集成飞控板

attachment iconssopcb.epro537.96KBEPRO0次下载

ssopcb 是另一套面向集成安装的飞控设计,也是后续实际火箭任务优先考虑的硬件方案。与早期采用 JY901B 的实验板不同,该工程使用 BMI088 六轴惯性传感器和 BMP390 气压传感器,更侧重由 MCU 直接完成传感器采集、姿态传播和导航计算。

工程包含核心板和传感器板两个板级设计。核心板以 STM32F407VET6 为主控,包含最小系统、时钟、存储和相关接口;传感器板主要配置 BMI088、BMP390 以及 GNSS、无线通信、电源和外围接口。当前 GNSS 天线采用无源方案,不需要额外偏置供电。若后续采用有源天线,应根据对应模块的接口和供电要求重新设计。

image.jpg

图 8-12 ssopcb 传感器及外围接口原理图

image.jpg

图 8-13 ssopcb 主控电路原理图

BMI088 是一款集成加速度计与陀螺仪的六轴惯性传感器,支持 SPI 和 I²C 数字接口。相比直接使用集成姿态算法输出的模块,采用 BMI088 原始数据可以使飞控软件更加直接地控制采样、校准、惯性传播和融合过程。

这样做的主要好处,是可以将姿态传播和惯性导航建立在明确的原始测量、时间戳和误差模型之上,减少对传感器内部姿态融合算法的依赖。不过,软件也需要自行承担更完整的传感器初始化、时序处理和姿态计算工作。

BMP390 用于测量环境压力,可以为高度估计和任务状态判定提供辅助信息。将气压传感器作为独立器件使用,有利于单独配置其采样率、滤波和工作状态,也方便对气压数据进行专门分析。

这两类传感器需要在 PCB 上妥善处理供电、数字通信和安装位置。BMI088 应避免受到不必要的板弯与热应力,BMP390 则需要合理的压力感测环境,两者的布局要求并不完全相同。

image.jpg

图 8-14 ssopcb 传感器板 PCB 布局

image.jpg

图 8-14 ssopcb 主控板 PCB 布局

从整体方案看,ssopcb 不仅更换了惯性传感器,也为后续统一使用软件姿态传播和导航融合提供了硬件基础。由于 BMI088 的量程、噪声特性和采样方式与 JY901B 不同,不能直接沿用原有的全部校准和滤波参数,需要结合实际测试重新配置。该设计同时保留 GNSS、无线通信和日志记录等功能,以便继续与 SilverStar 的地面站及分析软件配合使用。

9. 固件组成与运行机制

SilverStar 的固件负责完成传感器采集、导航计算、任务控制、无线通信和数据记录等工作。与传统的单一飞控程序不同,SilverStar 采用模块化架构,将硬件驱动、数据接口、导航算法和任务逻辑分开组织,再由 SCG 根据具体硬件和任务配置生成对应的固件工程。

这种设计使系统可以在不同 STM32 平台、传感器组合和导航算法之间进行选择,同时保持各个模块相对独立。本章以当前 STM32F407 飞控固件为主要示例,介绍系统的软件结构、任务调度、数据处理、状态管理和异常处理机制。地面站固件的组成也将在相应部分说明。

9.1 固件总体架构与模块分层

SilverStar 固件采用分层设计,将底层硬件操作与上层业务逻辑分离。其主要组成包括 Platform、Device、Adapter、Interface、System、Algorithm、APP、Protocol 和 FlightLogic 等模块。

Platform 是最接近 MCU 硬件的一层,负责提供 UART、SPI、I²C、GPIO、中断、DMA 和系统时间等基础功能。它通过统一接口向上层提供硬件能力,隐藏不同 STM32 型号之间的寄存器、HAL 句柄和外设实现差异。例如,上层设备驱动只需要通过 Platform 提供的 UART 接口读取数据,而不需要直接操作某个具体的 USART 或 DMA 通道。

MCU 与板卡配置又分为不同层次。MCU Family 提供同系列芯片共用的外设实现,具体 MCU 组件提供处理器内核、存储空间、启动文件和链接脚本等信息,Board 则描述实际 PCB 上的引脚连接和外设资源。这样,在更换同系列 MCU 或重新设计 PCB 时,可以尽量复用不需要改变的底层代码。

Device 层负责具体设备的原生驱动,包括寄存器读写、通信帧解析、校验、初始化和数据读取等。例如,JY901B 驱动理解其串口数据格式,NEO-M9N 驱动处理 UBX/NMEA 消息,BMI088 驱动则按照其数字接口读取加速度和角速度。

Device Adapter 位于设备驱动和系统公共接口之间,负责将不同设备输出的数据转换为统一格式。不同 IMU 可能使用不同的数据单位、坐标方向和量程表示方式,Adapter 会根据设备配置完成必要的转换,并提供统一的数据类型、时间戳和有效性信息。

Interface 定义系统需要的逻辑能力,而不是具体传感器型号。例如,导航算法需要的是加速度和角速度,不需要知道数据究竟来自 JY901B、BMI088 还是其他 IMU。只要对应设备能够通过 Adapter 提供符合要求的数据,算法就可以使用相同的公共接口工作。

一个物理设备也可能提供多种能力。例如,JY901B 可以同时提供惯性测量、气压信息和硬件姿态。SilverStar 将这些数据表示为不同的逻辑能力,但底层仍由同一个物理设备驱动负责通信和数据解析,从而避免多个模块同时操作同一串口、重复解析相同数据的问题。

System 层负责系统级的数据管理和状态控制,包括设备启动、健康状态、传感器来源选择、校准、初始对准、导航准备和任务生命周期等。它不直接依赖某个具体设备型号,而是通过公共接口获取需要的信息。

Algorithm 层负责纯数学计算,例如四元数运算、固定增益修正和卡尔曼滤波。算法只接收已经整理好的数值输入,不直接操作串口、文件系统或 FreeRTOS。这有利于在电脑端进行独立测试,也方便同一算法适配不同的 MCU。

APP 层则负责创建和运行 FreeRTOS 任务,安排各个模块在什么时刻工作,并管理任务之间的数据传递。FlightLogic 负责开伞、着陆等任务策略,Protocol 负责 AIR、维护串口及 SSLOG 等协议的编码与解码。

这些模块由 SCG 根据项目中选择的硬件、算法、协议和资源档位进行组合,生成对应的接口绑定与构建文件。插件主要作用于工程配置和生成阶段,生成后的固件已包含所选组件,不需要在 MCU 运行时动态加载插件。

为了使不同开发工具使用一致的源码和构建参数,SilverStar 采用统一的 SourceGraph 管理源文件、头文件路径、宏定义、处理器和链接配置,并据此生成 Make、EIDE 和 VS Code 的构建入口,减少不同构建环境之间的配置差异。

9.2 FreeRTOS 任务调度与内存管理

SilverStar 的 Flight 固件采用 FreeRTOS 实时操作系统,将数据采集、导航计算、任务管理和通信记录等工作分配到不同任务中。

使用 RTOS 的主要目的,是让不同功能按照各自的时间要求运行,并通过明确的数据传递机制避免相互干扰。例如,IMU 需要较高频率的数据处理,而日志写入可能受到 TF 卡访问延迟影响。如果将所有功能放在一个循环中,某次较慢的存储操作就可能影响传感器采集和导航计算。

当前 F407 参考配置可创建 Device、INS、Estimator、Flight、Serial、Logger 和 Telemetry 七类任务,其中 Serial、Logger 和 Telemetry 根据实际启用的协议与功能参与构建。

Device Task 负责推进设备驱动、读取传感器数据和更新设备健康状态。它还承担部分初始化、配置验证及设备异常恢复工作,是多数物理设备的主要运行所有者。

INS Task 负责消费惯性数据,应用已经确定的校准结果,并按照真实采样时间执行惯性传播。对于需要连续处理的角速度和加速度数据,INS Task 会保持正确的时间顺序,避免因其他任务执行速度不同而打乱积分过程。

Estimator Task 负责运行所选择的融合估计器,例如 SF6、KF6 或 ESKF15。它使用惯性增量进行预测,并根据实际到达的 GNSS 和气压观测执行修正,随后发布最新的导航估计结果。

Flight Task 负责校准、初始对准、任务生命周期、开伞与着陆判断等工作。它主要协调系统服务和任务策略,不直接承担所有底层驱动的处理。

Serial Task 负责维护串口命令的接收、解析和响应。Telemetry Task 负责 AIR 遥测与无线接口服务,Logger Task 则负责日志编码、缓存和存储介质写入。

不同任务具有不同优先级。以现有 F407 参考配置为例,Device 和 INS 的优先级为 7,Estimator 为 6,Flight 为 5,Serial 为 4,Logger 和 Telemetry 为 3。数值越大表示优先级越高。

这种安排使惯性数据采集和传播具有较高的调度优先级,而日志写入等相对不敏感的操作可以在较低优先级下进行。不过,高优先级并不代表任何情况下都能够准时完成任务。如果高优先级任务持续占用 CPU,其他任务仍可能出现延迟。因此还需要控制每次执行的工作量,并在目标 MCU 上测试实际执行时间。

各任务通常采用短周期运行或等待方式,例如 Device、INS 和 Estimator 的服务循环以毫秒级节奏推进。但任务每毫秒执行一次,并不代表传感器实际以 1000 Hz 采样,也不代表每次循环都会执行一次完整导航更新。实际数据处理频率由传感器输出、惯性数据聚合和算法配置共同决定。

在内存管理方面,SilverStar 采用 FreeRTOS 静态分配方式。任务通过 xTaskCreateStatic() 创建,任务控制块和栈空间由预先分配的静态数组提供,不依赖运行过程中反复申请和释放堆内存。

这样做的优点是,主要内存占用在编译时便能够确定,可以降低动态内存分配失败及堆碎片对长期运行的影响。但静态分配并不意味着所有任务都不会溢栈,每个任务仍需要预留足够的调用栈空间。

为此,SilverStar 提供任务栈使用情况查询及构建期栈分析功能。FreeRTOS 的栈高水位可以反映已经执行过的路径中剩余的栈空间,帮助发现内存紧张的任务;编译生成的栈使用信息则可以辅助分析函数调用带来的内存需求。

对于 STM32F407,还需要区分普通 SRAM 与 CCM RAM。CCM RAM 适合放置部分 CPU 高频访问的数据,但通常不能直接供一般 DMA 控制器访问,因此 UART DMA 缓冲、部分外设数据区等需要放在 DMA 可访问的内存区域。

SilverStar 通过平台内存接口区分 CPU 快速内存与 DMA 可访问内存,并在目标工程中落实具体分配。这种设计在更换具有不同存储结构的 MCU 时尤其重要。

任务之间的数据交换主要采用静态队列和快照。需要逐个处理且具有严格时间顺序的数据,例如惯性增量,适合通过队列传递;对于只需要读取最新值的设备状态或导航结果,则可以使用带时间戳和有效标志的快照。

队列用于保存尚未消费的数据,快照用于提供某一时刻的一致状态,两者不能随意替换。如果队列已满,系统会返回明确的错误并记录相关计数,而不会默认认为数据已经成功传递。

对于需要保护的共享数据,固件使用短临界区等同步机制保证读写一致性。耗时的传感器解析、导航计算和存储操作则应留在正常任务上下文中执行,避免长时间关闭中断或阻塞其他任务。

9.3 设备驱动、数据采集与时间管理

传感器数据是导航系统的输入,其正确性不仅取决于测量数值,还取决于单位、时间、来源和数据完整性。

SilverStar 将设备数据处理划分为硬件接收、协议解析、数据适配和系统使用等阶段,使每个环节都能够独立检查。

对于 UART 传感器,SilverStar 可以通过 DMA 和 Receive-to-Idle 等机制接收数据,再由任务完成协议解析,避免在中断中进行大量计算。接收数据通常进入预先分配的环形缓冲区,以吸收短时间的调度延迟。如果数据产生速度持续超过处理能力,仍可能发生溢出,系统会记录丢弃和数据不连续等信息。

设备驱动从缓冲区取得字节后,根据对应协议识别帧头、长度和校验信息,形成设备原生数据。例如,GNSS 驱动需要解析接收机输出的定位、速度、时间和状态字段,IMU 驱动则需要取得加速度、角速度及其相关测量信息。

完成原生解析后,Adapter 将数据转换为统一格式。对于惯性数据,通常需要完成传感器坐标轴映射、量程换算和单位转换,使系统获得以机体系表示的角速度和比力数据。

这一步非常重要。不同传感器可能以 g、°/s 或其他单位输出数据,而导航计算统一使用 m/s²、rad/s 等物理单位。如果转换错误,即使滤波算法本身完全正确,也会得到明显异常的结果。

时间管理同样是系统的重要组成部分。SilverStar 使用 MCU 单调时间作为运行期时间基准,记录样本接收时间,并在设备能够提供可靠原生时间时保存相应的测量时刻。

需要区分测量时间、接收时间和估计器当前状态时间。测量时间代表物理观测对应的时刻,接收时间代表 MCU 实际收到数据的时刻,而估计器状态时间代表导航计算已经推进到的时刻。

三者可能存在差异。例如,GNSS 接收机完成一次定位计算后,需要经过内部处理和串口传输,数据才会到达 MCU。如果不考虑这些时间关系,就可能把较早的观测错误地应用到当前状态。

因此,系统会根据数据来源和配置决定如何解释时间戳,并对过期、未来、重复或乱序数据进行检查。导航算法最终使用的积分时间也来自真实样本间隔,而不是简单假定每次任务循环都代表固定时间。

对于不同输出速率的设备,系统不会强制将其补齐到相同频率。IMU 可以以较高频率连续提供惯性数据,GNSS 和气压计则按照各自实际的更新时间产生观测。

SilverStar 还将物理设备与逻辑数据来源分开管理。一个设备实例具有独立的驱动状态、配置和健康信息,而导航系统通过来源选择器取得当前使用的标准化数据。

在多 IMU 配置下,系统可以在预飞阶段选择可用的惯性来源,并在校准和初始对准前锁定。这样可以避免任务中途突然更换 IMU 导致安装误差、零偏和时间关系发生变化。

GNSS 和遥测来源具有各自的有限切换策略,但目前并不等同于多个接收机投票或完整的飞行中惯性传感器热切换系统。来源选择与真正的冗余导航还存在区别。

9.4 系统启动、校准与初始对准

SilverStar 的启动过程不仅需要完成 MCU 和外设初始化,还需要确认相关设备的数据可以用于本次任务。

系统上电后,首先建立基础时钟、时间服务及必要的软件对象,并将任务输出设置为安全状态。随后创建静态任务,启动 FreeRTOS 调度器。

对于 JY901B、NEO-M9N 等可能需要通信探测或配置验证的设备,完整初始化由 Device Task 在调度器启动后逐步推进,而不是在主函数中通过长时间阻塞等待完成。

设备启动过程中可能经过探测、身份识别、配置读取、参数应用、重新连接、配置验证和等待有效样本等阶段。每个阶段具有明确的结果与超时条件,避免某个设备一直没有响应时阻塞整个系统。

例如,NEO-M9N 可能具有与项目目标不同的初始波特率和通信配置。驱动可以在有限的候选波特率范围内尝试识别设备,确认身份后读取当前配置,只修改必要的参数,再重新连接并验证实际结果。

对于 JY901B,也需要考虑出厂通信参数与项目参数不一致的情况。通过有限探测和配置读回,可以提高设备初始化的兼容性,同时避免无限循环搜索造成系统无法继续运行。

设备初始化完成并产生有效数据后,系统进入预飞准备阶段。

预飞准备的核心包括传感器校准、初始对准,以及导航参考原点和初始状态的建立。这几个过程相互关联,但并不是同一项操作。

Calibration 负责形成当前任务使用的惯性传感器校正结果。SilverStar 支持 NONE、ONE_FACE 和 SIX_FACE 等校准方式。

NONE 表示使用单位校正,即不执行新的采样零偏与比例校准;ONE_FACE 利用指定静止方向的采样估计部分误差;SIX_FACE 则通过多个不同朝向的静止采样估计各轴加速度计偏置及比例等参数。

单面和六面校准都需要满足一定的静止条件、样本数量、持续时间和测量质量要求。如果采样过程中设备发生运动、方向不正确或数据间隔异常,系统会拒绝不合格的窗口并保留相关诊断。

校准完成后,Alignment 负责建立本次任务的初始姿态。GNSS 位置原点和气压高度参考则由预飞准备过程中的相应模块建立,两者与姿态对准有关联,但不属于同一项计算。

SilverStar 支持根据重力和已知方向计算初始姿态,也可以采用符合要求的外部姿态源。当前示例工程使用重力与已知方位组成的双矢量对准,其中重力用于确定倾斜,已知方向用于确定水平朝向。

固件底层还保留了通用多矢量约束求解框架,可根据多组机体系与导航系方向关系计算姿态,但当前普通配置入口尚未开放完整的多矢量功能。由于静止重力无法单独确定航向,完整三维对准仍需要有效的第二方向参考。

具体哪些来源属于 START 的必需条件,由当前项目与算法配置决定。对于允许缺少 GNSS 的任务,可以在没有有效 GNSS 原点的条件下运行惯导及其他可用功能,但本次任务的 GNSS 位置融合可能因此保持禁用,而不是在任务中随意建立新的地理原点。

SilverStar 将校准和对准设置为明确的单向依赖:Calibration READY 是 Alignment 开始和完成的前提,而 Alignment READY 又是任务开始的重要前提。

如果重新校准,原有初始对准会失效,因为校正参数改变后,之前计算的姿态可能不再适用。完成初始对准后,如果设备发生足以破坏静止参考的运动,系统也可以将 Alignment 标记为 STALE,要求重新进行对准。

执行 START 时,系统会再次检查准备状态,并冻结本次任务使用的姿态、原点、设备来源和导航配置。随后初始化惯性导航与估计器状态,建立任务时间并切换到运行阶段。

START 是一个具有多个步骤的事务,而不是简单修改一个运行标志。如果准备过程中某一步失败,系统需要返回对应错误并撤销尚未完成的状态变更,避免出现部分模块已经启动、其他模块却仍处于预飞阶段的情况。

在任务开始之后,初始姿态不再由最新一帧硬件四元数直接替换。系统使用冻结的初始状态进行软件姿态传播,并由所选导航算法按照各自机制维护后续状态。

9.5 惯性导航与融合估计

惯性导航是 SilverStar 固件中的主要计算部分。系统通过连续的角速度和加速度测量,估计设备的姿态、速度与位置,再根据所选择的算法使用 GNSS、气压等外部观测修正累积误差。

惯性处理首先从校准后的机体系数据开始。加速度计测量的是比力,其中包含重力相关信息,因此不能简单将其当作已经去除重力的平动加速度。

SilverStar 在惯性传播过程中根据姿态将机体系比力转换到 ENU 导航系,再结合重力模型计算导航速度和位置变化。

姿态采用四元数表示,并通过陀螺仪测得的角增量进行更新。与直接积分欧拉角相比,四元数传播可以避免常见的欧拉角奇异问题,也更适合表示连续三维旋转。

为了降低离散采样和连续转动引入的部分误差,SilverStar 支持二子样圆锥与划桨补偿,即 Coning2/Sculling2。该方法使用相邻惯性子区间的角增量和比力速度增量,对姿态和速度传播进行修正。

系统使用真实采样时间确定每个积分区间。根据机械化聚合参数,可以使用一个或两个实际采样间隔形成一次传播。比如原始 IMU 输出率为 400 Hz、每次聚合两个间隔时,名义机械化传播率约为 200 Hz。

这种方式可以降低不必要的高频计算负担,但实际传播率、输入间隔与估计器执行时间仍需结合具体设备检查。

在 Pure INS 模式下,系统根据校准后的惯性数据独立传播姿态、速度和位置,不使用 GNSS 或气压观测持续修正。由于传感器零偏、姿态和积分误差会不断累积,导航结果通常会随时间产生漂移。Pure INS 也可以作为独立的实验配置,通过 FLP 与其他导航算法的结果进行比较。

当选择 SF6、KF6 或 ESKF15 时,INS Task 主要负责整理、校正和补偿惯性输入,再由选定的估计器维护导航状态。系统不会因此同时运行一套完整的 Pure INS 轨迹和所有其他估计器。KF6、SF6 仍需要相应的惯性姿态传播,而 ESKF15 则使用自身的名义姿态和残余偏置重新计算导航增量,以便外部观测的修正能够影响后续惯性传播。

SF6 是六维固定增益融合器,主要维护三个速度分量与三个位置分量。它通过预先配置的增益,将有效外部观测与当前预测结果进行加权合并,不维护完整的状态协方差矩阵。

这种方式计算过程较为直接,资源需求较小,适合需要简单位置速度修正的配置。但固定增益无法根据完整的状态不确定性自动调整融合权重,也不能像卡尔曼滤波那样利用协方差描述各状态之间的关联。

KF6 同样维护六维位置与速度状态,但采用卡尔曼滤波进行预测和量测更新。除了导航状态外,它还维护相应的协方差矩阵,用于描述估计的不确定性。

KF6 可以根据 GNSS 位置、GNSS 速度及气压高度等观测进行分组更新,并利用创新和 NIS 等统计量判断测量是否与当前预测相符。

不过,KF6 的滤波状态不包含姿态误差或惯性传感器残余零偏。因此,即使位置和速度得到外部观测修正,持续存在的姿态偏差仍可能在之后的惯性传播中引入新的误差。

ESKF15 采用误差状态卡尔曼滤波结构,除位置和速度外,还显式描述姿态误差、陀螺仪残余零偏和加速度计残余零偏。

它使用四元数等变量维护名义导航状态,同时通过十五维误差状态和协方差进行误差估计,再将修正注入名义状态。这使外部位置和速度观测有机会通过系统耦合间接修正姿态和残余偏置。

相应地,ESKF15 的矩阵计算、历史数据维护和数值检查也更加复杂,对 MCU 的运算性能、内存和任务调度提出了更高要求。

对于存在处理与传输延迟的 GNSS、气压观测,KF6 和 ESKF15 使用有界历史缓存,根据量测时间恢复相应的历史状态,完成更新后重新传播至当前时刻。KF6 主要回放六维位置速度状态及协方差;ESKF15 还需要重新处理机体系惯性输入,并传播姿态和残余偏置,因此计算负担更大。超过历史窗口、输入不完整或数值计算失败时,系统会明确报告异常,而不会直接将历史观测当作当前观测使用。

GNSS 等外部观测在进入算法前,还需要经过独立的质量检查,包括设备在线、定位有效、字段完整、时间新鲜度和数值合法性等。通过基础检查后,融合器仍可能根据 NIS 等条件接受、降低权重或拒绝观测。

对于 GNSS,SilverStar 还实现了位置变化与速度积分之间的一致性检查,可用于发现接收机内部测量存在明显差异的区间,并在适用算法中调整部分位置观测的方差。

这些机制并不能代替独立真实轨迹,但能够帮助系统对不同质量的观测作出更合理的处理,也为 FLP 的后期分析提供诊断依据。

关于坐标变换、四元数、惯性积分、SF6、KF6 和 ESKF15 的具体数学模型,将在第 10 章展开。

9.6 任务状态机与执行逻辑

除了导航计算,SilverStar 还需要管理任务从上电准备到运行和结束的完整过程。

系统采用生命周期状态机组织不同阶段,主要包括 BOOT、SELF_TEST、PREFLIGHT、READY、FLIGHT、RECOVERY、LANDED、POSTFLIGHT 和 FAULT。

BOOT 与 SELF_TEST 对应基础启动和设备检查;PREFLIGHT 表示系统正在进行预飞准备;READY 表示当前配置要求的开始条件已经满足。任务成功开始后进入 FLIGHT,随后可以根据部署和回收流程进入 RECOVERY、LANDED 及后续状态。

状态机的作用,是为每种操作规定明确的允许条件,避免在系统尚未准备完成时执行不合适的任务动作。

例如,校准和初始对准通常在预飞阶段执行;任务开始后,相关配置与初始条件被冻结,不能像地面调试时一样随意重新初始化导航系统。

GSHC 发送的 START 命令需要经过 AIR 命令检查,再提交系统生命周期服务。维护串口和其他本地入口也可以通过统一的生命周期接口请求开始任务,但无线入口还具有 Capability 握手和解锁等额外条件。

这里的 START 表示固件开始一次任务,不一定代表真实火箭已经离开发射架。实际发射过程和任务开始时刻之间可能存在差异,需要根据测试方式和任务设计进行解释。

开伞逻辑由独立的 Deployment 策略负责。SilverStar 支持根据姿态倾角、竖直速度越过极高点及任务开始后的延时等条件进行判断,也可以组合多种触发条件。

当前 MultiTrigger 使用触发条件掩码进行组合,多个启用条件之间采用“任一满足即可触发”的关系。若未启用自动部署条件,则不会凭空执行部署动作。

例如,倾角条件可以根据当前姿态与任务开始时冻结的参考方向判断;极高点条件则利用竖直速度变化;延时条件使用 START 成功后的任务时间。

需要区分部署条件成立、执行动作成功和状态机进入 RECOVERY 这几个阶段。系统首先确认触发条件,再通过 Mission Action 接口请求实际动作,只有执行结果满足相应条件后才更新任务状态。

Mission Action 将上层任务语义与具体 GPIO、功率输出电路分开。上层只请求某种已定义的任务动作,具体使用哪个引脚、有效电平以及输出方式由板卡和生成配置决定。

为了避免任务循环中重复触发同一动作,系统采用一次性执行及状态锁存机制。即使部署条件在连续多个周期中保持成立,也不应因此重复执行相同的输出动作。

对于着陆判断,SilverStar 提供不同的 Landing 策略,其中气压与 IMU 联合窗口是一种主要实现方式。

该策略通过一定时间范围内的气压高度变化率和惯性传感器静止特征,判断设备是否已经稳定下来。

之所以同时考虑气压和惯性数据,是因为单独依靠某一个指标可能产生误判。例如,竖直速度较小并不代表物体完全静止,而 IMU 在某些短暂运动条件下也可能出现接近静止的测量特征。

联合窗口需要检查实际采样数量、时间覆盖、数据新鲜度、气压高度变化和角速度、加速度等条件。只有满足对应判据,状态机才确认着陆。

对于当前默认的气压与 IMU 联合判定,其气压输入来自直接的气压高度观测,而不是简单取 KF6 或 INS 输出的位置和速度代替。这样可以在一定程度上将着陆判断与导航滤波状态区分开来。

如果任务策略依赖的设备没有配置,或者缺少所需的测量能力,SCG 应在工程生成阶段给出相应检查,而不是在运行时自动使用未经确认的替代条件。

任务状态机还会将重要状态变化交给日志和遥测模块记录,使使用者能够在 GSHC 或 FLP 中查看任务开始、部署和着陆等事件。

9.7 遥测通信与机载日志

SilverStar 固件中的通信与记录系统主要包括 Telemetry、Maintenance 和 Logging 三类功能。它们使用不同的协议和数据路径,但都从系统状态、设备接口和导航结果中获取所需信息。

Telemetry Task 负责运行空地遥测服务,并通过对应无线设备接口发送 AIR 消息。

系统会根据当前生命周期选择需要发送的状态。例如,预飞阶段主要发送能力、准备状态和姿态信息,任务开始后则以飞行状态和关键事件为主。

由于无线链路容量有限,遥测并不直接发送全部高频传感器数据,而是将适合实时监控的状态进行编码和传输。重要命令应答、任务事件和周期状态之间也具有发送优先次序,避免大量普通遥测长期阻塞关键控制反馈。

无线驱动通过 Platform 的 SPI、GPIO 和中断接口与具体模块通信。协议编码与无线传输分开,使 AIR 消息的业务含义不依赖某一种特定射频芯片。

Ground 固件主要作为通信网关,将无线链路收到的 AIR 帧通过 GSP 封装后发送至电脑,并将电脑下发的 AIR 请求转发至无线链路。Ground 不直接计算导航状态,也不负责判断校准、START 或着陆等任务逻辑。这些操作由 Flight 执行,地面数据展示和历史会话处理则由 GSHC 负责。

Maintenance 通过 Serial Task 提供文本形式的设备查询和诊断。它可以读取设备运行状态、配置、传感器样本、估计器信息及部分系统资源数据,方便在不依赖无线链路的情况下定位问题。

相比遥测协议,维护接口可以提供更详细的调试信息,但同样需要受到当前任务状态与设备所有权的约束。例如,串口查询设备状态不应直接打断 Device Task 正在执行的设备事务。

Logging 则是独立的数据保存路径。系统、设备和导航算法产生记录后,首先将其放入有界 LoggerBus,由 Logger Task 统一负责 SSLOG 序列化和文件写入。

采用独立 Logger Task 的原因,是存储介质访问时间通常具有一定波动。通过队列将数据生产和实际写盘分离,可以降低一次较慢的文件系统操作对高频惯性采集的直接影响。

不过,队列只能吸收有限的短时延迟。如果日志产生速度长期超过存储写入能力,仍然可能出现积压或丢弃,因此系统会保留相关计数和状态。

日志初始化时,Logger 会优先处理描述本次任务所需的关键记录,例如项目配置、设备和算法信息、校准结果、初始状态以及解码包匹配信息。

这样做是为了使后续保存的大量数据具有明确的解释依据。否则,即使记录了完整的速度或传感器数值,也可能因为缺少单位、配置或算法身份而难以正确分析。

对于使用 TF/SD 卡的 Flight 配置,存储功能通过独立接口连接到 SDIO 与 FatFs。Logger Task 统一拥有主要文件系统操作,其他任务通过状态和记录接口与其交互,避免多个任务同时直接操作同一个日志文件。

在启用任务持久化信息的配置中,系统还会使用任务目录、manifest 和 mission snapshot 等文件记录本次任务的身份与配置。部分关键对象采用带 CRC 和代次信息的双槽保存方式,并通过写入、同步和读回检查降低中途断电造成的不完整更新风险。

任务开始前,系统会检查日志会话和存储介质的实际状态。当前实现允许在缺少 TF/SD 卡等存储介质时继续执行其他满足准入条件的任务功能,但机载文件日志将不可用,系统需要通过状态和诊断明确提示,而不能将已经进入内存队列的数据视为成功写盘。对于需要可靠保存日志的正式实验,仍应在启动前检查存储介质和记录状态。

正常记录过程中,Logger 会聚合多个记录后写入文件,以减少过于零碎的存储操作。对于关键阶段或任务结束,还需要进行相应的缓冲排空和同步。

数据进入日志队列、数据写入文件系统,以及文件完成同步,并不是同一个时刻。只有区分这些阶段,才能正确理解断电、卡片故障和日志丢失等问题。

任务结束时,Logger 会按照既定流程停止接纳需要结束的记录,处理剩余数据并完成文件关闭。即使日志文件最终能够正常打开,也还需要通过记录序号和相关统计判断是否存在采集或排队过程中的数据缺口。

SSLOG 的记录格式与 AIR 遥测协议相互独立。FLP 通过与工程精确匹配的 .ssdecoder 解释机载数据,GSHC 则处理地面端实际收到的遥测会话。两条数据路径可以相互补充,但不能直接替代。

9.8 异常处理、资源检查与系统可靠性

对于需要持续运行的嵌入式系统,除了保证正常情况下能够完成任务,还需要考虑传感器失联、通信超时、存储错误、数据溢出和数值异常等情况。

SilverStar 将不同性质的异常分开处理,而不是把所有错误都统一视为需要重新启动整个系统。

对于外部设备可能正常出现的错误,例如数据暂时不可用、设备响应超时、GNSS 失去定位和无线发送失败,驱动通常通过明确的状态或错误码报告,并按照配置执行有限重试或恢复。

设备恢复采用有界的处理方式。一个设备没有响应时,系统可以在规定的时间和候选范围内尝试重新建立通信,而不是无限阻塞等待。

对于 GNSS,还需要区分接收机失联与定位质量下降。持续收到合法数据,但没有有效定位,不一定需要重新启动设备;接收机完全不再响应,则属于另一类通信或设备故障。

同时,设备恢复并不意味着此前丢失的数据已经恢复。导航系统需要继续保留时间缺口和相关质量信息,避免将重新收到的样本错误地接在不连续的惯性积分区间之后。

在使用多个设备实例时,系统可以根据已定义的来源优先级和基础健康条件选择数据来源。但不同设备具有不同的切换约束。

例如,当前 IMU 来源在预飞阶段确定后会被锁定,以保持校准、安装关系和导航时间的连续性。GNSS 来源可以根据基本在线和启动状态进行有限切换,但这不等同于根据多个接收机的位置精度进行投票。

对于导航算法,系统还需要检查输入是否有限、时间是否连续、状态矩阵是否满足相应数值条件,以及量测是否超过有效门限。

某次 GNSS 观测因 NIS 过大而被拒绝,属于可以记录并继续处理的外部测量异常;如果滤波器内部状态出现 NaN、协方差严重异常或不可恢复的模型不一致,则可能需要将导航健康状态降级或锁存故障。

相比之下,栈溢出、HardFault、内部状态约束破坏等严重错误通常不适合通过简单忽略来继续运行。SilverStar 为相关故障保留静态诊断信息,并采用受控的故障停止方式,避免损坏状态继续参与正常计算。

系统还通过多种健康和统计信息帮助定位异常,包括设备在线状态、采样错误、通信超时、缓冲区溢出、日志写入错误、导航有效性及任务栈高水位等。

这些指标需要结合起来理解。例如,遥测停止更新可能由无线通信问题引起,也可能来自上层任务长时间占用 CPU、队列持续积压或固件发生严重故障。仅看到某个界面不再刷新,并不足以确定原因。

在资源管理方面,SilverStar 会检查目标 MCU 的 Flash、RAM、外设资源和主频条件,并结合所选算法与数据缓存评估配置是否适合生成。

不同算法的资源消耗不只包括其状态结构体本身,还包括历史数据、协方差、工作缓冲、任务栈及相关诊断和日志队列。尤其对于需要历史回放的 ESKF15,完整的内存与 CPU 负担通常高于单个滤波状态对象所反映的大小。

构建完成后,可以通过 ELF、MAP、栈使用文件和目标板运行信息进一步检查资源占用。链接器报告的内存剩余量能够反映静态分配情况,但不能直接证明所有任务在任何条件下都不会出现栈溢出。

任务栈高水位同样只代表已经执行过的路径。要评估任务在较大负载、异常处理和中断嵌套时的可靠性,还需要结合静态分析、目标板测试和实际执行时间测量。

对于实时性,还需要关注任务优先级、最坏执行时间、临界区、外设中断、DMA 和日志写入之间的相互影响。某个算法在电脑端运行得很快,或者在单独测试时满足周期要求,并不意味着整套固件同时运行时一定具有相同的时间余量。

SilverStar 参考 Power of Ten 等嵌入式软件设计原则,强调有界循环、静态内存、明确的错误处理、断言和可检查的数据流,并为项目建立了相应的自动化检查规则。这些检查有助于发现部分常见的软件风险,但并不等同于严格满足原始 Power of Ten 规范,更不能代替关键任务状态、输入边界、栈空间和最坏执行时间等方面的完整验证。

静态检查、Host 测试、编译链接及目标板测试各有不同的适用范围。对于实际飞行使用的固件,还需要结合传感器、无线通信、存储负载和任务时序进行进一步验证。

通过模块分层、静态资源管理、明确的数据所有权和异常诊断,SilverStar 希望在保留设备与算法可扩展性的同时,使固件行为更容易理解、测试和维护。

第三部分:数学原理与扩展

10. 惯导与融合算法的数学推导

SilverStar 的导航计算由惯性传播和外部观测修正两部分组成。惯性传播利用角速度和比力,连续计算姿态、速度与位置;外部观测则利用 GNSS、气压等信息,约束随时间积累的误差。

Pure INS、SF6、KF6 和 ESKF15 共用部分坐标与输入约定,但维护的状态、使用的误差模型和处理观测的方式不同。本章公式均以 v0.1.2 固件中的实际实现为准。相关数学文档和实现说明保存在项目的 docs 目录中。

10.1 坐标系、单位与基本约定

导航系与机体系

SilverStar 使用局部东、北、上坐标系作为导航系,记为 $n$。三个坐标轴分别对应 East、North 和 Up,构成右手坐标系。

位置和速度写为:

$$\boldsymbol{p}=\begin{bmatrix}p_ {E}&p_ {N}&p_ {U}\end{bmatrix}^{T},\qquad\boldsymbol{v}=\begin{bmatrix}v_ {E}&v_ {N}&v_ {U}\end{bmatrix}^{T}.$$

位置单位为米,速度单位为米每秒。这里的位置是相对于本次任务参考原点的局部坐标,不是经纬度,也不是到初始位置的累计路程。

机体系记为 $b$,由传感器安装方式和软件轴向映射共同确定。传感器封装上的 X、Y、Z,不一定直接等于系统使用的机体系轴向。例如,同一个 IMU 旋转安装或放到 PCB 背面后,就需要相应修改坐标映射。

用 $C_ {nb}$ 表示从机体系到导航系的旋转矩阵,则同一个向量在两个坐标系中的表示满足:

$$\boldsymbol{u}^{n}=C_ {nb}\boldsymbol{u}^{b}.$$

反向转换为:

$$\boldsymbol{u}^{b}=C_ {nb}^{T}\boldsymbol{u}^{n}.$$

旋转矩阵应满足:

$$C_ {nb}^{T}C_ {nb}=I_ {3},\qquad\det(C_ {nb})=1.$$

本章使用 $C$ 表示旋转矩阵,使用 $R$ 表示量测噪声协方差,避免两者混淆。

比力与重力

加速度计直接测得的是比力,而不是已经去除重力的平动加速度。经过单位转换和校准后的机体系比力记为 $\boldsymbol{f}^{b}$,导航加速度为:

$$\boldsymbol{a}^{n}=C_ {nb}\boldsymbol{f}^{b}+\boldsymbol{g}^{n}.$$

ENU 的竖直正方向向上,因此重力向量为:

$$\boldsymbol{g}^{n}=\begin{bmatrix}0\cr 0\cr -g\end{bmatrix},\qquad g>0.$$

例如,设备静止且机体系与 ENU 对齐时,加速度计的向上分量约为 $+g$。将其旋转到导航系,再加上向下的重力,结果应接近零:

$$C_ {nb}\boldsymbol{f}^{b}+\boldsymbol{g}^{n}\approx\boldsymbol{0}.$$

因此,不能先固定地从某个机体系分量中减去 $g$,再把结果交给任意姿态下的导航计算;也不能在输入和机械化过程中重复扣除重力。

当前导航采用固定局部坐标系与常重力近似,不包含地球自转、导航系运输角速度、科氏项或随位置变化的重力模型。任务持续时间、运动距离和高度增加后,这些近似带来的误差也需要重新评估。

单位与符号

进入算法的角速度统一使用 $\mathrm{rad/s}$,角增量使用 $\mathrm{rad}$,比力使用 $\mathrm{m/s^2}$。设备给出的 $\mathrm{g}$、${}^\circ/\mathrm{s}$ 等单位,需要在进入计算前完成转换。

如果 GNSS 使用 NED 速度,其向下分量需要转换为 ENU 的向上分量:

$$v_ {E}=v_ {\mathrm{East}},\qquad v_ {N}=v_ {\mathrm{North}},\qquad v_ {U}=-v_ {\mathrm{Down}}.$$

本章中的 $I_ {m}$ 表示 $m$ 阶单位矩阵,上标 $-$ 表示量测更新前的预测值,上标 $+$ 表示量测更新后的值。下标 $k$ 表示离散计算时刻,不代表每次 FreeRTOS 任务循环都会产生一个新样本。

10.2 四元数与姿态更新

四元数表示

SilverStar 使用 Hamilton 四元数,标量分量在前:

$$q_ {nb}=\begin{bmatrix}q_ {w}&q_ {x}&q_ {y}&q_ {z}\end{bmatrix}^{T}.$$

它表示将机体系向量主动旋转到 ENU 导航系,单位四元数满足:

$$q_ {w}^2+q_ {x}^2+q_ {y}^2+q_ {z}^2=1.$$

若将两个四元数分别写为 $q_1=[w_1,\boldsymbol{u}_1]^T$ 和 $q_2=[w_2,\boldsymbol{u}_2]^T$,其乘法为:

$$q_1\otimes q_2=\begin{bmatrix}w_1w_2-\boldsymbol{u}_1^{T}\boldsymbol{u}_2\cr w_1\boldsymbol{u}_2+w_2\boldsymbol{u}_1+\boldsymbol{u}_1\times\boldsymbol{u}_2\end{bmatrix}.$$

四元数乘法一般不满足交换律,即 $q_1\otimes q_2$ 通常不等于 $q_2\otimes q_1$。因此,姿态更新时必须明确增量在哪个坐标系中表示。

单位四元数对应的旋转矩阵为:

$$C_ {nb}(q)=\begin{bmatrix}1-2(q_ {y}^2+q_ {z}^2)&2(q_ {x}q_ {y}-q_ {w}q_ {z})&2(q_ {x}q_ {z}+q_ {w}q_ {y})\cr 2(q_ {x}q_ {y}+q_ {w}q_ {z})&1-2(q_ {x}^2+q_ {z}^2)&2(q_ {y}q_ {z}-q_ {w}q_ {x})\cr 2(q_ {x}q_ {z}-q_ {w}q_ {y})&2(q_ {y}q_ {z}+q_ {w}q_ {x})&1-2(q_ {x}^2+q_ {y}^2)\end{bmatrix}.$$

由角增量更新姿态

设一次积分得到的机体系旋转向量为 $\Delta\boldsymbol{\theta}$,其模长为:

$$\alpha=\lVert\Delta\boldsymbol{\theta}\rVert.$$

对应的增量四元数记为 $\mathcal{Q}(\Delta\boldsymbol{\theta})$:

$$\mathcal{Q}(\Delta\boldsymbol{\theta})=\begin{bmatrix}\cos(\alpha/2)\cr \dfrac{\sin(\alpha/2)}{\alpha}\Delta\boldsymbol{\theta}\end{bmatrix}.$$

当 $\alpha=0$ 时,取其连续极限,即单位四元数。实际计算中可以使用小角度展开,避免除以很小的数:

$$\cos(\alpha/2)\approx1-\frac{\alpha^2}{8},$$

$$\frac{\sin(\alpha/2)}{\alpha}\approx\frac12-\frac{\alpha^2}{48}.$$

因为角增量在机体系中表示,姿态通过右乘更新:

$$q_ {k+1}=\operatorname{normalize}\left(q_ {k}\otimes\mathcal{Q}(\Delta\boldsymbol{\theta})\right).$$

如果执行的是绕导航系固定轴的旋转,则应在左侧相乘。后面的已知航向对准和 ESKF 误差注入会分别用到这两种情况。

归一化用于修正浮点运算造成的模长偏差,并不能消除陀螺零偏或姿态漂移。另外,$q$ 和 $-q$ 表示同一个姿态,比较或平均四元数时不能只看四个分量是否接近。

姿态与航向角的区别

本项目的 ENU yaw,通常指机体系 $+X$ 轴在水平面上的投影相对于东向的角度:

$$\psi=\operatorname{atan2}(C_ {21},C_ {11}).$$

按照这一约定,$0^\circ$ 指东,$90^\circ$ 指北。

若使用从北向顺时针计量的方位角 $A$,对于同一个被约束的水平投影方向,两者满足:

$$\psi=\operatorname{wrap}\left(\frac{\pi}{2}-A\right).$$

这里必须是同一根参考轴。如果对准配置约束的是火箭纵轴或其他指定轴,就需要先将该轴旋转到导航系,再计算其水平投影。

当所选轴接近竖直时,水平投影长度接近零,方位角不再具有稳定意义。此时应使用其他姿态信息,而不是将一个数值不稳定的 yaw 当作可靠航向。

10.3 传感器校准与初始对准

校准与初始对准解决的是两个不同问题。校准修正传感器测量中的部分系统误差,初始对准则确定任务开始时的姿态。校准完成后可以重新摆放设备,再进行初始对准。

校准模型

当前校准采用逐轴偏置与比例修正。对第 $j$ 个轴:

$$f_ {c,j}=s_ {a,j}\left(f_ {\mathrm{raw},j}-b_ {a,\mathrm{cal},j}\right),$$

$$\omega_ {c,j}=s_ {g,j}\left(\omega_ {\mathrm{raw},j}-b_ {g,\mathrm{cal},j}\right).$$

其中,$b_ {a,\mathrm{cal},j}$ 和 $b_ {g,\mathrm{cal},j}$ 分别是加速度计与陀螺仪的校准偏置,$s_ {a,j}$ 和 $s_ {g,j}$ 是比例修正系数。

这一模型只进行各轴独立修正,不包含完整的交叉轴误差矩阵和温度模型。

NONE 模式使用零偏置和单位比例,即:

$$b_ {a,\mathrm{cal},j}=b_ {g,\mathrm{cal},j}=0,\qquad s_ {a,j}=s_ {g,j}=1.$$

它表示没有进行本次采样校准,不表示传感器实际不存在误差。

单面与六面校准

单面校准需要已知静止时重力对应的比力方向。设该方向在机体系中的单位向量为 $\boldsymbol{d}_ {\mathrm{ref}}$,静止采样均值为 $\overline{\boldsymbol{f}}$ 和 $\overline{\boldsymbol{\omega}}$,则偏置估计可写为:

$$\boldsymbol{b}_ {a,\mathrm{cal}}=\overline{\boldsymbol{f}}-g\boldsymbol{d}_ {\mathrm{ref}},$$

$$\boldsymbol{b}_ {g,\mathrm{cal}}=\overline{\boldsymbol{\omega}}.$$

一个静止方向不足以独立确定各轴的全部比例和安装误差,因此单面校准不能代替完整标定。

六面校准分别取得各轴正向、反向朝上的测量均值。对第 $j$ 个轴,设对应结果为 $a_ {j}^+$ 和 $a_ {j}^-$,要求校正后分别接近 $+g$ 和 $-g$:

$$(a_ {j}^+-b_ {j})s_ {j}=g,\qquad(a_ {j}^--b_ {j})s_ {j}=-g.$$

两式相加、相减,可得:

$$b_ {a,\mathrm{cal},j}=\frac{a_ {j}^++a_ {j}^-}{2},$$

$$s_ {a,j}=\frac{2g}{a_ {j}^+-a_ {j}^-}.$$

分母必须为正且足够大,得到的比例系数也需要落在合理范围内。陀螺偏置可由六个静止面的角速度均值求平均:

$$b_ {g,\mathrm{cal},j}=\frac16\sum_ {r=1}^{6}\overline{\omega}_ {r,j}.$$

当前静态六面校准并不测量陀螺比例误差,因此陀螺比例系数保持为 1。校准阶段使用的重力、传感器单位换算和导航阶段使用的重力参数应相互核对,避免静止时出现人为的重力补偿残差。

重力与已知方向对准

在合格的静止窗口内,比力均值的方向可以作为机体系中的向上参考:

$$\boldsymbol{u}_ {b}=\frac{\overline{\boldsymbol{f}}_ {c}}{\lVert\overline{\boldsymbol{f}}_ {c}\rVert},\qquad\boldsymbol{u}_ {n}=\begin{bmatrix}0\cr 0\cr 1\end{bmatrix}.$$

初始姿态需要满足:

$$C_ {nb}\boldsymbol{u}_ {b}=\boldsymbol{u}_ {n}.$$

但这一条件只能确定两个倾斜自由度。绕导航系竖直轴继续旋转,仍然满足同一个重力约束,因此单独依靠重力无法确定绝对水平朝向。

设首先求得满足重力约束的姿态 $q_ {g}$,选定的机体系参考轴为 $\boldsymbol{r}_ {b}$。将它旋转到导航系:

$$\boldsymbol{r}_ {n}=C_ {nb}(q_ {g})\boldsymbol{r}_ {b}.$$

在水平投影有效时,其当前方位角为:

$$\psi_ {g}=\operatorname{atan2}(r_ {n,N},r_ {n,E}).$$

若已知目标角度为 $\psi_ {0}$,则:

$$\Delta\psi=\operatorname{wrap}(\psi_ {0}-\psi_ {g}),$$

$$q_ {0}=\mathcal{Q}\left(\begin{bmatrix}0\cr 0\cr \Delta\psi\end{bmatrix}\right)\otimes q_ {g}.$$

这里绕导航系 Up 轴修正,所以采用左乘。直接改成右乘,会把旋转理解为绕机体系轴进行,在倾斜姿态下得到不同结果。

双矢量与多矢量约束

如果已知两组不共线的方向对应关系:

$$C_ {nb}\boldsymbol{b}_ {1}=\boldsymbol{n}_ {1},\qquad C_ {nb}\boldsymbol{b}_ {2}=\boldsymbol{n}_ {2},$$

就可以分别在两个坐标系中构造正交基:

$$\boldsymbol{t}_ {b,1}=\boldsymbol{b}_ {1},\qquad\boldsymbol{t}_ {b,2}=\frac{\boldsymbol{b}_ {1}\times\boldsymbol{b}_ {2}}{\lVert\boldsymbol{b}_ {1}\times\boldsymbol{b}_ {2}\rVert},\qquad\boldsymbol{t}_ {b,3}=\boldsymbol{t}_ {b,1}\times\boldsymbol{t}_ {b,2},$$

$$\boldsymbol{t}_ {n,1}=\boldsymbol{n}_ {1},\qquad\boldsymbol{t}_ {n,2}=\frac{\boldsymbol{n}_ {1}\times\boldsymbol{n}_ {2}}{\lVert\boldsymbol{n}_ {1}\times\boldsymbol{n}_ {2}\rVert},\qquad\boldsymbol{t}_ {n,3}=\boldsymbol{t}_ {n,1}\times\boldsymbol{t}_ {n,2}.$$

令:

$$T_ {b}=\begin{bmatrix}\boldsymbol{t}_ {b,1}&\boldsymbol{t}_ {b,2}&\boldsymbol{t}_ {b,3}\end{bmatrix},\qquad T_ {n}=\begin{bmatrix}\boldsymbol{t}_ {n,1}&\boldsymbol{t}_ {n,2}&\boldsymbol{t}_ {n,3}\end{bmatrix},$$

则姿态矩阵为:

$$C_ {nb}=T_ {n}T_ {b}^T.$$

两个向量越接近平行或反平行,叉积越小,对测量误差就越敏感。因此,双矢量对准不仅需要两个向量,还需要它们具有足够好的几何关系。

SilverStar 的多矢量约束实现,会从输入中选取有效向量对,分别计算候选四元数,再根据输入权重和几何关系进行平均。对向量对 $(i,j)$,其权重采用:

$$w_ {ij}=w_ {i}w_ {j}\lVert\boldsymbol{b}_ {i}\times\boldsymbol{b}_ {j}\rVert^2\lVert\boldsymbol{n}_ {i}\times\boldsymbol{n}_ {j}\rVert^2.$$

随后构造四元数平均矩阵:

$$M_ {q}=\sum_ {i<j}w_ {ij}q_ {ij}q_ {ij}^T.$$

通过固定次数的幂迭代求取主要方向,得到平均四元数。使用外积 $qq^T$,可以避免 $q$ 与 $-q$ 表示相同姿态却在普通算术平均中相互抵消的问题。

这一实现属于成对构姿与加权四元数平均,不应直接等同于任意条件下的全局最优姿态解。最终还要检查各个方向约束的残差,决定是否接受此次对准。

当前普通配置入口主要开放重力与已知方向构成的双矢量对准,通用多矢量求解框架保留在底层,尚未作为完整的普通配置功能开放。

10.4 参考原点与外部观测

参考原点

局部导航需要一个固定原点。SilverStar 在准备阶段收集合格的 GNSS 和气压样本,检查有效性、新鲜度及离群情况,再冻结本次任务的参考信息。

对最终保留的样本集合 $\mathcal{I}$,某个标量参考量的均值可写为:

$$\overline{z}_ {0}=\frac{1}{|\mathcal{I}|}\sum_ {i\in\mathcal{I}}z_ {i}.$$

平均可以减小部分随机波动,但不能自动消除多路径、共同偏差或安装误差。将初始位置设为局部坐标零点,也不表示这个零点在绝对地理位置上没有误差。

如果任务开始前没有建立合格的 GNSS 原点,后续移动中出现的定位结果不会自动被当作新的原点。这样可以避免任务过程中坐标基准突然变化。

经纬度到局部坐标

当前实现使用基于 WGS-84 椭球的固定局部线性化,而不是完整的 ECEF 到 ENU 转换。

设原点纬度、经度和椭球高为 $(\varphi_ {0},\lambda_ {0},h_ {\mathrm{ell},0})$。椭球长半轴为 $a_ {\mathrm{ell}}$,扁率为 $f_ {\mathrm{ell}}$,第一偏心率平方为:

$$e_ {\mathrm{ell}}^2=f_ {\mathrm{ell}}(2-f_ {\mathrm{ell}}).$$

原点处的卯酉圈曲率半径和子午圈曲率半径分别为:

$$N_ {0}=\frac{a_ {\mathrm{ell}}}{\sqrt{1-e_ {\mathrm{ell}}^2\sin^2\varphi_ {0}}},$$

$$M_ {0}=\frac{a_ {\mathrm{ell}}(1-e_ {\mathrm{ell}}^2)}{(1-e_ {\mathrm{ell}}^2\sin^2\varphi_ {0})^{3/2}}.$$

对于邻近位置 $(\varphi,\lambda,h_ {\mathrm{ell}})$,局部坐标近似为:

$$p_ {E}=(N_ {0}+h_ {\mathrm{ell},0})\cos\varphi_ {0}\thinspace\Delta\lambda,$$

$$p_ {N}=(M_ {0}+h_ {\mathrm{ell},0})\Delta\varphi,$$

$$p_ {U}=h_ {\mathrm{ell}}-h_ {\mathrm{ell},0}.$$

其中经纬度差必须使用弧度,经度差需要处理跨越 $\pm180^\circ$ 的情况。源码先在整数域求经纬度差,再进行浮点尺度转换,以减少大数相减时的精度损失。

这是一种局部近似,$p_ {U}$ 使用椭球高度差,不是完整三维旋转后严格意义上的切平面 Up 坐标。距离较长或接近极区时,应重新考虑坐标转换与导航模型。

气压高度观测

设气压传感器提供的高度为 $h_ {\mathrm{baro}}(t)$,准备阶段冻结的参考高度为 $\overline{h}_ {\mathrm{baro},0}$,则用于融合的相对高度为:

$$z_ {\mathrm{baro}}(t)=h_ {\mathrm{baro}}(t)-\overline{h}_ {\mathrm{baro},0}.$$

它在滤波器中主要观测 $p_ {U}$。相对化可以消除一部分起始偏移,但不能消除后续气压变化、温度变化和取压条件带来的误差。

当前 KF6 与 ESKF15 都没有额外估计一个独立的气压偏置状态,因此不能把长期气压偏差理解为必然会被滤波器自动分离出来。

观测分组

GNSS 和气压观测按五组处理:水平位置、竖直位置、水平速度、竖直速度以及气压相对高度。

这样的分组允许分别判断有效性。例如,水平位置可用而竖直位置不可用时,可以只处理水平位置;某组观测被拒绝,也不意味着同一 GNSS 消息中的其他组都必须被拒绝。

初始化时,姿态来自本次对准,位置对应所选局部参考,初始速度和协方差则由具体导航支路及有效初始观测确定。离线复算需要保留这些实际初值,而不应把所有算法的初始状态统一替换成同一组默认值。

10.5 惯性机械化与 Pure INS

惯性机械化是将 IMU 测量转换为姿态、速度和位置的过程。Pure INS 直接以这一传播结果作为导航输出,不执行外部量测更新。

子区间积分

设三个连续样本时刻为 $t_ {0},t_ {1},t_ {2}$,对应两个真实时间间隔:

$$\Delta t_ {1}=t_ {1}-t_ {0},\qquad\Delta t_ {2}=t_ {2}-t_ {1}.$$

对第 $i$ 个子区间,使用梯形积分计算角增量和比力速度增量:

$$\Delta\boldsymbol{\theta}_ {i}=\frac{\boldsymbol{\omega}_ {i-1}+\boldsymbol{\omega}_ {i}}{2}\Delta t_ {i},$$

$$\Delta\boldsymbol{u}_ {i}=\frac{\boldsymbol{f}_ {i-1}+\boldsymbol{f}_ {i}}{2}\Delta t_ {i}.$$

$\Delta\boldsymbol{u}_ {i}$ 的单位虽然是米每秒,但它仍是机体系中的比力积分,尚未转换到导航系,也尚未加入重力项。

圆锥与划桨补偿

三维转动不满足交换律。沿两个方向先后转动,其结果一般不等于简单交换顺序后的结果,因此不能只把所有角增量直接相加。

当前二子样圆锥补偿采用:

$$\Delta\boldsymbol{\theta}_ {b}=\Delta\boldsymbol{\theta}_ {1}+\Delta\boldsymbol{\theta}_ {2}+\frac23\left(\Delta\boldsymbol{\theta}_ {1}\times\Delta\boldsymbol{\theta}_ {2}\right).$$

相应的比力速度增量采用:

$$\begin{aligned}\Delta\boldsymbol{u}_ {b}={}&\Delta\boldsymbol{u}_ {1}+\Delta\boldsymbol{u}_ {2}\cr &+\frac12\left[(\Delta\boldsymbol{\theta}_ {1}+\Delta\boldsymbol{\theta}_ {2})\times(\Delta\boldsymbol{u}_ {1}+\Delta\boldsymbol{u}_ {2})\right]\cr &+\frac23\left(\Delta\boldsymbol{\theta}_ {1}\times\Delta\boldsymbol{u}_ {2}+\Delta\boldsymbol{u}_ {1}\times\Delta\boldsymbol{\theta}_ {2}\right).\end{aligned}$$

其中,系数为 $1/2$ 的项处理积分区间内旋转对比力方向的影响,后面的交叉项用于二子样划桨补偿。

这些补偿可以改善离散旋转和比力耦合带来的部分误差,但不能消除采样混叠,也不能恢复传感器量程之外的真实运动。标准的固定 $2/3$ 系数建立在相应的子样本近似上;当前实现仍使用各自真实时间间隔配合这一固定系数,明显不等间隔时不能将其视为严格精确的非等间隔算法。

导航系传播

设总时间间隔为:

$$\Delta t=\Delta t_ {1}+\Delta t_ {2}.$$

使用区间起点姿态,将补偿后的比力增量旋转到导航系:

$$\Delta\boldsymbol{v}^{n}=C_ {nb}(q_ {k})\Delta\boldsymbol{u}_ {b}+\boldsymbol{g}^{n}\Delta t.$$

随后更新速度与位置:

$$\boldsymbol{v}_ {k+1}=\boldsymbol{v}_ {k}+\Delta\boldsymbol{v}^{n},$$

$$\boldsymbol{p}_ {k+1}=\boldsymbol{p}_ {k}+\frac{\boldsymbol{v}_ {k}+\boldsymbol{v}_ {k+1}}{2}\Delta t.$$

位置更新也可以写成:

$$\boldsymbol{p}_ {k+1}=\boldsymbol{p}_ {k}+\boldsymbol{v}_ {k}\Delta t+\frac12\Delta\boldsymbol{v}^{n}\Delta t.$$

姿态则按前面的右乘公式更新:

$$q_ {k+1}=\operatorname{normalize}\left(q_ {k}\otimes\mathcal{Q}(\Delta\boldsymbol{\theta}_ {b})\right).$$

这里使用的是起点姿态,不应再额外套用一次中点旋转来重复补偿同一个旋转效应。位置采用速度梯形积分,对区间内复杂运动仍然存在离散近似。

Pure INS 的误差增长

设某个方向存在常值残余加速度误差 $\delta a$,且初始速度、位置误差为零,则:

$$\delta v(t)\approx\delta a\thinspace t,$$

$$\delta p(t)\approx\frac12\delta a\thinspace t^2.$$

小倾斜误差还会将一部分重力错误地投影到水平方向:

$$|\delta a_ {h}|\approx g|\delta\theta|.$$

例如,在 $g=9.8\thinspace\mathrm{m/s^2}$、倾斜误差保持为 $1^\circ$ 的简化条件下,水平加速度误差约为 $0.17\thinspace\mathrm{m/s^2}$,10 s 后的位置误差就可以达到约 8.5 m。

如果倾斜误差由某个近似恒定的陀螺残余偏置 $b_ {g}$ 逐渐积累,则在小角度、短时间近似下:

$$|\delta\theta(t)|\approx|b_ {g}|t,$$

$$|\delta p_ {h}(t)|\approx\frac16g|b_ {g}|t^3.$$

这些关系解释了为什么初始姿态、陀螺零偏和加速度计偏置都很重要。它们是特定简化条件下的误差估计,实际运动中的误差还会受到姿态变化、传感器噪声和外部观测的影响。

10.6 SF6 固定增益融合

SF6 在惯性传播基础上,对位置和速度进行固定增益修正。它的状态顺序为:

$$\boldsymbol{x}_ {s}=\begin{bmatrix}v_ {E}&v_ {N}&v_ {U}&p_ {E}&p_ {N}&p_ {U}\end{bmatrix}^{T}.$$

这一顺序与后面的 KF6 不同。

预测阶段使用惯性导航增量:

$$\boldsymbol{v}_ {k+1}^{-}=\boldsymbol{v}_ {k}^{+}+\Delta\boldsymbol{v}^{n},$$

$$\boldsymbol{p}_ {k+1}^{-}=\boldsymbol{p}_ {k}^{+}+\left(\boldsymbol{v}_ {k}^{+}+\frac12\Delta\boldsymbol{v}^{n}\right)\Delta t.$$

某个有效观测 $z_ {j}$ 到达后,只对它直接观测的状态分量进行修正:

$$x_ {s,j}^{+}=x_ {s,j}^{-}+k_ {j}(z_ {j}-x_ {s,j}^{-}),\qquad0\le k_ {j}\le1.$$

也可以写为:

$$x_ {s,j}^{+}=(1-k_ {j})x_ {s,j}^{-}+k_ {j}z_ {j}.$$

$k_ {j}=0$ 表示保持预测值,$k_ {j}=1$ 表示直接采用已通过检查的观测值,介于两者之间时则进行加权合并。

SF6 的六个增益分别对应六个状态分量。GNSS 竖直位置和气压高度都修正 $p_ {U}$,使用该分量对应的增益。位置观测不会在同一次更新中直接修正速度;速度更新对位置的影响来自后续积分。

固定增益的含义

在没有预测扰动、观测始终为同一个常值的简化情况下,连续更新后的误差满足:

$$e_ {r+1}=(1-k)e_ {r},$$

$$e_ {r}=(1-k)^r e_ {0}.$$

因此,相同增益下,单位时间更新次数越多,向观测收敛的速度通常越快。固定增益的实际效果不仅与 $k$ 有关,也与观测频率有关。

SF6 不维护状态协方差,不计算 $Q$、$R$、卡尔曼增益或 NIS。它依靠数据有效性、时间和数值检查接纳观测,而不是按照完整概率模型判断观测权重。

当前状态更新

SF6 将合格观测直接应用到最新预测状态,不保存用于延迟更新的历史滤波轨迹。

量测需要满足初始化时间、测量时间、接收时间和当前状态时间之间的关系:

$$t_ {0}\le t_ {m}\le t_ {r}\le t_ {e}.$$

当前实现还要求量测年龄不超过允许范围,并按观测组检查时间和序号是否正常递增。

这能避免重复使用、乱序或明显过期的数据,但不能消除合法延迟本身造成的误差。以恒速运动为例,延迟 $\tau$ 的位置观测相对于当前真实位置大约落后 $\boldsymbol{v}\tau$。直接更新到当前时刻,就会额外引入与增益和延迟有关的修正偏差。

SF6 适合需要较少状态、固定计算流程和直接参数含义的配置,但不能把 KF6、ESKF15 的统计门控和历史回放能力一并算到 SF6 上。

10.7 KF6 六状态卡尔曼滤波

状态与预测

KF6 的状态顺序为:

$$\boldsymbol{x}=\begin{bmatrix}p_ {E}&p_ {N}&p_ {U}&v_ {E}&v_ {N}&v_ {U}\end{bmatrix}^{T}.$$

它只估计位置与速度。用于产生导航系惯性增量的姿态由软件惯性支路维护,GNSS 更新不直接修正该姿态,也不估计 IMU 残余零偏。

设本次传播时长为 $h$,导航系速度增量为 $\Delta\boldsymbol{v}^{n}$,则:

$$\boldsymbol{x}_ {k+1}^{-}=A(h)\boldsymbol{x}_ {k}^{+}+B(h)\Delta\boldsymbol{v}^{n},$$

其中:

$$A(h)=\begin{bmatrix}I_ {3}&hI_ {3}\cr 0&I_ {3}\end{bmatrix},\qquad B(h)=\begin{bmatrix}\dfrac h2I_ {3}\cr I_ {3}\end{bmatrix}.$$

这里的输入是速度增量,不是加速度,所以 $B$ 的上半部分是 $h/2$。若改用区间平均加速度 $\overline{\boldsymbol{a}}$ 作为输入,才会出现常见的 $h^2/2$ 和 $h$:

$$B(h)\Delta\boldsymbol{v}^{n}=\begin{bmatrix}\dfrac{h^2}{2}I_ {3}\cr hI_ {3}\end{bmatrix}\overline{\boldsymbol{a}}.$$

协方差预测为:

$$P_ {k+1}^{-}=A(h)P_ {k}^{+}A(h)^T+Q_ {d}.$$

过程噪声模型

KF6 的过程噪声参数是每轴的等效加速度标准差 $\sigma_ {a,i}$,单位为 $\mathrm{m/s^2}$。它不是 ESKF 使用的连续噪声密度。

为了正确处理延迟回放中的区间拆分,需要同时区分原始惯性区间时长 $T$ 和当前正在传播的片段时长 $h$,其中 $0<h\le T$。

定义:

$$D_ {a}=T\operatorname{diag}\left(\sigma_ {a,E}^2,\sigma_ {a,N}^2,\sigma_ {a,U}^2\right).$$

当前过程噪声矩阵为:

$$Q_ {d}(h;T)=\begin{bmatrix}\dfrac{h^3}{3}D_ {a}&\dfrac{h^2}{2}D_ {a}\cr \dfrac{h^2}{2}D_ {a}&hD_ {a}\end{bmatrix}.$$

对于完整区间,取 $h=T$。单轴的位置方差、位置速度协方差和速度方差增量分别为:

$$Q_ {pp}=\frac{\sigma_ {a}^2T^4}{3},\qquad Q_ {pv}=\frac{\sigma_ {a}^2T^3}{2},\qquad Q_ {vv}=\sigma_ {a}^2T^2.$$

这些项的单位分别为 $\mathrm{m^2}$、$\mathrm{m^2/s}$ 和 $\mathrm{m^2/s^2}$。

这个矩阵可以由原始区间内等效白加速度噪声积分得到。对单轴而言,时长 $\tau$ 的噪声传播向量为 $[\tau,1]^T$,因此:

$$Q_ {d,i}(h;T)=\sigma_ {a,i}^2T\int_ {0}^h\begin{bmatrix}\tau\cr 1\end{bmatrix}\begin{bmatrix}\tau&1\end{bmatrix}\thinspace d\tau.$$

积分后正好得到前面的 $h^3/3$、$h^2/2$ 和 $h$。

当原始区间被拆成 $h_ {1}$ 和 $h_ {2}$ 时,必须保持同一个 $T$,才能满足:

$$\begin{aligned}Q_ {d}(h_ {1}+h_ {2};T)={}&A(h_ {2})Q_ {d}(h_ {1};T)A(h_ {2})^T\cr &+Q_ {d}(h_ {2};T).\end{aligned}$$

如果把每个片段的 $h$ 又当成新的原始 $T$,就改变了噪声强度,拆分前后的协方差不再一致。因此,区间拆分时需要始终保留原始时长,以保证过程噪声的一致性。

观测模型

定义水平选择矩阵与竖直选择向量:

$$E_ {EN}=\begin{bmatrix}1&0&0\cr 0&1&0\end{bmatrix},\qquad e_ {U}^T=\begin{bmatrix}0&0&1\end{bmatrix}.$$

位置和速度观测矩阵分别为:

$$H_ {p,EN}=\begin{bmatrix}E_ {EN}&0\end{bmatrix},\qquad H_ {p,U}=\begin{bmatrix}e_ {U}^T&0\end{bmatrix},$$

$$H_ {v,EN}=\begin{bmatrix}0&E_ {EN}\end{bmatrix},\qquad H_ {v,U}=\begin{bmatrix}0&e_ {U}^T\end{bmatrix}.$$

气压观测直接对应 $p_ {U}$,所以:

$$H_ {\mathrm{baro}}=H_ {p,U}.$$

量测模型写为:

$$\boldsymbol{z}=H\boldsymbol{x}+\boldsymbol{\nu},\qquad\operatorname{Cov}(\boldsymbol{\nu})=R.$$

水平组为二维更新,竖直组为一维更新,不应在这些分组已经使用同一批数据后,再额外执行一次重复的三维 GNSS 更新。

量测不确定度

当前 KF6 先处理接收机报告的不确定度,再构造量测方差。其基本形式为:

$$\sigma_ {\mathrm{eff}}=\max\left(c_ {\mathrm{acc}}\sigma_ {\mathrm{reported}},\sigma_ {\mathrm{floor}}\right).$$

竖直速度还可以使用独立的标准差倍率:

$$\sigma_ {v,U,\mathrm{eff}}=c_ {U}\max\left(c_ {\mathrm{acc}}\sigma_ {v,U,\mathrm{reported}},\sigma_ {v,\mathrm{floor}}\right).$$

进入协方差时需要平方,因此标准差乘以 $c_ {U}$,对应方差乘以 $c_ {U}^2$。实际传入更新的 $R$ 还要结合该支路的原点不确定度处理和后续质量倍率,不能只根据一个界面参数反推完整权重。

创新与卡尔曼更新

创新是观测与预测之间的差:

$$\boldsymbol{r}=\boldsymbol{z}-H\boldsymbol{x}^{-}.$$

创新协方差和卡尔曼增益为:

$$S=HP^{-}H^T+R,$$

$$K=P^{-}H^TS^{-1}.$$

通过质量检查和统计门控后,状态更新为:

$$\boldsymbol{x}^{+}=\boldsymbol{x}^{-}+K\boldsymbol{r}.$$

协方差使用 Joseph 形式:

$$P^{+}=(I-KH)P^{-}(I-KH)^T+KRK^T.$$

如果本次观测经过了软降权,这里的 $R$ 应使用降权后的有效量测协方差,$K$ 也必须由同一个有效 $R$ 重新计算。

在最简单的一维直接观测情况下,增益为:

$$K=\frac{P^-}{P^-+R}.$$

预测不确定度较大时,更新更依赖观测;观测不确定度较大时,更新更保留预测。多维情况还会受到交叉协方差影响,例如气压只直接观测高度,却可以通过位置速度协方差修正竖直速度。

源码通过 Cholesky 分解和线性方程求解处理创新协方差。协方差数值检查是计算稳定性措施,并不能证明所设 $Q$、$R$ 恰好描述了真实误差。

10.8 ESKF15 名义状态与误差传播

ESKF15 不直接把四元数的四个分量作为四个独立误差状态,而是维护完整名义状态,并用三维小旋转描述姿态误差。

名义状态与误差状态

名义状态为:

$$\boldsymbol{x}_ {\mathrm{nom}}=\left(\boldsymbol{p},\boldsymbol{v},q_ {nb},\boldsymbol{b}_ {g},\boldsymbol{b}_ {a}\right).$$

它在存储上包含 16 个标量:位置 3 个、速度 3 个、四元数 4 个以及两类偏置各 3 个。

对应的十五维误差状态为:

$$\delta\boldsymbol{x}=\begin{bmatrix}\delta\boldsymbol{p}\cr \delta\boldsymbol{v}\cr \delta\boldsymbol{\theta}\cr \delta\boldsymbol{b}_ {g}\cr \delta\boldsymbol{b}_ {a}\end{bmatrix}.$$

位置、速度和偏置采用“真实值减名义值”的加性误差。姿态采用右乘局部误差:

$$q_ {\mathrm{true}}=q_ {nb}\otimes\mathcal{Q}(\delta\boldsymbol{\theta}).$$

因此,$\delta\boldsymbol{\theta}$ 是在局部机体系中表示的小旋转,后续误差矩阵和观测雅可比都必须遵守这一约定。

这里的 $\boldsymbol{b}_ {g}$ 和 $\boldsymbol{b}_ {a}$ 是外部校准之后剩余的残余偏置。ESKF 实际使用的输入为:

$$\boldsymbol{\omega}=\boldsymbol{\omega}_ {c}-\boldsymbol{b}_ {g},\qquad\boldsymbol{f}=\boldsymbol{f}_ {c}-\boldsymbol{b}_ {a}.$$

这不是再次减去同一份校准偏置,而是对校准后仍然存在的误差进行在线估计。

名义状态传播

ESKF 使用总积分区间内的两个半区间机体系均值。设总时长为 $\Delta t$,则每个半区间形成:

$$\Delta\boldsymbol{\theta}_ {i}=(\overline{\boldsymbol{\omega}}_ {c,i}-\boldsymbol{b}_ {g})\frac{\Delta t}{2},$$

$$\Delta\boldsymbol{u}_ {i}=(\overline{\boldsymbol{f}}_ {c,i}-\boldsymbol{b}_ {a})\frac{\Delta t}{2},\qquad i=1,2.$$

然后使用前面相同的圆锥、旋转和划桨补偿公式,以 ESKF 自己的起点姿态更新位置、速度和四元数。

名义偏置在一次纯预测中保持不变,其不确定度则通过随机游走模型增长。

ESKF 必须保留机体系输入,因为姿态和偏置修正以后,同一段原始运动对应的导航系增量也会改变。直接复用另一个惯导支路已经旋转好的 ENU 增量,就无法正确体现这些反馈。

误差动力学

定义叉乘矩阵:

$$[\boldsymbol{a}]_ {\times}=\begin{bmatrix}0&-a_ {z}&a_ {y}\cr a_ {z}&0&-a_ {x}\cr -a_ {y}&a_ {x}&0\end{bmatrix},$$

使其满足:

$$[\boldsymbol{a}]_ {\times}\boldsymbol{b}=\boldsymbol{a}\times\boldsymbol{b}.$$

在小姿态误差下:

$$C_ {\mathrm{true}}\approx C_ {nb}(I_ {3}+[\delta\boldsymbol{\theta}]_ {\times}).$$

因此,比力旋转误差的一阶项为:

$$\delta(C\boldsymbol{f})\approx-C_ {nb}[\boldsymbol{f}]_ {\times}\delta\boldsymbol{\theta}-C_ {nb}\delta\boldsymbol{b}_ {a}.$$

忽略噪声项时,主要误差关系为:

$$\delta\dot{\boldsymbol{p}}=\delta\boldsymbol{v},$$

$$\delta\dot{\boldsymbol{v}}=-C_ {nb}[\overline{\boldsymbol{f}}]_ {\times}\delta\boldsymbol{\theta}-C_ {nb}\delta\boldsymbol{b}_ {a},$$

$$\delta\dot{\boldsymbol{\theta}}=-[\overline{\boldsymbol{\omega}}]_ {\times}\delta\boldsymbol{\theta}-\delta\boldsymbol{b}_ {g}.$$

将其写成矩阵形式:

$$\delta\dot{\boldsymbol{x}}=F\delta\boldsymbol{x}+\boldsymbol{\xi}(t),$$

其中 $\boldsymbol{\xi}(t)$ 表示进入误差状态方程的合成噪声项。

$$F=\begin{bmatrix}0&I_ {3}&0&0&0\cr 0&0&-C_ {nb}[\overline{\boldsymbol{f}}]_ {\times}&0&-C_ {nb}\cr 0&0&-[\overline{\boldsymbol{\omega}}]_ {\times}&-I_ {3}&0\cr 0&0&0&0&0\cr 0&0&0&0&0\end{bmatrix}.$$

所有分块均为 $3\times3$。当前实现使用两个半区间的平均比力和角速度,并以名义起点姿态构造这一线性化模型。

矩阵中的耦合项解释了外部位置和速度观测为什么能够间接约束姿态与偏置。但能否充分估计这些量,还取决于运动激励和观测条件;有耦合项并不意味着所有误差在静止或任意运动下都能被独立识别。

离散转移与过程噪声

在一个短区间内将 $F$ 视为固定,精确线性状态转移为 $e^{F\Delta t}$。当前实现保留到二阶:

$$\Phi=I_ {15}+F\Delta t+\frac12F^2\Delta t^2.$$

协方差预测为:

$$P^-=\Phi P^+\Phi^T+Q_ {d}.$$

设加速度计、陀螺仪和两类偏置随机游走的连续噪声强度参数分别为 $n_ {a},n_ {g},n_ {bg},n_ {ba}$。在当前各向同性、互不相关的噪声模型下:

$$W=c_ {q}\operatorname{diag}\left(0_ {3},n_ {a}^2I_ {3},n_ {g}^2I_ {3},n_ {bg}^2I_ {3},n_ {ba}^2I_ {3}\right).$$

其中 $n_ {a}$、$n_ {g}$ 分别使用加速度和角速度的噪声密度单位;$n_ {bg}$、$n_ {ba}$ 描述偏置随机游走,可分别表示为 $(\mathrm{rad/s})/\sqrt{\mathrm s}$ 和 $(\mathrm{m/s^2})/\sqrt{\mathrm s}$。

这些参数平方后进入谱强度矩阵,不能直接用某次静止采样的标准差替代。将器件手册中的噪声密度转换为模型参数时,还需要核对带宽和谱密度约定。

当前噪声传播采用一阶近似 $I+F\tau$,因此:

$$Q_ {d}=\int_ {0}^{\Delta t}(I+F\tau)W(I+F\tau)^T\thinspace d\tau,$$

展开得到:

$$Q_ {d}=\Delta t\thinspace W+\frac{\Delta t^2}{2}(FW+WF^T)+\frac{\Delta t^3}{3}FWF^T.$$

这个等式对所采用的一阶噪声传播近似成立,但不是完整矩阵指数噪声积分的精确结果。不能因为 $\Phi$ 保留了二阶项,就把 $Q_ {d}$ 也描述为使用同样二阶传播得到的精确积分。

实现会根据部分 IMU 质量标志将 $c_ {q}$ 从 1 调整为 4。这是噪声方差强度乘以 4,相当于相应幅度参数乘以 2,而不是幅度乘以 4。削顶和时间不连续等更严重问题则进入拒绝传播的路径。

10.9 ESKF15 观测更新与误差注入

GNSS 与气压观测模型

ESKF15 使用 GNSS 位置、速度和气压高度等外部观测修正导航状态。当前默认配置将 GNSS 天线与导航参考点近似视为同一位置,不启用非零杆臂补偿。

因此,GNSS 位置和速度的基本观测模型为:

$$\widehat{\boldsymbol{z}}_ {p}=\boldsymbol{p},\qquad\widehat{\boldsymbol{z}}_ {v}=\boldsymbol{v}.$$

按照十五维误差状态的排列顺序,对应的三轴观测雅可比矩阵为:

$$H_ {p}=\left[I_ {3}\quad0_ {3\times12}\right].$$

$$H_ {v}=\left[0_ {3\times3}\quad I_ {3}\quad0_ {3\times9}\right].$$

其中,$I_ {3}$ 是三阶单位矩阵,$0_ {m\times n}$ 表示 $m$ 行 $n$ 列的零矩阵。两个雅可比矩阵的大小均为 $3\times15$。

实际更新时,系统根据有效性将 GNSS 位置和速度分成水平与竖直观测组,分别执行一维或二维更新。

气压传感器提供相对高度,直接观测竖直位置:

$$\widehat{z}_ {\mathrm{baro}}=p_ {U}.$$

$$H_ {\mathrm{baro}}=\left[0\quad0\quad1\quad0_ {1\times12}\right].$$

虽然这些观测没有直接测量姿态和惯性传感器零偏,但 ESKF15 可以通过状态之间的交叉协方差,将位置和速度修正传递到相应误差状态。

对于 GNSS 天线与 IMU 不在同一位置的情况,ESKF15 源码已经提供杆臂参数和相应的观测计算,但当前默认参数均为零,非零杆臂补偿尚未在本次任务中启用。

误差估计与注入

ESKF 的创新为实际观测减名义观测预测。记非线性观测函数为 $\mathcal{H}$,其相对于误差状态的雅可比为 $H$:

$$\boldsymbol{r}=\boldsymbol{z}-\mathcal{H}(\boldsymbol{x}_ {\mathrm{nom}}^-).$$

创新协方差、增益和误差估计分别为:

$$S=HP^-H^T+R.$$

$$K=P^-H^TS^{-1}.$$

$$\widehat{\delta\boldsymbol{x}}=K\boldsymbol{r}.$$

位置、速度及两类偏置使用加性注入:

$$\boldsymbol{p}^{+}=\boldsymbol{p}^{-}+\widehat{\delta\boldsymbol{p}},\qquad\boldsymbol{v}^{+}=\boldsymbol{v}^{-}+\widehat{\delta\boldsymbol{v}}.$$

$$\boldsymbol{b}_ {g}^{+}=\boldsymbol{b}_ {g}^{-}+\widehat{\delta\boldsymbol{b}_ {g}},\qquad\boldsymbol{b}_ {a}^{+}=\boldsymbol{b}_ {a}^{-}+\widehat{\delta\boldsymbol{b}_ {a}}.$$

姿态通过右乘注入:

$$q^+=\operatorname{normalize}\left(q^-\otimes\mathcal{Q}(\widehat{\delta\boldsymbol{\theta}})\right).$$

运行中的加速度计在这里作为比力输入参与传播,并没有被直接当作始终指向重力的姿态观测。外部位置和速度观测通过误差状态的耦合关系修正姿态,这与静止初对准时使用重力方向是两种不同机制。

协方差重置

将估计误差注入名义状态后,误差均值回到零,但协方差不能简单清零,也不能完全保持原样,因为姿态误差的参考已经改变。

首先按 Joseph 形式计算更新后的误差协方差:

$$P_ {J}=(I-KH)P^-(I-KH)^T+KRK^T.$$

然后执行坐标重置:

$$P^+=GP_ {J}G^T.$$

$$G=\operatorname{diag}\left(I_ {3},I_ {3},J_ {r}(\widehat{\delta\boldsymbol{\theta}}),I_ {3},I_ {3}\right).$$

对旋转向量 $\boldsymbol{\phi}$,令 $\alpha=\lVert\boldsymbol{\phi}\rVert$,右雅可比为:

$$J_ {r}(\boldsymbol{\phi})=I_ {3}-\frac{1-\cos\alpha}{\alpha^2}[\boldsymbol{\phi}]_ {\times}+\frac{\alpha-\sin\alpha}{\alpha^3}[\boldsymbol{\phi}]_ {\times}^2.$$

接近零角度时使用:

$$\frac{1-\cos\alpha}{\alpha^2}\approx\frac12-\frac{\alpha^2}{24}.$$

$$\frac{\alpha-\sin\alpha}{\alpha^3}\approx\frac16-\frac{\alpha^2}{120}.$$

其最低几阶形式为:

$$J_ {r}(\boldsymbol{\phi})\approx I_ {3}-\frac12[\boldsymbol{\phi}]_ {\times}+\frac16[\boldsymbol{\phi}]_ {\times}^2.$$

这一重置来自同一个真实姿态在注入前后的表示关系:

$$\mathcal{Q}(\delta\boldsymbol{\theta}_ {\mathrm{new}})=\mathcal{Q}(-\widehat{\delta\boldsymbol{\theta}})\otimes\mathcal{Q}(\delta\boldsymbol{\theta}_ {\mathrm{old}}).$$

因此,变换影响的不只是姿态误差自身的协方差,还包括姿态与位置、速度、偏置之间的交叉协方差。当前源码对完整协方差执行这一变换。

数值检查与初始不确定度

当前 ESKF 的一维、二维创新系统采用标量或 $2\times2$ 显式求逆,完整状态协方差的正定性检查则使用 Cholesky。两者是不同步骤,不能都称为 Cholesky 创新求解。

每次传播和更新先形成候选状态,经过有限性、模型范围和协方差检查后再提交。某次候选修正被拒绝,不应留下部分已经修改的名义状态。

初始协方差中的元素已经是方差。例如,希望表达 $10^\circ$ 的姿态误差标准差,需要先转为弧度再平方:

$$\sigma_ {\theta}=10\frac{\pi}{180}\approx0.17453\thinspace\mathrm{rad}.$$

$$P_ {\theta\theta}=\sigma_ {\theta}^2\approx0.03046\thinspace\mathrm{rad^2}.$$

残余偏置初始化为零,也不表示偏置误差为零;其初始不确定度仍由对应的协方差项描述。

10.10 时间对齐与延迟观测处理

三个不同的时刻

异步传感器融合需要区分:

$t_ {m}$ 为观测对应的测量时刻,$t_ {r}$ 为 MCU 接收到观测的时刻,$t_ {e}$ 为估计器当前已经传播到的时刻。

一条观测进入历史更新前,需要满足相应的先后关系和有效时间窗口。设备给出的 GNSS 周内时等原生时钟,也不能未经转换就直接与 MCU 单调时间相减。

当设备提供可信的 MCU 测量时间时,直接使用该时间;否则,可按配置的固定延迟 $\tau$ 估计:

$$t_ {m}=t_ {r}-\tau.$$

可信时间分支不应再重复减去同一项延迟。固定延迟只是设备和数据路径的模型参数,不是所有 GNSS 接收机通用的常数。

延迟为什么会形成创新

以一维恒速运动为例:

$$p(t_ {e})-p(t_ {m})=v(t_ {e}-t_ {m}).$$

即使观测本身完全正确,如果把 $p(t_ {m})$ 直接与当前预测 $p(t_ {e})$ 比较,也会产生:

$$r\approx-v(t_ {e}-t_ {m}).$$

因此,较大的创新不一定只来自位置测量误差,还可能来自时间不一致。

SF6 选择将合格观测直接作用于当前状态,主要以较简单的计算换取较低资源占用。KF6 和 ESKF15 则可以在有限历史窗口中处理延迟观测。

KF6 历史回放

KF6 保存一定范围内的惯性增量、量测事件和检查点。延迟观测到达后,恢复相应历史状态及协方差,在量测时刻执行更新,再重新传播到当前时刻。

如果观测落在原始区间内部,需要按时间拆分该区间。对于当前采用的区间平均导航加速度模型,片段速度增量为:

$$\Delta\boldsymbol{v}_ {\mathrm{part}}=\frac{h}{T}\Delta\boldsymbol{v}_ {\mathrm{original}}.$$

相应过程噪声使用 $Q_ {d}(h;T)$,其中 $T$ 继续保留原始区间时长。这样,单纯拆分同一个惯性区间不会无故改变其过程噪声预算。

KF6 不通过 GNSS 修正姿态和偏置,所以回放使用已保存的导航系惯性增量,不重新计算整个姿态历史。

ESKF15 历史回放

ESKF 的姿态和残余偏置会受到观测反馈,因此历史更新后必须重新使用机体系惯性输入进行传播。

例如,某次 GNSS 观测修正了过去的陀螺偏置,随后一段角速度的有效值就应重新计算:

$$\boldsymbol{\omega}=\boldsymbol{\omega}_ {c}-\boldsymbol{b}_ {g}^+.$$

继续沿用旧的导航系增量,就相当于忽略了这次修正对后续运动积分的影响。

当前实现使用有界历史窗口,目标长度为 600 ms。部分区间传播按所保存的半区间输入处理;由于旋转、分段近似和交叉补偿的存在,不能认为任意切分都与一次完整非线性传播严格相同。

超出历史范围、来源或校准代次不匹配、输入不连续以及容量不足,都需要保留明确的失败结果。历史回放也不能把同一条 GNSS 消息重复算成多次新接收,更不能重复触发任务输出动作。

10.11 观测质量、NIS 与一致性检查

观测更新前,首先需要判断设备和数据是否可用,然后才能进行统计检查。接收机在线、定位有效、观测被滤波器接受,是不同层次的判断。

SilverStar 将 GNSS 位置与速度分组处理,分别检查数据有效性、时间新鲜度和观测质量。例如,水平位置有效而竖直位置无效时,可以只更新水平位置,不必拒绝整条 GNSS 消息。

NIS 门控

NIS,即归一化创新平方,用于判断观测与当前预测之间的差异是否合理。

设创新向量为 $r$,创新协方差为 $S$,则:

$$\eta=r^TS^{-1}r.$$

NIS 没有量纲。同样大小的位置偏差,在不同的预测协方差和观测噪声下,会得到不同的 NIS。

当前 KF6 使用软、硬两个门限,分别记为 $\eta_ {s}$ 和 $\eta_ {h}$。

当 $\eta\leq\eta_ {s}$ 时,正常使用观测;当 $\eta_ {s}<\eta<\eta_ {h}$ 时,增大量测协方差,降低本次观测的影响;当 $\eta\geq\eta_ {h}$ 时,拒绝本组观测。

软降权倍率为:

$$c_ {NIS}=\min\left(c_ {\max},\frac{\eta}{\eta_ {s}}\right).$$

有效量测协方差为:

$$R_ {eff}=c_ {NIS}R.$$

随后使用 $R_ {eff}$ 重新计算创新协方差和卡尔曼增益,再执行状态更新。

当前参考配置中,一维观测的软、硬门限分别为 6.635 和 10.828,二维观测分别为 9.210 和 13.816。不同维数需要使用相应的门限。

ESKF15 采用相近的 NIS 检查方法,但硬门限的拒绝条件为 $\eta>\eta_ {h}$,而 KF6 使用 $\eta\geq\eta_ {h}$。此外,KF6 保留软降权前的 NIS,ESKF15 更新结果中的 NIS 则可能是重新计算后的值。因此,分析日志时需要注意两种算法的区别。

NIS 检查依赖协方差模型。如果过程噪声或量测噪声设置不合理,NIS 也可能出现偏差,不能仅根据一次通过或拒绝判断传感器是否正常。

卫星数量与方差倍率

GNSS 的测量质量可能随着卫星数量和接收条件变化。SilverStar 可以根据有效卫星数量,对部分 GNSS 观测使用额外的方差倍率。

设当前有效卫星数量为 $N_ {sv}$。当 $N_ {sv}\geq6$ 时:

$$c_ {sv}=1.$$

当 $N_ {sv}<6$ 时:

$$c_ {sv}=\min\left(4,1+\frac{(6-N_ {sv})^2}{2}\right).$$

例如,卫星数量为 5 时,倍率为 1.5;数量为 4 时,倍率为 3;数量进一步下降时,倍率最大限制为 4。

这里的倍率作用于量测方差,而不是标准差。方差增大以后,滤波器通常会降低对应观测的权重。

卫星数量未知时,这一倍率取中性值 1,但并不代表接收机质量一定良好。定位状态、数据完整性、测量时间和接收机报告的精度等条件仍需独立检查。

这一机制主要用于 KF6 和 ESKF15 的观测质量处理,不会直接改变 SF6 的固定融合增益。

GNSS 位置与速度闭合检查

GNSS 接收机可以同时输出位置和速度。从理论上说,一段时间内的位置变化,应当与同一段时间内的速度积分接近。

因此,可以利用两者之间的差异,检查 GNSS 输出是否具有较好的一致性。

设检查窗口为 $[t_ {0},t_ {1}]$,分别对东向和北向进行计算。令 $j$ 表示 E 或 N,$p_ {j}$ 和 $v_ {j}$ 分别表示 GNSS 输出的位置与速度分量。

首先计算窗口内的位置变化:

$$\Delta p_ {j}=p_ {j}(t_ {1})-p_ {j}(t_ {0}).$$

再计算速度积分:

$$\Delta d_ {j}=\int_ {t_ {0}}^{t_ {1}}v_ {j}(t)\thinspace dt.$$

两者之差为该方向的闭合误差:

$$e_ {j}=\Delta p_ {j}-\Delta d_ {j}.$$

水平闭合差的模长记为 $E_ {\mathrm{cl}}$:

$$E_ {\mathrm{cl}}=\sqrt{e_ {E}^2+e_ {N}^2}.$$

这里使用的全部都是 GNSS 自身的输出,并没有直接使用 INS 或 KF6 的位置。因此,惯导漂移不会直接导致这一指标增大。

实际 GNSS 速度是离散采样的,SilverStar 在相邻样本之间采用线性插值。对于两个完整相邻历元,速度积分可以写为:

$$\Delta d_ {j,i}=\frac{v_ {j,i}+v_ {j,i+1}}{2}(t_ {i+1}-t_ {i}).$$

当检查窗口的起点或终点落在两个采样时刻之间时,系统会先插值得到边界速度,再计算落入窗口的部分,而不是将整个采样间隔直接计入。

当前固件使用两组长度为 10 s、起点相差 5 s 的窗口。两个窗口交错工作,每组窗口完成后才产生新的闭合检查结果。

由于窗口结果不是每次 GNSS 更新都重新计算,因此在高频日志中,相邻多个样本可能具有相同的闭合差或方差倍率,绘图时表现为阶梯状变化。

对于完成且有效的检查窗口,设闭合差门限为 $E_ {\mathrm{cl},0}$,最大方差倍率为 $c_ {w,max}$,则:

$$c_ {w}=\min\left(c_ {w,max},\max\left(1,\frac{E_ {\mathrm{cl}}^2}{E_ {\mathrm{cl},0}^2}\right)\right).$$

当闭合差小于门限时,$c_ {w}=1$,不增加观测方差;当闭合差超过门限时,方差倍率随闭合差增大,但不会超过配置的上限。

当前该窗口倍率主要作用于 GNSS 水平位置观测,不直接放大竖直位置或速度的方差。

如果窗口数据缺失、时间不连续、传感器来源发生变化,或者结果已经过期,系统会将该窗口标记为不可用,并使用中性倍率,而不是直接判定位置与速度一致。

观测方差的综合处理

对于水平位置观测,设基础量测协方差为 $R_ {0}$,经过卫星数量和有效闭合窗口的质量调整后,可以表示为:

$$R=c_ {sv}c_ {w}R_ {0}.$$

如果本次更新还触发了 NIS 软降权,则进一步得到:

$$R_ {eff}=c_ {NIS}c_ {sv}c_ {w}R_ {0}.$$

这样,滤波器可以根据接收机报告的不确定度、卫星数量、位置速度一致性以及当前创新大小,调整外部观测的影响。

需要注意,这里只是水平位置观测的倍率关系。KF6 和 ESKF15 的基础量测方差计算及具体参数并不完全相同,不能直接认为两者在相同 GNSS 数据下必然得到相同的融合结果。

竖直一致性与指标解释

FLP 还可以对 GNSS 的竖直位置变化和竖直速度积分进行比较,用于分析高度数据的一致性。

设 $U(t)$ 为 GNSS 输出的相对竖直位置,$v_ {U}(t)$ 为 GNSS 竖直速度,$t_ {0}$ 为当前分析段的参考时刻。

首先计算相对于参考时刻的高度变化:

$$\Delta U(t)=U(t)-U(t_ {0}).$$

对竖直速度进行积分:

$$D_ {U}(t)=\int_ {t_ {0}}^{t}v_ {U}(\tau)\thinspace d\tau.$$

竖直闭合误差为:

$$e_ {U}(t)=\Delta U(t)-D_ {U}(t).$$

它与水平闭合检查使用了相同的基本思想,但 FLP 的竖直分析采用逐样本累计与局部参考重置,不是固件中两组 10 s 交错的水平窗口。

因此,水平与竖直闭合误差的计算范围和更新时间可能不同,不能简单地只按数值大小比较两者。

此外,闭合误差较小,只说明 GNSS 位置变化与速度积分在对应时间段内较为一致,并不代表它们都与真实运动完全相符。

例如,GNSS 位置和速度如果同时受到某种相关误差影响,二者仍可能表现出较好的闭合结果。因此,这项检查应当作为观测质量的辅助依据,而不是直接用作导航精度或真实位置误差的评价。

10.12 融合超时与恢复

有效融合时间

融合健康检查关注的不只是“有没有收到数据”,还包括这次数据是否有效、是否进入更新以及是否真正完成了有效修正。

对某个观测组,设最近一次有效融合时刻为 $t_ {f}$,当前评估时刻为 $t$,则融合年龄为:

$$\Delta t_ {f}=t-t_ {f}.$$

尚未发生过有效融合时,以本次初始化时刻作为相应时间基准。

当前监督策略在连续一段时间没有有效融合后,将该组标记为推算状态;更长时间没有融合后,再标记为无效。参考配置中的时间分别为 2 s 和 10 s,属于工程监督参数,并不是误差一定小于某个数值的保证。

被 NIS 拒绝的观测、数值失败的更新,以及 SF6 中增益为零的观测,都不应刷新有效融合时间。反过来,创新恰好为零但增益有效、更新正常的观测,仍然可以构成一次有效融合。

KF6 的协方差膨胀

GNSS 长时间不可用后重新恢复,惯导状态可能已经偏离较远。如果此时滤波器仍低估自己的不确定度,就可能连续拒绝已经恢复的 GNSS 观测。

KF6 为此设置了单独的重捕获过程。它需要已有的观测可用性中断、连续拒绝和接收端一致性等条件,而不是只要 NIS 大就立即放大协方差。

对允许恢复的状态组,采用:

$$P'=D_ {P}PD_ {P}^T.$$

$D_ {P}$ 是对角矩阵,需要放大的状态分量使用系数 $\gamma_ {P}>1$,其他分量使用 1。

例如,$\gamma_ {P}=2$ 时,相关状态方差乘以 4,与未放大状态之间的交叉协方差乘以 2。不能只修改几个对角元素,却把其余相关项完全留在旧尺度。

这种合同变换可以保留协方差的对称性和半正定结构,但并不自动保证接收机观测正确,因此仍需继续检查恢复条件和后续更新结果。

受控重新锚定

在满足更严格的恢复条件、有限膨胀尝试仍未解决持续拒绝时,KF6 可以对指定位置或速度组执行受控重新锚定。

将状态分为待恢复组 $A$ 和其余组 $B$,则该操作可以概括为:

$$\boldsymbol{x}_ {A}'=\boldsymbol{z}_ {A},\qquad\boldsymbol{x}_ {B}'=\boldsymbol{x}_ {B},$$

$$P'=\begin{bmatrix}P_ {A,\mathrm{new}}&0\cr 0&P_ {BB}\end{bmatrix}.$$

其中 $P_ {A,\mathrm{new}}$ 由有效量测不确定度和必要下限构造,保留正的方差;原组与其余状态的交叉协方差被清零。

这不是普通卡尔曼更新自然产生的结果,而是有条件执行的恢复操作。它只调整相应位置或速度组,不改变初始地理原点、姿态参考或任务时钟。

不同算法的恢复方式

ESKF15 并不直接采用 KF6 的这套按组膨胀与重新锚定流程。正常情况下,它通过传播增加不确定度,外部观测满足门控后重新参与更新;如果持续超过门限或出现模型不匹配,则需要按对应错误状态处理。

SF6 则在新观测通过有效性与时间检查后,继续按固定增益修正当前状态,不具有同样的统计重捕获阶段。

因此,通信恢复、观测恢复和导航重新收敛不能视为同一件事。重新收到 GNSS 数据,只是后续恢复的起点;先前丢失的惯性区间、已经产生的姿态偏差以及冻结原点是否有效,仍然需要分别处理。

11. 插件、许可与社区

SilverStar 采用插件式架构,将硬件设备、导航算法、协议和部分任务功能设计为可独立维护的组件。开发者可以在已有接口基础上增加设备或算法,而不必重新编写整个系统。

项目源代码、组件定义和技术文档统一保存在 GitHub 仓库中。本章介绍插件的扩展方式、开源许可、社区协作和后续开发计划。

11.1 插件体系与扩展方式

SilverStar 的插件主要分为 SCG 工程组件与 FLP 数据处理组件,两者作用于不同阶段。

SCG 插件用于描述固件需要哪些功能,以及如何将这些功能组合成可编译的工程。插件可以提供设备驱动、导航算法、MCU 支持、板卡资源、协议和任务逻辑等内容。

每个插件包含描述自身信息的 plugin.json 文件,以及对应的源代码或其他资源。plugin.json 用于声明插件身份、类型、版本、依赖、硬件资源和构建要求。SCG 根据这些信息检查组件之间是否兼容,再确定需要生成和编译的文件。

插件机制将组件选择与具体实现分开。例如,更换 IMU 时,只要新设备通过 Adapter 提供符合要求的数据,上层导航算法就不需要直接依赖其寄存器或通信协议。但不同设备在采样率、数据格式、时间戳和误差特性方面仍可能存在差异,需要分别完成适配与测试。

SCG 的插件主要在配置和生成阶段发挥作用。生成的 STM32 固件已经包含所选组件,并不会在飞行过程中动态加载插件。

FLP 的插件则用于电脑端的日志解析和离线计算。其功能包括识别日志容器、根据解码包解释数据,以及对已有记录执行导航复算等操作。

GSHC 主要通过既定通信协议与 Flight、Ground 协作,扩展时需要保持相关通信数据与状态语义的一致性,不能简单将 SCG 或 FLP 的插件直接安装到 GSHC 中使用。

11.2 SCG 设备与算法插件开发

向 SCG 添加新设备时,通常需要先完成原生驱动,再通过 Adapter 将设备能力提供给系统公共接口。

以新增 IMU 为例,首先需要实现通信初始化、配置读取、数据解析和健康状态查询,并将加速度、角速度转换为 SilverStar 使用的单位及坐标约定。

随后,需要在插件清单中声明设备类型、支持的通信方式、外设资源、采样能力和实例限制,使 SCG 能够判断它是否适用于当前项目。

如果同一芯片支持 SPI 和 I²C,或者具有不同的运行模式,可以通过设备变体描述不同接口和配置,而不必为每种组合重复维护一套完整驱动。

对于新增 MCU 或 PCB,还需要提供相应的底层外设支持、内存与时钟信息、资源映射,以及必要的启动文件和构建配置。仅修改芯片名称并不能保证固件可以在新平台运行。

新增导航算法时,则应明确其输入和输出、内部状态、参数、计算频率及所需资源。例如,依赖 GNSS 的融合算法应能够处理 GNSS 暂时不可用的情况;需要浮点运算或较大历史缓存的算法,也应声明对应的处理器与内存要求。

插件开发完成后,应首先检查接口和构建规则,再通过 Host 测试验证计算与错误处理,最后在目标 MCU 上检查编译、运行时间和实际数据。

对于多传感器和多实例配置,还需要检查不同实例的数据是否相互隔离,避免出现驱动状态共享、通信资源冲突或来源选择错误。

SCG 内置插件可作为开发参考,具体清单格式、接口定义和生成规则可以在仓库的 docs/public/SCG 目录中查看。

11.3 FLP 日志与离线算法扩展

FLP 将日志容器解析、记录字段解释和离线算法分开管理。SSLOG 容器负责确定记录边界、长度和完整性,.ssdecoder 则以声明式数据描述具体工程的记录结构、设备和算法配置。FLP 需要先验证日志与解码包的身份匹配,再解析相应字段。这使新增传感器或记录类型时,通常不必修改底层 SSLOG 容器解析代码。

这种设计使新增传感器或日志字段时,通常可以通过更新对应的 Record Catalog 和 Project Semantics 完成适配,而不必每次修改底层 SSLOG 容器解析代码。

如果未来采用完全不同的日志容器格式,则需要实现新的可信容器插件,并处理文件头、记录边界、校验、损坏恢复和未知记录等问题。

FLP 的离线算法插件还可以读取已经解码的传感器数据,执行独立的导航计算,并输出统一的姿态、速度、位置和诊断通道。

新增算法时,应明确所需数据、参数来源、坐标系、采样时间要求和缺失输入的处理方式。同时,要区分固件实际记录的结果、按照记录配置重新计算的结果,以及使用新参数执行的 What-if 分析。

由于离线算法包含可执行代码,其扩展方式与 .ssdecoder 不同。当前 FLP 对可信插件具有安装和执行限制,不能将任意 Python 文件打包后就认为可以直接通过界面加载。相关开发接口和要求可在 docs/public/FLP 中查看。

11.4 开源许可与社区协作

SilverStar 原创代码采用 Apache License 2.0,具体授权条件以仓库根目录的 LICENSE 文件为准。使用者可以在遵守许可要求的前提下使用、修改和分发相关代码,包括商业用途,但需保留适用的版权与许可声明,并按要求说明修改情况。

项目依赖的 FreeRTOS、CMSIS、STM32 HAL、FatFs 及部分传感器、无线通信代码具有各自的来源和许可条件,并不因集成到 SilverStar 中而自动适用 Apache License 2.0。部分历史第三方代码的来源和授权材料仍需进一步完善,已核对的内容及尚未解决的问题记录在仓库 docs/public/licenses 目录中。

其中部分历史引入的第三方代码仍有来源和许可材料需要继续完善。仓库的 docs/public/licenses 中保留了已核对的来源信息、许可材料和未解决事项。

对于 Windows 便携包,除 SilverStar 自身代码外,还包含 Python、Qt 和其他运行依赖,因此其第三方许可与分发内容需要单独核对。

项目欢迎使用者反馈问题或参与开发。建议通过 GitHub Issues 提交故障、功能建议和文档问题,代码修改则可以通过分支及 Pull Request 进行协作。

提交问题时,最好说明 SilverStar 版本、操作系统、MCU 或硬件型号、相关配置、复现步骤,以及预期和实际结果。涉及固件或日志解析的问题,建议同时提供对应工程配置和必要的日志信息。

公开日志前,应检查其中是否包含不希望公开的 GNSS 位置、时间信息、设备身份或其他个人数据。

对于代码贡献,建议保持修改范围清晰,说明新增功能的用途及兼容性影响,并提供相应测试结果。涉及通信协议、日志记录或算法参数格式的修改,还需要同步检查 SCG、GSHC 和 FLP,避免不同组件对同一数据产生不同解释。

项目的公共技术文档位于 GitHub 仓库的 docs/public 目录。开发者可以从其中的插件格式、接口规范和算法说明入手,了解现有设计后再进行扩展。

11.5 已知限制与未来计划

SilverStar v0.1.2 已建立从系统配置、固件生成到地面监控和日志分析的基本工作流程,但目前仍主要面向无主动姿态或推力闭环控制的探空火箭。部分 MCU、传感器和 USB CDC 接口尚未完成充分的实机验证,导航算法的动态精度、实时性能及复杂环境适应性也需要进一步测试。

硬件方面,项目计划逐步完善面向实际飞行的集成飞控 PCB、采用 USB CDC 的迷你地面站,以及相关电源、接口和结构设计。同时,计划建设自动化室内测试平台,通过机械臂、转台和远程工作站开展可重复的运动测试,并逐步实现固件构建、烧录、测试和数据分析的自动化。

软件方面,SilverStar 将继续完善设备驱动、插件体系、导航算法、通信协议及日志分析功能,重点改进现有问题,并根据外场和后续飞行测试结果调整设计。UNDERLINE 等相关开源项目也将独立维护和更新。

此外,计划开展 TreeDiagram(树状图)仿真软件项目,研究有控探空火箭的动力学建模、控制算法仿真及结果可视化,为后续主动姿态控制系统的开发提供基础。

上述工作将根据实际开发进度逐步推进,后续更新、源码和技术文档将在 GitHub 仓库及相关发布文章中公布。

附录 A 源码与开发环境

SilverStar 的源代码托管于 GitHub:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

本文对应 v0.1.2 版本,建议查阅代码时选择相应 Tag,避免后续更新造成文件或接口不一致。

Windows 便携版

下载并完整解压 Windows 便携包后,可直接运行 SCG.exe、GSHC.exe 和 FLP.exe。便携包包含运行所需的 Python 环境与依赖,不需要用户另外安装 Python。

三个程序共用运行时目录,不可单独复制 EXE 使用。

源码运行

源码开发建议使用 Python 3.11 或以上版本。

在仓库根目录打开 PowerShell,依次执行:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .

随后根据需要启动对应程序:

.\.venv\Scripts\python.exe SCG.py
.\.venv\Scripts\python.exe GSHC.py
.\.venv\Scripts\python.exe FLP.py

三个程序共用仓库根目录的虚拟环境,不需要为每个应用分别建立环境。

固件编译与烧录

生成的 STM32 工程需要使用对应的 Arm GNU Toolchain、GNU Make 及构建环境。若使用自定义硬件,还应准备完整的 STM32CubeMX 工程及所需 HAL、CMSIS 等文件。

SCG 负责配置、生成和编译检查,实际烧录需要使用与目标 MCU 兼容的调试器及烧录工具。

常用入口

XXXXXXXXX:项目介绍及启动方式。

VERSION:当前产品版本。

LICENSE:SilverStar 原创代码的开源许可证。

docs/public/XXXXXXXXX:公共技术文档总入口。

docs/public/SCG/:配置器、插件和工程生成文档。

docs/public/GSHC/:地面站及通信协议文档。

docs/public/FLP/:日志、解码器和离线算法文档。

docs/public/math/:导航算法的数学说明、LaTeX 源码及 PDF。

附录 B 主要符号、公式与实现速查

本附录用于快速定位第 9、10 章涉及的主要实现。以下路径均相对于 SilverStar v0.1.2 仓库根目录。

主要符号对照表

第 10 章涉及坐标变换、惯性导航及不同融合算法。为避免相同字母在不同场景下产生歧义,主要符号统一如下。向量和矩阵使用相应的数学字体,上下标用于区分坐标系、物理意义及算法。

主要符号对照表

符号

含义

主要位置

$C_{nb}$

机体系到导航系的旋转矩阵

10.1~10.9

$q_{nb}$

表示机体系到导航系姿态的单位四元数

10.2、10.8

$\boldsymbol p,\boldsymbol v$

ENU 导航系中的位置、速度向量

10.1~10.12

$\boldsymbol f^b$

机体系比力,单位为 m/s²

10.1、10.5

$\boldsymbol g^n,g$

导航系重力向量、重力加速度大小

10.1、10.5

$I_m$

m 阶单位矩阵

全章

$a_{\mathrm{ell}}$

参考椭球长半轴

10.4

$f_{\mathrm{ell}}$

参考椭球扁率,与比力区分

10.4

$e_{\mathrm{ell}}^2$

参考椭球第一偏心率平方

10.4

$h_{\mathrm{ell}}$

椭球高度,与传播时长 h 区分

10.4

$M_0,N_0$

原点处的子午圈、卯酉圈曲率半径

10.4

$\boldsymbol d_{\mathrm{ref}}$

单面校准使用的已知比力方向

10.3

$M_q$

多矢量对准中的四元数平均矩阵

10.3

$\Delta\boldsymbol\theta_b$

圆锥补偿后的机体系角增量

10.5

$\Delta\boldsymbol u_b$

划桨补偿后的机体系比力积分

10.5

$\Delta\boldsymbol v^n$

包含重力作用的导航系速度增量

10.5、10.7

$\Delta t$

普通惯性传播时间间隔

10.5、10.8

$T,h$

KF6 原始惯性区间时长、本次传播片段时长

10.7、10.10

$\boldsymbol x_s,\boldsymbol x$

SF6、KF6 的六维状态向量

10.6、10.7

$\boldsymbol x_{\mathrm{nom}}$

ESKF15 名义状态

10.8、10.9

$\delta\boldsymbol x$

ESKF15 十五维误差状态

10.8、10.9

$\delta\boldsymbol\theta$

ESKF15 的三维局部姿态误差

10.8、10.9

$F,\Phi$

连续误差动力学矩阵、离散状态转移矩阵

10.8

$P,P_J$

状态误差协方差、Joseph 更新后的协方差

10.7~10.9

$Q_d,D_a,W$

离散过程噪声协方差、KF6 等效噪声强度矩阵、ESKF 连续噪声谱强度矩阵

10.7、10.8

$R,R_{\mathrm{eff}}$

基础量测噪声协方差、调整后的有效量测噪声协方差

10.7~10.11

$\mathcal H,H$

非线性观测函数、误差状态观测雅可比

10.9

$\boldsymbol r,S,K$

创新向量、创新协方差、卡尔曼增益

10.7、10.9

$\eta$

归一化创新平方(NIS)

10.11

$J_r,G$

姿态右雅可比、完整误差状态重置矩阵

10.9

$E_{\mathrm{cl}},E_{\mathrm{cl},0}$

GNSS 水平闭合差及其门限

10.11

$c_{sv},c_w,c_{\mathrm{NIS}}$

卫星数量、闭合检查及 NIS 对应的方差倍率

10.11

$D_P,\gamma_P$

KF6 协方差膨胀矩阵及膨胀系数

10.12

其中,SF6 的固定增益使用小写 (k_j),卡尔曼滤波增益使用大写 (K),两者不是同一个参数。带有上标 − 和 + 的状态或协方差,分别表示量测更新前的预测值和更新后的结果。

数学公式

完整数学文档:docs/public/math/navigation-models.pdf

可编辑的公式源文件位于 docs/public/math/sections/,按内容分为:

symbols.tex:坐标、单位、四元数和基本约定,对应 10.1~10.2。

preparation.tex:校准、初始对准及原点,对应 10.3~10.4。

mechanization.tex:圆锥与划桨补偿、Pure INS,对应 10.5。

sf6.tex:SF6 固定增益融合,对应 10.6。

kf6.tex:KF6 状态预测、过程噪声及量测更新,对应 10.7。

eskf15.tex:ESKF15 误差传播、观测更新和协方差重置,对应 10.8~10.9。

diagnostics.tex:时间、GNSS 质量和融合健康等内容,对应 10.10~10.12。

固件实现

固件组件主要位于 apps/SCG/plugins/builtin/,各组件通过 plugin.json 描述身份、依赖、参数和构建文件,实际 C 源码位于对应 payload 目录中。

常用源码文件可以直接按文件名搜索:

ins_mechanization.c:惯性增量计算、圆锥与划桨补偿。

attitude_frame.c:四元数及姿态相关计算。

imu_six_face_calibration.c:六面校准。

attitude_alignment.c、vector_constraints.c:姿态对准与矢量约束。

navigation_sf6.c:SF6 固定增益更新。

navigation_kf.c、navigation_kf_replay.c:KF6 滤波与历史回放。

navigation_eskf.c、navigation_eskf_replay.c:ESKF15 滤波与历史回放。

navigation_quality.c:GNSS 位置速度一致性检查。

app_tasks.c、ins_task.c、estimator_task.c:FreeRTOS 任务、惯性传播和估计器运行。

上位机实现

SCG:apps/SCG/src/silverstar_fccg/

GSHC:apps/GSHC/

FLP:apps/FLP/src/silverstar_flp/

其中 SCG 仍保留 silverstar_fccg 的历史 Python 包名称,属于兼容命名,并不表示这是另一个独立软件。

如需了解某个功能的详细实现,建议先查看 docs/public 中的对应说明,再通过组件名或函数名定位源码。

附录 C 术语与常见文件

常用术语

术语

含义

MCU

微控制器,如 STM32F407

PCB

印制电路板

IMU

惯性测量单元,通常包含加速度计和陀螺仪

GNSS

全球卫星导航系统

INS

惯性导航系统

ENU

东、北、上局部导航坐标系

SF6

六维固定增益融合器

KF6

六维卡尔曼滤波器

ESKF15

十五维误差状态扩展卡尔曼滤波器

NIS

归一化创新平方,用于观测统计检查

AIR

飞控与地面站之间的应用层通信协议

GSP

地面站与电脑之间的数据封装协议

SSLOG

SilverStar 机载日志容器格式

DMA

直接存储器访问

CRC

循环冗余校验,用于检测数据损坏

WCET

最坏执行时间

常见文件与目录

文件或目录

用途

SilverStar.ssproject

SCG 项目配置

Flight_Controller/

生成的飞控固件工程

Ground_Station/

生成的地面站固件工程

Log/

项目日志存放目录

.ssdecoder

与固件生成配置对应的日志解码包

.BIN / .sslog

机载日志文件

.ssflp

FLP 分析项目,保存数据引用、参数和界面状态

.jsonl

GSHC 保存的原始遥测会话数据

.ioc

STM32CubeMX 硬件配置文件

.ssplugin

FLP 可信插件安装包,与 .ssdecoder 不同

文件与版本的关系

SilverStar 产品版本、SCG 项目格式、AIR 协议、SSLOG 容器、.ssdecoder 和导航算法的内部实现版本分别管理,不能简单认为产品版本相同就代表所有文件兼容。

其中,机载日志与 .ssdecoder 需要通过内部 Descriptor 进行精确匹配,不能仅根据文件名或扩展名判断。

FLP 的 Recorded 表示固件实际记录的数据;Recomputed 表示根据记录配置重新计算的结果;Offline 表示采用相应离线算法的默认参数进行计算;What-if 则表示使用另外指定的算法或参数进行对照分析。四者应保留各自的数据来源和参数信息,不能将离线计算结果直接视为机载运行记录。

附录 D 测试日志与解析器

本附录随文提供 SilverStar 项目整理收集的全部测试日志及其对应的 .ssdecoder 解析器。原始日志保留原有内容,解析器按照对应关系整理,便于读者使用 FLP 导入、查看和分析历史测试数据。

特别说明:在本次日志整理中,除编号为 000053 的日志外,其余日志均已找回对应的解析器。000053 的原始日志仍予以保留,但其本身仅有日志头没有具体数据,因此暂时无法通过 FLP 完整解析。

image.jpg

图 D-1 历史测试日志解码包的目录结构

解析器压缩包内部已按如图整理,需要使用的时候可以对应选取。解码包已按照对应关系整理,分析历史日志时应选择与其实际固件配置匹配的 .ssdecoder 文件。

解析器压缩包:

attachment iconLog_Decoders.zip448.85KBZIP0次下载

日志压缩包:

attachment iconmissions.zip62.57MBZIP0次下载


参考文献
  1. [1]
    Kalman R E. A New Approach to Linear Filtering and Prediction Problems[J]. Journal of Basic Engineering,1960,82(1):35-45. DOI:10.1115/1.3662552.
  2. [2]
    Solà J. Quaternion kinematics for the error-state Kalman filter[PP/OL]. arXiv,2017-11-03. https://arxiv.org/abs/1711.02508v1. [2026-10-12]
  3. [3]
    严恭敏,翁浚. 捷联惯导算法与组合导航原理[M]. 2版. 西安:西北工业大学出版社,2023.
  4. [4]
    秦永元. 惯性导航[M]. 3版. 北京:科学出版社,2020.
  5. [5]
  6. [6]
    PX4. PX4 Architectural Overview[EB/OL]. [2026-10-12] https://docs.px4.io/main/en/concept/architecture.
  7. [7]
    Holzmann G J. The Power of 10:Rules for Developing Safety-Critical Code[J/OL]. Computer,2006-10-12,39(6). https://doi.org/10.1109/MC.2006.212.
  8. [8]
    Bosch Sensortec. BMP3xy—Digital Pressure Sensors:Handling, Soldering and Mounting Instruction[R/OL]. 2020. https://www.bosch-sensortec.com/media/boschsensortec/downloads/handling_soldering_mounting_instructions/bst-bmp380-hs000.pdf.
  9. [9]
    u-blox. NEO-M9N:Standard precision GNSS module: Integration manual[R/OL]. R10. 2025. https://content.u-blox.com/sites/default/files/NEO-M9N_Integrationmanual_UBX-19014286.pdf.
  10. [10]
    Wallace R. Antenna Selection Guide:AN058, SWRA161B[R/OL]. 2010. https://www.ti.com/lit/an/swra161b/swra161b.pdf.
  11. [11]
    Porley M A,Chesser K. What Are the Basic Guidelines for Layout Design of Mixed-Signal PCBs?[J/OL]. Analog Dialogue,2022,56(3). https://www.analog.com/media/en/analog-dialogue/volume-56/number-3/what-are-the-basic-guidelines-for-layout-design-of-mixed-signal-pcbs.pdf.
  12. [12]
    Yater G. ESD Protection Layout Guide[R/OL]. 2022. https://www.ti.com/lit/an/slva680a/slva680a.pdf.
  13. [13]
    STMicroelectronics. Getting started with STM32F4xxxx MCU hardware development[R/OL]. 2018. https://www.st.com/resource/en/application_note/dm00115714.pdf.
  14. [14]
    Texas Instruments. LDO Basics:SLYY151A[EB/OL]. [2026-10-12] https://www.ti.com/lit/eb/slyy151a/slyy151a.pdf.
原始数据
[ 修改于13天0时前 - 2026/10/18 00:58:40 ]
+6.1
科创币
FalconHSH
2026/10/13
一直听您讲,今天是真看到了,长文资持!感谢帮助
tmn_A作者
18天1时前修改于 13天0时前IP:广东
952515
1楼

正文公式显示问题已解决,已人工逐条核对无误,请放心阅读。文中描述软件架构等也经过人工核对无误。

这里需要说明的是,这里的无误是指符合当前的版本,且无数学物理错误,但是由于最近tibo重置背刺我,第一次还剩37%,第二次还剩68%,这让我被迫提前开始改进,已发现这个版本很多算法有相当大的优化空间。

正文已经修改,规范了格式,并删去了重复和关系较弱的部分,不过字数仍在6.8w左右,因为有些地方我觉得删了可能会有遗漏。

考虑到正文编辑困难,以及这些和本次发布无关,我决定在后续结合一些我想强调的和之前我开发的ss0相关的对比简要说说。这放到后面的回复。

非常抱歉,我不知道插入公式"$$"之间不能换行,由于卡顿我这边没法打公式,我再尝试一下让AI改一下格式。现在只能把AI生成的在文外修改后复制过去,如果这几天这个卡顿能修改好我就手动一一放到公式编辑器里了,如果不行的话我考虑让ai直接生成公式图替换当前第十节的大部分内容再推送评审。

大部分公式已经替换,但是还有部分有问题,我实在是无法修改了,这个卡顿太严重了,单是把原有格式错误的章节右键选择就用了我10min,复制过去就已经很困难了,定位,修改,更是。我想看看这个问题能否修复,如果可以修复的话我就等待修复完成后再修改,不行的话明天,或者统一10.15前,花点时间修复了。

不过ddl真的要杀了我……


引用
评论(3)
12天14时前IP:浙江
952565
2楼

你好,想问一下你这套航电系统和无人机航模上用的有什么区别和改进吗?

引用
评论
tmn_A作者
12天5时前IP:广东
952566
3楼
引用evahy2000发表于2楼的内容
你好,想问一下你这套航电系统和无人机航模上用的有什么区别和改进吗?

区别的话,缺点上是当前是无控的,只能记录和开伞(探空火箭的控制和无人机区别很大,这个我正在做)。而且当前才刚刚做出来,没有做上箭测试,数据不多,代码肯定比比不上已经存在很久的开源社区。

在探空火箭领域的优点是,自由度更高,核心导航算法等可配置;比起利于飞手迅速操作的飞控或者轻量导航飞控,如betaflight,inav等等,以及大部分基于f103等的飞控(他们主要使用互补滤波),导航精度会高很多(前提是选择kf6或者eskf15算法,不过sf6也有inav的水平);比起有完整融合算法的飞控,如px4,ardupilot,在同硬件下导航精度略低(因为这一版还没有引入磁力计,更没有考虑风),但是有专为探空火箭设计的飞行流程,比如开伞的各种判定的配置。

另外当前融合算法对延迟量测是采用重新传播的方法,而不是让估计器本身落后于现实时间,再用惯导预测,理论上更好些,不过实际上似乎差异不大,算力要求还更大,我也在尝试把这个方法做成可配置的。

改进的话,首先,这个飞控不是由无人机飞控改来的,而是从一开始就为了探空火箭设计,做了很多针对探空火箭发射流程的设计,包括开伞的判定,无线协议设计,量测融合的各种健康判定等。

其次,飞控代码是参考了power of ten的,可靠性会更好一些。

再次,就是平台比较自由,是插件形式的,传感器,融合算法,开伞判定等等都是可配置的,可以针对任务配置,而且还可以自己加。而且做了两个适配低成本的单片机的删减档位,大容量的f103都能跑sf6。而且生成代码也很方便。

最后,当前的三个程序还是比较完整的,虽然肯定比不上px4那些,但是都是为了探空火箭任务准备的。

引用
评论
1
tmn_A作者
12天0时前IP:广东
952567
4楼

这里有些内容要解释一下,考虑到涉及之前的飞控和之后的计划,和本次的正文关系不大,就不放在正文里了。

这边先讲比之前飞控的一些改进吧。当然,这个是一个航电平台,在系统性上和之前的完全不是一个东西了,我主要讲生成的固件代码和之前的区别。

首先是惯导算法,之前SS0飞控使用的是jy901b的硬件四元数,再加上优化三子样的划桨误差补偿,但是现在退回普通二子样的划桨误差补偿,然后软件做圆锥误差的二子样补偿。

实际上,对于一般的MEMS,实测二子样补偿就足够了,之前SS0根本就没必要使用优化三子样,而且之前imu带宽居然只设置为10 Hz,那完全没用了。现在imu带宽拉到256Hz了,而且没有使用内部融合的四元数,而是选择mcu软件更新。实测jy901b内部融合的四元数带宽很低,而且姿态在接近水平时精度很差。

其次是融合,这应该是最大的区别,之前都是固定增益融合,还没有gnss竖直速度,相当于sf5,现在从前面flp的复算可以得知卡尔曼滤波的效果了。

再次是遥测和日志,之前真的以为nrf24l01+可以传1km呢……现在了解了一点相关的知识,知道要实测,要计算了。而且当前遥测的协议也重新严谨设计了。现在遥测和日志是两手打算,日志用上了更快的4线sdio,记录了更加详细的信息,而遥测信息也会被电脑记录,用于在火箭飞丢等无法取得日志的情况下仍能获取部分信息。

最后是一些算法细节,比如时间帧的对齐,量测到来时延迟处理,量测协方差的缩放,gnss丢失后的恢复等等,这个之前完全没有考虑。整体来看,我觉得价值最大的反而是这些算法细节的处理。

引用
评论
1
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的