基于MATLAB的坐标系转换框架和实现方法
在双基地星载雷达仿真中,精确的坐标系转换至关重要。
双基地星载雷达常用坐标系
双基地雷达的发射站和接收机分置于不同位置,仿真中常涉及以下坐标系转换:
| 坐标系 | 描述 |
|---|---|
| 地心惯性坐标系 (ECI) | 原点在地心,相对恒星静止 |
| 地心地固坐标系 (ECEF) | 原点在地心,随地球自转 |
| 地理坐标系 (NED) | 当地北-东-地坐标系 |
| 雷达发射/接收站本体坐标系 | 固定在雷达平台 |
| 通用直角坐标系 | 坐标轴可任意设置,用于优化跟踪模型 |
核心坐标系转换原理与MATLAB实现
关键的转换步骤和MATLAB代码
1. 经纬高 (LLA) 转地心地固 (ECEF)
使用WGS84椭球体模型。
function [x, y, z] = lla2ecef(lat, lon, alt)
% 将纬度、经度、高度转换为ECEF坐标
% 输入:lat, lon (度), alt (米)
% 输出:x, y, z (米)
a = 6378137.0; % WGS84长半轴
f = 1/298.257223563; % 扁率
e2 = 2*f - f*f; % 第一偏心率平方
lat_rad = deg2rad(lat);
lon_rad = deg2rad(lon);
N = a / sqrt(1 - e2 * sin(lat_rad)^2);
x = (N + alt) * cos(lat_rad) * cos(lon_rad);
y = (N + alt) * cos(lat_rad) * sin(lon_rad);
z = (N*(1 - e2) + alt) * sin(lat_rad);
end
2. ECEF 转东北天 (ENU)
需要参考站点的经纬度。
function [e, n, u] = ecef2enu(x, y, z, ref_lat, ref_lon, ref_alt)
% ECEF坐标转ENU坐标
% 输入:目标点ECEF坐标x,y,z,参考点经纬高ref_lat,ref_lon,ref_alt
% 输出:东、北、天方向坐标e,n,u
% 将参考点转换为ECEF
[ref_x, ref_y, ref_z] = lla2ecef(ref_lat, ref_lon, ref_alt);
% 计算目标点相对于参考点的ECEF差值
dx = x - ref_x;
dy = y - ref_y;
dz = z - ref_z;
lat_rad = deg2rad(ref_lat);
lon_rad = deg2rad(ref_lon);
% 构建旋转矩阵 (ECEF to ENU)
R = [-sin(lon_rad), cos(lon_rad), 0;...
-sin(lat_rad)*cos(lon_rad), -sin(lat_rad)*sin(lon_rad), cos(lat_rad);...
cos(lat_rad)*cos(lon_rad), cos(lat_rad)*sin(lon_rad), sin(lat_rad)];
% 应用旋转矩阵
enu = R * [dx; dy; dz];
e = enu(1);
n = enu(2);
u = enu(3);
end
3. 通过方向余弦矩阵进行直角坐标系间转换
两个直角坐标系间的转换可通过方向余弦矩阵实现。
function A = directionCosineMatrix(angles, sequence)
% 根据欧拉角构建方向余弦矩阵
% 输入:angles = [angle1, angle2, angle3] (弧度),rotation_sequence 如 'ZYX'
% 输出:方向余弦矩阵A
% 示例为 'ZYX' 转序 (偏航-俯仰-滚转)
psi = angles(1); % 偏航角
theta = angles(2); % 俯仰角
phi = angles(3); % 滚转角
% 计算旋转矩阵的元素
A11 = cos(psi)*cos(theta);
A12 = cos(psi)*sin(theta)*sin(phi) - sin(psi)*cos(phi);
A13 = cos(psi)*sin(theta)*cos(phi) + sin(psi)*sin(phi);
A21 = sin(psi)*cos(theta);
A22 = sin(psi)*sin(theta)*sin(phi) + cos(psi)*cos(phi);
A23 = sin(psi)*sin(theta)*cos(phi) - cos(psi)*sin(phi);
A31 = -sin(theta);
A32 = cos(theta)*sin(phi);
A33 = cos(theta)*cos(phi);
A = [A11, A12, A13;
A21, A22, A23;
A31, A32, A33];
end
% 使用方向余弦矩阵转换矢量
function vector_new = transformVector(vector_old, A)
% 使用方向余弦矩阵A转换矢量
% 输入:vector_old (旧坐标系中的矢量),A (方向余弦矩阵,从旧系到新系)
% 输出:vector_new (新坐标系中的矢量)
vector_new = A * vector_old;
end
4. 双基地雷达目标定位与坐标转换仿真框架
classdef BistaticRadarSimulator < handle
properties
tx_lla; % 发射站经纬高 [lat, lon, alt]
rx_lla; % 接收站经纬高 [lat, lon, alt]
transformer; % 坐标转换器
end
methods
function obj = BistaticRadarSimulator(tx_lla, rx_lla)
% 构造函数
obj.tx_lla = tx_lla;
obj.rx_lla = rx_lla;
obj.transformer = @lla2ecef;
end
function [tx_range, rx_range, bistatic_range] = calculateBistaticRange(obj, target_lla)
% 计算双基地距离
% 输入:target_lla 目标经纬高
% 输出:tx_range 目标到发射站距离,rx_range 目标到接收站距离,bistatic_range 双基地距离
% 转换为ECEF
[target_ecef(1), target_ecef(2), target_ecef(3)] = obj.transformer(target_lla(1), target_lla(2), target_lla(3));
[tx_ecef(1), tx_ecef(2), tx_ecef(3)] = obj.transformer(obj.tx_lla(1), obj.tx_lla(2), obj.tx_lla(3));
[rx_ecef(1), rx_ecef(2), rx_ecef(3)] = obj.transformer(obj.rx_lla(1), obj.rx_lla(2), obj.rx_lla(3));
% 计算距离
tx_range = norm(target_ecef - tx_ecef);
rx_range = norm(target_ecef - rx_ecef);
bistatic_range = tx_range + rx_range;
end
function [tx_enu, rx_enu] = targetToRadarENU(obj, target_lla)
% 将目标位置转换到发射站和接收站的ENU坐标系
% 输入:target_lla 目标经纬高
% 输出:tx_enu 目标在发射站ENU系坐标,rx_enu 目标在接收站ENU系坐标
[target_x, target_y, target_z] = obj.transformer(target_lla(1), target_lla(2), target_lla(3));
% 转换到发射站ENU
tx_enu = ecef2enu(target_x, target_y, target_z, ...
obj.tx_lla(1), obj.tx_lla(2), obj.tx_lla(3));
% 转换到接收站ENU
rx_enu = ecef2enu(target_x, target_y, target_z, ...
obj.rx_lla(1), obj.rx_lla(2), obj.rx_lla(3));
end
end
end
5. 使用示例与验证
% 示例:双基地星载雷达坐标转换
clear; clc;
% 设置发射站和接收站位置 (假设值)
tx_lla = [39.9, 116.4, 500000]; % 发射站:纬度、经度、高度(米)
rx_lla = [34.7, 113.6, 500000]; % 接收站
% 创建双基地雷达仿真器
radar_sim = BistaticRadarSimulator(tx_lla, rx_lla);
% 设置目标位置
target_lla = [36.5, 115.0, 10000]; % 目标经纬高
% 计算双基地距离
[tx_range, rx_range, bistatic_range] = radar_sim.calculateBistaticRange(target_lla);
fprintf('目标到发射站距离: %.2f km\n', tx_range/1000);
fprintf('目标到接收站距离: %.2f km\n', rx_range/1000);
fprintf('双基地距离和: %.2f km\n', bistatic_range/1000);
% 将目标位置转换到雷达的ENU坐标系
[tx_enu, rx_enu] = radar_sim.targetToRadarENU(target_lla);
fprintf('目标在发射站ENU系坐标: E=%.2f km, N=%.2f km, U=%.2f km\n', ...
tx_enu(1)/1000, tx_enu(2)/1000, tx_enu(3)/1000);
fprintf('目标在接收站ENU系坐标: E=%.2f km, N=%.2f km, U=%.2f km\n', ...
rx_enu(1)/1000, rx_enu(2)/1000, rx_enu(3)/1000);
% 验证:将ENU坐标转换回ECEF,再转换回LLA,检查误差
[target_x, target_y, target_z] = lla2ecef(target_lla(1), target_lla(2), target_lla(3));
[lat_back, lon_back, alt_back] = ecef2lla(target_x, target_y, target_z);
fprintf('坐标转换验证误差: lat=%.6f°, lon=%.6f°, alt=%.2f m\n', ...
abs(target_lla(1)-lat_back), abs(target_lla(2)-lon_back), abs(target_lla(3)-alt_back));
参考资料
- 代码 双基地星载雷达仿真,完成坐标系之间的转换 *www.3dddown.com/cna/82216.html
- 书籍《双基地SAR/GISAR/FISAR观测几何、信号模型和成像算法》提供了相关的观测几何、信号模型和成像算法的Matlab程序代码。

浙公网安备 33010602011771号