0.经纬度坐标系
经纬度坐标系(LLA - Latitude/Longitude/Altitude)是最常用的地球表面位置表示方法,使用角度值描述位置。
CGCS2000 与WGS84
CGCS2000 (China Geodetic Coordinate System 2000) 是一种地心坐标系,与 WGS84 在数学模型上基本一致,都基于 GRS80 椭球体。
- GeographicLib 的 Geodesic 类直接支持基于椭球体的距离计算
-
-
- 对于坐标转换,可以使用 PROJ 库(GeographicLib 可以与 PROJ 配合使用)
-
// 使用 GeographicLib 计算 CGCS2000 坐标间的距离
#include <GeographicLib/Geodesic.hpp>
double lat1 = 39.9042; // 北京(CGCS2000)
double lon1 = 116.4074;
double lat2 = 31.2304; // 上海(CGCS2000)
double lon2 = 121.4737;
GeographicLib::Geodesic geod(6378137.0, 1/298.257223563); // GRS80 椭球参数(CGCS2000使用)
double s12;
geod.Inverse(lat1, lon1, lat2, lon2, s12);
1. ECEF 坐标系(地心地固坐标)
- X, Y, Z :以地心为原点的三维直角坐标
- 单位:米
- 用于:卫星定位、空间计算
#include <GeographicLib/Geocentric.hpp>
GeographicLib::Geocentric earth(GeographicLib::Constants::WGS84_a(),
GeographicLib::Constants::WGS84_f());
double lat = 39.9042, lon = 116.4074, h = 50; // 经纬度 + 高度
double X, Y, Z;
earth.Forward(lat, lon, h, X, Y, Z); // 转换为 ECEF
// 反向转换
earth.Reverse(X, Y, Z, lat, lon, h);
2. UTM 投影坐标(平面坐标 + 高度)
- X (Easting) :东向坐标
- Y (Northing) :北向坐标
- Z :高度
- 单位:米
#include <GeographicLib/UTMUPS.hpp>
int zone;
bool northp;
double x, y;
GeographicLib::UTMUPS::Forward(lat, lon, zone, northp, x, y); // 经纬度 -> UTM
// 反向转换
GeographicLib::UTMUPS::Reverse(zone, northp, x, y, lat, lon);
3. MGRS 坐标
- 军事网格参考系统,基于 UTM
#include <GeographicLib/MGRS.hpp>
std::string mgrs;
GeographicLib::MGRS::Forward(zone, northp, x, y, lat, 5, mgrs);
4. 局部切平面坐标(ENU)
- E (East) :东向
- N (North) :北向
- U (Up) :天向(高度)
#include <GeographicLib/LocalCartesian.hpp>
GeographicLib::LocalCartesian proj(lat0, lon0, h0); // 定义原点
double e, n, u;
proj.Forward(lat, lon, h, e, n, u); // 转换为局部坐标
// 反向转换
proj.Reverse(e, n, u, lat, lon, h);
5. 北-东-地 坐标系(NED)
NED(North-East-Down)是 北-东-地 坐标系,一种 本地切平面坐标系。
N(北/North)
↑
│
│
│
└──────→ E(东/East)
╱
╱
D(地/Down)↓
特点:
- 原点:参考点(载机/载舰/仿真中心)
- N轴:指向正北(真北)
- E轴:指向正东
- D轴:指向地心(垂直向下)
- 单位:米
- 正交坐标系:N ⊥ E ⊥ D
与 ENU 的区别
| 特性 | NED | ENU |
|---|---|---|
| 垂直轴 | D(向下) | U(向上) |
| 轴顺序 | N-E-D | E-N-U |
| 应用 | 飞行器 | 地面/传感器 |
| 高度 | -D | U |
// 经纬度 → NED
void llaToNED(double lat, double lon, double alt,
double refLat, double refLon, double refAlt,
double& n, double& e, double& d) {
// 1. LLA → ECEF
double x, y, z;
GeographicLib::Geocentric earth(GeographicLib::Constants::WGS84_a(),
GeographicLib::Constants::WGS84_f());
earth.Forward(lat, lon, alt, x, y, z);
// 2. ECEF → NED
GeographicLib::LocalCartesian local(refLat, refLon, refAlt);
local.Reverse(x, y, z, e, n, u); // 注意:LocalCartesian 输出是 ENU
// 3. ENU → NED
n = n; // 北向不变
e = e; // 东向不变
d = -u; // 天向取反为地向
}
// NED → 经纬度
void nedToLLA(double n, double e, double d,
double refLat, double refLon, double refAlt,
double& lat, double& lon, double& alt) {
// 1. NED → ENU
double u = -d; // 地向取反为天向
// 2. ENU → ECEF
GeographicLib::LocalCartesian local(refLat, refLon, refAlt);
double x, y, z;
local.Forward(e, n, u, x, y, z);
// 3. ECEF → LLA
GeographicLib::Geocentric earth(GeographicLib::Constants::WGS84_a(),
GeographicLib::Constants::WGS84_f());
earth.Reverse(x, y, z, lat, lon, alt);
}
6.坐标系对比
| 坐标系 | X/Y 含义 | Z 含义 | 适用场景 |
|---|---|---|---|
| ECEF | 地心三维坐标 | 地心三维坐标 | 卫星定位、空间计算 |
| UTM | 东向/北向 | 高度 | 地图投影、区域测量 |
| ENU | 东向/北向 | 天向 | 局部区域、相对位置 |
| 经纬度 | 经度/纬度 | 高度 | 全球定位、导航 |
7.典型仿真系统选择
典型仿真流程:
经纬度(LLA) ──→ ECEF ──→ ENU/NED
│ │ │
│ │ └── 动力学计算
│ └── 实体间相对位置
└── 数据输入/显示
转换公式:
LLA → ECEF:GeographicLib::Geocentric::Forward()
ECEF → ENU:GeographicLib::LocalCartesian::Forward()
ECEF → NED:旋转矩阵转换
8.军事仿真系统主流选择 :
| 场景 | 主坐标 | 原因 |
|---|---|---|
| 飞行器仿真 | NED | 符合飞行力学,高度直观 |
| 导弹仿真 | ECEF + NED | 全球定位 + 本地制导 |
| 地面仿真 | ENU/UTM | 地面作战直观 |
| 分布式仿真 | ECEF | 全球统一,互操作性强 |
9. AFSim 坐标系
AFSim(Advanced Framework for Simulation)是美国空军开发的作战仿真框架,其坐标系设计如下:
9.1. 主要坐标系
坐标系 用途 说明 ECEF 内部计算、实体定位 地心地固坐标系,主要工作坐标系 NED 飞行器动力学 北-东-地坐标系,本地参考系 LLA 输入输出 经度-纬度-高度,用户接口 ECI 轨道计算 地心惯性坐标系,卫星/弹道
9.2. 坐标系层次结构
用户层 LLA(经纬度高度)
│
↓ 转换
────────────────────────────────────
核心层 ECEF(地心地固)
│
↓ 转换
────────────────────────────────────
平台层 NED(北东地)
│
↓ 动力学计算
────────────────────────────────────
9.3. 各平台坐标系
| 平台类型 | 本地坐标系 | 说明 |
|---|---|---|
| 飞机 | NED | 机体系 → NED → ECEF |
| 导弹 | NED | 制导计算在 NED |
| 卫星 | ECI | 轨道动力学 |
| 地面车辆 | ENU/UTM | 地面作战 |
| 舰船 | NED | 海面作战 |
9.4. AFSim 坐标转换
// AFSim 典型坐标转换流程
// 输入:经纬度
LLA position = {39.9042, 116.4074, 10000}; // 高度10km
// 转换为 ECEF(内部存储)
ECEF ecefPos;
WCS_Convert::LLA_To_ECEF(position, ecefPos);
// 转换为 NED(飞行器本地)
NED nedPos;
WCS_Convert::ECEF_To_NED(ecefPos, nedPos, refPoint);
// 动力学计算在 NED 中进行
// ...
9.5. AFSim 坐标约定
| 参数 | 约定 |
|---|---|
| 角度单位 | 度(输入)、弧度(内部计算) |
| 距离单位 | 米 |
| 高度参考 | WGS84 椭球或 MSL(平均海平面) |
| 经度范围 | -180° ~ +180° |
| 纬度范围 | -90° ~ +90° |
9.6. 平台姿态表示
AFSim 姿态定义:
- Roll(滚转):绕纵轴旋转
- Pitch(俯仰):绕横轴旋转
- Yaw(偏航):绕垂直轴旋转
参考系:
- 机体系:相对于飞机本体
- NED:相对于本地北东地
9.7. 与 DIS/HLA 的关系
标准 坐标系 说明 DIS ECEF IEEE 1278 标准 HLA ECEF IEEE 1516 标准 AFSim ECEF 兼容 DIS/HLA
9.8. 典型应用场景
场景1:空战仿真
LLA(输入)→ ECEF(全局)→ NED(本地动力学)→ ECEF → LLA(输出)
场景2:导弹制导
ECEF(发射点)→ NED(制导计算)→ ECEF(目标拦截)
场景3:卫星轨道
ECI(轨道计算)→ ECEF(地面相对位置)→ LLA(显示)
9.9. AFSim 配置示例
<!-- AFSim 场景配置 -->
<scenario>
<platform name="Fighter">
<position>
<latitude>39.9042</latitude>
<longitude>116.4074</longitude>
<altitude>10000</altitude> <!-- 米 -->
</position>
<orientation>
<heading>90</heading> <!-- 度 -->
<pitch>0</pitch>
<roll>0</roll>
</orientation>
</platform>
</scenario>
9.10. 总结
层次 坐标系 用途 用户接口 LLA 输入输出、显示 核心计算 ECEF 全局定位、实体间关系 平台动力学 NED 飞行器运动方程 轨道计算 ECI 卫星/弹道导弹
一句话总结 :AFSim 以 ECEF 为核心坐标系 , LLA 为用户接口 , NED 为飞行器本地坐标系 ,符合军事仿真标准(DIS/HLA)规范。
10.投影、经纬度、坐标之间
graph TD
A["地球(真实物理位置)"] --> B["地心坐标系(现代)<br/>原点:地球质心"]
A --> C["参心坐标系(传统)<br/>原点:参考椭球中心"]
B --> D["WGS84<br/>(GPS)"]
B --> E["CGCS2000<br/>(中国)"]
B --> F["ITRF<br/>(国际)"]
C --> G["北京54<br/>(中国老)"]
C --> H["西安80<br/>(中国老)"]
C --> I["NAD27<br/>(美国老)"]
D & E & F & G & H & I --> J["坐标转换<br/>(七参数/四参数)"]
J --> K["经纬度坐标(LLA)<br/>Longitude, Latitude, Altitude<br/>例:116.4074°E, 39.9042°N, 50m"]
K --> L["不投影<br/>(三维坐标)"]
K --> M["投影变换<br/>(曲面→平面)"]
L --> N["ECEF<br/>地心地固坐标<br/>X, Y, Z(米)<br/>用于:卫星轨道/导弹制导"]
M --> O["平面投影坐标<br/>(米为单位)"]
M --> P["加密坐标<br/>(中国特有)"]
N --> Q["ENU/NED<br/>局部切平面<br/>ENU: 东-北-天<br/>用于:传感器/地面仿真<br/>NED: 北-东-地<br/>用于:飞行器/导弹制导"]
O --> R["墨卡托投影<br/>Web地图/航海"]
O --> S["UTM投影<br/>60分带/军事仿真"]
O --> T["高斯-克吕格<br/>3°/6°分带/中国测绘"]
O --> U["兰伯特投影<br/>圆锥投影/航空/气象"]
P --> V["GCJ-02<br/>(火星坐标)"]
P --> W["BD-09<br/>(百度坐标)<br/>用于:高德/百度地图/腾讯地图"]