FAPP:面向动态杂乱环境的 UAV 感知与规划
FAPP(Fast and Adaptive Perception and Planning)把几何聚类和运动估计结合起来做点云分割,不依赖 GPU 也能把快速运动目标和静态背景分开。这个设计很务实:它不追求把所有点云问题一次性算到最优,而是先把动态目标从地图里剥离,再把跟踪和规划接上。

1. 动态环境感知
1.1 坐标系变换与增量 KD 树
先把传感器局部坐标系 $B$ 下的点云变换到全局坐标系 $W$。然后维护一个增量 KD 树(I-KD Tree),保存最近 $F$ 帧的点集合 $\xi$。更新方式不是每帧重建整棵树,而是通过插入和删除来维持结构:
- $\xi \subseteq { W P_j }_{j \in [k-F, k-1]}$
- I-KD Tree 让 $\xi$ 的规模保持可控,同时在 3D 空间里尽量均匀分布,便于描述最近几帧扫描到的障碍物空间形状。
这个'均匀分布'其实很关键。静态墙体如果被反复扫到,点会越积越密,最近邻距离几乎变成 0,动态目标就容易被淹没;反过来,历史点太稀,动态判断会抖得很厉害。
KD Tree 用来做最近邻搜索很合适。给定一点 $p$,可以快速找到 $\xi$ 中离它最近的点。I-KD Tree 的好处是增量更新,不需要每次把历史点云重新组织一遍。它更像一个'带记忆的空间索引',用来判断点是新来的,还是早就在那里。
保存多帧也不是为了堆数据量,而是让静态结构在时间上越积越实,动态物体则因为移动形成稀疏轨迹或拖尾。只看上一帧会更轻,但信息太薄,很多场景下不够稳。
1.2 区分动态/静态点云
对当前帧点云 $W P_k$ 做 DBSCAN 聚类,得到 $m$ 个簇 $C_k = {C_1, \dots, C_m}$。每个簇再根据阈值 $h_1, h_2$ 分成三类:
- Case 1(持续移动物体):$T_1 > h_1$ 且 $T_2 < h_2$。
- 这类目标是真在动。当前簇里的点到历史点云的最近距离偏大,但分布还比较一致,说明它不是随机噪声。
- Case 2(静态物体):$T_1 < h_1$。
- 说明这个簇早就在历史帧里出现过,且基本没有位移,最近距离应该落在传感器误差范围内。
- Case 3(未知物体):$T_1 > h_1$ 且 $T_2 > h_2$。
- 这类通常更麻烦。可能是之前被动态目标挡住的静态结构,也可能是刚进入视野的新物体。距离分布不均匀,所以方差会更高。
参数上,$\varepsilon$ 和 min_samples 决定 DBSCAN 的聚类粒度;$h_1$ 一般和传感器噪声、定位误差挂钩,太小会把移动目标误判成静态,太大又会把静态背景误判成动态。$h_2$ 更依赖经验,通常要靠数据上反复看分布。分母那里如果 $T_1$ 很小,最好做个保护,避免数值炸掉。
统计量定义如下。对簇中每个点 $p_n$,计算它到历史点集 $\xi$ 的最近距离 $d_n$:
$$ T_1 = \frac{1}{N}\sum_{n=1}^{N} d_n $$ $$ T_2 = \frac{1}{N}\sum_{n=1}^{N}\frac{(d_n-T_1)^2}{T_1^2} $$
2. 动态目标跟踪
跟踪部分用离散线性系统配卡尔曼滤波器(KF)。如果某个簇是新出现的,就新建一个 tracker;如果它能关联到已有的第 $i$ 个 tracker,就把该簇的几何中心和帧差作为测量向量 $Z_i$,送进 KF 更新。
状态向量是:
$$ X_i = [x_i, y_i, z_i, \dot{x}_i, \dot{y}_i, \dot{z}_i]^T $$
系统模型写成:
- 状态转移矩阵 $A_k$ 和测量矩阵 $H_k$。
- 过程噪声与测量噪声假定为零均值高斯噪声,对应协方差 $Q$ 和 $R$。
$$ X_i^{k+1} = A_k X_i^k + \nu_i $$ $$ Z_i^k = H_k X_i^k + \omega_i $$ $$ A_k = \begin{bmatrix} I_{3\times3} & \Delta t\cdot I_{3\times3} \ 0_{3\times3} & I_{3\times3} \end{bmatrix}, \quad H_k = \begin{bmatrix} I_{3\times3} & 0_{3\times3} \ 0_{3\times3} & I_{3\times3} \end{bmatrix} $$


