坐标转换模块
2026/1/14大约 3 分钟
坐标转换模块
说明:本文档旨在帮助理解模块功能,具体API和行为请查阅源代码。
模块概述
坐标变换模块提供了天体力学和航天动力学中常用的各种坐标系之间的转换功能。该模块支持多种参考系之间的精确转换,包括惯性系、固连系以及各种中间参考系,为轨道计算、姿态控制等应用提供基础支持。
核心概念
坐标系定义
模块支持以下主要坐标系:
- CBI (Central Body Inertial Frame):中心天体惯性系
- CBF (Central Body Fixed Frame):中心天体固连系
- ECI (Earth Centered Inertial Frame):地球惯性系,根据配置可表示ICRF或J2000
- J2000:地球时(TT)2000年1月1日12时0分0秒的地球平赤道系
- MOD (Mean of Date):平赤道系,考虑岁差
- TOD (True of Date):真赤道系,考虑岁差和章动
- GTOD (Greenwich True of Date):格林尼治真赤道系,XY平面为赤道平面,正X轴指向本初子午线,随地球旋转
- 又称TDR、GCR、PEF或EFG
- ECF (Earth Centered Fixed Frame):地球固连系,在GTOD基础上考虑了极移
- ICRF (International Celestial Reference Frame):国际天球参考系
- CIRF (Celestial Intermediate Reference Frame):天球中间参考系
- 第一极(z轴方向)为给定时刻的天球中间极(CIP)
- 基本平面为与该时刻的天球中间极垂直的中间赤道
- 经度坐标起量点为天球中间零点
- TIRF (Terrestrial Intermediate Reference Frame):地球中间参考系
- 与国际地球参考系(ITRF)的联系由极移和地球中间零点的定位角确定
- 通过绕天球中间极CIP的转动角度(地球自转角ERA)与CIRF相联系
坐标变换类型
模块提供三种主要的坐标变换接口:
- Transform:返回Rotation或KinematicRotation对象
- Matrix:返回坐标转换矩阵
- 直接转换:直接将坐标从一个参考系转换到另一个参考系
部分变换还支持带速度的转换,考虑旋转坐标系的角速度影响。
主要功能
模块支持以下主要坐标系之间的转换:
- ECI ↔ ECF:地球惯性系与地球固连系之间的转换
- J2000 ↔ ECF:J2000地球平赤道系与地球固连系之间的转换
- J2000 ↔ MOD:J2000地球平赤道系与平赤道系之间的转换
- MOD ↔ TOD:平赤道系与真赤道系之间的转换
- TOD ↔ GTOD:真赤道系与格林尼治真赤道系之间的转换
- GTOD ↔ ECF:格林尼治真赤道系与地球固连系之间的转换
- ICRF ↔ ECF:国际天球参考系与地球固连系之间的转换
- ICRF ↔ CIRF:国际天球参考系与天球中间参考系之间的转换
- CIRF ↔ TIRF:天球中间参考系与地球中间参考系之间的转换
- TIRF ↔ ECF:地球中间参考系与地球固连系之间的转换
用法示例
1. J2000到ECF的坐标转换
#include "AstCore/FrameTransform.hpp"
#include "AstCore/TimePoint.hpp"
#include "AstMath/Vector.hpp"
#include "AstUtil/Literals.hpp"
#include "AstCore/RunTime.hpp"
AST_USING_NAMESPACE
using namespace _AST literals;
int main()
{
// 加载基础数据并初始化,需要EOP数据
aInitialize();
// 创建时间点
TimePoint tp = TimePoint::FromUTC(2026, 1, 1, 0, 0, 0);
// J2000坐标
Vector3d vecJ2000{1000_km, 2000_km, 3000_km};
// 转换到ECF坐标
Vector3d vecECF;
aJ2000ToECF(tp, vecJ2000, vecECF);
// 输出结果
printf("J2000坐标: %.3f m, %.3f m, %.3f m\n", vecJ2000[0], vecJ2000[1], vecJ2000[2]);
printf("ECF坐标: %.3f m, %.3f m, %.3f m\n", vecECF[0], vecECF[1], vecECF[2]);
// 清理资源
aUninitialize();
return 0;
}2. 带速度的J2000到ECF转换
#include "AstCore/FrameTransform.hpp"
#include "AstCore/TimePoint.hpp"
#include "AstMath/Vector.hpp"
#include "AstUtil/Literals.hpp"
#include "AstCore/RunTime.hpp"
AST_USING_NAMESPACE
using namespace _AST literals;
int main()
{
// 加载基础数据并初始化,需要EOP数据
aInitialize();
// 创建时间点
TimePoint tp = TimePoint::FromUTC(2026, 1, 1, 0, 0, 0);
// J2000坐标和速度
Vector3d vecJ2000{1000_km, 2000_km, 3000_km};
Vector3d velJ2000{100_km/s, 200_km/s, 300_km/s};
// 转换到ECF坐标和速度
Vector3d vecECF;
Vector3d velECF;
aJ2000ToECF(tp, vecJ2000, velJ2000, vecECF, velECF);
// 输出结果
printf("J2000坐标: %.3f m, %.3f m, %.3f m\n", vecJ2000[0], vecJ2000[1], vecJ2000[2]);
printf("J2000速度: %.3f m/s, %.3f m/s, %.3f m/s\n", velJ2000[0], velJ2000[1], velJ2000[2]);
printf("ECF坐标: %.3f m, %.3f m, %.3f m\n", vecECF[0], vecECF[1], vecECF[2]);
printf("ECF速度: %.3f m/s, %.3f m/s, %.3f m/s\n", velECF[0], velECF[1], velECF[2]);
// 清理资源
aUninitialize();
return 0;
}3. 使用转换矩阵
#include "AstCore/FrameTransform.hpp"
#include "AstCore/TimePoint.hpp"
#include "AstMath/Vector.hpp"
#include "AstMath/Matrix.hpp"
#include "AstUtil/Literals.hpp"
#include "AstCore/RunTime.hpp"
AST_USING_NAMESPACE
using namespace _AST literals;
int main()
{
// 加载基础数据并初始化,需要EOP数据
aInitialize();
// 创建时间点
TimePoint tp = TimePoint::FromUTC(2026, 1, 7, 12, 0, 0);
// 获取J2000到MOD的转换矩阵
Matrix3d matrix;
aJ2000ToMODMatrix(tp, matrix);
// J2000坐标
Vector3d vecJ2000{1000_km, 2000_km, 3000_km};
// 使用矩阵转换坐标
Vector3d vecMOD = matrix * vecJ2000;
// 输出结果
printf("J2000坐标: %.3f m, %.3f m, %.3f m\n", vecJ2000[0], vecJ2000[1], vecJ2000[2]);
printf("转换矩阵:\n");
printf("%.9f %.9f %.9f\n", matrix(0,0), matrix(0,1), matrix(0,2));
printf("%.9f %.9f %.9f\n", matrix(1,0), matrix(1,1), matrix(1,2));
printf("%.9f %.9f %.9f\n", matrix(2,0), matrix(2,1), matrix(2,2));
printf("MOD坐标: %.3f m, %.3f m, %.3f m\n", vecMOD[0], vecMOD[1], vecMOD[2]);
// 清理资源
aUninitialize();
return 0;
}依赖关系
AstGlobal.h:项目全局定义AstCore/TimePoint.hpp:时间点定义AstMath/Vector.hpp:向量定义AstMath/Matrix.hpp:矩阵定义AstMath/Rotation.hpp:旋转定义AstCore/SOFA.hpp:天文算法库接口AstCore/EOP.hpp:地球定向参数接口
注意事项
- 所有角度参数默认使用弧度(rad)
- 转换精度取决于所使用的岁差、章动模型
- 极移校正需要EOP数据支持
- 部分转换函数提供了IAU1980和JPL DE两种实现,可通过
aNutationMethodSet选择 - 长时间跨度的转换可能需要更精确的模型选择
API参考
///
/// @file FrameTransform.hpp
/// @brief ~
/// @details ~
/// @author axel
/// @date 2026-01-29
/// @copyright 版权所有 (C) 2026-present, ast项目.
///
/// ast项目(https://github.com/space-ast/ast)
/// 本项目基于 Apache 2.0 开源许可证分发。
/// 您可在遵守许可证条款的前提下使用、修改和分发本软件。
/// 许可证全文请见:
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// 重要须知:
/// 软件按"现有状态"提供,无任何明示或暗示的担保条件。
/// 除非法律要求或书面同意,作者与贡献者不承担任何责任。
/// 使用本软件所产生的风险,需由您自行承担。
#pragma once
#include "AstGlobal.h"
#include "LocalOrbitFrame.hpp"
#include "PlanetFrame.hpp"
#include "EarthFrame.hpp"
#include "MoonFrame.hpp"
#include "InertialFrame.hpp"
#include "AxesTransform.hpp"
AST_NAMESPACE_BEGIN
/// @todo 实现通用的坐标转换函数
/// 参考orekit、GMAT的坐标系统类,还有spice的坐标转换函数
/// 实现从一个坐标系统到另一个坐标系统的转换
AST_NAMESPACE_END