31 #ifndef PPRZ_GEODETIC_INT_H
32 #define PPRZ_GEODETIC_INT_H
131 #define CM_OF_M(_m) ((_m)*1e2)
132 #define M_OF_CM(_cm) ((_cm)/1e2)
133 #define MM_OF_M(_m) ((_m)*1e3)
134 #define M_OF_MM(_mm) ((_mm)/1e3)
135 #define EM7RAD_OF_RAD(_r) ((_r)*1e7)
136 #define RAD_OF_EM7RAD(_r) ((_r)/1e7)
137 #define EM7DEG_OF_DEG(_r) ((_r)*1e7)
138 #define DEG_OF_EM7DEG(_r) ((_r)/1e7)
139 #define EM7DEG_OF_RAD(_r) (DegOfRad(_r)*1e7)
140 #define RAD_OF_EM7DEG(_r) (RadOfDeg(_r)/1e7)
142 #define HIGH_RES_TRIG_FRAC 20
144 #define VECT3_ENU_OF_NED(_o, _i) { \
150 #define VECT3_NED_OF_ENU(_o, _i) VECT3_ENU_OF_NED(_o,_i)
151 #define INT32_VECT3_NED_OF_ENU(_o, _i) VECT3_ENU_OF_NED(_o,_i)
152 #define INT32_VECT3_ENU_OF_NED(_o, _i) VECT3_ENU_OF_NED(_o,_i)
154 #define ECEF_BFP_OF_REAL(_o, _i) { \
155 (_o).x = (int32_t)CM_OF_M((_i).x); \
156 (_o).y = (int32_t)CM_OF_M((_i).y); \
157 (_o).z = (int32_t)CM_OF_M((_i).z); \
160 #define ECEF_FLOAT_OF_BFP(_o, _i) { \
161 (_o).x = M_OF_CM((float)(_i).x); \
162 (_o).y = M_OF_CM((float)(_i).y); \
163 (_o).z = M_OF_CM((float)(_i).z); \
166 #define ECEF_DOUBLE_OF_BFP(_o, _i) { \
167 (_o).x = M_OF_CM((double)(_i).x); \
168 (_o).y = M_OF_CM((double)(_i).y); \
169 (_o).z = M_OF_CM((double)(_i).z); \
171 #define LLA_BFP_OF_REAL(_o, _i) { \
172 (_o).lat = (int32_t)EM7DEG_OF_RAD((_i).lat); \
173 (_o).lon = (int32_t)EM7DEG_OF_RAD((_i).lon); \
174 (_o).alt = (int32_t)MM_OF_M((_i).alt); \
177 #define LLA_FLOAT_OF_BFP(_o, _i) { \
178 (_o).lat = RAD_OF_EM7DEG((float)(_i).lat); \
179 (_o).lon = RAD_OF_EM7DEG((float)(_i).lon); \
180 (_o).alt = M_OF_MM((float)(_i).alt); \
183 #define LLA_DOUBLE_OF_BFP(_o, _i) { \
184 (_o).lat = RAD_OF_EM7DEG((double)(_i).lat); \
185 (_o).lon = RAD_OF_EM7DEG((double)(_i).lon); \
186 (_o).alt = M_OF_MM((double)(_i).alt); \
188 #define NED_BFP_OF_REAL(_o, _i) { \
189 (_o).x = (int32_t)POS_BFP_OF_REAL((_i).x); \
190 (_o).y = (int32_t)POS_BFP_OF_REAL((_i).y); \
191 (_o).z = (int32_t)POS_BFP_OF_REAL((_i).z); \
194 #define ENU_BFP_OF_REAL(_o, _i) NED_BFP_OF_REAL(_o, _i)
196 #define NED_FLOAT_OF_BFP(_o, _i) { \
197 (_o).x = POS_FLOAT_OF_BFP((_i).x); \
198 (_o).y = POS_FLOAT_OF_BFP((_i).y); \
199 (_o).z = POS_FLOAT_OF_BFP((_i).z); \
202 #define ENU_FLOAT_OF_BFP(_o, _i) NED_FLOAT_OF_BFP(_o, _i)
204 #define INT32_VECT2_ENU_OF_NED(_o, _i) { \
209 #define INT32_VECT2_NED_OF_ENU(_o, _i) INT32_VECT2_ENU_OF_NED(_o,_i)
211 #define HIGH_RES_RMAT_BFP_OF_REAL(_ei, _ef) { \
212 (_ei).m[0] = BFP_OF_REAL((_ef).m[0], HIGH_RES_TRIG_FRAC); \
213 (_ei).m[1] = BFP_OF_REAL((_ef).m[1], HIGH_RES_TRIG_FRAC); \
214 (_ei).m[2] = BFP_OF_REAL((_ef).m[2], HIGH_RES_TRIG_FRAC); \
215 (_ei).m[3] = BFP_OF_REAL((_ef).m[3], HIGH_RES_TRIG_FRAC); \
216 (_ei).m[4] = BFP_OF_REAL((_ef).m[4], HIGH_RES_TRIG_FRAC); \
217 (_ei).m[5] = BFP_OF_REAL((_ef).m[5], HIGH_RES_TRIG_FRAC); \
218 (_ei).m[6] = BFP_OF_REAL((_ef).m[6], HIGH_RES_TRIG_FRAC); \
219 (_ei).m[7] = BFP_OF_REAL((_ef).m[7], HIGH_RES_TRIG_FRAC); \
220 (_ei).m[8] = BFP_OF_REAL((_ef).m[8], HIGH_RES_TRIG_FRAC); \
223 #define HIGH_RES_RMAT_FLOAT_OF_BFP(_ef, _ei) { \
224 (_ef).m[0] = FLOAT_OF_BFP((_ei).m[0], HIGH_RES_TRIG_FRAC); \
225 (_ef).m[1] = FLOAT_OF_BFP((_ei).m[1], HIGH_RES_TRIG_FRAC); \
226 (_ef).m[2] = FLOAT_OF_BFP((_ei).m[2], HIGH_RES_TRIG_FRAC); \
227 (_ef).m[3] = FLOAT_OF_BFP((_ei).m[3], HIGH_RES_TRIG_FRAC); \
228 (_ef).m[4] = FLOAT_OF_BFP((_ei).m[4], HIGH_RES_TRIG_FRAC); \
229 (_ef).m[5] = FLOAT_OF_BFP((_ei).m[5], HIGH_RES_TRIG_FRAC); \
230 (_ef).m[6] = FLOAT_OF_BFP((_ei).m[6], HIGH_RES_TRIG_FRAC); \
231 (_ef).m[7] = FLOAT_OF_BFP((_ei).m[7], HIGH_RES_TRIG_FRAC); \
232 (_ef).m[8] = FLOAT_OF_BFP((_ei).m[8], HIGH_RES_TRIG_FRAC); \
235 #define HIGH_RES_RMAT_DOUBLE_OF_BFP(_ef, _ei) { \
236 (_ef).m[0] = DOUBLE_OF_BFP((_ei).m[0], HIGH_RES_TRIG_FRAC); \
237 (_ef).m[1] = DOUBLE_OF_BFP((_ei).m[1], HIGH_RES_TRIG_FRAC); \
238 (_ef).m[2] = DOUBLE_OF_BFP((_ei).m[2], HIGH_RES_TRIG_FRAC); \
239 (_ef).m[3] = DOUBLE_OF_BFP((_ei).m[3], HIGH_RES_TRIG_FRAC); \
240 (_ef).m[4] = DOUBLE_OF_BFP((_ei).m[4], HIGH_RES_TRIG_FRAC); \
241 (_ef).m[5] = DOUBLE_OF_BFP((_ei).m[5], HIGH_RES_TRIG_FRAC); \
242 (_ef).m[6] = DOUBLE_OF_BFP((_ei).m[6], HIGH_RES_TRIG_FRAC); \
243 (_ef).m[7] = DOUBLE_OF_BFP((_ei).m[7], HIGH_RES_TRIG_FRAC); \
244 (_ef).m[8] = DOUBLE_OF_BFP((_ei).m[8], HIGH_RES_TRIG_FRAC); \
247 #define UTM_FLOAT_OF_BFP(_o, _i) { \
248 (_o).east = M_OF_CM((float)(_i).east); \
249 (_o).north = M_OF_CM((float)(_i).north); \
250 (_o).alt = M_OF_MM((float)(_i).alt); \
251 (_o).zone = (_i).zone; \
254 #define UTM_DOUBLE_OF_BFP(_o, _i) { \
255 (_o).east = M_OF_CM((double)(_i).east); \
256 (_o).north = M_OF_CM((double)(_i).north); \
257 (_o).alt = M_OF_MM((double)(_i).alt); \
258 (_o).zone = (_i).zone; \
261 #define UTM_BFP_OF_REAL(_o, _i) { \
262 (_o).east = (int32_t)CM_OF_M((_i).east); \
263 (_o).north = (int32_t)CM_OF_M((_i).north); \
264 (_o).alt = (int32_t)MM_OF_M((_i).alt); \
265 (_o).zone = (_i).zone; \
void ecef_of_enu_pos_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct EnuCoor_i *enu)
Convert a local ENU position to ECEF.
int32_t north
in centimeters
void ecef_of_ned_point_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct NedCoor_i *ned)
Convert a point in local NED to ECEF.
definition of the local (flat earth) coordinate system
void ecef_of_enu_point_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct EnuCoor_i *enu)
Convert a point in local ENU to ECEF.
void enu_of_ecef_pos_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Convert a ECEF position to local ENU.
vector in EarthCenteredEarthFixed coordinates
struct Int32RMat ltp_of_ecef
Rotation matrix.
int32_t east
in centimeters
vector in Latitude, Longitude and Altitude
void ltp_def_from_lla_i(struct LtpDef_i *def, struct LlaCoor_i *lla)
void ned_of_ecef_vect_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Rotate a vector from ECEF to NED.
struct EcefCoor_i ecef
Reference point in ecef.
int32_t hmsl
Height above mean sea level in mm.
int32_t alt
in millimeters above WGS84 reference ellipsoid
uint8_t zone
UTM zone number.
void ned_of_ecef_pos_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Convert a ECEF position to local NED.
void lla_of_utm_i(struct LlaCoor_i *lla, struct UtmCoor_i *utm)
Convert a UTM to LLA.
void enu_of_ecef_point_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Convert a point from ECEF to local ENU.
struct LlaCoor_i lla
Reference point in lla.
int32_t lon
in degrees*1e7
void utm_of_lla_i(struct UtmCoor_i *utm, struct LlaCoor_i *lla)
Convert a LLA to UTM.
void ned_of_lla_pos_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct LlaCoor_i *lla)
Convert a point from LLA to local NED.
void ecef_of_ned_pos_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct NedCoor_i *ned)
Convert a local NED position to ECEF.
int32_t alt
in millimeters (above WGS84 reference ellipsoid or above MSL)
void ned_of_lla_point_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct LlaCoor_i *lla)
Convert a point from LLA to local NED.
Paparazzi generic macros for geodetic calculations.
vector in East North Up coordinates
void ned_of_ecef_point_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Convert a point from ECEF to local NED.
vector in North East Down coordinates
void enu_of_lla_pos_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct LlaCoor_i *lla)
Convert a point from LLA to local ENU.
void enu_of_ecef_vect_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Rotate a vector from ECEF to ENU.
void ecef_of_lla_i(struct EcefCoor_i *out, struct LlaCoor_i *in)
Convert a LLA to ECEF.
void ltp_of_ecef_rmat_from_lla_i(struct Int32RMat *ltp_of_ecef, struct LlaCoor_i *lla)
void lla_of_ecef_i(struct LlaCoor_i *out, struct EcefCoor_i *in)
Convert a ECEF to LLA.
void enu_of_lla_point_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct LlaCoor_i *lla)
Convert a point from LLA to local ENU.
int32_t lat
in degrees*1e7
void ned_of_lla_vect_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct LlaCoor_i *lla)
void enu_of_lla_vect_i(struct EnuCoor_i *enu, struct LtpDef_i *def, struct LlaCoor_i *lla)
void ecef_of_enu_vect_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct EnuCoor_i *enu)
Rotate a vector from ENU to ECEF.
void ltp_def_from_ecef_i(struct LtpDef_i *def, struct EcefCoor_i *ecef)
Paparazzi fixed point algebra.
position in UTM coordinates
void ecef_of_ned_vect_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct NedCoor_i *ned)
Rotate a vector from NED to ECEF.