🎯要点
🎯视觉轨迹几何惯性单元超维计算结构算法 | 🎯超维计算结构视觉场景理解 | 🎯超维计算结构算法解瑞文矩阵 | 🎯超维矢量计算递归神经算法
🍪语言内容分比
🍇Python蒙特卡罗惯性导航
蒙特卡罗方法,或蒙特卡罗实验,是一类广泛的计算算法,依靠重复随机抽样来获得数值结果。其基本概念是利用随机性来解决原则上可能确定的问题。蒙特卡罗方法主要用于三类不同的问题:优化、数值积分和从概率分布生成抽样。它们还可用于对输入具有很大不确定性的现象进行建模,例如计算核电站故障的风险。蒙特卡罗方法通常使用计算机模拟来实现,它们可以为难以解决或过于复杂而无法进行数学分析的问题提供近似解。
蒙特卡罗方法广泛应用于科学、工程和数学的各个领域,例如物理学、化学、生物学、统计学、人工智能、金融和密码学。它们还被应用于社会科学,例如社会学、心理学和政治学。蒙特卡罗方法被公认为 20 世纪最重要和最具影响力的思想之一,并促成了许多科学和技术突破。
蒙特卡罗方法也存在一些局限性和挑战,例如精度和计算成本之间的权衡、维数灾难、随机数生成器的可靠性以及结果的验证和确认。
蒙特卡罗方法各不相同,但往往遵循特定的模式:
-
定义可能输入的域
-
根据域上的概率分布随机生成输入
-
对输出执行确定性计算
-
汇总结果
蒙特卡罗仿真验证惯性导航卡尔曼滤波器的性能:
- 设置建模轨迹、理想测量值和误差统计参数
- 根据模型应用独立随机误差,执行过滤器 N 次。记录滤波器的估计参数误差和预测标准偏差
- 计算误差的均方根值,并将其与滤波器的标准偏差进行比较。计算出的均方根值必须与标准偏差值非常一致
请注意,均方根值的方差大约下降为 1 / N 1 / N 1/N (其 标准偏差为 1 / N 1 / \sqrt{N} 1/N )。这意味着获得低方差可能需要多次重复。
为简单起见,我们将使用由循环和平均运动组成的合成轨迹。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['axes.grid'] = True
plt.rcParams['font.size'] = 12
trajectory_true, imu_true = pyx.sim.generate_sine_velocity_motion(
0.05, 600.0, [58, 56, 0], [10.0, -10.0, -1.0],
velocity_change_amplitude=60.0, velocity_change_period=30)
让我们想象一下东西向平面上的轨迹。
ned = pyx.transform.lla_to_ned(trajectory_true)
plt.plot(ned.east, ned.north)
plt.xlabel("East, m")
plt.ylabel("North, m")
plt.axis('equal');
这样的轨迹允许陀螺仪比例因子和 Z 轴的未对准估计(因为围绕它有足够的旋转)。
现在让我们定义误差和噪声参数。 初始位置-速度-姿态误差标准差:
initial_position_sd = 10.0
initival_velocity_sd = 0.3
initial_level_sd = 0.1
initial_azimuth_sd = 0.5
对于惯性单元,我们采用中级微机电系统传感器。我们对陀螺仪 Z 轴的初始偏差、噪声、未对准和比例误差进行建模。
📜微机电系统用例:Python和MATLAB微机电健康推导算法和系统模拟优化设计
gyro_model = pyx.inertial_sensor.EstimationModel(
bias_sd=100.0 * pyx.transform.DH_TO_RS,
noise=1.0 * pyx.transform.DRH_TO_RRS,
bias_walk=10.0 * pyx.transform.DH_TO_RS / 60,
scale_misal_sd=[[0, 0, 0.01],
[0, 0, 0.01],
[0, 0, 0.01]])
accel_model = pyx.inertial_sensor.EstimationModel(
bias_sd=0.05,
noise=0.1 / 60,
bias_walk=0.001 / 60
)
作为外部测量,我们使用具有以下参数的 GNSS 定位:
gnss_period = 1
gnss_position_sd = 2
为了以更可靠的方式表示代码,让我们编写执行单次运行和完整模拟的函数。
def run_single(trajectory_true, imu_true, gnss_lla_true,
gyro_model, accel_model,
position_sd, velocity_sd, level_sd, azimuth_sd,
gnss_position_sd, filter_time_step, rng):
gyro_parameters = pyx.inertial_sensor.Parameters.from_EstimationModel(gyro_model, rng=rng)
accel_parameters = pyx.inertial_sensor.Parameters.from_EstimationModel(accel_model, rng=rng)
imu = pyx.inertial_sensor.apply_imu_parameters(imu_true, 'rate', gyro_parameters, accel_parameters)
increments = pyx.strapdown.compute_increments_from_imu(imu, 'rate')
gnss_measurement = pyx.measurements.Position(
pyx.sim.generate_position_measurements(gnss_lla_true, gnss_position_sd, rng),
gnss_position_sd)
pva_error = pyx.sim.generate_pva_error(position_sd, velocity_sd, level_sd, azimuth_sd, rng=rng)
pva_initial = pyx.sim.perturb_pva(trajectory_true.iloc[0], pva_error)
filter_result = pyx.filters.run_feedback_filter(
pva_initial, position_sd, velocity_sd, level_sd, azimuth_sd,
increments, gyro_model, accel_model,
measurements=[gnss_measurement], time_step=filter_time_step)
return pyx.util.Bunch(
trajectory=pyx.transform.compute_state_difference(filter_result.trajectory, trajectory_true),
gyro=pyx.transform.compute_state_difference(filter_result.gyro, gyro_parameters.data_frame),
accel=pyx.transform.compute_state_difference(filter_result.accel, accel_parameters.data_frame),
trajectory_sd=filter_result.trajectory_sd,
gyro_sd=filter_result.gyro_sd,
accel_sd=filter_result.accel_sd
)