(后续代码+参考论文持续更新)
A 题 多源机会信号建模与导航分析
2024数维杯A题完整思路35页+配套代码+后续参考论文https://www.jdmm.cc/file/2710634
(一)问题背景
尽管全球卫星定位系统下的定位导航技术已成熟, 但考虑到室内、隧道、建 筑密集区等复杂环境或全球卫星定位系统被毁失灵等突发场景, 会发生全球卫星 定位系统拒止情况, 无法有效定位导航。因此, 需要发展基于新型信号的自主定 位导航方法, 机会信号导航是目前一种可行的自主导航技术。机会信号是指存在 于空间域中的各类无线电信号, 具有不同的频段。在多个发射源发射多种机会信 号(机会信号中均带有发射源位置信息、发射时间信息) 的场景下, 考虑接收飞 行器的自主导航解算问题, 即: 飞行器根据接收到的机会信号信息, 通过飞行器 机载设备, 实时计算飞行器自身的三维空间位置。根据机会信号蕴含的信息来分 类,可以将机会信号分为五类: 达到时间信息(TOA)、到达时间差信息(TDOA)、
多普勒频率差信息(DFD)、到达角度信息(AOA)、接收强度指标信息(RSSI)。
五类机会信号的
具体信息含义如下:
(1)达到时间信息 TOA:信号传输时间, 即飞行器接收信号时间与信号发射时
间的差。
(2)到达时间差信息 TDOA:同一信号从两个发射源(同时发射)到达接收端
的时间差。
(3)多普勒频率差信息 DFD:同一信号从两个发射源发射, 由于飞行器与信号 源具有相对速度, 接收信号会产生频率变化, 进而产生信号频率差, 具体计算方
式如下:
根据结合五类机会信号数据(TOA, TDOA, DFD, AOA, RSSI)的卡尔 曼滤波方法,我们得到了在最后一个采样时间点上的飞行器状态估计。
这些状态包括位置坐标(x,y,z)和速度(vx,vy,vz):
x位置: 0.480米
y位置: 51.61米
z位置: −23.18米
x速度: 0.0069米/秒
y速度: −0.086米/秒
z速度: −2.46米/秒
全部结果如下标所示
0.167639024 | 50.20981823 | 0.306828736 |
0.200481126 | 50.0383057 | 0.269052641 |
0.252338457 | 50.13401999 | 0.232708947 |
0.277293341 | 50.00534989 | 0.256833497 |
0.24010827 | 50.0035857 | 0.505714978 |
0.175725073 | 50.2170725 | 0.083868459 |
0.224353676 | 50.25922459 | 0.179733767 |
0.236802692 | 50.05655168 | 0.427747958 |
0.318821357 | 50.09673735 | 0.365122265 |
0.302493344 | 49.86873936 | 0.310617107 |
0.297992566 | 49.98352116 | 0.328463637 |
0.342013784 | 49.82971025 | -0.015377651 |
0.32952757 | 49.98011325 | -0.04078135 |
0.355792151 | 49.82529241 | 0.21763355 |
0.30281615 | 49.8559223 | 0.036163576 |
0.277025428 | 49.77354806 | -0.144692196 |
0.271246664 | 49.84159572 | -0.044343201 |
import
numpy
as np
2.
4.
5. data_path = '2024 年第九届数维杯数学建模挑战赛题目 \\2024 年第九届数维杯数学建模挑战赛题目\\A 题\\附件一:多源 机会信号建模与导航分析问题.xlsx'
6. signal_data = pd.read_excel(data_path, sheet_nam
e=None)
8. transmitter_data = signal_data['机会信号参数与发
射源数据']
10. speed_vectors = transmitter_data['数值
'][4:8].apply(lambda x: np.array(eval(x)))
12.
14. reception1_data.columns = signal_data['接收情况
1'].iloc[0]
16. sampling_interval = 0.01
18. state_dimension = 6 # x, y, z, vx, vy, vz
20. x_hat = np.zeros((number_of_steps, state_dimensi
on))
22.
24. F = np.array([[1, 0, 0, sampling_interval, 0, 0]
,
[0, 0, 1, 0, 0, sampling_interval]
28. [0, 0, 0, 0, 1, 0],
30. Q = np.eye(state_dimension) * 0.1
32. I = np.eye(state_dimension)
33.
34. num_signals = 5
35. H = np.zeros((num_signals, state_dimension))
36. H[0, 0] = 1
37. H[1, 1] = 1
38. H[2, 2] = 1
39. H[3, 0] = 1
40. H[4, 1] = 1
44. P = np.eye(state_dimension) * 1000
46.
48. P = F @ P @ F.T + Q
50. reception1_data['TDOA(发射源 1,
)](发射源 4)'][t],
56. K = P @ H.T @ np.linalg.inv(S)
57. x_hat[t] += K @ (Z - H @ x_hat[t])
58. P = (I - K @ H) @ P
59. import pandas as pd
60. x_hat_df = pd.DataFrame(x_hat, columns=['x', 'y'
, 'z', 'vx', 'vy', 'vz'])
62. output_path = 'x_hat_results.csv'
64. x_hat_df.to_csv(output_path, index=False)
最后我们对模拟的轨迹进行优化并画出轨迹图如下:
x | y | z |
0.125810334 | 50.24988969 | 0.281371212 |
0.1829938 | 50.10308796 | -0.021292213 |
0.201562094 | 49.8869984 | -0.040429748 |
0.282851278 | 49.91879617 | 0.129599485 |
0.252143879 | 50.14092724 | -0.386131847 |
0.169514974 | 50.20995332 | -0.083372608 |