自瞄整体流程与基础知识
从识别、状态估计到火控,建立自瞄系统的完整地图。
自瞄的任务可以概括为一件事:从连续图像中判断目标此刻和未来的位置,让云台在合适的时刻指向可命中的位置。经典流程可以概括为 识别 → 状态估计 → 火控。为了讲清工程实现,本章再把火控之后的云台上位机控制和电控执行展开。
自瞄系统完整数据流
观测 → 估计 → 决策 → 控制 → 执行
识别
从像素中获得二维观测
图像处理
传统特征或神经网络
目标观测
类别、置信度、二维角点
状态估计
从单帧位姿到连续运动
位姿解算
物理尺寸 + 标定参数 + PnP
滤波与预测
位置、速度、朝向、角速度
火控
形成射击方案并决定开火
目标与瞄准点
选甲、切换连续性、命中位置
弹道与提前量
飞行时间、重力补偿、延迟
开火决策
瞄准 / 单发 / 连发 / 保持
云台控制(上位机)
把射击解变成可执行指令
参考轨迹
未来 Yaw / Pitch 与角速度
控制规划
反馈校正、限速、MPC 等
控制指令
目标角、角速度与 shot mode
电控执行
下位机闭环与发射机构
云台底层控制
电机、编码器、姿态闭环
发射执行
拨盘、热量与发射许可
1. 从图像到发射的完整流程
| 模块 | 它回答的问题 | 主要输入 | 主要输出 |
|---|---|---|---|
| 识别 | 画面里有什么目标? | 相机图像 | 装甲板、类别、二维角点、置信度 |
| 状态估计 | 目标在怎样运动? | 识别观测、云台姿态、时间 | 目标的三维位置、速度、朝向与预测状态 |
| 火控 | 打哪里,以及此刻是否开火? | 目标状态、弹速、系统延迟 | 瞄准参考、弹道解、开火模式 |
| 云台控制 | 怎样平稳、及时地跟上参考角? | 参考轨迹、云台姿态与角速度 | Yaw、Pitch 或角速度指令 |
| 电控执行 | 怎样驱动电机与发射机构? | 上位机控制指令 | 云台运动、单发或连发动作 |
这些模块按照时间顺序工作,也通过时间戳和反馈构成闭环。图像提供观测,状态估计把离散观测串成连续运动,火控生成射击方案并决定开火状态,云台控制把参考角变成可执行指令。电控执行后返回云台姿态、角速度、弹速与发射许可,供下一轮计算使用。
识别:把图像变成可信观测
识别模块处理相机的 RGB 图像。它首先在画面中寻找可能的装甲板,再判断编号或类别,并给出装甲板关键点在图像中的像素坐标。对后续模块而言,这些信息组成了一次带时间戳的二维观测。
识别的核心目标是稳定:同一个目标在相邻帧中有连续的观测,角点位置具有足够精度,类别结果能够支持目标关联。后续“感知”章节会展开讨论检测器、分类器、角点和数据集。
状态估计:从一次观测到运动状态
状态估计包含两个紧密相连的环节。
- 位姿解算:使用 PnP(Perspective-n-Point)将装甲板的二维角点、已知尺寸和相机内参组合起来,得到目标相对相机的三维位置与姿态。
- 滤波与预测:将连续帧的位姿测量、时间间隔和运动模型结合,估计目标的位置、速度和朝向,并给出火控所需时刻的预测状态。
PnP 的输出是一帧图像对应的测量值;滤波器的输出是跨时间连续的运动状态。常见实现会采用 EKF,也可以围绕目标运动特征比较 KF、UKF 或其他估计方法。后续章节将分别讨论坐标变换、PnP、观测噪声和滤波模型。
火控:生成射击方案并决定是否开火
火控接收滤波器给出的目标状态,并结合弹速、系统延迟和当前云台状态完成三件事:
- 选择目标与瞄准点:在多个目标或多块装甲板之间选择当前射击对象,并保持切换过程的连续性。
- 计算射击解:预测弹丸到达时目标的位置,计算飞行时间、运动提前量、重力补偿以及最终的
Yaw、Pitch参考。 - 作出开火决策:根据目标状态是否可信、云台是否跟上、装甲板是否进入命中窗口、发射机构是否许可等条件,输出保持瞄准、单发或连续发射。
在 vivsionn 的实现中,FireControl::calControlData 会组织目标规划、弹道角计算和开火模式判断;decideShotMode 最终输出 AIM_ONLY、AUTO_FIRE 或 SHOT_ONCE。这说明“是否开火”本身就是火控的核心输出,而不仅是计算两个目标角度。
云台控制:把参考角变成可执行指令
从职责上看,射击解和云台控制是两个不同问题。火控描述“希望云台在未来指向哪里”,云台控制描述“怎样让真实云台及时、稳定地跟上这条参考轨迹”。上位机控制规划会使用云台角度、角速度和控制周期,对参考角进行反馈校正、速度约束或预测控制,再把目标角或目标角速度发送给电控。
vivsionn 当前将这部分放在 FireControl 内部:Planner 生成未来 Yaw 参考轨迹,二阶模型与 MPC 根据云台反馈输出控制命令。许多自瞄工程采用类似组织方式,因为射击解、控制规划和开火窗口共享同一组预测状态与时序信息。本教程在概念上把“云台控制”单独列出,在阅读具体代码时再观察它与火控如何组合。
电控执行:完成底层闭环与发射动作
上位机输出 Yaw、Pitch 和开火模式后,电控负责电机、编码器与姿态环的高频闭环,并控制拨盘和发射机构。电控返回的云台姿态、角速度、弹速、热量和发射许可又会进入下一轮状态估计与火控计算。
2. 相关背景知识
这一节只建立直觉;各概念将在后续模块中结合真实数据和代码展开。
计算机视觉:从二维图像理解三维世界
相机把进入镜头的光投影到成像平面,得到一张二维图像。对计算机来说,灰度图是一张数值矩阵,彩色图通常可以看作由 R、G、B 三张矩阵叠成的三维数组:矩阵中的每个位置对应一个像素,数值表示该位置的亮度或颜色。
图像保留了目标在画面中的位置、轮廓、颜色和纹理,同时压缩了真实世界的深度信息。一个像素点只能确定空间中的一条视线。为了恢复目标的大致三维位置,自瞄会加入已知的物理特征:
- 装甲板具有规定的宽度和高度;
- 装甲板角点在物体坐标系中的三维位置已知;
- 相机经过标定,可以得到焦距、主点和畸变参数;
- 识别模块可以给出这些角点在图像中的二维像素坐标。
把“已知的三维角点”和“观测到的二维角点”对应起来,就可以使用 PnP 求出目标相对相机的大致旋转和平移。这条链路可以写成:
图像矩阵 → 识别目标与角点 → 建立 2D–3D 对应 → PnP → 三维位姿
透视投影可以简写为:
s · [u, v, 1]ᵀ = K · [R | t] · [X, Y, Z, 1]ᵀ其中 $(X,Y,Z)$ 是空间点,$(u,v)$ 是像素坐标,$K$ 是相机内参,$R,t$ 描述物体与相机之间的旋转和平移。PnP 做的事情,就是利用多组 2D–3D 对应关系反求 $R$ 和 $t$。
常见坐标系:让每个模块描述同一个位置
自瞄中常见的坐标系包括:
| 坐标系 | 常见含义 | 典型用途 |
|---|---|---|
| 图像坐标系 | 原点在图像左上角,u 向右、v 向下,单位为像素 | 检测框、角点、重投影 |
| 相机光学坐标系 | OpenCV 常用约定为 x 向右、y 向下、z 向前 | PnP 输出、相机观测 |
| 云台坐标系 | 固连于云台,用于描述当前朝向 | 角度控制、姿态反馈 |
| 枪口坐标系 | 固连于发射机构 | 弹道初始位置与方向 |
| 车体坐标系 | 固连于底盘 | 车体运动与云台安装关系 |
| 世界 / 惯性坐标系 | 相对场地或初始姿态固定 | 目标跟踪、运动预测 |
坐标变换使用旋转矩阵和平移向量,把同一个点从一个坐标系表达成另一个坐标系。相机、云台和枪口之间的安装关系来自外参标定;云台实时姿态来自电控反馈。坐标方向、旋转顺序和角度单位会直接影响解算与火控,因此每个工程都会为它们建立统一约定。
传统视觉与神经网络
计算机视觉需要先从矩阵中找到目标。常见方法分为两类。
传统视觉由开发者设计处理规则。例如根据颜色和亮度进行阈值分割,寻找轮廓和灯条,再用长宽比、平行度、间距等几何条件组合出装甲板。它的计算过程直观、速度快,在光照和目标外观较稳定时很有效。
神经网络从标注数据中学习特征。训练时,图像矩阵作为输入,网络经过多层卷积或其他运算提取特征,输出目标框、类别、关键点或置信度;损失函数衡量预测与标注的差异,反向传播不断更新网络参数。部署时只执行前向计算,把新图像映射为识别结果。
现代自瞄通常把两者组合起来:神经网络负责在复杂画面中找到目标、分类并预测关键点,传统几何方法负责角点整理、PnP、坐标变换和结果校验。识别章节会继续讨论数据集、网络输出、传统灯条方案以及两类方法的组合方式。
机器学习:训练与推理的基本过程
机器学习的核心是用数据确定模型参数。训练集提供图像与正确答案,优化器根据损失函数调整参数;验证集用来观察模型面对未参与训练的数据时表现如何。训练完成后,固定参数的模型进入推理阶段,在每一帧图像上输出检测框、类别或关键点。
对自瞄而言,模型效果同时取决于数据覆盖、标注质量、网络结构、输入分辨率和部署速度。准确率决定观测质量,推理延迟则会改变观测对应的真实时刻,二者都会继续影响状态估计与火控。
估计与控制:让系统面向未来工作
相机每一帧都带有测量误差,目标也在持续运动。状态估计使用模型与观测融合,得到更平滑、更可预测的运动状态;火控使用这个状态计算未来的射击解。两者连接起“看见目标”和“命中目标”。