Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
ins_int.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2010 The Paparazzi Team
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21 
29 #include "modules/ins/ins_int.h"
30 
31 #include "modules/core/abi.h"
32 
33 #include "modules/imu/imu.h"
34 #include "modules/gps/gps.h"
35 
36 #include "generated/airframe.h"
37 
38 #if USE_VFF_EXTENDED
40 #else
41 #include "modules/ins/vf_float.h"
42 #endif
43 
44 #if USE_HFF
45 #include "modules/ins/hf_float.h"
46 #endif
47 
48 #if defined SITL && USE_NPS
49 //#include "nps_fdm.h"
50 #include "nps_autopilot.h"
51 #include <stdio.h>
52 #endif
53 
54 #include "math/pprz_geodetic_int.h"
55 #include "math/pprz_isa.h"
56 #include "math/pprz_stat.h"
57 
58 #ifndef VFF_R_AGL
59 #define VFF_R_AGL 0.2
60 #endif
61 
62 #if USE_SONAR
63 #if !USE_VFF_EXTENDED
64 #error USE_SONAR needs USE_VFF_EXTENDED
65 #endif
66 
67 #ifdef INS_SONAR_THROTTLE_THRESHOLD
69 #endif
70 
71 #ifndef INS_SONAR_MIN_RANGE
72 #define INS_SONAR_MIN_RANGE 0.001
73 #endif
74 #ifndef INS_SONAR_MAX_RANGE
75 #define INS_SONAR_MAX_RANGE 4.0
76 #endif
77 #define VFF_R_SONAR_0 0.2
78 #ifndef VFF_R_SONAR_OF_M
79 #define VFF_R_SONAR_OF_M 0.2
80 #endif
81 
82 #endif // USE_SONAR
83 
84 #if USE_GPS
85 #ifndef INS_VFF_R_GPS
86 #define INS_VFF_R_GPS 2.0
87 #endif
88 
89 #ifndef INS_VFF_VZ_R_GPS
90 #define INS_VFF_VZ_R_GPS 2.0
91 #endif
92 #endif // USE_GPS
93 
95 #ifndef INS_MAX_PROPAGATION_STEPS
96 #define INS_MAX_PROPAGATION_STEPS 200
97 #endif
98 
99 #ifndef USE_INS_NAV_INIT
100 #define USE_INS_NAV_INIT TRUE
101 PRINT_CONFIG_MSG("USE_INS_NAV_INIT defaulting to TRUE")
102 #endif
103 
105 #define INS_BARO_MAX_INIT_VAR 1.f // variance threshold to set initial baro measurement
106 #ifndef INS_INT_BARO_ID
107 #if USE_BARO_BOARD
108 #define INS_INT_BARO_ID BARO_BOARD_SENDER_ID
109 #else
110 #define INS_INT_BARO_ID ABI_BROADCAST
111 #endif
112 #endif
115 static void baro_cb(uint8_t sender_id, uint32_t stamp, float pressure);
116 
120 #ifndef INS_INT_IMU_ID
121 #define INS_INT_IMU_ID ABI_BROADCAST
122 #endif
125 static void accel_cb(uint8_t sender_id, uint32_t stamp, struct Int32Vect3 *accel);
126 
127 #ifndef INS_INT_GPS_ID
128 #define INS_INT_GPS_ID GPS_MULTI_ID
129 #endif
132 static void gps_cb(uint8_t sender_id, uint32_t stamp, struct GpsState *gps_s);
133 
137 #ifndef INS_INT_VEL_ID
138 #define INS_INT_VEL_ID ABI_BROADCAST
139 #endif
142 static void vel_est_cb(uint8_t sender_id,
143  uint32_t stamp,
144  float x, float y, float z,
145  float noise_x, float noise_y, float noise_z);
146 #ifndef INS_INT_POS_ID
147 #define INS_INT_POS_ID ABI_BROADCAST
148 #endif
151 static void pos_est_cb(uint8_t sender_id,
152  uint32_t stamp,
153  float x, float y, float z,
154  float noise_x, float noise_y, float noise_z);
155 
159 #ifndef INS_INT_AGL_ID
160 #define INS_INT_AGL_ID ABI_BROADCAST
161 #endif
164 static void agl_cb(uint8_t sender_id, uint32_t stamp, float distance);
165 
166 
168 static void reset_cb(uint8_t sender_id, uint8_t flag);
169 
170 struct InsInt ins_int;
171 
172 #if PERIODIC_TELEMETRY
174 
175 static void send_ins(struct transport_tx *trans, struct link_device *dev)
176 {
177  pprz_msg_send_INS(trans, dev, AC_ID,
181 }
182 
183 static void send_ins_z(struct transport_tx *trans, struct link_device *dev)
184 {
185  pprz_msg_send_INS_Z(trans, dev, AC_ID,
187 }
188 
189 static void send_ins_ref(struct transport_tx *trans, struct link_device *dev)
190 {
191  if (ins_int.ltp_initialized) {
192  pprz_msg_send_INS_REF(trans, dev, AC_ID,
196  }
197 }
198 #endif
199 
200 static void ins_ned_to_state(void);
201 static void ins_update_from_vff(void);
202 #if USE_HFF
203 static void ins_update_from_hff(void);
204 #endif
205 
206 
207 void ins_int_init(void)
208 {
209 
210 #if USE_INS_NAV_INIT
211  ins_init_origin_i_from_flightplan(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_def);
212  ins_int.ltp_initialized = true;
213 #else
214  ins_int.ltp_initialized = false;
215 #endif
216 
217  /* we haven't had any measurement updates yet, so set the counter to max */
219 
220  // Bind to BARO_ABS message
221  AbiBindMsgBARO_ABS(INS_INT_BARO_ID, &baro_ev, baro_cb);
222  ins_int.baro_initialized = false;
223 
224  ins_int.vf_reset = false;
225  ins_int.hf_realign = false;
226 
227  /* init vertical and horizontal filters */
228  vff_init_zero();
229 #if USE_HFF
230  hff_init(0., 0., 0., 0.);
231 #endif
232 
236 
237 #if PERIODIC_TELEMETRY
241 #endif
242 
243  /*
244  * Subscribe to scaled IMU measurements and attach callbacks
245  */
246  AbiBindMsgIMU_ACCEL(INS_INT_IMU_ID, &accel_ev, accel_cb);
247  AbiBindMsgGPS(INS_INT_GPS_ID, &gps_ev, gps_cb);
248  AbiBindMsgVELOCITY_ESTIMATE(INS_INT_VEL_ID, &vel_est_ev, vel_est_cb);
249  AbiBindMsgPOSITION_ESTIMATE(INS_INT_POS_ID, &pos_est_ev, pos_est_cb);
250  AbiBindMsgAGL(INS_INT_AGL_ID, &agl_ev, agl_cb); // ABI to the altitude above ground level
251  AbiBindMsgINS_RESET(ABI_BROADCAST, &reset_ev, reset_cb);
252 }
253 
254 static void reset_ref(void)
255 {
256 #if USE_GPS
257  if (GpsFixValid()) {
258  struct EcefCoor_i ecef_pos = ecef_int_from_gps(&gps);
259  struct LlaCoor_i lla_pos = lla_int_from_gps(&gps);
260  ltp_def_from_ecef_i(&ins_int.ltp_def, &ecef_pos);
261  ins_int.ltp_def.lla.alt = lla_pos.alt;
263  ins_int.ltp_initialized = true;
264  stateSetLocalOrigin_i(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_def);
265  } else {
266  ins_int.ltp_initialized = false;
267  }
268 #else
269  ins_int.ltp_initialized = false;
270 #endif
271 
272 #if USE_HFF
273  ins_int.hf_realign = true;
274 #endif
275  ins_int.vf_reset = true;
276 }
277 
278 static void reset_vertical_ref(void)
279 {
280 #if USE_GPS
281  if (GpsFixValid()) {
282  struct LlaCoor_i lla_pos = lla_int_from_gps(&gps);
283  struct LlaCoor_i lla = {
285  .lon = stateGetLlaOrigin_i().lon,
286  .alt = lla_pos.alt
287  };
290  stateSetLocalOrigin_i(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_def);
291  }
292 #endif
293  ins_int.vf_reset = true;
294 }
295 
296 static void reset_vertical_pos(void)
297 {
298  ins_int.vf_reset = true;
299 }
300 
301 static void reset_cb(uint8_t sender_id UNUSED, uint8_t flag)
302 {
303  switch (flag) {
304  case INS_RESET_REF:
305  reset_ref();
306  break;
309  break;
312  break;
313  default:
314  // unsupported cases
315  break;
316  }
317 }
318 
319 void ins_int_propagate(struct Int32Vect3 *accel, float dt)
320 {
321  // Set body acceleration in the state
322  stateSetAccelBody_i(MODULE_INS_INT_COMMON_ID, accel);
323 
324  /* untilt accels */
325  struct Int32Vect3 accel_meas_ltp;
326  int32_rmat_transp_vmult(&accel_meas_ltp, stateGetNedToBodyRMat_i(), accel);
327 
328  float z_accel_meas_float = ACCEL_FLOAT_OF_BFP(accel_meas_ltp.z);
329 
330  /* Propagate only if we got any measurement during the last INS_MAX_PROPAGATION_STEPS.
331  * Otherwise halt the propagation to not diverge and only set the acceleration.
332  * This should only be relevant in the startup phase when the baro is not yet initialized
333  * and there is no gps fix yet...
334  */
336  vff_propagate(z_accel_meas_float, dt);
338  } else {
339  // feed accel from the sensors
340  // subtract -9.81m/s2 (acceleration measured due to gravity,
341  // but vehicle not accelerating in ltp)
342  ins_int.ltp_accel.z = accel_meas_ltp.z + ACCEL_BFP_OF_REAL(9.81);
343  }
344 
345 #if USE_HFF
346  /* propagate horizontal filter */
347  hff_propagate();
348  /* convert and copy result to ins_int */
349  ins_update_from_hff();
350 #else
351  ins_int.ltp_accel.x = accel_meas_ltp.x;
352  ins_int.ltp_accel.y = accel_meas_ltp.y;
353 #endif /* USE_HFF */
354 
356 
357  /* increment the propagation counter, while making sure it doesn't overflow */
360  }
361 }
362 
363 static void baro_cb(uint8_t __attribute__((unused)) sender_id, __attribute__((unused)) uint32_t stamp, float pressure)
364 {
365  if (pressure < 1.f)
366  {
367  // bad baro pressure, don't use
368  return;
369  }
370 
371  if (!ins_int.baro_initialized) {
372 #define press_hist_len 10
373  static float press_hist[press_hist_len];
374  static uint8_t idx = 0;
375 
376  press_hist[idx] = pressure;
377  idx = (idx + 1) % press_hist_len;
378  float var = variance_f(press_hist, press_hist_len);
379  if (var < INS_BARO_MAX_INIT_VAR){
380  // wait for a first positive value
381  ins_int.vf_reset = true;
382  ins_int.baro_initialized = true;
383  }
384  }
385 
387  float height_correction = 0.f;
389  // Calculate the distance to the origin
390  struct EnuCoor_f *enu = stateGetPositionEnu_f();
391  double dist2_to_origin = enu->x * enu->x + enu->y * enu->y;
392 
393  // correction for the earth's curvature
394  const double earth_radius = 6378137.0;
395  height_correction = (float)(sqrt(earth_radius * earth_radius + dist2_to_origin) - earth_radius);
396  }
397 
398  if (ins_int.vf_reset) {
399  ins_int.vf_reset = false;
400  ins_int.qfe = pressure;
401  vff_realign(height_correction);
403  }
404 
405  float baro_up = pprz_isa_height_of_pressure(pressure, ins_int.qfe);
406 
407  // The VFF will update in the NED frame
408  ins_int.baro_z = -(baro_up - height_correction);
409 
410 #if USE_VFF_EXTENDED
412 #else
414 #endif
415 
416  /* reset the counter to indicate we just had a measurement update */
418  }
419 }
420 
421 #if USE_GPS
422 void ins_int_update_gps(struct GpsState *gps_s)
423 {
424  if (gps_s->fix < GPS_FIX_3D) {
425  return;
426  }
427 
428  if (!ins_int.ltp_initialized) {
429  reset_ref();
430  }
431 
432  struct NedCoor_i gps_pos_cm_ned;
433  struct EcefCoor_i ecef_pos_i = ecef_int_from_gps(gps_s);
434  ned_of_ecef_point_i(&gps_pos_cm_ned, &ins_int.ltp_def, &ecef_pos_i);
435 
436  /* calculate body frame position taking BODY_TO_GPS translation (in cm) into account */
437 #ifdef INS_BODY_TO_GPS_X
438  /* body2gps translation in body frame */
439  struct Int32Vect3 b2g_b = {
440  .x = INS_BODY_TO_GPS_X,
441  .y = INS_BODY_TO_GPS_Y,
442  .z = INS_BODY_TO_GPS_Z
443  };
444  /* rotate offset given in body frame to navigation/ltp frame using current attitude */
445  struct Int32Quat q_b2n = *stateGetNedToBodyQuat_i();
446  QUAT_INVERT(q_b2n, q_b2n);
447  struct Int32Vect3 b2g_n;
448  int32_quat_vmult(&b2g_n, &q_b2n, &b2g_b);
449  /* subtract body2gps translation in ltp from gps position */
450  VECT3_SUB(gps_pos_cm_ned, b2g_n);
451 #endif
452 
454  struct NedCoor_i gps_speed_cm_s_ned;
455  struct EcefCoor_i ecef_vel_i = ecef_vel_int_from_gps(gps_s);
456  ned_of_ecef_vect_i(&gps_speed_cm_s_ned, &ins_int.ltp_def, &ecef_vel_i);
457 
458 #if INS_USE_GPS_ALT
459  vff_update_z_conf(((float)gps_pos_cm_ned.z) / 100.0, INS_VFF_R_GPS);
460 #endif
461 #if INS_USE_GPS_ALT_SPEED
462  vff_update_vz_conf(((float)gps_speed_cm_s_ned.z) / 100.0, INS_VFF_VZ_R_GPS);
464 #endif
465 
466 #if USE_HFF
467  /* horizontal gps transformed to NED in meters as float */
468  struct FloatVect2 gps_pos_m_ned;
469  VECT2_ASSIGN(gps_pos_m_ned, gps_pos_cm_ned.x, gps_pos_cm_ned.y);
470  VECT2_SDIV(gps_pos_m_ned, gps_pos_m_ned, 100.0f);
471 
472  struct FloatVect2 gps_speed_m_s_ned;
473  VECT2_ASSIGN(gps_speed_m_s_ned, gps_speed_cm_s_ned.x, gps_speed_cm_s_ned.y);
474  VECT2_SDIV(gps_speed_m_s_ned, gps_speed_m_s_ned, 100.f);
475 
476  if (ins_int.hf_realign) {
477  ins_int.hf_realign = false;
478  hff_realign(gps_pos_m_ned, gps_speed_m_s_ned);
479  }
480  // run horizontal filter
481  hff_update_gps(&gps_pos_m_ned, &gps_speed_m_s_ned);
482  // convert and copy result to ins_int
483  ins_update_from_hff();
484 
485 #else /* hff not used */
486  /* simply copy horizontal pos/speed from gps */
487  INT32_VECT2_SCALE_2(ins_int.ltp_pos, gps_pos_cm_ned,
489  INT32_VECT2_SCALE_2(ins_int.ltp_speed, gps_speed_cm_s_ned,
491 #endif /* USE_HFF */
492 
494 
495  /* reset the counter to indicate we just had a measurement update */
497 }
498 #else
499 void ins_int_update_gps(struct GpsState *gps_s __attribute__((unused))) {}
500 #endif /* USE_GPS */
501 
506 #if USE_VFF_EXTENDED
507 static void agl_cb(uint8_t __attribute__((unused)) sender_id, __attribute__((unused)) uint32_t stamp, float distance) {
508  if (distance <= 0 || !(ins_int.baro_initialized)) {
509  return;
510  }
511 
512 #if USE_SONAR
513  if (distance > INS_SONAR_MAX_RANGE || distance < INS_SONAR_MIN_RANGE){
514  return;
515  }
516 #endif
517 #ifdef INS_AGL_THROTTLE_THRESHOLD
518  if(stabilization.cmd[COMMAND_THRUST] < INS_AGL_THROTTLE_THRESHOLD){
519  return;
520  }
521 #endif
522 #ifdef INS_AGL_BARO_THRESHOLD
523  if(ins_int.baro_z < -INS_SONAR_BARO_THRESHOLD){ /* z down */
524  return;
525  }
526 #endif
527 
528 #if USE_SONAR
529  vff_update_agl(-distance, VFF_R_SONAR_0 + VFF_R_SONAR_OF_M * fabsf(distance));
530 #else
531  // TODO: this assumes that you will either have sonar or other agl sensor never both
532  vff_update_agl(-distance, VFF_R_AGL);
533 #endif
534  /* reset the counter to indicate we just had a measurement update */
536 }
537 #else
538 static void agl_cb(uint8_t __attribute__((unused)) sender_id, __attribute__((unused)) uint32_t stamp, __attribute__((unused)) float distance) {}
539 #endif
540 
542 static void ins_ned_to_state(void)
543 {
544  stateSetPositionNed_i(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_pos);
545  stateSetSpeedNed_i(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_speed);
546  stateSetAccelNed_i(MODULE_INS_INT_COMMON_ID, &ins_int.ltp_accel);
547 
548 #if defined SITL && USE_NPS
549  if (nps_bypass_ins) {
551  }
552 #endif
553 }
554 
556 static void ins_update_from_vff(void)
557 {
561 }
562 
563 #if USE_HFF
565 static void ins_update_from_hff(void)
566 {
573 }
574 #endif
575 
576 
577 static void accel_cb(uint8_t sender_id __attribute__((unused)),
578  uint32_t stamp, struct Int32Vect3 *accel)
579 {
580  PRINT_CONFIG_MSG("Calculating dt for INS int propagation.")
581  /* timestamp in usec when last callback was received */
582  static uint32_t last_stamp = 0;
583 
584  if (last_stamp > 0) {
585  float dt = (float)(stamp - last_stamp) * 1e-6;
586  ins_int_propagate(accel, dt);
587  }
588  last_stamp = stamp;
589 }
590 
591 static void gps_cb(uint8_t sender_id __attribute__((unused)),
592  uint32_t stamp __attribute__((unused)),
593  struct GpsState *gps_s)
594 {
595  ins_int_update_gps(gps_s);
596 }
597 
598 /* body relative velocity estimate
599  *
600  */
601 static void vel_est_cb(uint8_t sender_id __attribute__((unused)),
602  uint32_t stamp __attribute__((unused)),
603  float x, float y, float z,
604  float noise_x, float noise_y, float noise_z)
605 {
606  struct FloatVect3 vel_body = {x, y, z};
607 
608  /* rotate velocity estimate to nav/ltp frame */
609  struct FloatQuat q_b2n = *stateGetNedToBodyQuat_f();
610  QUAT_INVERT(q_b2n, q_b2n);
611  struct FloatVect3 vel_ned;
612  float_quat_vmult(&vel_ned, &q_b2n, &vel_body);
613 
614  // abi message contains an update to the horizontal velocity estimate
615 #if USE_HFF
616  struct FloatVect2 vel = {vel_ned.x, vel_ned.y};
617  struct FloatVect2 Rvel = {noise_x, noise_y};
618 
619  hff_update_vel(vel, Rvel);
620  ins_update_from_hff();
621 #else
622  if (noise_x >= 0.f)
623  {
625  }
626  if (noise_y >= 0.f)
627  {
629  }
630 
631  static uint32_t last_stamp_x = 0, last_stamp_y = 0;
632  if (noise_x >= 0.f) {
633  if (last_stamp_x > 0)
634  {
635  float dt = (float)(stamp - last_stamp_x) * 1e-6;
636  ins_int.ltp_pos.x += lround(POS_BFP_OF_REAL(dt * vel_ned.x));
637  }
638  last_stamp_x = stamp;
639  }
640 
641  if (noise_y >= 0.f)
642  {
643  if (last_stamp_y > 0)
644  {
645  float dt = (float)(stamp - last_stamp_y) * 1e-6;
646  ins_int.ltp_pos.y += lround(POS_BFP_OF_REAL(dt * vel_ned.y));
647  }
648  last_stamp_y = stamp;
649  }
650 #endif
651 
652  // abi message contains an update to the vertical velocity estimate
653  vff_update_vz_conf(vel_ned.z, noise_z);
654 
656 
657  /* reset the counter to indicate we just had a measurement update */
659 }
660 
661 /* NED position estimate relative to ltp origin
662  */
663 static void pos_est_cb(uint8_t sender_id __attribute__((unused)),
664  uint32_t stamp __attribute__((unused)),
665  float x, float y, float z,
666  float noise_x, float noise_y, float noise_z)
667 {
668 
669 #if USE_HFF
670  struct FloatVect2 pos = {x, y};
671  struct FloatVect2 Rpos = {noise_x, noise_y};
672 
673  hff_update_pos(pos, Rpos);
674  ins_update_from_hff();
675 #else
676  if (noise_x >= 0.f)
677  {
679  }
680  if (noise_y >= 0.f)
681  {
683  }
684 #endif
685 
686  vff_update_z_conf(z, noise_z);
687 
689 
690  /* reset the counter to indicate we just had a measurement update */
692 }
Main include for ABI (AirBorneInterface).
#define ABI_BROADCAST
Broadcast address.
Definition: abi_common.h:58
Event structure to store callbacks in a linked list.
Definition: abi_common.h:67
uint8_t last_wp UNUSED
struct GpsState gps
global GPS state
Definition: gps.c:74
struct LlaCoor_i lla_int_from_gps(struct GpsState *gps_s)
Get GPS lla (integer) Converted on the fly if not available.
Definition: gps.c:464
struct EcefCoor_i ecef_vel_int_from_gps(struct GpsState *gps_s)
Get GPS ecef velocity (integer) Converted on the fly if not available.
Definition: gps.c:522
struct EcefCoor_i ecef_int_from_gps(struct GpsState *gps_s)
Get GPS ecef pos (integer) Converted on the fly if not available.
Definition: gps.c:493
Device independent GPS code (interface)
int32_t hmsl
height above mean sea level (MSL) in mm
Definition: gps.h:94
#define GpsFixValid()
Definition: gps.h:168
#define GPS_FIX_3D
3D GPS fix
Definition: gps.h:44
uint8_t fix
status of fix
Definition: gps.h:107
data structure for GPS information
Definition: gps.h:87
void float_quat_vmult(struct FloatVect3 *v_out, struct FloatQuat *q, const struct FloatVect3 *v_in)
rotate 3D vector by quaternion.
Roation quaternion.
#define QUAT_INVERT(_qo, _qi)
Definition: pprz_algebra.h:627
#define VECT3_SUB(_a, _b)
Definition: pprz_algebra.h:154
#define VECT2_SDIV(_vo, _vi, _s)
Definition: pprz_algebra.h:104
#define VECT2_ASSIGN(_a, _x, _y)
Definition: pprz_algebra.h:62
#define INT32_POS_OF_CM_DEN
#define INT32_SPEED_OF_CM_S_NUM
#define ACCEL_BFP_OF_REAL(_af)
#define INT32_SPEED_OF_CM_S_DEN
#define INT32_VECT2_SCALE_2(_a, _b, _num, _den)
void int32_quat_vmult(struct Int32Vect3 *v_out, struct Int32Quat *q, struct Int32Vect3 *v_in)
rotate 3D vector by quaternion.
#define INT32_POS_OF_CM_NUM
#define INT32_VECT3_ZERO(_v)
void int32_rmat_transp_vmult(struct Int32Vect3 *vb, struct Int32RMat *m_b2a, struct Int32Vect3 *va)
rotate 3D vector by transposed rotation matrix.
#define POS_BFP_OF_REAL(_af)
#define ACCEL_FLOAT_OF_BFP(_ai)
#define SPEED_BFP_OF_REAL(_af)
Rotation quaternion.
int32_t lat
in degrees*1e7
int32_t hmsl
Height above mean sea level in mm.
int32_t alt
in millimeters above WGS84 reference ellipsoid
int32_t z
Down.
int32_t z
in centimeters
struct LlaCoor_i lla
Reference point in lla.
int32_t x
in centimeters
int32_t y
East.
struct EcefCoor_i ecef
Reference point in ecef.
int32_t y
in centimeters
int32_t lon
in degrees*1e7
int32_t x
North.
void ltp_def_from_ecef_i(struct LtpDef_i *def, struct EcefCoor_i *ecef)
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.
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.
void ltp_def_from_lla_i(struct LtpDef_i *def, struct LlaCoor_i *lla)
vector in EarthCenteredEarthFixed coordinates
vector in Latitude, Longitude and Altitude
vector in North East Down coordinates
static float pprz_isa_height_of_pressure(float pressure, float ref_p)
Get relative altitude from pressure (using simplified equation).
Definition: pprz_isa.h:102
static void stateSetAccelNed_i(uint16_t id, struct NedCoor_i *ned_accel)
Set acceleration in NED coordinates (int).
Definition: state.h:1127
static void stateSetAccelBody_i(uint16_t id, struct Int32Vect3 *body_accel)
Set acceleration in Body coordinates (int).
Definition: state.h:1167
static struct Int32Quat * stateGetNedToBodyQuat_i(void)
Get vehicle body attitude quaternion (int).
Definition: state.h:1276
static struct Int32RMat * stateGetNedToBodyRMat_i(void)
Get vehicle body attitude rotation matrix (int).
Definition: state.h:1282
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
Definition: state.h:1294
static void stateSetLocalOrigin_i(uint16_t id, struct LtpDef_i *ltp_def)
Set the local (flat earth) coordinate frame origin (int).
Definition: state.h:519
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
Definition: state.h:848
struct LlaCoor_i stateGetLlaOrigin_i(void)
Get the LLA position of the frame origin (int)
Definition: state.c:124
static void stateSetPositionNed_i(uint16_t id, struct NedCoor_i *ned_pos)
Set position from local NED coordinates (int).
Definition: state.h:638
static void stateSetSpeedNed_i(uint16_t id, struct NedCoor_i *ned_speed)
Set ground speed in local NED coordinates (int).
Definition: state.h:892
void hff_init(float init_x, float init_xdot, float init_y, float init_ydot)
Definition: hf_float.c:274
struct HfilterFloat hff
Definition: hf_float.c:124
void hff_update_gps(struct FloatVect2 *pos_ned, struct FloatVect2 *speed_ned)
Definition: hf_float.c:541
void hff_propagate(void)
Definition: hf_float.c:479
void hff_update_vel(struct FloatVect2 vel, struct FloatVect2 Rvel)
Definition: hf_float.c:806
void hff_realign(struct FloatVect2 pos, struct FloatVect2 vel)
Definition: hf_float.c:602
void hff_update_pos(struct FloatVect2 pos, struct FloatVect2 Rpos)
Update position.
Definition: hf_float.c:711
Horizontal filter (x,y) to estimate position and velocity.
float y
Definition: hf_float.h:45
float xdot
Definition: hf_float.h:42
float x
Definition: hf_float.h:41
float ydotdot
Definition: hf_float.h:47
float xdotdot
Definition: hf_float.h:43
float ydot
Definition: hf_float.h:46
Inertial Measurement Unit interface.
void ins_init_origin_i_from_flightplan(uint16_t id, struct LtpDef_i *ltp_def)
initialize the local origin (ltp_def in fixed point) from flight plan position
Definition: ins.c:33
#define INS_RESET_VERTICAL_REF
Definition: ins.h:37
#define INS_RESET_VERTICAL_POS
Definition: ins.h:38
#define INS_RESET_REF
flags for INS reset
Definition: ins.h:36
struct InsInt ins_int
global INS state
Definition: ins_int.c:170
#define INS_INT_IMU_ID
ABI binding for IMU data.
Definition: ins_int.c:121
static void reset_vertical_ref(void)
Definition: ins_int.c:278
#define INS_INT_AGL_ID
ABI binding for AGL.
Definition: ins_int.c:160
static void gps_cb(uint8_t sender_id, uint32_t stamp, struct GpsState *gps_s)
Definition: ins_int.c:591
static void ins_update_from_vff(void)
update ins state from vertical filter
Definition: ins_int.c:556
static void reset_cb(uint8_t sender_id, uint8_t flag)
Definition: ins_int.c:301
static void send_ins(struct transport_tx *trans, struct link_device *dev)
Definition: ins_int.c:175
static abi_event pos_est_ev
Definition: ins_int.c:150
#define VFF_R_AGL
Definition: ins_int.c:59
#define INS_INT_GPS_ID
Definition: ins_int.c:128
static void reset_ref(void)
Definition: ins_int.c:254
static abi_event accel_ev
Definition: ins_int.c:124
#define INS_BARO_MAX_INIT_VAR
default barometer to use in INS
Definition: ins_int.c:105
void ins_int_propagate(struct Int32Vect3 *accel, float dt)
Definition: ins_int.c:319
static abi_event reset_ev
Definition: ins_int.c:167
void ins_int_update_gps(struct GpsState *gps_s)
Definition: ins_int.c:422
void ins_int_init(void)
Definition: ins_int.c:207
static void send_ins_ref(struct transport_tx *trans, struct link_device *dev)
Definition: ins_int.c:189
static void agl_cb(uint8_t sender_id, uint32_t stamp, float distance)
agl_cb This callback handles all estimates of the height of the vehicle above the ground under it Thi...
Definition: ins_int.c:538
static void send_ins_z(struct transport_tx *trans, struct link_device *dev)
Definition: ins_int.c:183
abi_event baro_ev
Definition: ins_int.c:114
#define INS_INT_VEL_ID
ABI binding for VELOCITY_ESTIMATE.
Definition: ins_int.c:138
#define INS_MAX_PROPAGATION_STEPS
maximum number of propagation steps without any updates in between
Definition: ins_int.c:96
static abi_event vel_est_ev
Definition: ins_int.c:141
static void ins_ned_to_state(void)
copy position and speed to state interface
Definition: ins_int.c:542
static void baro_cb(uint8_t sender_id, uint32_t stamp, float pressure)
Definition: ins_int.c:363
#define INS_VFF_VZ_R_GPS
Definition: ins_int.c:90
static void reset_vertical_pos(void)
Definition: ins_int.c:296
static void accel_cb(uint8_t sender_id, uint32_t stamp, struct Int32Vect3 *accel)
Definition: ins_int.c:577
#define INS_INT_POS_ID
Definition: ins_int.c:147
static void vel_est_cb(uint8_t sender_id, uint32_t stamp, float x, float y, float z, float noise_x, float noise_y, float noise_z)
Definition: ins_int.c:601
#define press_hist_len
#define INS_INT_BARO_ID
Definition: ins_int.c:110
static void pos_est_cb(uint8_t sender_id, uint32_t stamp, float x, float y, float z, float noise_x, float noise_y, float noise_z)
Definition: ins_int.c:663
#define INS_VFF_R_GPS
Definition: ins_int.c:86
static abi_event gps_ev
Definition: ins_int.c:131
static abi_event agl_ev
The agl ABI event.
Definition: ins_int.c:163
INS for rotorcrafts combining vertical and horizontal filters.
float baro_z
z-position calculated from baro in meters (z-down)
Definition: ins_int.h:61
struct LtpDef_i ltp_def
Definition: ins_int.h:40
bool ltp_initialized
Definition: ins_int.h:41
bool baro_initialized
Definition: ins_int.h:63
struct NedCoor_i ltp_pos
Definition: ins_int.h:56
bool vf_reset
request to reset vertical filter.
Definition: ins_int.h:53
struct NedCoor_i ltp_speed
Definition: ins_int.h:57
float qfe
Definition: ins_int.h:62
bool hf_realign
request to realign horizontal filter.
Definition: ins_int.h:48
uint32_t propagation_cnt
number of propagation steps since the last measurement update
Definition: ins_int.h:43
struct NedCoor_i ltp_accel
Definition: ins_int.h:58
Ins implementation state (fixed point)
Definition: ins_int.h:39
PRINT_CONFIG_MSG("USE_INS_NAV_INIT defaulting to TRUE")
bool nps_bypass_ins
void sim_overwrite_ins(void)
static uint32_t idx
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
float y
in meters
float x
in meters
vector in East North Up coordinates Units: meters
Paparazzi fixed point math for geodetic calculations.
Paparazzi atmospheric pressure conversion utilities.
float variance_f(float *array, uint32_t n_elements)
Compute the variance of an array of values (float).
Definition: pprz_stat.c:139
Statistics functions.
struct Stabilization stabilization
Definition: stabilization.c:41
General stabilization interface for rotorcrafts.
int32_t cmd[COMMANDS_NB]
output command vector, range from [-MAX_PPRZ:MAX_PPRZ] (store for messages)
static const struct usb_device_descriptor dev
Definition: usb_ser_hw.c:74
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition: telemetry.c:51
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
Definition: telemetry.h:66
void vff_init_zero(void)
void vff_update_z_conf(float z_meas, float conf)
void vff_update_vz_conf(float vz_meas, float conf)
void vff_update_baro(float z_meas)
void vff_realign(float z_meas)
void vff_propagate(float accel, float dt)
Propagate the filter in time.
struct VffExtended vff
void vff_update_agl(float z_meas, float conf)
Interface for extended vertical filter (in float).
float zdotdot
z-acceleration in m/s^2 (NED, z-down)
float zdot
z-velocity estimate in m/s (NED, z-down)
float z
z-position estimate in m (NED, z-down)
void vff_update(float z_meas)
Definition: vf_float.c:189
Vertical filter (in float) estimating altitude, velocity and accel bias.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
Definition: vl53l1_types.h:78
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98