导航与制导的每种方法添加的 代码例程 和 核心公式,以帮助更好地理解其实现和应用。基于 MATLAB 的实现示例。
(INS, Inertial Navigation System)
原理:基于惯性测量单元(IMU)中的加速度计和陀螺仪,测量飞行器的加速度和角速度,通过积分计算位置、速度和姿态。
优点:
不依赖外部信号,具有自主性。
抗干扰能力强。
缺点:
长时间运行会产生累积误差(漂移)。
应用:导弹、潜艇、宇宙飞船等。
核心公式:
代码例程:
% 惯性导航系统模拟
dt = 0.01; % 时间步长
T = 10; % 仿真时间
t = 0:dt:T;
% 初始状态
x = 0; % 初始位置
v = 0; % 初始速度
a = 1; % 恒定加速度
% 状态更新
position = zeros(1, length(t));
for i = 2:length(t)
v = v + a * dt; % 更新速度
x = x + v * dt; % 更新位置
position(i) = x;
end
% 绘图
plot(t, position, 'b-', 'LineWidth', 1.5);
xlabel('时间 (s)');
ylabel('位置 (m)');
title('惯性导航系统模拟');
grid on;
(GNSS, Global Navigation Satellite System)
原理:利用卫星信号(如 GPS、北斗、GLONASS、伽利略)进行定位。
优点:
精度高(可达厘米级,RTK 技术)。
全球覆盖。
缺点:
受环境影响(如遮挡、干扰、欺骗攻击)。
依赖外部信号。
应用:民用导航、航空、无人机、车辆导航。
核心公式:
代码例程:
% GNSS单点定位模拟
satellite_pos = [20000, 20000, 20000]; % 卫星位置 (m)
receiver_pos = [0, 0, 0]; % 接收机初始位置 (m)
c = 3e8; % 光速 (m/s)
delta_t = 1e-6; % 时钟偏差 (s)
% 伪距计算
rho = norm(receiver_pos - satellite_pos) + c * delta_t;
% 输出
fprintf('伪距: %.2f m\n', rho);
代码例程:
% 天文导航高度角计算
phi = deg2rad(30); % 纬度 (30°)
delta = deg2rad(45); % 赤纬 (45°)
H = deg2rad(60); % 时角 (60°)
% 高度角计算
h = asin(sin(phi) * sin(delta) + cos(phi) * cos(delta) * cos(H));
% 输出结果
fprintf('天体高度角: %.2f°\n', rad2deg(h));
(TERCOM)
核心公式:
代码例程:
% 地形匹配导航模拟
Z_map = [100, 105, 110, 120, 130]; % 地图地形数据
Z_measured = [98, 107, 112, 122, 128]; % 实际测量数据
% 计算匹配误差
E = sum((Z_measured - Z_map).^2);
% 输出误差
fprintf('地形匹配误差: %.2f\n', E);
核心公式:
代码例程:
% 组合导航模拟
x_INS = 100.0; % 惯性导航位置
x_GNSS = 101.5; % GNSS 位置
w_INS = 0.6; % 惯性导航权重
w_GNSS = 0.4; % GNSS 权重
% 融合位置
x_fused = w_INS * x_INS + w_GNSS * x_GNSS;
fprintf('组合导航结果: %.2f m\n', x_fused);
(PN, Proportional Navigation)
原理:根据目标与飞行器的视线角变化率,计算飞行器的加速度指令,使其保持与目标视线的固定角速度关系。
优点:
实现简单。
适用于高速目标。
缺点:
对机动目标效果较差。
应用:空空导弹、地空导弹。
核心公式:
a = N ⋅ V c ⋅ λ ˙ a = N \cdot V_c \cdot \dot{\lambda} a=N⋅Vc⋅λ˙
其中, N N N 为比例系数, V c V_c Vc为闭合速度, λ ˙ \dot{\lambda} λ˙为视线角变化率。
代码例程:
% 比例导引律模拟
N = 3; % 导引系数
V_c = 300; % 闭合速度 (m/s)
lambda_dot = deg2rad(2); % 视线角变化率 (rad/s)
% 计算加速度
a = N * V_c * lambda_dot;
fprintf('比例导引加速度: %.2f m/s^2\n', a);
原理:飞行器始终指向目标当前位置。
优点:
实现简单。
缺点:
对高机动目标难以跟踪。
易产生较大能量损耗。
应用:早期制导导弹。
核心公式:
a ⃗ = k ⋅ ( r ⃗ − r ⃗ t ) \vec{a} = k \cdot (\vec{r} - \vec{r}_t) a=k⋅(r−rt)
其中, r ⃗ \vec{r} r为导弹位置, r ⃗ t \vec{r}_t rt为目标位置, k k k为增益。
代码例程:
% 纯追踪制导模拟
r_missile = [1000, 1000]; % 导弹位置
r_target = [500, 500]; % 目标位置
k = 0.1; % 增益
% 计算加速度
a = k * (r_target - r_missile);
fprintf('纯追踪加速度: [%.2f, %.2f] m/s^2\n', a);
代码例程:
% 航迹制导模拟
r_desired = [1000, 1000]; % 目标点
r_current = [800, 900]; % 当前点
% 计算控制输入
u = r_desired - r_current;
fprintf('航迹控制输入: [%.2f, %.2f] m\n', u);
代码例程:
% LQR制导模拟
A = [0 1; 0 0]; % 状态矩阵
B = [0; 1]; % 控制矩阵
Q = diag([1, 1]); % 状态权重
R = 0.1; % 控制权重
% 求解反馈增益
[K, ~, ~] = lqr(A, B, Q, R);
x = [2; -1]; % 当前状态偏差
u = -K * x; % 控制输入
fprintf('LQR控制输入: %.2f\n', u);
代码例程:
% 自主制导路径规划示例
start = [0, 0];
goal = [10, 10];
obstacles = [5, 5; 6, 6]; % 障碍物
% 简单路径规划 (直线路径)
path = [linspace(start(1), goal(1), 100); linspace(start(2), goal(2), 100)];
% 绘制结果
plot(path(1, :), path(2, :), 'b-', 'LineWidth', 1.5); hold on;
scatter(obstacles(:, 1), obstacles(:, 2), 100, 'r', 'filled');
scatter(goal(1), goal(2), 100, 'g', 'filled');
grid on;
title('自主制导路径规划');
在实际应用中,导航和制导通常结合使用。例如:
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者