飞行力学-飞行器模型-1坐标系与坐标转换(附代码)
坑呀坑呀坑呀坑
编辑于 2023年09月02日 20:12
收录于文集
共2篇

温馨提示:本专栏内容用于回顾梳理,相较教材有所简化。本节涉及坐标系和坐标转换。


1  坐标系、坐标转换


1.1  常用坐标系

1)地面坐标系(goe)O_gx_gy_gz_g:

O_g通常取起飞点;O_gx_g通常取正北或航向;O_gz_g铅锤向下。

不考虑地球自转,惯性系。飞机三维坐标和速度在此坐标系下描述。

2)体轴系/机体坐标系(body)O_bx_by_bz_b:

O_b取飞行器质心;O_bx_b在飞行器对称平面内,平行于机身轴线,向前为正;O_bz_b在飞行器对称平面内,垂直于O_bx_b,向下为正;O_by_b垂直于对称平面,向右为正。注:苏系和美系坐标系不同,此处为美系,飞机常用美系,火箭常用苏系。

非惯性系。

3)风轴系/气流坐标系(air)O_ax_ay_az_a:

O_a取飞行器质心;O_ax_a指向空速方向;O_az_a在飞行器对称平面内,垂直于O_ax_a,向下为正;O_ay_a垂直于O_ax_az_a,向右为正。

非惯性系。

4)航迹坐标系O_kx_ky_kz_k:

O_k取飞行器质心;O_kx_k指向地速方向;O_kz_k在包含O_kx_k的铅锤平面内,垂直于O_kx_k,向下为正;O_ky_k垂直于O_kx_kz_k,向右为正。

非惯性系。与火箭的弹道坐标系平行,轴的定义和正负稍有区别

当且仅当风速V_%7Bwind%7D%3D0时,O_kx_kO_ax_a方向一致。


1.2  坐标系转换

基元变换矩阵:

L_x(%5Czeta)%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccc%7D%0A1%20%26%200%20%26%200%20%5C%5C%0A0%20%26%20%5Ccos%20%5Czeta%20%26%20%5Csin%20%5Czeta%20%5C%5C%0A0%20%26%20-%5Csin%20%5Czeta%20%26%20%5Ccos%20%5Czeta%0A%5Cend%7Barray%7D%5Cright%5D%20%5Cquad

%20L_y(%5Ceta)%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccc%7D%0A%5Ccos%20%5Ceta%20%26%200%20%26%20-%5Csin%20%5Ceta%20%5C%5C%0A0%20%26%201%20%26%200%20%5C%5C%0A%5Csin%20%5Ceta%20%26%200%20%26%20%5Ccos%20%5Ceta%0A%5Cend%7Barray%7D%5Cright%5D%20%5Cquad

%20L_z(%5Cxi)%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bccc%7D%0A%5Ccos%20%5Cxi%20%26%20%5Csin%20%5Cxi%20%26%200%20%5C%5C%0A-%5Csin%20%5Cxi%20%26%20%5Ccos%20%5Cxi%20%26%200%20%5C%5C%0A0%20%26%200%20%26%201%0A%5Cend%7Barray%7D%5Cright%5D

代码块
Python
自动换行
复制代码
% matlab function
% edit by James D in 202300901

% example: 
% X_old = [1 0 0]'; % 3x1 vector
% RM = RotationMatrix_user(45,2); % 1:x  2:y  3:z
% X_new = RM*X_old; % 3x1 vector

function RM = RotationMatrix_user( RotationAngle_deg,Axes)
% input:
% RotationAngle_deg: Rotation Angle in degree.
% Axes: 1:x  2:y  3:z
% output:
% RM:3x3matix.

cos_RA = cosd(RotationAngle_deg);
sin_RA = sind(RotationAngle_deg);

switch Axes
    case 1 % Rotate around the x axis
        RM=[ 1,0,0; 0,cos_RA,sin_RA; 0,-sin_RA,cos_RA];
    case 2 % Rotate around the y axis
        RM=[cos_RA,0,-sin_RA; 0,1,0; sin_RA,0,cos_RA];
    case 3 % Rotate around the z axis
        RM=[cos_RA,sin_RA,0; -sin_RA,cos_RA,0; 0,0,1];
end
end
复制成功

原坐标系下坐标X_%7Bo%7D%EF%BC%88x_%7Bo%7D%EF%BC%8Cy_%7Bo%7D%EF%BC%8Cz_%7Bo%7D%EF%BC%89%5ET,旋转后坐标系下坐标X_%7Bn%7D%EF%BC%88x_%7Bn%7D%EF%BC%8Cy_%7Bn%7D%EF%BC%8Cz_%7Bn%7D%EF%BC%89%5ET

假设按照213顺序(y-x-z)旋转。则:

%20%20X_n%20%3DL_%7Bzo%7DX_o

L_%7Bzo%7D%3D%20L_z(%5Cxi)L_x(%5Czeta)L_y(%5Ceta)

因正交变换,有:

L_%7Boz%7D%3D%20(L_%7Bzo%7D)%5E%7B-1%7D%3D%20(L_%7Bzo%7D)%5E%7BT%7D

1)地面系到体轴系,3-2-1旋转

姿态角/欧拉角:

偏航角%5Cpsi(yaw ):O_gx_g 与 机体轴O_bx_b在水平面O_gx_gy_g上投影的夹角,右偏航为正(坐标系旋转方向为O_gz_g正向)。

俯仰角%5Ctheta(pitch):机体轴O_bx_b在水平面O_gx_gy_g上投影 与 机体轴O_bx_b的夹角,右偏航为正(坐标系旋转方向为Oy%26%2339%3B正向)。

滚转角%5Cphi(roll):包含机体轴O_bx_b的铅锤平面 与 飞机对称平面的夹角,右滚转为正(坐标系旋转方向为O_bx_b正向)。

代码块
Python
自动换行
复制代码
%% goe2body
% matlab
[phi_d,theta_d,psi_d] = deal(3,5,10);

cos_phi = cosd(phi_d);
sin_phi = sind(phi_d);
cos_theta = cosd(theta_d);
sin_theta = sind(theta_d);
cos_psi = cosd(psi_d);
sin_psi = sind(psi_d);

% body2goe
RM_bg = [ cos_theta*cos_psi, cos_theta*sin_psi, -sin_theta;
          sin_phi*sin_theta*cos_psi-cos_phi*sin_psi, sin_phi*sin_theta*sin_psi+cos_phi*cos_psi, sin_phi*cos_theta;
          cos_phi*sin_theta*cos_psi+sin_phi*sin_psi, cos_phi*sin_theta*sin_psi-sin_phi*cos_psi, cos_phi*cos_theta;];

RM_bg = RotationMatrix_user(phi_d,1)...
       *RotationMatrix_user(theta_d,2)...
       *RotationMatrix_user(psi_d,3);
复制成功

2)体轴系O_bx_by_bz_b到风轴系O_ax_ay_az_a,2-3旋转

攻角%5Calpha(angle of attack):飞行器空速矢量V在飞机对称平面投影 与 机体轴O_bx_b的夹角,空速投影在O_bx_b下方为正(坐标系旋转方向为O_by_b负向)。

侧滑角%5Cbeta(angle of sideslip):飞行器空速矢量V 与 飞机对称平面的夹角,空速在对称面右侧为正(坐标系旋转方向为O_az_a正向)。

代码块
Python
自动换行
复制代码
%% body2air
% matlab
[alpha_d,beta_d] = deal(5,3);

cos_alpha = cosd(alpha_d);
sin_alpha = sind(alpha_d);
cos_beta = cosd(beta_d);
sin_beta = sind(beta_d);

% body2air
RM_ab = [ cos_alpha*cos_beta, sin_beta, sin_alpha*cos_beta;
          -cos_alpha*sin_beta, cos_beta, -sin_alpha*sin_beta;
          -sin_alpha, 0, cos_alpha;];

RM_ab = RotationMatrix_user(beta_d,3)...
       *RotationMatrix_user(-alpha_d,2);
复制成功

3)地面系O_gx_gy_gz_g到航迹坐标系O_kx_ky_kz_k,3-2旋转

航迹(轨迹)偏角/航向角%5CchiO_gx_g(通常为正北)  与  O_kx_k(地速方向)在水平面O_gx_gy_g投影的夹角,航迹右偏为正(坐标系旋转方向为O_gz_g正向)。

航迹(轨迹)倾角/爬升角%5CgammaO_kx_k(地速方向)与 水平面O_gx_gy_g的夹角,航迹向上为正(坐标系旋转方向为O_ky_k正向)。

代码块
Python
自动换行
复制代码
%% goe2k
% matlab
[chi_d,gamma_d] = deal(5,3);

cos_chi = cosd(chi_d);
sin_chi = sind(chi_d);
cos_gamma = cosd(gamma_d);
sin_gamma = sind(gamma_d);

% body2air
RM_kg = [ cos_gamma*cos_chi, cos_gamma*sin_chi, -sin_gamma;
          -sin_chi, cos_chi, 0;
          sin_gamma*cos_chi, sin_gamma*sin_chi, cos_gamma;];

RM_kg = RotationMatrix_user(gamma_d,2)...
        *RotationMatrix_user(chi_d,3);
复制成功

注意:上面定义来自于《无人机自主控制系统理论与方法》,书中将航迹(轨迹)偏角与航向角当成同一角度,笔者不太建议用此定义。在某些地方,会同时使用航向角、航迹角、偏航角。给出一种定义如下:

航向角:体轴O_bx_b在水平面投影与O_gx_g(取正北)的夹角,投影在右侧为正,范围%5B0%5Eo%2C360%5Eo)

航迹角:O_kx_k(地速方向)在水平面投影与O_gx_g(取正北)的夹角,投影在右侧为正,范围%5B0%5Eo%2C360%5Eo)

偏航角:体轴O_bx_b在水平面投影与O_gx_g(取当前航线方向)的夹角,投影在右侧为正,范围%5B-180%5Eo%2C180%5Eo)

参考:

吴森堂.飞行控制系统[M].北京航空航天大学出版社,2013.

陈宗基,周锐,张平编著.无人机自主控制系统理论与方法[M].上海:上海交通大学出版社,2021