Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
rotwing_state.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl>
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, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
31 
33 #include "modules/core/abi.h"
34 
35 // Quad state identification
36 #ifndef ROTWING_MIN_SKEW_ANGLE_DEG_QUAD
37 #define ROTWING_MIN_SKEW_ANGLE_DEG_QUAD 10.0
38 #endif
39 #ifndef ROTWING_MIN_SKEW_ANGLE_COUNTER
40 #define ROTWING_MIN_SKEW_ANGLE_COUNTER 10 // Minimum number of loops the skew angle is below ROTWING_MIN_SKEW_ANGLE_COUNTER
41 #endif
42 
43 // Skewing state identification
44 #ifndef ROTWING_SKEWING_COUNTER
45 #define ROTWING_SKEWING_COUNTER 10 // Minimum number of loops the skew angle is in between QUAD and FW
46 #endif
47 
48 // maximum quad airspeed to force quad state
49 #ifndef ROTWING_MAX_QUAD_AIRSPEED
50 #define ROTWING_MAX_QUAD_AIRSPEED 20.0
51 #endif
52 
53 // Half skew state identification
54 #ifndef ROTWING_HALF_SKEW_ANGLE_DEG
55 #define ROTWING_HALF_SKEW_ANGLE_DEG 55.0
56 #endif
57 #ifndef ROTWING_HALF_SKEW_ANGLE_RANG
58 #define ROTWING_HALF_SKEW_ANGLE_HALF_RANGE 10.0
59 #endif
60 #ifndef ROTWING_HALF_SKEW_COUNTER
61 #define ROTWING_HALF_SKEW_COUNTER 10 // Minimum number of loops the skew angle is at HALF_SKEW_ANGLE_DEG +/- ROTWING_HALF_SKEW_ANGLE_HALF_RANGE to trigger ROTWING_HALF_SKEW_ANGLE state
62 #endif
63 
64 // FW state identification
65 #ifndef ROTWING_MIN_FW_SKEW_ANGLE_DEG
66 #define ROTWING_MIN_FW_SKEW_ANGLE_DEG 80.0 // Minimum wing angle to fly in fixed wing state
67 #endif
68 #ifndef ROTWING_MIN_FW_COUNTER
69 #define ROTWING_MIN_FW_COUNTER 10 // Minimum number of loops the skew angle is above the MIN_FW_SKEW_ANGLE
70 #endif
71 
72 // FW idle state identification
73 #ifndef ROTWING_MIN_THRUST_IDLE
74 #define ROTWING_MIN_THRUST_IDLE 100
75 #endif
76 #ifndef ROTWING_MIN_THRUST_IDLE_COUNTER
77 #define ROTWING_MIN_THRUST_IDLE_COUNTER 10
78 #endif
79 
80 // FW hov mot off state identification
81 #ifndef ROTWING_HOV_MOT_OFF_RPM_TH
82 #define ROTWING_HOV_MOT_OFF_RPM_TH 50
83 #endif
84 #ifndef ROTWING_HOV_MOT_OFF_COUNTER
85 #define ROTWING_HOV_MOT_OFF_COUNTER 10
86 #endif
87 
88 #ifndef ROTWING_STATE_USE_ROTATION_REF_MODEL
89 #define ROTWING_STATE_USE_ROTATION_REF_MODEL FALSE
90 #endif
91 
92 
93 // Hover preferred pitch (deg)
94 #ifndef ROTWING_STATE_HOVER_PREF_PITCH
95 #define ROTWING_STATE_HOVER_PREF_PITCH 0.0
96 #endif
97 
98 // Transition preffered pitch (deg)
99 #ifndef ROTWING_STATE_TRANSITION_PREF_PITCH
100 #define ROTWING_STATE_TRANSITION_PREF_PITCH 3.0
101 #endif
102 
103 // Forward preffered pitch (deg)
104 #ifndef ROTWING_STATE_FW_PREF_PITCH
105 #define ROTWING_STATE_FW_PREF_PITCH 8.0
106 #endif
107 
108 // stream ADC data if ADC rotation sensor
109 #ifndef ADC_WING_ROTATION
110 #define ADC_WING_ROTATION FALSE
111 #endif
112 #if ADC_WING_ROTATION
114 #endif
117 #ifndef ROTWING_STATE_ACT_FEEDBACK_ID
118 #define ROTWING_STATE_ACT_FEEDBACK_ID ABI_BROADCAST
119 #endif
121 static void rotwing_state_feedback_cb(uint8_t sender_id, struct act_feedback_t *feedback_msg, uint8_t num_act);
122 #define ROTWING_STATE_NUM_HOVER_RPM 4
124 
128 
134 
136 
139 
140 
141 inline void rotwing_check_set_current_state(void);
142 inline void rotwing_switch_state(void);
143 
144 inline void rotwing_state_set_hover_settings(void);
145 inline void rotwing_state_set_skewing_settings(void);
146 inline void rotwing_state_set_fw_settings(void);
149 
150 inline void rotwing_state_set_state_settings(void);
151 inline void rotwing_state_skewer(void);
152 
153 inline void guidance_indi_hybrid_set_wls_settings(float body_v[3], float roll_angle, float pitch_angle);
154 
155 #if PERIODIC_TELEMETRY
157 static void send_rotating_wing_state(struct transport_tx *trans, struct link_device *dev)
158 {
159  uint16_t adc_dummy = 0;
160  pprz_msg_send_ROTATING_WING_STATE(trans, dev, AC_ID,
165  &adc_dummy,
167 }
168 #endif // PERIODIC_TELEMETRY
169 
171 {
172  // Bind ABI messages
174 
175  // Start the drone in a desired hover state
178 
184 
185 #if PERIODIC_TELEMETRY
186  register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_ROTATING_WING_STATE, send_rotating_wing_state);
187 #endif
188 }
189 
191 {
192  // Check and set the current state
194 
195  // Check and update desired state
198  } else if (guidance_h.mode == GUIDANCE_H_MODE_ATTITUDE) {
200  } else if (guidance_h.mode == GUIDANCE_H_MODE_FORWARD) {
202  }
203 
204  // Run the wing skewer
206 
207  //TODO: incorparate motor active / disbaling depending on called flight state
208  // Switch on motors if flight mode is attitude
211  } else if (guidance_h.mode == GUIDANCE_H_MODE_FORWARD) {
213  }
214 }
215 
216 // Function to request a state
218 {
221  }
222 }
223 
224 // Function to prefer configuration
226 {
227  switch (configuration) {
230  break;
233  break;
236  break;
237  }
238 }
239 
241 {
242  // if !in_flight, set state to hover
243  if (!autopilot.in_flight) {
250  return;
251  }
252 
253  // States can be checked according to wing angle sensor, setpoints .....
254  uint8_t prev_state = rotwing_state.current_state;
255  switch (prev_state) {
256  case ROTWING_STATE_HOVER:
257  // Check if state needs to be set to skewing
260  } else {
262  }
263 
264  // Switch state if necessary
268  }
269  break;
270 
272  // Check if state needs to be set to hover
275  } else {
277  }
278 
279  // Check if state needs to be set to fixed wing
282  } else {
284  }
285 
286  // Switch state if necessary
290  }
291 
295  }
296  break;
297 
298  case ROTWING_STATE_FW:
299  // Check if state needs to be set to skewing
302  } else {
304  }
305 
306  // Check if state needs to be set to fixed wing with hover motors idle (If hover thrust below threshold)
309  } else {
311  }
312 
313  // Switch state if necessary
323  }
324  break;
325 
327  // Check if state needs to be set to fixed wing with hover motors activated
328  if (stabilization_cmd[COMMAND_THRUST] > ROTWING_MIN_THRUST_IDLE
331  } else {
333  }
334 
335  // Check if state needs to be set to fixed wing with hover motors off (if zero rpm on hover motors)
336  if (rotwing_state_hover_rpm[0] == 0
337  && rotwing_state_hover_rpm[1] == 0
338  && rotwing_state_hover_rpm[2] == 0
339  && rotwing_state_hover_rpm[3] == 0) {
340 #if !USE_NPS
342 #endif
343  } else {
345  }
346 
347  // Switch state if necessary
353  && rotwing_state_fw_counter == 0) {
357  }
358  break;
359 
361  // Check if state needs to be set to fixed wing with hover motors idle (if rpm on hover motors)
367  } else {
369  }
370 
371  // Switch state if necessary
375  }
376  break;
377 
378  default:
379  break;
380  }
381 }
382 
383 // Function that handles settings for switching state(s)
385 {
386  switch (rotwing_state.current_state) {
387  case ROTWING_STATE_HOVER:
390  } else {
392  }
393  break;
394 
398  } else {
400  }
401  break;
402 
403  case ROTWING_STATE_FW:
408  } else {
410  }
411  break;
412 
418  } else {
420  }
421  break;
422 
426  } else {
428  }
429  break;
430  }
431 }
432 
434 {
445 }
446 
448 {
449  // Wing may be skewed to quad when desired state is hover and skewing settings set by state machine
452  } else {
454  }
462  rotwing_state_settings.nav_max_speed = 100; // Big as we use airspeed guidance
464 }
465 
467 {
476  rotwing_state_settings.nav_max_speed = 100; // Big as we use airspeed guidance
478 }
479 
481 {
490  rotwing_state_settings.nav_max_speed = 100; // Big as we use airspeed guidance
492 }
493 
495 {
504  rotwing_state_settings.nav_max_speed = 100; // Big as we use airspeed guidance
506 }
507 
509 {
510 
516  break;
519  break;
522  break;
523  }
524  } else {
526  }
527 
529 
531 
533 
535 
536  // TO DO: pitch angle now hard coded scheduled by wing angle
537 
538  // Stall protection handled by hover_motors_active boolean
539 
540  // TO DO: Climb and descend speeds now handled by guidance airspeed
541 }
542 
544 {
546  float wing_angle_scheduled_sp_deg = 0;
547  float airspeed = stateGetAirspeed_f();
548  if (airspeed < 8) {
549  wing_angle_scheduled_sp_deg = 0;
550  } else if (airspeed < 10 && (rotwing_state.desired_state > ROTWING_STATE_HOVER)) {
551  wing_angle_scheduled_sp_deg = 55;
552  } else if (airspeed > 10) {
553  wing_angle_scheduled_sp_deg = ((airspeed - 10.)) / 4. * 35. + 55.;
554  } else {
555  wing_angle_scheduled_sp_deg = 0;
556  }
557 
558  Bound(wing_angle_scheduled_sp_deg, 0., 90.)
559  rotwing_state_skewing.wing_angle_deg_sp = wing_angle_scheduled_sp_deg;
560  }
561 }
562 
564 {
565 
566  // calc rotation percentage of setpoint (0 deg = -1, 45 deg = 0, 90 deg = 1)
567  float wing_rotation_percentage = (rotwing_state_skewing.wing_angle_deg_sp - 45.) / 45.;
568  Bound(wing_rotation_percentage, -1., 1.);
569 
570  float servo_pprz_cmd = MAX_PPRZ * wing_rotation_percentage;
571  // Calulcate rotation_cmd
572  Bound(servo_pprz_cmd, -MAX_PPRZ, MAX_PPRZ);
573 
574 #if ROTWING_STATE_USE_ROTATION_REF_MODEL
575  // Rotate with second order filter
576  static float rotwing_state_skew_p_cmd = -MAX_PPRZ;
577  static float rotwing_state_skew_d_cmd = 0;
578  float speed_sp = 0.001 * (servo_pprz_cmd - rotwing_state_skew_p_cmd);
579  rotwing_state_skew_d_cmd += 0.003 * (speed_sp - rotwing_state_skew_d_cmd);
580  rotwing_state_skew_p_cmd += rotwing_state_skew_d_cmd;
581  Bound(rotwing_state_skew_p_cmd, -MAX_PPRZ, MAX_PPRZ);
582  rotwing_state_skewing.servo_pprz_cmd = rotwing_state_skew_p_cmd;
583 #else
584  // Directly controlling the wing rotation
586 #endif
587 
588 #if USE_NPS
589  // Export to the index of the SKEW in the NPS_ACTUATOR_NAMES array
590  actuators_pprz[INDI_NUM_ACT] = (rotwing_state_skewing.servo_pprz_cmd + MAX_PPRZ) / 2.; // Scale to simulation command
591 
592  // Simulate wing angle from command
594 
595  // SEND ABI Message to ctr_eff_sched and other modules that want Actuator position feedback
596  struct act_feedback_t feedback;
597  feedback.idx = SERVO_ROTATION_MECH_IDX;
598  feedback.position = 0.5 * M_PI - RadOfDeg(rotwing_state_skewing.wing_angle_deg);
599  feedback.set.position = true;
600 
601  // Send ABI message
602  AbiSendMsgACT_FEEDBACK(ACT_FEEDBACK_UAVCAN_ID, &feedback, 1);
603 #endif
604 }
605 
606 static void rotwing_state_feedback_cb(uint8_t __attribute__((unused)) sender_id,
607  struct act_feedback_t UNUSED *feedback_msg, uint8_t UNUSED num_act_message)
608 {
609  for (int i = 0; i < num_act_message; i++) {
610 
611  for (int i = 0; i < num_act_message; i++) {
612  // Check for wing rotation feedback
613  if ((feedback_msg[i].set.position) && (feedback_msg[i].idx == SERVO_ROTATION_MECH_IDX)) {
614  // Get wing rotation angle from sensor
615  float wing_angle_rad = 0.5 * M_PI - feedback_msg[i].position;
616  rotwing_state_skewing.wing_angle_deg = DegOfRad(wing_angle_rad);
617 
618  // Bound wing rotation angle
619  Bound(rotwing_state_skewing.wing_angle_deg, 0, 90.);
620  }
621  }
622 
623  // Sanity check that index is valid
624  int idx = feedback_msg[i].idx;
625  if (feedback_msg[i].set.rpm) {
626  if ((idx == SERVO_MOTOR_FRONT_IDX) || (idx == SERVO_BMOTOR_FRONT_IDX)) {
627  rotwing_state_hover_rpm[0] = feedback_msg->rpm;
628  } else if ((idx == SERVO_MOTOR_RIGHT_IDX) || (idx == SERVO_BMOTOR_RIGHT_IDX)) {
629  rotwing_state_hover_rpm[1] = feedback_msg->rpm;
630  } else if ((idx == SERVO_MOTOR_BACK_IDX) || (idx == SERVO_BMOTOR_BACK_IDX)) {
631  rotwing_state_hover_rpm[2] = feedback_msg->rpm;
632  } else if ((idx == SERVO_MOTOR_LEFT_IDX) || (idx == SERVO_BMOTOR_LEFT_IDX)) {
633  rotwing_state_hover_rpm[3] = feedback_msg->rpm;
634  }
635  }
636  }
637 }
638 
639 void guidance_indi_hybrid_set_wls_settings(float body_v[3], float roll_angle, float pitch_angle)
640 {
641  float pitch_priority_factor = 11.;
642  float roll_priority_factor = 10.;
643  float thrust_priority_factor = 7.;
644  float pusher_priority_factor = 30.;
645 
646  float horizontal_accel_weight = 10.;
647  float vertical_accel_weight = 10.;
648 
649  // Set weights
650  Wu_gih[0] = roll_priority_factor * 10.414;
651  Wu_gih[1] = pitch_priority_factor * 27.53;
652  Wu_gih[2] = thrust_priority_factor * 0.626;
653  Wu_gih[3] = pusher_priority_factor * 1.0;
654 
655  // adjust weights
656  float thrust_command = (actuator_state_filt_vect[0] + actuator_state_filt_vect[1] + actuator_state_filt_vect[2] +
657  actuator_state_filt_vect[3]) / 4;
658  Bound(thrust_command, 0, MAX_PPRZ);
659  float fixed_wing_percentage = !hover_motors_active; // TODO: when hover props go below 40%, ...
660  Bound(fixed_wing_percentage, 0, 1);
661 #define AIRSPEED_IMPORTANCE_IN_FORWARD_WEIGHT 16
662 
663  Wv_gih[0] = horizontal_accel_weight * (1.0f + fixed_wing_percentage *
664  AIRSPEED_IMPORTANCE_IN_FORWARD_WEIGHT); // stall n low hover motor_off (weight 16x more important than vertical weight)
665  Wv_gih[1] = horizontal_accel_weight;
666  Wv_gih[2] = vertical_accel_weight;
667 
668  struct FloatEulers eulers_zxy;
670 
671  // Evaluate motors_on boolean
672  if (!hover_motors_active) {
673  if (stateGetAirspeed_f() < 15.) {
674  hover_motors_active = true;
676  } else if (eulers_zxy.theta > RadOfDeg(15.0)) {
677  hover_motors_active = true;
679  }
680  } else {
682  }
683 
684  float du_min_thrust_z = ((MAX_PPRZ - actuator_state_filt_vect[0]) * g1g2[3][0] + (MAX_PPRZ -
687  Bound(du_min_thrust_z, -50., 0.);
688  float du_max_thrust_z = -(actuator_state_filt_vect[0] * g1g2[3][0] + actuator_state_filt_vect[1] * g1g2[3][1] +
690  Bound(du_max_thrust_z, 0., 50.);
691 
692  float roll_limit_rad = 2.0; // big roll limit hacked in to overcome wls problems at roll limit
693  float max_pitch_limit_rad = RadOfDeg(GUIDANCE_INDI_MAX_PITCH);
694  float min_pitch_limit_rad = RadOfDeg(GUIDANCE_INDI_MIN_PITCH);
695 
696  float scheduled_pitch_angle = 0;
697  float pitch_angle_range = 3.;
699  scheduled_pitch_angle = 0;
700  } else {
701  float pitch_progression = (rotwing_state_skewing.wing_angle_deg - 55) / 35.;
702  scheduled_pitch_angle = pitch_angle_range * pitch_progression;
703  }
704  if (!hover_motors_active) {
705  scheduled_pitch_angle = 8.;
706  }
707  Bound(scheduled_pitch_angle, -5., 8.);
708  guidance_indi_pitch_pref_deg = scheduled_pitch_angle;
709 
710  float pitch_pref_rad = RadOfDeg(guidance_indi_pitch_pref_deg);
711 
712  // Set lower limits
713  du_min_gih[0] = -roll_limit_rad - roll_angle; //roll
714  du_min_gih[1] = min_pitch_limit_rad - pitch_angle; // pitch
715  du_min_gih[2] = du_min_thrust_z;
716  du_min_gih[3] = (-actuator_state_filt_vect[8] * g1g2[4][8]);
717 
718  // Set upper limits limits
719  du_max_gih[0] = roll_limit_rad - roll_angle; //roll
720  du_max_gih[1] = max_pitch_limit_rad - pitch_angle; // pitch
721  du_max_gih[2] = du_max_thrust_z;
722  du_max_gih[3] = 9.0; // Hacky value to prevent drone from pitching down in transition
723 
724  // Set prefered states
725  du_pref_gih[0] = 0; // prefered delta roll angle
726  du_pref_gih[1] = -pitch_angle + pitch_pref_rad;// prefered delta pitch angle
727  du_pref_gih[2] = du_max_gih[2]; // Low thrust better for efficiency
728  du_pref_gih[3] = body_v[0]; // solve the body acceleration
729 }
Main include for ABI (AirBorneInterface).
Event structure to store callbacks in a linked list.
Definition: abi_common.h:67
#define ACT_FEEDBACK_UAVCAN_ID
struct pprz_autopilot autopilot
Global autopilot structure.
Definition: autopilot.c:49
bool in_flight
in flight status
Definition: autopilot.h:70
uint8_t last_wp UNUSED
float theta
in radians
void float_eulers_of_quat_zxy(struct FloatEulers *e, struct FloatQuat *q)
euler rotation 'ZXY' This rotation order is useful if you need 90 deg pitch
euler angles
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
Definition: state.h:1131
struct State state
Definition: state.c:36
static float stateGetAirspeed_f(void)
Get airspeed (float).
Definition: state.h:1407
struct FloatVect3 speed_sp
Definition: guidance_indi.c:77
bool force_forward
forward flight for hybrid nav
float guidance_indi_pitch_pref_deg
struct FloatEulers eulers_zxy
state eulers in zxy order
A guidance mode based on Incremental Nonlinear Dynamic Inversion Come to ICRA2016 to learn more!
#define GUIDANCE_INDI_MAX_PITCH
#define GUIDANCE_INDI_MIN_PITCH
Hardware independent API for actuators (servos, motor controllers).
uint8_t idx
General index of the actuators (generated in airframe.h)
Definition: actuators.h:45
float nav_max_speed
Specific navigation functions for hybrid aircraft.
static uint32_t idx
#define MAX_PPRZ
Definition: paparazzi.h:8
Rotorcraft specific autopilot interface and initialization.
struct HorizontalGuidance guidance_h
Definition: guidance_h.c:50
#define GUIDANCE_H_MODE_FORWARD
Definition: guidance_h.h:63
#define GUIDANCE_H_MODE_NAV
Definition: guidance_h.h:60
#define GUIDANCE_H_MODE_ATTITUDE
Definition: guidance_h.h:58
void init_rotwing_state(void)
static void rotwing_state_feedback_cb(uint8_t sender_id, struct act_feedback_t *feedback_msg, uint8_t num_act)
struct RotWingStateSettings rotwing_state_settings
void rotwing_state_set_fw_settings(void)
void rotwing_switch_state(void)
#define ROTWING_MIN_SKEW_ANGLE_COUNTER
Definition: rotwing_state.c:40
#define ROTWING_MIN_FW_SKEW_ANGLE_DEG
Definition: rotwing_state.c:66
void rotwing_state_skew_actuator_periodic(void)
#define ROTWING_MIN_FW_COUNTER
Definition: rotwing_state.c:69
void request_rotwing_state(uint8_t state)
void rotwing_state_set_state_settings(void)
#define ROTWING_MAX_QUAD_AIRSPEED
Definition: rotwing_state.c:50
#define ROTWING_MIN_THRUST_IDLE
Definition: rotwing_state.c:74
struct RotwingState rotwing_state
uint8_t rotwing_state_hover_counter
#define ROTWING_HOV_MOT_OFF_RPM_TH
Definition: rotwing_state.c:82
float rotwing_state_max_hover_speed
struct RotWingStateSkewing rotwing_state_skewing
#define ROTWING_MIN_THRUST_IDLE_COUNTER
Definition: rotwing_state.c:77
uint8_t rotwing_state_fw_idle_counter
uint8_t rotwing_state_skewing_counter
uint8_t rotwing_state_fw_counter
#define ROTWING_STATE_NUM_HOVER_RPM
bool bool_disable_hover_motors
#define AIRSPEED_IMPORTANCE_IN_FORWARD_WEIGHT
void rotwing_state_set_fw_hov_mot_off_settings(void)
int32_t rotwing_state_hover_rpm[ROTWING_STATE_NUM_HOVER_RPM]
uint8_t rotwing_state_fw_m_off_counter
void rotwing_state_set_skewing_settings(void)
void rotwing_check_set_current_state(void)
void rotwing_state_skewer(void)
void rotwing_state_set_hover_settings(void)
#define ROTWING_MIN_SKEW_ANGLE_DEG_QUAD
Definition: rotwing_state.c:37
static void send_rotating_wing_state(struct transport_tx *trans, struct link_device *dev)
bool hover_motors_active
#define ROTWING_STATE_ACT_FEEDBACK_ID
ABI binding feedback data.
void rotwing_request_configuration(uint8_t configuration)
abi_event rotwing_state_feedback_ev
#define ROTWING_HOV_MOT_OFF_COUNTER
Definition: rotwing_state.c:85
void guidance_indi_hybrid_set_wls_settings(float body_v[3], float roll_angle, float pitch_angle)
void rotwing_state_set_fw_hov_mot_idle_settings(void)
void periodic_rotwing_state(void)
uint8_t current_state
Definition: rotwing_state.h:47
#define ROTWING_CONFIGURATION_HYBRID
Definition: rotwing_state.h:43
#define ROTWING_STATE_FW
Definition: rotwing_state.h:35
uint8_t desired_state
Definition: rotwing_state.h:48
#define ROTWING_STATE_SKEWING
Definition: rotwing_state.h:34
#define ROTWING_STATE_FW_HOV_MOT_IDLE
Definition: rotwing_state.h:36
#define ROTWING_STATE_HOVER
Rotwing States.
Definition: rotwing_state.h:33
#define ROTWING_STATE_PITCH_FW_SETTING
Definition: rotwing_state.h:57
#define ROTWING_STATE_WING_FW_SETTING
Definition: rotwing_state.h:53
#define ROTWING_CONFIGURATION_HOVER
Rotwing Configurations.
Definition: rotwing_state.h:42
#define ROTWING_STATE_PITCH_TRANSITION_SETTING
Definition: rotwing_state.h:56
#define ROTWING_STATE_PITCH_QUAD_SETTING
Definition: rotwing_state.h:55
#define ROTWING_STATE_FW_HOV_MOT_OFF
Definition: rotwing_state.h:37
#define ROTWING_STATE_WING_QUAD_SETTING
Definition: rotwing_state.h:51
#define ROTWING_STATE_WING_SCHEDULING_SETTING
Definition: rotwing_state.h:52
#define ROTWING_CONFIGURATION_EFFICIENT
Definition: rotwing_state.h:44
int32_t stabilization_cmd[COMMANDS_NB]
Stabilization commands.
Definition: stabilization.c:34
float g1g2[INDI_OUTPUTS][INDI_NUM_ACT]
float actuator_state_filt_vect[INDI_NUM_ACT]
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
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
Definition: vl53l1_types.h:88
int int32_t
Typedef defining 32 bit int type.
Definition: vl53l1_types.h:83
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98