从太敏原始遥测值计算太阳矢量(卫星本体系)详解
从太敏原始遥测值计算太阳矢量(卫星本体系)详解
1. 概述
太阳敏感器(太敏)是卫星姿态确定系统中的重要部件,用于测量太阳光方向在卫星本体系下的单位向量。本文将详细介绍从太敏原始遥测值到太阳矢量的完整计算过程,包括数学模型、计算方法和C语言实现。
2. 基本原理
太阳敏感器通常输出两个角度:太阳光线在敏感器测量坐标系下的方位角α\alphaα和俯仰角β\betaβ。
3. 数学模型
3.1 测量坐标系到敏感器坐标系的转换
在太阳敏感器测量坐标系中,太阳矢量的坐标为:
Smeas=[cosβcosαcosβsinαsinβ]\mathbf{S}_{meas} = \begin{bmatrix} \cos\beta\cos\alpha \\ \cos\beta\sin\alpha \\ \sin\beta \end{bmatrix} Smeas=cosβcosαcosβsinαsinβ
其中:
- α\alphaα:方位角(绕Z轴旋转)
- β\betaβ:俯仰角(绕Y轴旋转)
3.2 敏感器坐标系到卫星本体坐标系的转换
敏感器坐标系到卫星本体坐标系的转换通过安装矩阵实现:
Sbody=Minstall⋅Ssensor\mathbf{S}_{body} = \mathbf{M}_{install} \cdot \mathbf{S}_{sensor} Sbody=Minstall⋅Ssensor
其中Minstall\mathbf{M}_{install}Minstall是3×3的旋转矩阵,由敏感器的安装方向决定。
4. 计算步骤
步骤1:从原始遥测值提取角度值
太敏原始数据通常是数字量,需要转换为物理角度:
α=Kα⋅(RAWα−OFFSETα)\alpha = K_\alpha \cdot (RAW_\alpha - OFFSET_\alpha) α=Kα⋅(RAWα−OFFSETα)
β=Kβ⋅(RAWβ−OFFSETβ)\beta = K_\beta \cdot (RAW_\beta - OFFSET_\beta) β=Kβ⋅(RAWβ−OFFSETβ)
其中:
- RAWαRAW_\alphaRAWα, RAWβRAW_\betaRAWβ:原始遥测值
- KαK_\alphaKα, KβK_\betaKβ:比例系数
- OFFSETαOFFSET_\alphaOFFSETα, OFFSETβOFFSET_\betaOFFSETβ:零点偏移
步骤2:计算测量坐标系下的太阳矢量
Smeas=[xmeasymeaszmeas]=[cosβcosαcosβsinαsinβ]\mathbf{S}_{meas} = \begin{bmatrix} x_{meas} \\ y_{meas} \\ z_{meas} \end{bmatrix} = \begin{bmatrix} \cos\beta\cos\alpha \\ \cos\beta\sin\alpha \\ \sin\beta \end{bmatrix} Smeas=xmeasymeaszmeas=cosβcosαcosβsinαsinβ
步骤3:坐标系转换
Sbody=Minstall⋅Smeas\mathbf{S}_{body} = \mathbf{M}_{install} \cdot \mathbf{S}_{meas} Sbody=Minstall⋅Smeas
步骤4:单位化处理
S^body=Sbody∥Sbody∥\mathbf{\hat{S}}_{body} = \frac{\mathbf{S}_{body}}{\|\mathbf{S}_{body}\|} S^body=∥Sbody∥Sbody
5. C语言实现
#include <stdio.h>
#include <math.h>#ifndef M_PI
#define M_PI 3.14159265358979323846
#endiftypedef struct {double x;double y;double z;
} Vector3D;typedef struct {double data[3][3];
} Matrix3x3;/*** @brief 从太敏原始数据计算太阳矢量* @param raw_alpha 方位角原始值* @param raw_beta 俯仰角原始值 * @param k_alpha 方位角比例系数* @param k_beta 俯仰角比例系数* @param offset_alpha 方位角零点偏移* @param offset_beta 俯仰角零点偏移* @param install_matrix 安装矩阵* @param sun_vector 输出的太阳单位矢量* @return 0:成功, -1:失败*/
int calculate_sun_vector(double raw_alpha, double raw_beta,double k_alpha, double k_beta,double offset_alpha, double offset_beta,const Matrix3x3* install_matrix,Vector3D* sun_vector)
{// 步骤1:原始数据转换为角度(弧度)double alpha = k_alpha * (raw_alpha - offset_alpha);double beta = k_beta * (raw_beta - offset_beta);// 将角度转换为弧度(如果输入是度的话)// alpha = alpha * M_PI / 180.0;// beta = beta * M_PI / 180.0;// 步骤2:计算测量坐标系下的太阳矢量double cos_beta = cos(beta);double sin_beta = sin(beta);double cos_alpha = cos(alpha);double sin_alpha = sin(alpha);Vector3D s_meas;s_meas.x = cos_beta * cos_alpha;s_meas.y = cos_beta * sin_alpha;s_meas.z = sin_beta;// 步骤3:坐标系转换到卫星本体系Vector3D s_body;s_body.x = install_matrix->data[0][0] * s_meas.x + install_matrix->data[0][1] * s_meas.y + install_matrix->data[0][2] * s_meas.z;s_body.y = install_matrix->data[1][0] * s_meas.x + install_matrix->data[1][1] * s_meas.y + install_matrix->data[1][2] * s_meas.z;s_body.z = install_matrix->data[2][0] * s_meas.x + install_matrix->data[2][1] * s_meas.y + install_matrix->data[2][2] * s_meas.z;// 步骤4:单位化double norm = sqrt(s_body.x * s_body.x + s_body.y * s_body.y + s_body.z * s_body.z);if (norm < 1e-12) {return -1; // 错误:矢量模长太小}sun_vector->x = s_body.x / norm;sun_vector->y = s_body.y / norm;sun_vector->z = s_body.z / norm;return 0;
}/*** @brief 创建安装矩阵(示例:敏感器与卫星坐标系对齐)*/
void create_identity_install_matrix(Matrix3x3* matrix)
{for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {matrix->data[i][j] = (i == j) ? 1.0 : 0.0;}}
}/*** @brief 创建绕X轴旋转的安装矩阵*/
void create_rotation_x_matrix(Matrix3x3* matrix, double angle_rad)
{double cos_a = cos(angle_rad);double sin_a = sin(angle_rad);matrix->data[0][0] = 1.0; matrix->data[0][1] = 0.0; matrix->data[0][2] = 0.0;matrix->data[1][0] = 0.0; matrix->data[1][1] = cos_a; matrix->data[1][2] = -sin_a;matrix->data[2][0] = 0.0; matrix->data[2][1] = sin_a; matrix->data[2][2] = cos_a;
}/*** @brief 打印矢量*/
void print_vector(const char* name, const Vector3D* vec)
{printf("%s: [%.6f, %.6f, %.6f]\n", name, vec->x, vec->y, vec->z);
}// 测试示例
int main()
{// 测试参数double raw_alpha = 1024.5; // 方位角原始值double raw_beta = 512.3; // 俯仰角原始值double k_alpha = 0.001; // 方位角比例系数double k_beta = 0.001; // 俯仰角比例系数 double offset_alpha = 1024.0; // 方位角零点double offset_beta = 512.0; // 俯仰角零点Matrix3x3 install_matrix;create_identity_install_matrix(&install_matrix);Vector3D sun_vector;int result = calculate_sun_vector(raw_alpha, raw_beta,k_alpha, k_beta,offset_alpha, offset_beta,&install_matrix,&sun_vector);if (result == 0) {print_vector("太阳单位矢量", &sun_vector);// 验证模长是否为1double norm = sqrt(sun_vector.x * sun_vector.x + sun_vector.y * sun_vector.y + sun_vector.z * sun_vector.z);printf("矢量模长: %.10f\n", norm);} else {printf("计算失败\n");}return 0;
}
6. 编译与运行
使用以下命令编译:
gcc -o sun_vector sun_vector.c -lm
7. 注意事项
- 角度单位:确保所有角度使用统一的单位(弧度或度)
- 安装矩阵:安装矩阵需要根据敏感器的实际安装方向仔细标定
- 误差处理:在实际工程中需要添加更多的错误检查和容错处理
- 精度验证:定期验证计算结果的精度,确保系统正常工作
8. 总结
本文详细介绍了从太敏原始遥测值计算太阳矢量的完整过程,包括数学模型、计算步骤和C语言实现。在实际卫星系统中,还需要考虑温度补偿、非线性校正等因素,但基本计算框架与此文所述一致。