基于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程序代码。
posted @ 2025-12-16 11:29  康帅服  阅读(0)  评论(0)    收藏  举报