模拟器原理¶
这个模拟器把一个 3D mesh 转换成合成的 MIMO FMCW 雷达数据。
核心链路是:
3D mesh -> 可见三角面 -> 散射点 -> 原始雷达数据立方体 -> FFT 图
它不是完整电磁场求解器,而是一个透明的几何雷达模拟器,适合学习、调试和早期实验。
对初学者来说,最重要的是把它拆成三层:
- 几何层:有哪些表面,在哪里,哪些表面朝向雷达。
- 雷达信号层:可见表面如何产生带延迟的复数回波。
- FFT 解释层:原始采样如何变成距离、速度和角度图。
这个模拟器就是围绕这三层搭起来的。
1. Mesh 表示目标几何¶
目标用三角面片网格表示。
每个三角面都有:
- 三个顶点
- 一个中心点
- 一个法向方向
- 一个面积
模拟器只保留几何信息,不使用纹理、材质、动画或渲染信息。
这就是为什么一个视觉 3D 模型可以变成雷达目标。雷达不关心衣服颜色,也不关心物体纹理。在这个简化模拟器里,它只需要知道有哪些可能反射能量的表面。
使用三角面是因为三角面很容易计算:
- 三角面有明确中心点
- 三角面有明确法向
- 三角面有可计算面积
- 射线和三角面的相交判断是标准几何问题
2. 目标运动¶
对每个 chirp,目标 mesh 都会按刚体方式变换。
变换包含两部分:
- 固定欧拉角旋转
- 初始位置加上速度乘以 slow time 得到的平移
这意味着目标作为一个整体运动。当前版本不建模关节运动、走路四肢摆动、振动或人体微多普勒。
这是刻意简化。刚体运动更容易看清“目标速度”和“Doppler”之间的关系。如果整个 mesh 朝雷达移动,那么多个 chirp 之间的相位变化会比较一致。以后如果要加人体微多普勒,可以让不同 mesh 部位按不同轨迹运动。
3. 可见面筛选¶
不是所有三角面都应该贡献雷达回波。
模拟器先去掉法向背向雷达的面。然后做视线遮挡判断:如果从雷达到候选面中心的射线被其他三角面挡住,这个面就被丢弃。
这一步很重要。如果没有它,背面和被遮挡的内部面也会产生不真实的回波。
可见性阶段回答的是一个物理问题:“雷达能不能直接看到这个表面?”
模拟器把雷达相位中心当成观察点。对每个候选面,它检查从雷达到面中心的直线是否被其他三角面挡住。这有点像非常简单的光线追踪,但目标不是渲染图片,而是判断哪些表面允许产生散射。
这一步在大 mesh 上会比较慢,因为每个候选面可能要和很多其他面做相交测试。所以命令行里提供了 --max-faces,用于早期实验时控制面数。
4. 面片级散射近似¶
每个可见三角面会被转换成一个位于面中心的散射点。
散射强度主要由三部分决定:
- 三角面面积
- 入射角
- 目标整体反射率
面积越大,贡献越大。越正对雷达,贡献越大。背向雷达的面不贡献回波。
这是一个粗略近似,但它能保持模拟器容易解释,也能控制计算量。
这个近似的好处是,把“表面散射问题”变成了“点散射问题”。一旦每个可见面都变成一个有强度的点,信号合成阶段只需要计算距离、延迟和相位。
散射强度公式故意保持简单:
strength ≈ reflectivity * area * incidence
含义是:
- 面积越大,回波越强
- 越正对雷达,回波越强
- 背向雷达的面不贡献回波
5. 通道信号合成¶
对每个散射点和每个 TX/RX 组合,模拟器会计算:
- Tx 到散射点的距离
- 散射点到 Rx 的距离
- 往返延迟
- 距离衰减
- beat frequency
- 复数相位
所有散射点产生的复指数信号会叠加起来。
最终得到原始雷达数据立方体:
num_adc_samples x num_chirps x (num_tx * num_rx)
这个立方体是项目最核心的数据对象。
每一维回答一个问题:
- ADC 采样点:一个 chirp 里有哪些 beat frequency?
- chirp 序列:重复 chirp 之间相位如何变化?
- 虚拟通道:不同天线位置之间相位如何变化?
在这个阶段,模拟器还没有单独存储“距离”或“速度”对象。这些物理含义是在 FFT 之后解释出来的。
6. FFT 处理¶
原始数据立方体会经过三次 FFT:
- 沿 ADC 采样点做 Range FFT。
- 沿 chirp 序列做 Doppler FFT。
- 沿 MIMO 虚拟通道做 Angle FFT。
流水线输出:
- 原始数据立方体
- 距离 FFT 立方体
- 距离-速度立方体
- 距离-速度图
- 距离-角度图
- 距离-速度-角度立方体
- 距离、速度和角度坐标轴
三次 FFT 不是随便做的,它们和雷达测量的三个物理维度一一对应:
| FFT | 输入维度 | 物理含义 |
|---|---|---|
| Range FFT | ADC 采样点 | 延迟 / 距离 |
| Doppler FFT | chirp 序列 | 相位变化 / 速度 |
| Angle FFT | 虚拟通道 | 空间相位 / 角度 |
这张表是理解代码最快的入口。
7. 多进程¶
最耗时的部分是对许多 chirp 和许多三角面做信号合成。
模拟器会把 chirp 维度切成连续块。每个 worker 进程计算一个块,主进程再把这些块写回最终数据立方体。
这种方式保持算法简单,同时让较大的示例更容易运行。
重要的是:多进程不改变数学模型。它只改变 chirp 循环的执行方式。串行运行和多进程运行使用的是同一套物理计算。
当前边界¶
这个模拟器更适合理解第一性原理链路:mesh 目标如何变成合成雷达数据。它不能替代专业雷达仿真软件,也不能替代真实传感器验证。
端到端心智模型¶
如果只记住一句话,可以记这句:
可见几何表面产生带延迟的复数正弦波;
FFT 把这些正弦波解释成距离、速度和角度。
项目里的其他代码,本质上都是围绕这句话展开的实现细节。