经纬高(LLA)坐标系地心地固(ECEF)坐标系与东北天(ENU)坐标系转换

文章介绍了在水下机器人项目中,如何处理RTK获取的经纬度信息,通过坐标系转换,从LLA(纬度、经度、高度)到ECEF(地球中心坐标系)以及进一步到ENU(东、北、天)坐标系的过程。文章详细阐述了转换公式和Cartographer库中的实现方法,包括计算旋转矩阵和平移量的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        前段时间在做水下机器人项目,添加了RTK,读取到的数据为经纬高坐标系中度分形式的经纬度信息,无法直接用于定位,还需要进行坐标系的转换。后来在学习Cartographer时处理GPS数据也有提到这方面的知识,于是决定汇总到一起进行学习,下文将对相关内容进行介绍。

一.LLA坐标系与ECEF坐标系之间的转换

        其中lon为经度信息,lat为纬度信息,alt为高度信息,f为极扁率,N为基准椭球体的曲率半径,将传入的信息先转换为ECEF坐标系下的X Y Z

        当已知ECEF坐标系下点为(x,y,z)时,需转换为LLA坐标系下的(lon,lat,alt):

       最初lon是未知的,可以假设为0,经过计策迭代之后就能收敛。

二.ECEF坐标系转ENU坐标系

        ECEF坐标系原点为地球的质心,x轴延伸通过本初子午线和赤道的交点。 z轴延伸通过的北极(即与地球旋转轴重合)。 y轴完成右手坐标系,穿过赤道和90度经度。

         坐标原点P_{0}(x_{0},y_{0},z_{0}),目标点P(x,y,z),以P_{0}为坐标原点的东北天坐标系坐标(e,n,u),LLA坐标系下的坐标LLA_{0} (lon_{0},lat_{0},alt_{0}),其中S为正交矩阵:

        而从ENU坐标系转换到ECEF坐标系为:

       以下Cartographer代码中,为计算第一帧GPS数据指向ECEF坐标系下原点的坐标变换:

cartographer::transform::Rigid3d ComputeLocalFrameFromLatLong(
    const double latitude, const double longitude) {
  const Eigen::Vector3d translation = LatLongAltToEcef(latitude, longitude, 0.);
  const Eigen::Quaterniond rotation =
      Eigen::AngleAxisd(cartographer::common::DegToRad(latitude - 90.),
                        Eigen::Vector3d::UnitY()) *
      Eigen::AngleAxisd(cartographer::common::DegToRad(-longitude),
                        Eigen::Vector3d::UnitZ());
  return cartographer::transform::Rigid3d(rotation * -translation, rotation);
}

        首先调用的是LatLongAltToEcef函数,从名字不难猜到这个函数是用来将得到的经纬高坐标系下的经纬度坐标转换成ECEF坐标系下的坐标:

Eigen::Vector3d LatLongAltToEcef(const double latitude, const double longitude,
                                 const double altitude) {
  // note: 地固坐标系(Earth-Fixed Coordinate System)也称地球坐标系, 
  // 是固定在地球上与地球一起旋转的坐标系.
  // 如果忽略地球潮汐和板块运动, 地面上点的坐标值在地固坐标系中是固定不变的.

  // https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates
  
  constexpr double a = 6378137.;  // semi-major axis, equator to center.
  constexpr double f = 1. / 298.257223563;
  constexpr double b = a * (1. - f);  // semi-minor axis, pole to center.
  constexpr double a_squared = a * a;
  constexpr double b_squared = b * b;
  constexpr double e_squared = (a_squared - b_squared) / a_squared;
  const double sin_phi = std::sin(cartographer::common::DegToRad(latitude));
  const double cos_phi = std::cos(cartographer::common::DegToRad(latitude));
  const double sin_lambda = std::sin(cartographer::common::DegToRad(longitude));
  const double cos_lambda = std::cos(cartographer::common::DegToRad(longitude));
  const double N = a / std::sqrt(1 - e_squared * sin_phi * sin_phi);
  const double x = (N + altitude) * cos_phi * cos_lambda;
  const double y = (N + altitude) * cos_phi * sin_lambda;
  const double z = (b_squared / a_squared * N + altitude) * sin_phi;

  return Eigen::Vector3d(x, y, z);
}

        回到ComputeLocalFrameFromLatLong函数,rotation为ECEF坐标系下的坐标到 local 坐标系的旋转矩阵,translation 表示ECEF坐标系原到 (latitude, longitude) 位置的平移,该旋转矩阵表示先绕Y轴调整经度,然后再绕Z轴调整纬度。

根据引用和引用的内容,可以得出ENU坐标系LLA坐标系的算法如下: 1. 将ENU坐标系转换为地心地坐标系ECEF)。 2. 根据ECEF坐标系计算经纬度和度。 3. 将经纬转换LLA坐标系。 具体的转换公式如下: 1. ENU坐标系ECEF坐标系: $$ \begin{bmatrix} x\\ y\\ z \end{bmatrix}_{ECEF}= \begin{bmatrix} -\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{bmatrix} \begin{bmatrix} e\\ n\\ u \end{bmatrix} + \begin{bmatrix} x_0\\ y_0\\ z_0 \end{bmatrix}_{ECEF} $$ 其中,$lon_0$和$lat_0$分别为$P_0$的经度和纬度,$x_0$、$y_0$、$z_0$分别为$P_0$的ECEF坐标。 2. ECEF坐标系经纬度和度: $$ \begin{aligned} &\text{计算参数:}\\ &a&\text{——}&\text{地球长半轴(单位:m)}\\ &b&\text{——}&\text{地球短半轴(单位:m)}\\ &e&\text{——}&\text{第一偏心率}\\ &e'&\text{——}&\text{第二偏心率}\\ &\rho&\text{——}&\text{子午圈半径}\\ &N&\text{——}&\text{卯酉圈半径}\\ &h&\text{——}&\text{度(单位:m)}\\ &\phi&\text{——}&\text{纬度(单位:弧度)}\\ &\lambda&\text{——}&\text{经度(单位:弧度)}\\ &\text{计算公式:}\\ &e^2&=&1-\frac{b^2}{a^2}\\ &e'^2&=&\frac{a^2}{b^2}-1\\ \rho&=&\sqrt{x^2+y^2}\\ \phi&=&\arctan\frac{z}{\rho\cdot(1-e^2)}\\ N&=&\frac{a}{\sqrt{1-e^2\cdot\sin^2\phi}}\\ h&=&\rho\cdot\cos\phi+N\cdot(1-e^2)\\ \lambda&=&\arctan\frac{y}{x} \end{aligned} $$ 其中,$x$、$y$、$z$分别为ECEF坐标系下的坐标。 3. 经纬度转LLA坐标系: $$ \begin{bmatrix} lat\\ lon\\ alt \end{bmatrix}_{LLA}= \begin{bmatrix} \phi\\ \lambda\\ h \end{bmatrix} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值