074-RTKlib中ECEF坐标转换为大地坐标问题

RTKlib中ECEF坐标转换为大地坐标的方法跟平时使用的不同,特此记录。
常用的大地坐标转换为ECEF坐标的公式有:

(1){x=(Rn+h)cosLcosλy=(Rn+h)cosLsinλz=[Rn(1−e2)+h]sinL \tag{1} \begin{cases} x = (R_n+h)cosLcos\lambda \\ y = (R_n+h)cosLsin\lambda \\ z = [R_n(1-e^2)+h]sinL \end{cases} x=(Rn+h)cosLcosλy=(Rn+h)cosLsinλz=[Rn(1e2)+h]sinL(1)

各符号具体含义不再赘述。

整理(1)式中第三式可得:

(2)(Rn+h)sinL=z+Rne2sinL \tag{2} (R_n+h)sinL = z + R_n e^2 sinL (Rn+h)sinL=z+Rne2sinL(2)

为直观表现,参考下图:

为与图中字母对应,改写公式(2)为:

(3)(N+h)sinϕ=z+Ne2sinϕ \tag{3} (N+h)sin\phi = z + N e^2 sin\phi (N+h)sinϕ=z+Ne2sinϕ(3)

RTKlib程序:

extern void ecef2pos(const double *r, double *pos)
{
    double e2=FE_WGS84*(2.0-FE_WGS84),r2=dot(r,r,2),z,zk,v=RE_WGS84,sinp; 
    for (z=r[2],zk=0.0;fabs(z-zk)>=1E-4;) {
        zk=z;
        sinp = z / sqrt(r2 + z*z);
        v=RE_WGS84/sqrt(1.0-e2*sinp*sinp); 
        z=r[2]+v*e2*sinp;
    }
    pos[0]=r2>1E-12?atan(z/sqrt(r2)):(r[2]>0.0?PI/2.0:-PI/2.0);
    pos[1]=r2>1E-12?atan2(r[1],r[0]):0.0;
    pos[2]=sqrt(r2+z*z)-v;
}

由于sinϕ=AC/(N+h)sin\phi = AC/(N+h)sinϕ=AC/(N+h),所以对于sinp = z / sqrt(r2 + z*z);,得到的为小于ϕ\phiϕ的角度的正弦值,相应的,程序中的卯酉圈曲率半径v,即公式中的NNN也是小于实际值。
循环中的最后一行z=r[2]+v*e2*sinp;为z向图中ACACAC的逼近。注意:z越逼近ACACAC,得到的纬度越准确。最终逼近ACACAC,从而得到较为准确的ϕ\phiϕ,便可进行下面的解算。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值