yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
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
import math
 
import pytest
 
from hitl import geo
 
 
GGA_SAMPLE = "$GNGGA,080112.000,3949.8105069,N,11616.6876082,E,4,44,0.42,48.502,M,-6.684,M,1.0,0409*73"
 
 
def test_parse_origin_from_gga():
    origin = geo.parse_origin(GGA_SAMPLE)
    assert origin.latitude_deg == pytest.approx(39.830175115)
    assert origin.longitude_deg == pytest.approx(116.278126803)
    assert origin.altitude_m == pytest.approx(48.502)
 
 
def test_parse_origin_short_format():
    origin = geo.parse_origin("3949.8105,N,11616.6876,E,50.0")
    assert origin.latitude_deg == pytest.approx(39.830175)
    assert origin.longitude_deg == pytest.approx(116.278126)
    assert origin.altitude_m == pytest.approx(50.0)
 
 
def test_enu_roundtrip_accuracy():
    origin = geo.parse_origin(GGA_SAMPLE)
    east, north, up = 5.0, -3.0, 1.2
    lat, lon, alt = geo.enu_to_lla(east, north, up, origin)
    x, y, z = geo.geo_to_ecef(lat, lon, alt)
    dx = x - origin.ecef[0]
    dy = y - origin.ecef[1]
    dz = z - origin.ecef[2]
    east_rt, north_rt, up_rt = geo.ecef_to_enu(dx, dy, dz, origin.latitude_rad, origin.longitude_rad)
 
    assert east_rt == pytest.approx(east, abs=0.01)
    assert north_rt == pytest.approx(north, abs=0.01)
    assert up_rt == pytest.approx(up, abs=0.01)
 
 
def test_heading_math_to_nav():
    assert geo.heading_math_to_nav(math.radians(0.0)) == pytest.approx(90.0)
    assert geo.heading_math_to_nav(math.radians(90.0)) == pytest.approx(0.0)
    assert geo.heading_math_to_nav(math.radians(-90.0)) == pytest.approx(180.0)