Skip to content

Commit db1a51c

Browse files
committed
added "ecef2ned" function and tests
1 parent 71501da commit db1a51c

2 files changed

Lines changed: 109 additions & 0 deletions

File tree

skaero/geometry/coordinates.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,44 @@ def ned2ecef(v_ned, lat, lng):
9393
return v_ecef
9494

9595

96+
def ecef2ned(v_ecef, lat, lng):
97+
"""
98+
Converts vector from geocentric coordinates (ECEF - Earth Centered,
99+
Earth Fixed) at a given latitude and longitude to local geodetic horizon
100+
reference frame (NED - North, East, Down).
101+
102+
Parameters
103+
----------
104+
v_ecef: array-like
105+
vector expressed in ECEF coordinates
106+
lat : float
107+
latitude in degrees
108+
lng : float
109+
longitude in degrees
110+
111+
Returns
112+
-------
113+
v_ned : array-like
114+
vector expressed in NED coordinates
115+
"""
116+
if abs(lat) > 90:
117+
raise ValueError('latitude should be -90º <= latitude <= 90º')
118+
119+
if abs(lng) > 180:
120+
raise ValueError('longitude should be -180º <= longitude <= 180º')
121+
122+
lat = deg2rad(lat)
123+
lng = deg2rad(lng)
124+
125+
Lne = array([[-sin(lat) * cos(lng), -sin(lat) * sin(lng), cos(lat)],
126+
[-sin(lng), cos(lng), 0],
127+
[-cos(lat) * cos(lng), -cos(lat) * sin(lng), -sin(lat)]])
128+
129+
v_ned = Lne.dot(v_ecef)
130+
131+
return v_ned
132+
133+
96134
def body2ned(v_body, theta, phi, psi):
97135
"""
98136
Converts vector from body reference frame to local geodetic horizon

tests/test_coordinates.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,77 @@ def test_3(self):
162162
expected_value))
163163

164164

165+
class Test_ecef2ned(ut.TestCase):
166+
"""
167+
Test function that transforms ecef-basis vectors to ned-basis
168+
"""
169+
def test_latitude_wrong_input(self):
170+
v_aux = array([1, 0, 0])
171+
self.assertRaises(ValueError, ecef2ned, v_aux, 91.0, 0)
172+
self.assertRaises(ValueError, ecef2ned, v_aux, -90.001, 0)
173+
self.assertRaises(TypeError, ecef2ned, v_aux, 't', 0)
174+
175+
def test_longitude_wrong_input(self):
176+
v_aux = array([1, 0, 0])
177+
self.assertRaises(ValueError, ecef2ned, v_aux, 0, -190.1)
178+
self.assertRaises(ValueError, ecef2ned, v_aux, 0, 180.1)
179+
self.assertRaises(TypeError, ecef2ned, v_aux, 0, '0')
180+
181+
def test_1(self):
182+
lat, lng = 0, 0
183+
184+
v_ecef = array([1, 0, 0])
185+
expected_value = array([0, 0, -1])
186+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
187+
expected_value))
188+
189+
v_ecef = array([0, 1, 0])
190+
expected_value = array([0, 1, 0])
191+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
192+
expected_value))
193+
194+
v_ecef = array([0, 0, 1])
195+
expected_value = array([1, 0, 0])
196+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
197+
expected_value))
198+
199+
def test_2(self):
200+
lat, lng = 0, 90
201+
202+
v_ecef = array([1, 0, 0])
203+
expected_value = array([0, -1, 0])
204+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
205+
expected_value))
206+
207+
v_ecef = array([0, 1, 0])
208+
expected_value = array([0, 0, -1])
209+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
210+
expected_value))
211+
212+
v_ecef = array([0, 0, 1])
213+
expected_value = array([1, 0, 0])
214+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
215+
expected_value))
216+
217+
def test_3(self):
218+
lat, lng = 90, 0
219+
220+
v_ecef = array([1, 0, 0])
221+
expected_value = array([-1, 0, 0])
222+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
223+
expected_value))
224+
225+
v_ecef = array([0, 1, 0])
226+
expected_value = array([0, 1, 0])
227+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
228+
expected_value))
229+
230+
v_ecef = array([0, 0, 1])
231+
expected_value = array([0, 0, -1])
232+
self.assertTrue(np.allclose(ecef2ned(v_ecef, lat, lng),
233+
expected_value))
234+
235+
165236
class Test_body2ned(ut.TestCase):
166237
"""
167238
Test function that transforms body-basis vectors to ned-basis

0 commit comments

Comments
 (0)