来源:轨道机动算法的C++实现_shirro123的专栏-CSDN博客

卫星轨道推演计算相关基础知识点总结

一、卫星的运动特性
            二、卫星的空间坐标系
                (1)地心惯性坐标系(ECI×J2000历元坐标系)(ECSF 地心空间坐标系)
                (2)地心固定坐标系(ECF)(WGS84坐标系)
                (3)地心地固坐标系(ECEF)
                (4)地心椭球惯性坐标系(ECEI)(地心黄道惯性坐标系)
            三、根据轨道根数计算卫星位置
                (1)计算卫星在轨道坐标系下的位置
                (2)轨道坐标系与大地坐标系间的换算
                (3)轨道坐标系与大地坐标系间的换算
            四、空间几何关系相关知识点及C++代码
                (1)欧拉角、旋转向量和旋转矩阵的相互转换

近期在补卫星仿真领域的相关基础知识,并总结一些卫星轨道计算的算法与工具类代码函数。
    参考内容见百度公开文库文档与PPT:
    https://max.book118.com/html/2019/0309/5304232023002020.shtm
    https://wenku.baidu.com/view/e231b968a32d7375a417806b.html?rec_flag=default&fr=Recommend_RelativeDoc-60272,60321,40155,40311,40251,60314,40300-kpdrec_doc_pc_view-bf93f0936bec0975f465e2dd&sxts=1629169656038

一、卫星的运动特性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、卫星的空间坐标系
(1)地心惯性坐标系(ECI×J2000历元坐标系)(ECSF 地心空间坐标系)

地心惯性坐标系是太阳系内的一个惯性坐标系,不随地球而转动,也不受地球、DAC6574IDGS太阳运行的章动和岁差的影响。其坐标原点位于地心Oe;OeX轴位于赤道平面内,指向特定某一年(历元时刻)的太阳春分点位置,每年春分点均会发生变动;OeZ轴指向某一年(历元时刻)地球北极的平均位置处,即地球平均自转极点(CIO);OcY轴位于赤道平面内,与0eX轴垂直,且与OeX、OeZ构成满足右手定则的笛卡儿直角坐标系。
由于采用的历元时间不同,可以有各种不同的地心惯性坐标系,目前国际上通用的地心惯性坐标系是J2000历元坐标系,它是以公元2000年的春分点为基准的历元坐标系。
(2)地心固定坐标系(ECF)(WGS84坐标系)

如图所示,地心固定坐标系的坐标原点位于地心Oe,OeZ轴指向地球北极,OeX轴位于赤道平面内指向地理经度的零点,OeY轴根据右手定则确定。地心固定坐标系为笛卡尔直角坐标系,该坐标系在宇宙空间中相对地球静止,伴随地球自转和公转。
在这里插入图片描述
(3)地心地固坐标系(ECEF)

地心地固坐标系的坐标原点位于地心Oe,OeZ轴指向地球平均自转极点(CIO),OeX轴位于赤道平面内指向子午线与赤道交点,OeY轴根据右手定则确定。地心地固坐标系为笛卡尔直角坐标系,该坐标系在宇宙空间中相对地球静止,伴随地球自转和公转。
(4)地心椭球惯性坐标系(ECEI)(地心黄道惯性坐标系)

地心椭球惯性坐标系的坐标原点位于地心Oe,OeZ轴指向椭球极轴(黄道极-地球公转 轨迹在地球表面投影轨迹形成),OeX轴位于赤道平面内,指向特定某一年(历元时刻)的太阳春分点位置,每年春分点均会发生变动,OeY轴根据右手定则确定。地心地固坐标系为笛卡尔直角坐标系,该坐标系在宇宙空间中相对地球静止,伴随地球自转和公转。
三、根据轨道根数计算卫星位置
(1)计算卫星在轨道坐标系下的位置

轨道根数(或称轨道要素或轨道参数)是描述在牛顿运动定律和牛顿万有引力定律的作用下的天体或航天器,在其开普勒轨道上运动时,确定其轨道所必要的六个参数。由于运动的方式有许多种的参数表示法,依照选定的测量装置不同,对相同的轨道,有几种不同的方式来定义轨道根数。

轨道半长轴:椭圆轨道长轴的一半,有时可视作平均轨道半径。
轨道离心率:为椭圆扁平程度的一种量度,定义是椭圆两焦点间的距离与长轴长度的比值。 就是e=c/a。
轨道倾角:行星轨道面对黄道面的倾角;在升交点处从黄道面逆时针方向量到行星轨道面的角度。
升交点赤经:行星轨道升交点的黄道经度。
近日点幅角:从升交点沿行星运动轨道逆时针量到近日点的角度。
平近点角:行星对应于t0时卫星的平近点角。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)轨道坐标系与大地坐标系间的换算

在这里插入图片描述
在这里插入图片描述
(3)轨道坐标系与大地坐标系间的换算

在这里插入图片描述
在这里插入图片描述
四、空间几何关系相关知识点及C++代码
(1)欧拉角、旋转向量和旋转矩阵的相互转换

在这里插入图片描述
任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合,这三个角度成为欧拉角。对于在三维空间里的一个参考系,任何坐标系的取向都可以用欧拉角来表示,如图所示,蓝色为起始坐标系,红色为旋转之后的坐标系。
在这里插入图片描述
因此欧拉角转为旋转矩阵的公式如下:
在这里插入图片描述

欧拉角和旋转矩阵相互转换的C++代码如下所示:

Mat eulerAnglesToRotationMatrix(Vec3f &theta)
{
    // Calculate rotation about x axis
    Mat R_x = (Mat_<double>(3,3) <<
        1,       0,              0,
        0,       cos(theta[0]),   -sin(theta[0]),
        0,       sin(theta[0]),   cos(theta[0])
    );
    // Calculate rotation about y axis
    Mat R_y = (Mat_<double>(3,3) <<
        cos(theta[1]),    0,      sin(theta[1]),
        0,               1,      0,
        -sin(theta[1]),   0,      cos(theta[1])
    );
    // Calculate rotation about z axis
    Mat R_z = (Mat_<double>(3,3) <<
        cos(theta[2]),    -sin(theta[2]),      0,
        sin(theta[2]),    cos(theta[2]),       0,
        0,               0,                  1
    );
    // Combined rotation matrix
    Mat R = R_z * R_y * R_x;
    return R;
}
Vec3f rotationMatrixToEulerAngles(Mat &R)
{
    float sy = sqrt(R.at<double>(0,0) * R.at<double>(0,0) +  R.at<double>(1,0) * R.at<double>(1,0) );
    bool singular = sy < 1e-6; // If
    float x, y, z;
    if (!singular)
    {
        x = atan2(R.at<double>(2,1) , R.at<double>(2,2));
        y = atan2(-R.at<double>(2,0), sy);
        z = atan2(R.at<double>(1,0), R.at<double>(0,0));
    }
    else
    {
        x = atan2(-R.at<double>(1,2), R.at<double>(1,1));
        y = atan2(-R.at<double>(2,0), sy);
        z = 0;
    }
    #if 1
    x = x*180.0f/3.141592653589793f;
    y = y*180.0f/3.141592653589793f;
    z = z*180.0f/3.141592653589793f;
    #endif
    return Vec3f(x, y, z);
}

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48

这里存一下项目开发过程中常用的一些计算需求,例如根据旋转前后的两个向量求二者之间的旋转矩阵,C++代码如下所示:

AcGeVector3d CrossProduct(AcGeVector3d a, AcGeVector3d b)
{
    AcGeVector3d c;
    c.x = a.y * b.z - a.z * b.y;
    c.y = a.z * b.x - a.x * b.z;
    c.z = a.x * b.y - a.y * b.x;
    return c;
}

double DotProduct(AcGeVector3d a, AcGeVector3d b)
{
    double result;
    //result = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
    result = a.x * b.x + a.y * b.y + a.z * b.z;
    return result;
}

double Absolute(AcGeVector3d v)
{
    double result;
    result = sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
    return result;
}

AcGeMatrix3d RotationMatrix(double angle, AcGeVector3d u)
{
    double norm = Absolute(u);
    u.x = u.x / norm;
    u.y = u.y / norm;
    u.z = u.z / norm;
    AcGeMatrix3d rotatinMatrix;

rotatinMatrix.entry[0][0] = cos(angle) + u.x * u.x * (1 - cos(angle));
    rotatinMatrix.entry[0][1] = u.x * u.y * (1 - cos(angle)) - u.z * sin(angle);
    rotatinMatrix.entry[0][2] = u.y * sin(angle) + u.x * u.z * (1 - cos(angle));
    rotatinMatrix.entry[0][3] = 0.0;

rotatinMatrix.entry[1][0] = u.z * sin(angle) + u.x * u.y * (1 - cos(angle));
    rotatinMatrix.entry[1][1] = cos(angle) + u.y * u.y * (1 - cos(angle));
    rotatinMatrix.entry[1][2] = -u.x * sin(angle) + u.y * u.z * (1 - cos(angle));
    rotatinMatrix.entry[1][3] = 0.0;

rotatinMatrix.entry[2][0] = -u.y * sin(angle) + u.x * u.z * (1 - cos(angle));
    rotatinMatrix.entry[2][1] = u.x * sin(angle) + u.y * u.z * (1 - cos(angle));
    rotatinMatrix.entry[2][2] = cos(angle) + u.z * u.z * (1 - cos(angle));
    rotatinMatrix.entry[2][3] = 0.0;

rotatinMatrix.entry[3][0] = 0.0;
    rotatinMatrix.entry[3][1] = 0.0;
    rotatinMatrix.entry[3][2] = 0.0;
    rotatinMatrix.entry[3][3] = 1.0;

return rotatinMatrix;
}

AcGeMatrix3d CalculationMtrix(AcGeVector3d vectorBefore, AcGeVector3d vectorAfter)
{
    double rotationAngle = acos(DotProduct(vectorBefore, vectorAfter) / Absolute(vectorBefore) / Absolute(vectorAfter));
    AcGeVector3d rotationAxis = CrossProduct(vectorBefore, vectorAfter);
    AcGeMatrix3d rotationMatrix = RotationMatrix(rotationAngle, rotationAxis);

return rotationMatrix;
}

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63

未完待续 ,后面如果又涉及到卫星仿真的相关项目再进行更新完善。
努力补课的乔木小姐
————————————————
版权声明:本文为CSDN博主「码代码的乔木」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nannan7777/article/details/119752362

卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)相关推荐

  1. 卫星定位基础理论之GPS卫星轨道理论与计算

    以下内容主要参考谢钢博士的<GPS原理与接收机设计>一书 1.常用地理术语: 1.子午面:包含地球自转轴的任何一个平面,子午面与地球表面相交的大圆称为子午圈 2.时圈:以南极和北极为端点的 ...

  2. 计算机流水线重要知识,计算机组成与体系结构——流水线相关知识点(常考计算)...

    流水线是软考中经常考的一部分内容,并且常以要求计算的形式出现,所以,这里详细总结一下流水线的相关知识点. 流水线的概念 流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术.即可以同时为 ...

  3. 用c++根据轨道六根数计算卫星位置

    轨道六根数是描述卫星轨道的一组参数,包括: 轨道长半径(a):卫星轨道的半径,表示卫星到地球中心的平均距离. 轨道偏心率(e):卫星轨道的偏心率,表示轨道的椭圆程度. 轨道倾角(i):卫星轨道与地球赤 ...

  4. LC滤波器之m推演滤波器的LC参数matlab计算

    参考森荣二<LC滤波器设计与制作>书籍. 不同于定K型滤波器,m推演型LC滤波器可以设置陷波点用来滤除截止频率附近的频段. 其参数计算公式如下: 手按计算器算无论是直接计算还是利用标准单元 ...

  5. 计算机推演未来发展动象,大学生计算机基础学习心得五篇

    学习作为一种获取知识交流情感的方式,已经成为人们日常生活中不可缺少的一项重要内容,尤其是在二十一世纪这个知识经济时代,自主学习已是人们不断满足自身需要.以下是小编整理的大学生计算机基础学习心得,希望可 ...

  6. 深度长文 | 从FM推演各深度CTR预估模型(附开源代码)

    作者丨龙心尘 & 寒小阳 研究方向丨机器学习,数据挖掘 题记:多年以后,当资深算法专家们看着无缝对接用户需求的广告收入节节攀升时,他们可能会想起自己之前痛苦推导 FM 与深度学习公式的某个夜晚 ...

  7. 从FM推演各深度学习CTR预估模型

    本文的PDF版本.代码实现和数据可以在我的github取到. 1.引言 点击率(click-through rate, CTR)是互联网公司进行流量分配的核心依据之一.比如互联网广告平台,为了精细化权 ...

  8. AI实现的两种方案,暴力推演与因果率

    AI实现的两种方案,暴力推演与因果率 学习PYTHON两个月,写个小游戏练手.也为以后找工作做储备. 从最简单的九格棋入手. 九格棋玩法简单,横向,纵向,斜向三子连线则为胜. 基本设计构件有: 一.G ...

  9. Mysql——》索引存储模型推演

    推荐链接:     总结-->[Java]     总结-->[Mysql]     总结-->[Spring]     总结-->[SpringBoot] Mysql--&g ...

最新文章

  1. Oracle 分析函数--Row_Number()
  2. DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略
  3. Serializable的作用
  4. select选择框必输校验_轮子这么多,我们为什么选择自研NewSQL
  5. (android 实战总结)android第三方组件实现总结
  6. Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中
  7. PX4代码解析(5)
  8. string和StringBuilder的选择
  9. web框架--MVC、MTV
  10. 2021中国WMS市场发展趋势和特点
  11. 【计算机网络】【硬件】交换机芯片介绍
  12. 7.1 php7.0 微擎_php7.1以上微擎-人人商城小程序授权登录问题
  13. 天轰穿视频非知识点总结
  14. 项目总结Word基本格式
  15. Python实现两个有序集合的交集和并集
  16. 四足机器人|机器狗|仿生机器人|多足机器人|MATLAB动画仿真|Simulink动画仿真
  17. oracle sql 分区查询语句_Oracle SQL调优之分区表
  18. macOS排查usb接口问题
  19. c盘users在哪(c盘users在哪)
  20. Node-RED使用指南:22:定制化Node的使用方法

热门文章

  1. boost线程之类成员函数
  2. CoreLocation MKMapView
  3. define() vs const 该如何选择?
  4. 一篇文章 学会 iOS中的 代理(delegate) 设计模式
  5. 高并发架构系列:如何从0到1设计一个MQ消息队列
  6. effective c++ 学习
  7. unity2D平面摄像机滑动缩放
  8. VS2008快捷键大全
  9. 三层交换解决了VLAN之间的通信问题
  10. 双绞线,同轴电缆和光纤电缆之间的区别—Vecloud微云