transformations.pyx 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. # distutils: language = c++
  2. # cython: language_level = 3
  3. from openpilot.common.transformations.transformations cimport Matrix3, Vector3, Quaternion
  4. from openpilot.common.transformations.transformations cimport ECEF, NED, Geodetic
  5. from openpilot.common.transformations.transformations cimport euler2quat as euler2quat_c
  6. from openpilot.common.transformations.transformations cimport quat2euler as quat2euler_c
  7. from openpilot.common.transformations.transformations cimport quat2rot as quat2rot_c
  8. from openpilot.common.transformations.transformations cimport rot2quat as rot2quat_c
  9. from openpilot.common.transformations.transformations cimport euler2rot as euler2rot_c
  10. from openpilot.common.transformations.transformations cimport rot2euler as rot2euler_c
  11. from openpilot.common.transformations.transformations cimport rot_matrix as rot_matrix_c
  12. from openpilot.common.transformations.transformations cimport ecef_euler_from_ned as ecef_euler_from_ned_c
  13. from openpilot.common.transformations.transformations cimport ned_euler_from_ecef as ned_euler_from_ecef_c
  14. from openpilot.common.transformations.transformations cimport geodetic2ecef as geodetic2ecef_c
  15. from openpilot.common.transformations.transformations cimport ecef2geodetic as ecef2geodetic_c
  16. from openpilot.common.transformations.transformations cimport LocalCoord_c
  17. import numpy as np
  18. cimport numpy as np
  19. cdef np.ndarray[double, ndim=2] matrix2numpy(Matrix3 m):
  20. return np.array([
  21. [m(0, 0), m(0, 1), m(0, 2)],
  22. [m(1, 0), m(1, 1), m(1, 2)],
  23. [m(2, 0), m(2, 1), m(2, 2)],
  24. ])
  25. cdef Matrix3 numpy2matrix(np.ndarray[double, ndim=2, mode="fortran"] m):
  26. assert m.shape[0] == 3
  27. assert m.shape[1] == 3
  28. return Matrix3(<double*>m.data)
  29. cdef ECEF list2ecef(ecef):
  30. cdef ECEF e
  31. e.x = ecef[0]
  32. e.y = ecef[1]
  33. e.z = ecef[2]
  34. return e
  35. cdef NED list2ned(ned):
  36. cdef NED n
  37. n.n = ned[0]
  38. n.e = ned[1]
  39. n.d = ned[2]
  40. return n
  41. cdef Geodetic list2geodetic(geodetic):
  42. cdef Geodetic g
  43. g.lat = geodetic[0]
  44. g.lon = geodetic[1]
  45. g.alt = geodetic[2]
  46. return g
  47. def euler2quat_single(euler):
  48. cdef Vector3 e = Vector3(euler[0], euler[1], euler[2])
  49. cdef Quaternion q = euler2quat_c(e)
  50. return [q.w(), q.x(), q.y(), q.z()]
  51. def quat2euler_single(quat):
  52. cdef Quaternion q = Quaternion(quat[0], quat[1], quat[2], quat[3])
  53. cdef Vector3 e = quat2euler_c(q)
  54. return [e(0), e(1), e(2)]
  55. def quat2rot_single(quat):
  56. cdef Quaternion q = Quaternion(quat[0], quat[1], quat[2], quat[3])
  57. cdef Matrix3 r = quat2rot_c(q)
  58. return matrix2numpy(r)
  59. def rot2quat_single(rot):
  60. cdef Matrix3 r = numpy2matrix(np.asfortranarray(rot, dtype=np.double))
  61. cdef Quaternion q = rot2quat_c(r)
  62. return [q.w(), q.x(), q.y(), q.z()]
  63. def euler2rot_single(euler):
  64. cdef Vector3 e = Vector3(euler[0], euler[1], euler[2])
  65. cdef Matrix3 r = euler2rot_c(e)
  66. return matrix2numpy(r)
  67. def rot2euler_single(rot):
  68. cdef Matrix3 r = numpy2matrix(np.asfortranarray(rot, dtype=np.double))
  69. cdef Vector3 e = rot2euler_c(r)
  70. return [e(0), e(1), e(2)]
  71. def rot_matrix(roll, pitch, yaw):
  72. return matrix2numpy(rot_matrix_c(roll, pitch, yaw))
  73. def ecef_euler_from_ned_single(ecef_init, ned_pose):
  74. cdef ECEF init = list2ecef(ecef_init)
  75. cdef Vector3 pose = Vector3(ned_pose[0], ned_pose[1], ned_pose[2])
  76. cdef Vector3 e = ecef_euler_from_ned_c(init, pose)
  77. return [e(0), e(1), e(2)]
  78. def ned_euler_from_ecef_single(ecef_init, ecef_pose):
  79. cdef ECEF init = list2ecef(ecef_init)
  80. cdef Vector3 pose = Vector3(ecef_pose[0], ecef_pose[1], ecef_pose[2])
  81. cdef Vector3 e = ned_euler_from_ecef_c(init, pose)
  82. return [e(0), e(1), e(2)]
  83. def geodetic2ecef_single(geodetic):
  84. cdef Geodetic g = list2geodetic(geodetic)
  85. cdef ECEF e = geodetic2ecef_c(g)
  86. return [e.x, e.y, e.z]
  87. def ecef2geodetic_single(ecef):
  88. cdef ECEF e = list2ecef(ecef)
  89. cdef Geodetic g = ecef2geodetic_c(e)
  90. return [g.lat, g.lon, g.alt]
  91. cdef class LocalCoord:
  92. cdef LocalCoord_c * lc
  93. def __init__(self, geodetic=None, ecef=None):
  94. assert (geodetic is not None) or (ecef is not None)
  95. if geodetic is not None:
  96. self.lc = new LocalCoord_c(list2geodetic(geodetic))
  97. elif ecef is not None:
  98. self.lc = new LocalCoord_c(list2ecef(ecef))
  99. @property
  100. def ned2ecef_matrix(self):
  101. return matrix2numpy(self.lc.ned2ecef_matrix)
  102. @property
  103. def ecef2ned_matrix(self):
  104. return matrix2numpy(self.lc.ecef2ned_matrix)
  105. @property
  106. def ned_from_ecef_matrix(self):
  107. return self.ecef2ned_matrix
  108. @property
  109. def ecef_from_ned_matrix(self):
  110. return self.ned2ecef_matrix
  111. @classmethod
  112. def from_geodetic(cls, geodetic):
  113. return cls(geodetic=geodetic)
  114. @classmethod
  115. def from_ecef(cls, ecef):
  116. return cls(ecef=ecef)
  117. def ecef2ned_single(self, ecef):
  118. assert self.lc
  119. cdef ECEF e = list2ecef(ecef)
  120. cdef NED n = self.lc.ecef2ned(e)
  121. return [n.n, n.e, n.d]
  122. def ned2ecef_single(self, ned):
  123. assert self.lc
  124. cdef NED n = list2ned(ned)
  125. cdef ECEF e = self.lc.ned2ecef(n)
  126. return [e.x, e.y, e.z]
  127. def geodetic2ned_single(self, geodetic):
  128. assert self.lc
  129. cdef Geodetic g = list2geodetic(geodetic)
  130. cdef NED n = self.lc.geodetic2ned(g)
  131. return [n.n, n.e, n.d]
  132. def ned2geodetic_single(self, ned):
  133. assert self.lc
  134. cdef NED n = list2ned(ned)
  135. cdef Geodetic g = self.lc.ned2geodetic(n)
  136. return [g.lat, g.lon, g.alt]
  137. def __dealloc__(self):
  138. del self.lc