# distutils: language = c++ 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# cython: language_level = 3 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  Matrix3 ,  Vector3 ,  Quaternion 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  ECEF ,  NED ,  Geodetic 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  euler2quat  as  euler2quat_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  quat2euler  as  quat2euler_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  quat2rot  as  quat2rot_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  rot2quat  as  rot2quat_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  euler2rot  as  euler2rot_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  rot2euler  as  rot2euler_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  rot_matrix  as  rot_matrix_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  ecef_euler_from_ned  as  ecef_euler_from_ned_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  ned_euler_from_ecef  as  ned_euler_from_ecef_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  geodetic2ecef  as  geodetic2ecef_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  ecef2geodetic  as  ecef2geodetic_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common.transformations.transformations  cimport  LocalCoord_c 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  cython 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cimport  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cdef  np .ndarray [double ,  ndim = 2 ]  matrix2numpy ( Matrix3  m ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  np . array ( [ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        [ m ( 0 ,  0 ) ,  m ( 0 ,  1 ) ,  m ( 0 ,  2 ) ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        [ m ( 1 ,  0 ) ,  m ( 1 ,  1 ) ,  m ( 1 ,  2 ) ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        [ m ( 2 ,  0 ) ,  m ( 2 ,  1 ) ,  m ( 2 ,  2 ) ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								cdef  Matrix3  numpy2matrix ( np . ndarray [ double ,  ndim = 2 ,  mode = " fortran " ]  m ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . shape [ 0 ]  ==  3 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert  m . shape [ 1 ]  ==  3 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  Matrix3 ( < double * > m . data ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cdef  ECEF  list2ecef ( ecef ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  ECEF  e ;
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    e . x  =  ecef [ 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    e . y  =  ecef [ 1 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    e . z  =  ecef [ 2 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  e 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cdef  NED  list2ned ( ned ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  NED  n ;
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n . n  =  ned [ 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n . e  =  ned [ 1 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    n . d  =  ned [ 2 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  n 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cdef  Geodetic  list2geodetic ( geodetic ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Geodetic  g 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    g . lat  =  geodetic [ 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    g . lon  =  geodetic [ 1 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    g . alt  =  geodetic [ 2 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  g 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  euler2quat_single ( euler ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  Vector3 ( euler [ 0 ] ,  euler [ 1 ] ,  euler [ 2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Quaternion  q  =  euler2quat_c ( e ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ q . w ( ) ,  q . x ( ) ,  q . y ( ) ,  q . z ( ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  quat2euler_single ( quat ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Quaternion  q  =  Quaternion ( quat [ 0 ] ,  quat [ 1 ] ,  quat [ 2 ] ,  quat [ 3 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  quat2euler_c ( q ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ e ( 0 ) ,  e ( 1 ) ,  e ( 2 ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  quat2rot_single ( quat ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Quaternion  q  =  Quaternion ( quat [ 0 ] ,  quat [ 1 ] ,  quat [ 2 ] ,  quat [ 3 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Matrix3  r  =  quat2rot_c ( q ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  matrix2numpy ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  rot2quat_single ( rot ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Matrix3  r  =  numpy2matrix ( np . asfortranarray ( rot ,  dtype = np . double ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Quaternion  q  =  rot2quat_c ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ q . w ( ) ,  q . x ( ) ,  q . y ( ) ,  q . z ( ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  euler2rot_single ( euler ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  Vector3 ( euler [ 0 ] ,  euler [ 1 ] ,  euler [ 2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Matrix3  r  =  euler2rot_c ( e ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  matrix2numpy ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  rot2euler_single ( rot ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Matrix3  r  =  numpy2matrix ( np . asfortranarray ( rot ,  dtype = np . double ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  rot2euler_c ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ e ( 0 ) ,  e ( 1 ) ,  e ( 2 ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  rot_matrix ( roll ,  pitch ,  yaw ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  matrix2numpy ( rot_matrix_c ( roll ,  pitch ,  yaw ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  ecef_euler_from_ned_single ( ecef_init ,  ned_pose ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  ECEF  init  =  list2ecef ( ecef_init ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  pose  =  Vector3 ( ned_pose [ 0 ] ,  ned_pose [ 1 ] ,  ned_pose [ 2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  ecef_euler_from_ned_c ( init ,  pose ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ e ( 0 ) ,  e ( 1 ) ,  e ( 2 ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  ned_euler_from_ecef_single ( ecef_init ,  ecef_pose ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  ECEF  init  =  list2ecef ( ecef_init ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  pose  =  Vector3 ( ecef_pose [ 0 ] ,  ecef_pose [ 1 ] ,  ecef_pose [ 2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Vector3  e  =  ned_euler_from_ecef_c ( init ,  pose ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ e ( 0 ) ,  e ( 1 ) ,  e ( 2 ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  geodetic2ecef_single ( geodetic ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Geodetic  g  =  list2geodetic ( geodetic ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  ECEF  e  =  geodetic2ecef_c ( g ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ e . x ,  e . y ,  e . z ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  ecef2geodetic_single ( ecef ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  ECEF  e  =  list2ecef ( ecef ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  Geodetic  g  =  ecef2geodetic_c ( e ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ g . lat ,  g . lon ,  g . alt ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								cdef  class  LocalCoord : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cdef  LocalCoord_c  * lc 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  __init__ ( self ,  geodetic = None ,  ecef = None ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  ( geodetic  is  not  None )  or  ( ecef  is  not  None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  geodetic  is  not  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . lc  =  new  LocalCoord_c ( list2geodetic ( geodetic ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  ecef  is  not  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . lc  =  new  LocalCoord_c ( list2ecef ( ecef ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    @property 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ned2ecef_matrix ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  matrix2numpy ( self . lc . ned2ecef_matrix ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @property 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ecef2ned_matrix ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  matrix2numpy ( self . lc . ecef2ned_matrix ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @property 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ned_from_ecef_matrix ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . ecef2ned_matrix 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @property 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ecef_from_ned_matrix ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  self . ned2ecef_matrix 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @classmethod 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  from_geodetic ( cls ,  geodetic ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  cls ( geodetic = geodetic ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    @classmethod 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  from_ecef ( cls ,  ecef ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  cls ( ecef = ecef ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ecef2ned_single ( self ,  ecef ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  self . lc 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  ECEF  e  =  list2ecef ( ecef ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  NED  n  =  self . lc . ecef2ned ( e ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ n . n ,  n . e ,  n . d ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ned2ecef_single ( self ,  ned ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  self . lc 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  NED  n  =  list2ned ( ned ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  ECEF  e  =  self . lc . ned2ecef ( n ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ e . x ,  e . y ,  e . z ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  geodetic2ned_single ( self ,  geodetic ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  self . lc 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  Geodetic  g  =  list2geodetic ( geodetic ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  NED  n  =  self . lc . geodetic2ned ( g ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ n . n ,  n . e ,  n . d ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  ned2geodetic_single ( self ,  ned ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert  self . lc 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  NED  n  =  list2ned ( ned ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cdef  Geodetic  g  =  self . lc . ned2geodetic ( n ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ g . lat ,  g . lon ,  g . alt ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  __dealloc__ ( self ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  self . lc