曲线匹配
在自动驾驶, 机器人导航和地理信息系统等领域, 曲线匹配是核心的基础技术. 典型应用场景包括:
- 高精地图匹配: 将车辆实时轨迹与高精度地图道路网进行匹配
- 多传感器融合: 对齐不同传感器采集的轨迹数据(如GPS IMU 视觉SLAM)
- 运动模式识别: 比较不同驾驶员的转向操作模式特征
本文以自动驾驶中的典型场景为例: 假设我们有两个曲线集合:
- 集合A: 高精地图中的道路中心线(参考曲线)
- 集合B: 车辆实时采集的行驶轨迹(查询曲线)
目标: 快速找到集合B中每条轨迹在集合A中对应的最优匹配道路
文章目录
二 曲线相似度评价标准
以下是对点集曲线各种距离的数学形式化定义和程序
设曲线 P = { p 1 , p 2 , . . . , p m } P = \{p_1,p_2,...,p_m\} P={p1,p2,...,pm} 和 Q = { q 1 , q 2 , . . . , q n } Q = \{q_1,q_2,...,q_n\} Q={q1,q2,...,qn}, 其中 p i , q j ∈ R d p_i, q_j \in \mathbb{R}^d pi,qj∈Rd
2.1 逐点距离范数
2.1.1 欧氏距离 (L2范数)
要求 m = n m = n m=n, 对齐对应点:
D L 2 ( P , Q ) = ∑ k = 1 n ∥ p k − q k ∥ 2 2 D_{L2}(P,Q) = \sqrt{\sum_{k=1}^n \|p_k - q_k\|_2^2} DL2(P,Q)=k=1∑n∥pk−qk∥22
def euclidean_distance(curve1, curve2):
min_len = min(len(curve1), len(curve2))
return np.sqrt(np.sum((curve1[:min_len] - curve2[:min_len])**2))
2.1.2 曼哈顿距离 (L1范数)
D L 1 ( P , Q ) = ∑ k = 1 min ( m , n ) ∥ p k − q k ∥ 1 D_{L1}(P,Q) = \sum_{k=1}^{\min(m,n)} \|p_k - q_k\|_1 DL1(P,Q)=k=1∑min(m,n)∥pk−qk∥1
def manhattan_distance(curve1, curve2):
min_len = min(len(curve1), len(curve2))
return np.sum(np.abs(curve1[:min_len] - curve2[:min_len]))
2.2 动态时间规整 (DTW)
允许非线性对齐, 定义规整路径 π = ( π 1 , . . . , π K ) \pi = (\pi_1,...,\pi_K) π=(π1,...,πK), 其中 π k = ( i k , j k ) \pi_k = (i_k,j_k) πk=(ik,jk) 满足:
- π 1 = ( 1 , 1 ) \pi_1 = (1,1) π1=(1,1)
- π K = ( m , n ) \pi_K = (m,n) πK=(m,n)
- i k + 1 − i k ≤ 1 i_{k+1} - i_k \leq 1 ik+1−ik≤1
- j k + 1 − j k ≤ 1 j_{k+1} - j_k \leq 1 jk+1−jk≤1
DTW距离为:
D D T W ( P , Q ) = min π ∑ ( i , j ) ∈ π ∥ p i − q j ∥ 2 D_{DTW}(P,Q) = \min_{\pi} \sqrt{\sum_{(i,j)\in\pi} \|p_i - q_j\|^2} DDTW(P,Q)=πmin(i,j)∈π∑∥pi−qj∥2
from dtaidistance import dtw
def dtw_distance(curve1, curve2):
return dtw.distance(curve1, curve2)
2.3 弗雷歇距离 (Frétchet Distance)
考虑连续参数化 α : [ 0 , 1 ] → P \alpha:[0,1]\to P α:[0,1]→P, β : [ 0 , 1 ] → Q \beta:[0,1]\to Q β:[0,1]→Q, 定义:
D F r e ˊ t c h e t ( P , Q ) = inf α , β max t ∈ [ 0 , 1 ] ∥ α ( t ) − β ( t ) ∥ D_{Frétchet}(P,Q) = \inf_{\alpha,\beta} \max_{t\in[0,1]} \| \alpha(t) - \beta(t) \| DFreˊtchet(P,Q)=α,βinft∈[0,1]max∥α(t)−β(t)∥
离散形式近似为:
D d i s c F r e ˊ t c h e t = max i min j ∥ p i − q j ∥ + max j min i ∥ q j − p i ∥ D_{discFrétchet} = \max_{i} \min_{j} \|p_i - q_j\| + \max_{j} \min_{i} \|q_j - p_i\| DdiscFreˊtchet=imaxjmin∥pi−qj∥+jmaximin∥qj−pi∥
def frechet_distance(P, Q):
# 实现递归计算或使用矩阵加速
# 详见论文 [Computing the Fréchet distance between two polygonal curves]
2.4 方向相似度
对于方向向量序列 V P = { p i + 1 − p i } i = 1 m − 1 V_P = \{p_{i+1}-p_i\}_{i=1}^{m-1} VP={pi+1−pi}i=1m−1, V Q = { q j + 1 − q j } j = 1 n − 1 V_Q = \{q_{j+1}-q_j\}_{j=1}^{n-1} VQ={qj+1−qj}j=1n−1
余弦相似度:
S c o s ( P , Q ) = 1 K ∑ k = 1 K v k P ⋅ v k Q ∥ v k P ∥ ∥ v k Q ∥ S_{cos}(P,Q) = \frac{1}{K}\sum_{k=1}^K \frac{v_k^P \cdot v_k^Q}{\|v_k^P\| \|v_k^Q\|} Scos(P,Q)=K1k=1∑K∥vkP∥∥vkQ∥vkP⋅vkQ
其中 K = min ( m − 1 , n − 1 ) K = \min(m-1,n-1) K=min(m−1,n−1)
def cosine_similarity(curve1, curve2):
vec1 = curve1[1:] - curve1[:-1] # 计算方向向量
vec2 = curve2[1:] - curve2[:-1]
return np.dot(vec1, vec2.T)/(norm(vec1)*norm(vec2))
2.5 豪斯多夫距离 (Hausdorff Distance)
定义两个点集间的最大最小距离:
D H a u s d o r f f ( P , Q ) = max ( sup p ∈ P inf q ∈ Q ∥ p − q ∥ , sup q ∈ Q inf p ∈ P ∥ q − p ∥ ) D_{Hausdorff}(P,Q) = \max\left( \sup_{p\in P} \inf_{q\in Q} \|p-q\|, \sup_{q\in Q} \inf_{p\in P} \|q-p\| \right) DHausdorff(P,Q)=max(p∈Psupq∈Qinf∥p−q∥,q∈Qsupp∈Pinf∥q−p∥)
2.6 面积差异度量
对平面曲线 ( d = 2 d=2 d=2), 定义包围区域面积差:
D A r e a = ∣ ∬ Ω P d x d y − ∬ Ω Q d x d y ∣ D_{Area} = \left| \iint_{\Omega_P} dxdy - \iint_{\Omega_Q} dxdy \right| DArea=
∬ΩPdxdy−∬ΩQdxdy
其中 Ω P \Omega_P ΩP 为曲线P的闭合区域
关键公式对比表
距离类型 | 计算特点 | 数学表达式 |
---|---|---|
DTW | 允许弹性对齐 | min π ∑ ∣ p i k − q j k ∣ \min_\pi \sum |p_{i_k}-q_{j_k}| minπ∑∣pik−qjk∣ |
Frétchet | 考虑行进同步性 | inf α , β max t ∣ α ( t ) − β ( t ) ∣ \inf_{\alpha,\beta} \max_t |\alpha(t)-\beta(t)| infα,βmaxt∣α(t)−β(t)∣ |
Hausdorff | 最坏情况匹配 | max ( sup p inf q ∣ p − q ∣ , sup q inf p ∣ q − p ∣ ) \max(\sup_p \inf_q |p-q|, \sup_q \inf_p |q-p|) max(suppinfq∣p−q∣,supqinfp∣q−p∣) |
L2逐点匹配 | 严格点对点 | ∑ ∣ p i − q i ∣ 2 \sqrt{\sum |p_i-q_i|^2} ∑∣pi−qi∣2 |
方向相似度 | 关注走向一致性 | 1 K ∑ cos θ k \frac{1}{K}\sum \cos\theta_k K1∑cosθk |
工程应用中的变形公式
加权DTW
D W D T W ( P , Q ) = min π ∑ k = 1 K w k ⋅ ∥ p i k − q j k ∥ D_{WDTW}(P,Q) = \min_\pi \sum_{k=1}^K w_k \cdot \|p_{i_k}-q_{j_k}\| DWDTW(P,Q)=πmink=1∑Kwk⋅∥pik−qjk∥
其中权重 w k w_k wk 可根据应用场景设计(如更关注起始段匹配)
多尺度距离
结合不同粒度的距离计算:
D M u l t i ( P , Q ) = α D D T W ( P d o w n , Q d o w n ) + β D F r e c h e t ( P , Q ) D_{Multi}(P,Q) = \alpha D_{DTW}(P_{down},Q_{down}) + \beta D_{Frechet}(P,Q) DMulti(P,Q)=αDDTW(Pdown,Qdown)+βDFrechet(P,Q)
其中 P d o w n P_{down} Pdown 为降采样后的曲线
这些数学形式为实际工程实现提供了理论基准, 实际编码时需根据计算资源 实时性要求进行适当近似(如使用快速DTW算法代替全矩阵计算).
三 工程化解决方案架构
3.1 预处理阶段
重采样: 统一曲线采样频率
from scipy.interpolate import interp1d def resample_curve(curve, num_points=100): t = np.linspace(0, 1, len(curve)) f = interp1d(t, curve, axis=0, kind='linear') return f(np.linspace(0, 1, num_points))
坐标归一化: 消除绝对位置差异
def normalize_curve(curve): return (curve - np.mean(curve, axis=0)) / np.std(curve, axis=0)
3.2 多级匹配策略
3.3 实时匹配优化
- 滑动窗口缓存: 保留最近N个匹配结果作为匹配起点
- 并行计算: 利用CUDA加速矩阵运算
- 早期终止: 设置距离阈值提前终止计算
3.2 混合匹配算法实现
from scipy.spatial.distance import cdist
def hybrid_matcher(query, candidates, weights=(0.4, 0.6)):
"""
混合匹配算法: DTW + 方向相似度
:param weights: (dtw_weight, cosine_weight)
"""
scores = []
for ref in candidates:
# DTW距离
dtw_dist = dtw.distance(query, ref)
# 方向相似度
cos_sim = cosine_similarity(query, ref)
# 归一化组合得分
score = weights[0]*dtw_dist + weights[1]*(1 - cos_sim)
scores.append(score)
return np.argmin(scores)
3.4 优化建议
- 降采样策略: 在粗匹配阶段使用1/4采样率
- 空间索引加速: 使用KD-Tree进行快速邻域搜索
from sklearn.neighbors import KDTree tree = KDTree(ref_points) indices = tree.query_radius(query_points, r=5.0)
- 增量式计算: 对连续轨迹只计算最新窗口差异
- 非均匀采样: 处理不同采样率的曲线数据
- 部分匹配: 识别长曲线中的局部相似片段
- 深度学习: 使用CNN/LSTM学习曲线特征表示
# 示例使用PyTorch构建轨迹特征提取器 class TrajEncoder(nn.Module): def __init__(self): super().__init__() self.lstm = nn.LSTM(input_size=2, hidden_size=64) self.fc = nn.Linear(64, 32) def forward(self, x): _, (h_n, _) = self.lstm(x) return self.fc(h_n[-1])
注: 实际工程中需考虑坐标系转换, 道路拓扑约束等额外因素, 建议结合具体业务场景调整算法参数.