zoukankan      html  css  js  c++  java
  • GNSS学习笔记-坐标转换

    GNSS 坐标转换

    GNSS计算主要涉及三个坐标系,地心地固坐标系地理坐标系站心坐标系。这里主要介绍一下三个坐标的含义和转换公式。

    • 地心地固坐标系如图X,Y,Z表示 (ECEF坐标系),以地心O为坐标原点,Z轴指向协议地球北极,X轴指向参考子午面与地球赤道的交点,也叫地球坐标系。一般GNSS坐标计算都在地心地固坐标系下进行的。由于地球是椭圆形,有WGS-84和CGC2000等多种标准

    • 地理坐标系则通过经度(longitude),纬度(latitude)和高度(altitude)来表示地球的位置,也叫经纬高坐标系(LLA坐标系)。

    • 站心坐标系以用户所在位置P为坐标原点,三个轴分别指向东向,北向和天向,也叫东北天坐标系(enu坐标系)。站心坐标系的天向方向和地理坐标系的高度方向是一致的。站心坐标系用在惯性导航和卫星俯仰角计算中较多。

    参数 WGS-84 CGC200
    基准椭球体的长半径a 6378137.0 m 6378137.0 m
    基准椭球体的极扁率f 1/298.257223565 1/298.257223563
    地球自转角速度We 7.2921151467*1e-5 7.2921151467*1e-5
    地球引力和地球质量的乘积GM 3986004.418*1e8 3986004.418*1e8
    光速 2.99792458*1e8 m/s 2.99792458*1e8 m/s


    LLA坐标系转ECEF坐标系

    LLA坐标系下的(lon,lat,alt)转换为ECEF坐标系下点(X,Y,Z)

    [egin{cases} X=(N+alt)cos(lat)cos(lon)\ Y=(N+alt)cos(lat)sin(lon)\ Z=(N(1-e^2)+alt)sin(lat) end{cases}]

    其中e为椭球偏心率,N为基准椭球体的曲率半径

    [egin{cases} e^2=frac{a^2-b^2}{a^2}\ N=frac{a}{sqrt{1-e^2sin^2lat}} end{cases}]

    由于WGS-84下极扁率(f=frac{a-b}{a}),偏心率e和极扁率f之间的关系:

    [e^2=f(2-f) ]

    坐标转换公式也可以为

    [egin{cases} X=(N+alt)cos(lat)cos(lon)\ Y=(N+alt)cos(lat)sin(lon)\ Z=(N(1-f)^2+alt)sin(lat) end{cases}]

    [N=frac{a}{sqrt{1-f(2-f)sin^2lat}} ]

    python实现

    def lla2ecef(lat,lon,alt):
        WGS84_A = 6378137.0
        WGS84_f = 1/298.257223565
        WGS84_E2 = WGS84_f*(2-WGS84_f)
        deg2rad = math.pi/180.0
        rad2deg = 180.0/math.pi
        lat *= deg2rad
        lon *= deg2rad
        N = WGS84_A/(math.sqrt(1-WGS84_E2*math.sin(lat)*math.sin(lat)))
        x = (N+alt)*math.cos(lat)*math.cos(lon)
        y = (N+alt)*math.cos(lat)*math.sin(lon)
        z = (N*(1-WGS84_f)*(1-WGS84_f)+alt)*math.sin(lat)
        return [x,y,z]
    

    ECEF坐标系转LLA坐标系

    ECEF坐标系下点(X,Y,Z)转换为LLA坐标系下的(lon,lat,alt)

    [lon=arctan(frac{y}{x}) ]

    [alt=frac{p}{cos(lat)-N} ]

    [lat=arctanigg[frac{z}{p}igg(1-e^2frac{N}{N+alt}igg)^{-1}igg] ]

    [p=sqrt{x^2+y^2} ]

    一开始lon是未知的,可以假设为0,经过几次迭代之后就能收敛

    ECEF坐标系转enu坐标系

    用户所在坐标点(P_0=(x_0,y_0,z_0)),,计算点(P=(x,y,z))在以点(P_{0})为坐标原点的enu坐标系位置((e,n,u))这里需要用到LLA坐标系的数据,(P_0)的LLA坐标点为(LLA_0=(lon_0,lat_0,alt_0))

    [egin{gathered} left[ egin{array}{ccc} Delta{x}\Delta{y}\Delta{z} end{array} ight]= left[ egin{array}{ccc} x\y\zend{array} ight]- left[ egin{array}{ccc} x_0\y_0\z_0end{array} ight] end{gathered} ]

    [egin{gathered} left[ egin{array}{ccc} e\n\u end{array} ight]=Scdot left[ egin{array}{ccc} Delta{x}\Delta{y}\Delta{z} end{array} ight] end{gathered}= left[ egin{array}{ccc} -sin(lon_0) & cos(lon_0) & 0 \ -sin(lat_0)cos(lon_0) & -sin(lat_0)sin(lon_0) & cos(lat_0) \ cos(lat_0)cos(lon_0) & cos(lat_0)sin(lon_0) & sin(lat_0) end{array} ight]cdot left[ egin{array}{ccc} Delta{x}\Delta{y}\Delta{z} end{array} ight] ]

    即坐标变换矩阵(S=left[ egin{array}{ccc} -sin(lon_0) & cos(lon_0) & 0 \ -sin(lat_0)cos(lon_0) & -sin(lat_0)sin(lon_0) & cos(lat_0) \ cos(lat_0)cos(lon_0) & cos(lat_0)sin(lon_0) & sin(lat_0) end{array} ight])

    enu坐标系转ECEF坐标系

    (S)为单位正交矩阵

    [mathbf{S}^{-1}=mathbf{S}^mathrm{T} ]

    反之

    [egin{gathered} left[ egin{array}{ccc} Delta{x}\Delta{y}\Delta{z}end{array} ight]=S^{-1}cdotleft[ egin{array}{ccc} e\n\uend{array} ight]= mathbf{S}^mathrm{T}cdotleft[ egin{array}{ccc} e\n\uend{array} ight] end{gathered} ]

    LLA坐标系转enu坐标系

    上述可以看到,从LLA坐标系转换到enu坐标系有较多计算量,在考虑地球偏心率(e)很小的前提下,可以做一定的近似公式计算

    [left[ egin{array}{ccc} Delta e\ Delta n \ Delta u end{array} ight]= left[egin{array}{ccc} acdot cos(lat)cdot Delta lon & 0 & 0 \ 0 & a cdot Delta lat & 0 \ 0 & 0 & Delta alt end{array} ight] ]

  • 相关阅读:
    exec系列函数和system函数
    fork函数相关总结
    文件的内核结构file和dup实现重定向
    进程基本概述
    fcntl 函数与文件锁
    文件的属性
    目录的操作
    文件的读取写入
    文件的打开关闭
    浅谈原始套接字 SOCK_RAW 的内幕及其应用(port scan, packet sniffer, syn flood, icmp flood)
  • 原文地址:https://www.cnblogs.com/langzou/p/11388520.html
Copyright © 2011-2022 走看看