Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
rotwing_state_V2.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2023 Tomaso De Ponti <T.M.L.DePonti@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 
28 #include "modules/core/commands.h"
30 #include "modules/core/abi.h"
31 
32 // Quad state identification
33 #ifndef ROTWING_MIN_SKEW_ANGLE_DEG_QUAD
34 #define ROTWING_MIN_SKEW_ANGLE_DEG_QUAD 10.0
35 #endif
36 
37 #ifndef ROTWING_MIN_SKEW_ANGLE_COUNTER
38 #define ROTWING_MIN_SKEW_ANGLE_COUNTER 10 // Minimum number of loops the skew angle is below ROTWING_MIN_SKEW_ANGLE_COUNTER
39 #endif
40 
41 // Skewing state identification
42 #ifndef ROTWING_SKEWING_COUNTER
43 #define ROTWING_SKEWING_COUNTER 10 // Minimum number of loops the skew angle is in between QUAD and FW
44 #endif
45 
46 // maximum quad airspeed to force quad state
47 #ifndef ROTWING_MAX_QUAD_AIRSPEED
48 #define ROTWING_MAX_QUAD_AIRSPEED 20.0
49 #endif
50 
51 // Half skew state identification
52 #ifndef ROTWING_HALF_SKEW_ANGLE_DEG
53 #define ROTWING_HALF_SKEW_ANGLE_DEG 55.0
54 #endif
55 
56 #ifndef ROTWING_HALF_SKEW_ANGLE_RANG
57 #define ROTWING_HALF_SKEW_ANGLE_HALF_RANGE 10.0
58 #endif
59 
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 
69 #ifndef ROTWING_MIN_FW_COUNTER
70 #define ROTWING_MIN_FW_COUNTER 10 // Minimum number of loops the skew angle is above the MIN_FW_SKEW_ANGLE
71 #endif
72 
73 // FW idle state identification
74 #ifndef ROTWING_MIN_THRUST_IDLE
75 #define ROTWING_MIN_THRUST_IDLE 100
76 #endif
77 
78 #ifndef ROTWING_MIN_THRUST_IDLE_COUNTER
79 #define ROTWING_MIN_THRUST_IDLE_COUNTER 10
80 #endif
81 
82 // FW hov mot off state identification
83 #ifndef ROTWING_HOV_MOT_RUN_RPM_TH
84 #define ROTWING_HOV_MOT_RUN_RPM_TH 800
85 #endif
86 #ifndef ROTWING_HOV_MOT_OFF_RPM_TH
87 #define ROTWING_HOV_MOT_OFF_RPM_TH 50
88 #endif
89 
90 #ifndef ROTWING_HOV_MOT_OFF_COUNTER
91 #define ROTWING_HOV_MOT_OFF_COUNTER 10
92 #endif
93 
94 #ifndef ROTWING_STATE_USE_ROTATION_REF_MODEL
95 #define ROTWING_STATE_USE_ROTATION_REF_MODEL FALSE
96 #endif
97 
98 // Hover preferred pitch (deg)
99 #ifndef ROTWING_STATE_HOVER_PREF_PITCH
100 #define ROTWING_STATE_HOVER_PREF_PITCH 0.0
101 #endif
102 
103 // Transition preferred pitch (deg)
104 #ifndef ROTWING_STATE_TRANSITION_PREF_PITCH
105 #define ROTWING_STATE_TRANSITION_PREF_PITCH 3.0
106 #endif
107 
108 // Forward preferred pitch (deg)
109 #ifndef ROTWING_STATE_FW_PREF_PITCH
110 #define ROTWING_STATE_FW_PREF_PITCH 8.0
111 #endif
112 
113 // Make sure the rotmech dynamics are provided if the virtual rotmech is used
114 #ifndef USE_ROTMECH_VIRTUAL
115 #define USE_ROTMECH_VIRTUAL FALSE
116 #endif
117 
118 #if USE_ROTMECH_VIRTUAL
119 #ifndef ROTMECH_DYN
120 #error "Rotmech dynamics are not provided. Please provide them in your airframe file."
121 #endif
122 #endif
123 
124 // stream ADC data if ADC rotation sensor
125 #ifndef ADC_WING_ROTATION
126 #define ADC_WING_ROTATION FALSE
127 #endif
128 #if ADC_WING_ROTATION
130 #endif
133 #ifndef ROTWING_STATE_ACT_FEEDBACK_ID
134 #define ROTWING_STATE_ACT_FEEDBACK_ID ABI_BROADCAST
135 #endif
137 static void rotwing_state_feedback_cb(uint8_t sender_id, struct act_feedback_t *feedback_msg, uint8_t num_act);
138 #define ROTWING_STATE_NUM_HOVER_RPM 4
140 
144 
150 
152 #ifdef NAV_HYBRID_MAX_AIRSPEED
154 #else
156 #endif
157 
160 
161 inline void rotwing_check_set_current_state(void);
162 inline void rotwing_switch_state(void);
163 
164 inline void rotwing_state_set_hover_settings(void);
165 inline void rotwing_state_set_skewing_settings(void);
166 inline void rotwing_state_set_fw_settings(void);
169 
170 inline void rotwing_state_set_state_settings(void);
171 inline void rotwing_state_skewer(void);
172 inline void rotwing_state_free_processor(void);
173 
174 #if PERIODIC_TELEMETRY
176 static void send_rotating_wing_state(struct transport_tx *trans, struct link_device *dev)
177 {
178  uint16_t adc_dummy = 0;
179 
180  pprz_msg_send_ROTATING_WING_STATE(trans, dev, AC_ID,
185  &adc_dummy,
187 }
188 #endif // PERIODIC_TELEMETRY
189 
191 {
193 }
194 
196 {
197  // Bind ABI messages
199 
200  // Start the drone in a desired hover state
204 
206 
212 
213 #if PERIODIC_TELEMETRY
214  register_periodic_telemetry(DefaultPeriodic, PPRZ_MSG_ID_ROTATING_WING_STATE, send_rotating_wing_state);
215 #endif
216 }
217 
219 {
220  // Check and set the current state
222 
223  // Check and update desired state
225  // Run the free state requester if free configuration requestes
228  }
230  } else if (guidance_h.mode == GUIDANCE_H_MODE_NONE) {
234  } else {
236  }
237  }
238  }
239  // } else {
240  // rotwing_switch_state();
241  // }
242 
243  // Run the wing skewer
245 
246  //TODO: incorparate motor active / disbaling depending on called flight state
247  // Switch on motors if flight mode is attitude
250  }
251  struct FloatEulers eulers_zxy;
253 
254  // Evaluate motors_on boolean
255  if (!hover_motors_active) {
256  if (stateGetAirspeed_f() < 15.) {
257  hover_motors_active = true;
259  } else if (eulers_zxy.theta > RadOfDeg(15.0)) {
260  hover_motors_active = true;
262  }
263  } else {
265  }
267  // Calculate scheduled pitch angle
271  break;
274  break;
277  break;
278  }
279 }
280 
281 // Function to request a state
283 {
286  }
287 }
288 
289 // Function to prefer configuration
291 {
292  switch (configuration) {
296  break;
300  break;
304  break;
307  break;
308  }
309 }
310 
312 {
313  float current_thrust = (commands[COMMAND_MOTOR_FRONT] + commands[COMMAND_MOTOR_RIGHT] + commands[COMMAND_MOTOR_BACK] + commands[COMMAND_MOTOR_LEFT])/4.0;
314  // if !in_flight, set state to hover
315  if (!autopilot.in_flight) {
322  return;
323  }
324 
325  // States can be checked according to wing angle sensor, setpoints .....
326  uint8_t prev_state = rotwing_state.current_state;
327  switch (prev_state) {
328  case ROTWING_STATE_HOVER:
329  // Check if state needs to be set to skewing
332  } else {
334  }
335 
336  // Switch state if necessary
340  }
341  break;
342 
344  // Check if state needs to be set to hover
347  } else {
349  }
350 
351  // Check if state needs to be set to fixed wing
354  } else {
356  }
357 
358  // Switch state if necessary
362  }
363 
367  }
368  break;
369 
370  case ROTWING_STATE_FW:
371  // Check if state needs to be set to skewing
374  } else {
376  }
377 
378  // Check if state needs to be set to fixed wing with hover motors idle (If hover thrust below threshold)
379  if (current_thrust < ROTWING_MIN_THRUST_IDLE && rotwing_state.desired_state > ROTWING_STATE_FW) {
381  } else {
383  }
384 
385  // Switch state if necessary
395  }
396  break;
397 
399  // Check if state needs to be set to fixed wing with hover motors activated
400  if (current_thrust > ROTWING_MIN_THRUST_IDLE
403  } else {
405  }
406  // Check if state needs to be set to fixed wing with hover motors off (if zero rpm on hover motors)
407  if (rotwing_state_hover_rpm[0] == 0
408  && rotwing_state_hover_rpm[1] == 0
409  && rotwing_state_hover_rpm[2] == 0
410  && rotwing_state_hover_rpm[3] == 0) {
411 #if !USE_NPS
413 #endif
414  } else {
416  }
417 
418  // Switch state if necessary
424  && rotwing_state_fw_counter == 0) {
428  }
429  break;
430 
432  // Check if state needs to be set to fixed wing with hover motors idle (if rpm on hover motors)
438  } else {
440  }
441 
442  // Switch state if necessary
446  }
447  break;
448 
449  default:
450  break;
451  }
452 }
453 
454 // Function that handles settings for switching state(s)
456 {
457  switch (rotwing_state.current_state) {
458  case ROTWING_STATE_HOVER:
461  } else {
463  }
464  break;
465 
469  } else {
471  }
472  break;
473 
474  case ROTWING_STATE_FW:
479  } else {
481  }
482  break;
483 
489  } else {
491  }
492  break;
493 
497  } else {
499  }
500  break;
501  }
502 }
503 
505 {
516 }
517 
519 {
520  // Wing may be skewed to quad when desired state is hover and skewing settings set by state machine
523  } else {
525  }
533  rotwing_state_settings.nav_max_speed = rotwing_state_max_fw_speed;// Big as we use airspeed guidance
535 }
536 
538 {
547  rotwing_state_settings.nav_max_speed = rotwing_state_max_fw_speed; // Big as we use airspeed guidance
548  //rotwing_state_settings.nav_max_speed = 100; // Big as we use airspeed guidance
550 }
551 
553 {
562  rotwing_state_settings.nav_max_speed = rotwing_state_max_fw_speed; // Big as we use airspeed guidance
564 }
565 
567 {
576  rotwing_state_settings.nav_max_speed = rotwing_state_max_fw_speed; // Big as we use airspeed guidance
578 }
579 
581 {
587  break;
590  break;
593  break;
594  }
595  } else {
597  }
598 
600 
602 
604 
607 
608  // TO DO: pitch angle now hard coded scheduled by wing angle
609 
610  // Stall protection handled by hover_motors_active boolean
611 
612  // TO DO: Climb and descend speeds now handled by guidance airspeed
613 }
614 
616 {
618  float wing_angle_scheduled_sp_deg = 0;
619  float airspeed = stateGetAirspeed_f();
620  if (airspeed < 8) {
621  wing_angle_scheduled_sp_deg = 0;
622  } else if (airspeed < 10 && (rotwing_state.desired_state > ROTWING_STATE_HOVER)) {
623  wing_angle_scheduled_sp_deg = ROTWING_HALF_SKEW_ANGLE_DEG;
624  } else if (airspeed > 10) {
625  wing_angle_scheduled_sp_deg = ((airspeed - 10.)) / 4. * (90.-ROTWING_HALF_SKEW_ANGLE_DEG) + ROTWING_HALF_SKEW_ANGLE_DEG;
626  } else {
627  wing_angle_scheduled_sp_deg = 0;
628  }
629 
630  Bound(wing_angle_scheduled_sp_deg, 0., 90.)
631  rotwing_state_skewing.wing_angle_deg_sp = wing_angle_scheduled_sp_deg;
632  }
633 }
634 
636 {
637  // Get current speed vector
638  struct EnuCoor_f *groundspeed = stateGetSpeedEnu_f();
639  float current_groundspeed = FLOAT_VECT2_NORM(*groundspeed);
640 
641  // Get current airspeed
642  float airspeed = stateGetAirspeed_f();
643 
644  // Get windspeed vector
645  struct FloatEulers eulers_zxy;
647 
648  float psi = eulers_zxy.psi;
649  float cpsi = cosf(psi);
650  float spsi = sinf(psi);
651  struct FloatVect2 airspeed_v = { spsi * airspeed, cpsi * airspeed };
652  struct FloatVect2 windspeed_v;
653  VECT2_DIFF(windspeed_v, *groundspeed, airspeed_v);
654 
655  // Get goto target information
656  struct FloatVect2 pos_error;
657  struct EnuCoor_f *pos = stateGetPositionEnu_f();
658  VECT2_DIFF(pos_error, nav_rotorcraft_base.goto_wp.to, *pos);
659 
660  /*
661  Calculations
662  */
663  // speed over pos_error projection
664  struct FloatVect2 pos_error_norm;
665  VECT2_COPY(pos_error_norm, pos_error);
666  float_vect2_normalize(&pos_error_norm);
667  float dist_to_target = sqrtf(nav_rotorcraft_base.goto_wp.dist2_to_wp);
668  float max_speed_decel2 = fabsf(2.f * dist_to_target * nav_max_deceleration_sp); // dist_to_wp can only be positive, but just in case
669  float max_speed_decel = sqrtf(max_speed_decel2);
670 
671  // Check if speed setpoint above set airspeed
672  struct FloatVect2 desired_airspeed_v;
673  struct FloatVect2 groundspeed_sp;
674  groundspeed_sp.x = pos_error.x * nav_hybrid_pos_gain;
675  groundspeed_sp.y = pos_error.y * nav_hybrid_pos_gain;
676  VECT2_COPY(desired_airspeed_v, groundspeed_sp);
677  VECT2_ADD(desired_airspeed_v, windspeed_v);
678 
679  float desired_airspeed = FLOAT_VECT2_NORM(desired_airspeed_v);
680  float airspeed_error = rotwing_state_max_fw_speed - airspeed;
681 
682  // Request hybrid if we have to decelerate and approaching target
683  if (max_speed_decel < current_groundspeed) {
685  } else if ((desired_airspeed > 15) && ((current_groundspeed + airspeed_error) < max_speed_decel)) {
687  }
688 }
689 
691 {
692 
693  // calc rotation percentage of setpoint (0 deg = -1, 45 deg = 0, 90 deg = 1)
694  float wing_rotation_percentage = (rotwing_state_skewing.wing_angle_deg_sp - 45.) / 45.;
695  Bound(wing_rotation_percentage, -1., 1.);
696 
697  float servo_pprz_cmd = MAX_PPRZ * wing_rotation_percentage;
698  // Calulcate rotation_cmd
699  Bound(servo_pprz_cmd, -MAX_PPRZ, MAX_PPRZ);
700 
701 #if ROTWING_STATE_USE_ROTATION_REF_MODEL
702  // Rotate with second order filter
703  static float rotwing_state_skew_p_cmd = -MAX_PPRZ;
704  static float rotwing_state_skew_d_cmd = 0;
705  float speed_sp = 0.001 * (servo_pprz_cmd - rotwing_state_skew_p_cmd);
706  rotwing_state_skew_d_cmd += 0.003 * (speed_sp - rotwing_state_skew_d_cmd);
707  rotwing_state_skew_p_cmd += rotwing_state_skew_d_cmd;
708  Bound(rotwing_state_skew_p_cmd, -MAX_PPRZ, MAX_PPRZ);
709  rotwing_state_skewing.servo_pprz_cmd = rotwing_state_skew_p_cmd;
710 #else
711  // Directly controlling the wing rotation
712  rotwing_state_skewing.servo_pprz_cmd = servo_pprz_cmd;
713 #endif
714 
715 #if USE_NPS
716  // Export to the index of the SKEW in the NPS_ACTUATOR_NAMES array
717  commands[COMMAND_ROT_MECH] = (rotwing_state_skewing.servo_pprz_cmd + MAX_PPRZ) / 2.; // Scale to simulation command
718 
719 #if USE_ROTMECH_VIRTUAL
720  // Calculate discrete first order dynamics of rot mech
721  float dyn_dis = 1.0-exp(-ROTMECH_DYN / PERIODIC_FREQUENCY);
722  // Simulate wing angle from command
723  float prev_rotmech_state = rotwing_state_skewing.wing_angle_deg;
724  rotwing_state_skewing.wing_angle_deg = prev_rotmech_state + dyn_dis * (rotwing_state_skewing.wing_angle_deg_sp - prev_rotmech_state);
725 #else
726  // Simulate wing angle from command
728 #endif // USE_ROTMECH_VIRTUAL
729  // SEND ABI Message to ctr_eff_sched and other modules that want Actuator position feedback
730  struct act_feedback_t feedback;
731  feedback.idx = COMMAND_ROT_MECH;
732  feedback.position = 0.5 * M_PI - RadOfDeg(rotwing_state_skewing.wing_angle_deg);
733  feedback.set.position = true;
734  // Send ABI message
735  AbiSendMsgACT_FEEDBACK(ACT_FEEDBACK_UAVCAN_ID, &feedback, 1);
736 #else
737  commands[COMMAND_ROT_MECH] = rotwing_state_skewing.servo_pprz_cmd;
738 #endif // USE_NPS
739 }
740 
741 static void rotwing_state_feedback_cb(uint8_t __attribute__((unused)) sender_id,
742  struct act_feedback_t UNUSED *feedback_msg, uint8_t UNUSED num_act_message)
743 {
744  for (int i = 0; i < num_act_message; i++) {
745 
746  for (int i = 0; i < num_act_message; i++) {
747  // Check for wing rotation feedback
748  if ((feedback_msg[i].set.position) && (feedback_msg[i].idx == COMMAND_ROT_MECH)) {
749  // Get wing rotation angle from sensor
750  float wing_angle_rad = 0.5 * M_PI - feedback_msg[i].position;
751  rotwing_state_skewing.wing_angle_deg = DegOfRad(wing_angle_rad);
752 
753  // Bound wing rotation angle
754  Bound(rotwing_state_skewing.wing_angle_deg, 0, 90.);
755  }
756  }
757 
758  // Sanity check that index is valid
759  int idx = feedback_msg[i].idx;
760  if (feedback_msg[i].set.rpm) {
761  if ((idx == SERVO_MOTOR_FRONT_IDX) || (idx == SERVO_BMOTOR_FRONT_IDX)) {
762  rotwing_state_hover_rpm[0] = feedback_msg->rpm;
763  } else if ((idx == SERVO_MOTOR_RIGHT_IDX) || (idx == SERVO_BMOTOR_RIGHT_IDX)) {
764  rotwing_state_hover_rpm[1] = feedback_msg->rpm;
765  } else if ((idx == SERVO_MOTOR_BACK_IDX) || (idx == SERVO_BMOTOR_BACK_IDX)) {
766  rotwing_state_hover_rpm[2] = feedback_msg->rpm;
767  } else if ((idx == SERVO_MOTOR_LEFT_IDX) || (idx == SERVO_BMOTOR_LEFT_IDX)) {
768  rotwing_state_hover_rpm[3] = feedback_msg->rpm;
769  }
770  }
771  }
772 }
773 
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
pprz_t commands[COMMANDS_NB]
Definition: commands.c:30
Hardware independent code for commands handling.
uint8_t last_wp UNUSED
float theta
in radians
float psi
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
static void float_vect2_normalize(struct FloatVect2 *v)
normalize 2D vector in place
#define FLOAT_VECT2_NORM(_v)
euler angles
#define VECT2_ADD(_a, _b)
Definition: pprz_algebra.h:74
#define VECT2_DIFF(_c, _a, _b)
Definition: pprz_algebra.h:92
#define VECT2_COPY(_a, _b)
Definition: pprz_algebra.h:68
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
Definition: state.h:1131
struct State state
Definition: state.c:36
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
Definition: state.h:719
static struct EnuCoor_f * stateGetSpeedEnu_f(void)
Get ground speed in local ENU coordinates (float).
Definition: state.h:917
static float stateGetAirspeed_f(void)
Get airspeed (float).
Definition: state.h:1407
struct FloatVect3 speed_sp
Definition: guidance_indi.c:73
bool force_forward
forward flight for hybrid nav
struct FloatEulers eulers_zxy
state eulers in zxy order
struct FloatVect2 desired_airspeed
Hardware independent API for actuators (servos, motor controllers).
uint8_t idx
General index of the actuators (generated in airframe.h)
Definition: actuators.h:45
struct NavGoto_t goto_wp
Definition: nav_base.h:63
struct EnuCoor_f to
end WP position
Definition: nav_base.h:37
float dist2_to_wp
squared distance to next waypoint
Definition: nav_base.h:38
struct NavBase_t nav_rotorcraft_base
Basic Nav struct.
float nav_max_deceleration_sp
#define NAV_HYBRID_MAX_AIRSPEED
float nav_max_speed
float nav_hybrid_pos_gain
float nav_goto_max_speed
static uint32_t idx
#define MAX_PPRZ
Definition: paparazzi.h:8
vector in East North Up coordinates Units: meters
Rotorcraft specific autopilot interface and initialization.
struct HorizontalGuidance guidance_h
Definition: guidance_h.c:45
#define GUIDANCE_H_MODE_NAV
Definition: guidance_h.h:58
#define GUIDANCE_H_MODE_NONE
Definition: guidance_h.h:56
#define ROTWING_CONFIGURATION_HYBRID
Definition: rotwing_state.h:43
#define ROTWING_STATE_FW
Definition: rotwing_state.h:35
#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:59
#define ROTWING_STATE_WING_FW_SETTING
Definition: rotwing_state.h:55
#define ROTWING_CONFIGURATION_HOVER
Rotwing Configurations.
Definition: rotwing_state.h:42
#define ROTWING_CONFIGURATION_FREE
Definition: rotwing_state.h:45
#define ROTWING_STATE_PITCH_TRANSITION_SETTING
Definition: rotwing_state.h:58
#define ROTWING_STATE_PITCH_QUAD_SETTING
Definition: rotwing_state.h:57
#define ROTWING_STATE_FW_HOV_MOT_OFF
Definition: rotwing_state.h:37
#define ROTWING_STATE_WING_QUAD_SETTING
Definition: rotwing_state.h:53
#define ROTWING_STATE_WING_SCHEDULING_SETTING
Definition: rotwing_state.h:54
#define ROTWING_CONFIGURATION_EFFICIENT
Definition: rotwing_state.h:44
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
#define ROTWING_STATE_FW_PREF_PITCH
#define ROTWING_MIN_FW_SKEW_ANGLE_DEG
void rotwing_state_skew_actuator_periodic(void)
#define ROTWING_MIN_FW_COUNTER
void request_rotwing_state(uint8_t state)
void rotwing_state_set_state_settings(void)
#define ROTWING_MAX_QUAD_AIRSPEED
void rotwing_state_force_skew_off(void)
#define ROTWING_MIN_THRUST_IDLE
struct RotwingState rotwing_state
uint8_t rotwing_state_hover_counter
#define ROTWING_HOV_MOT_OFF_RPM_TH
float rotwing_state_max_hover_speed
float rotwing_state_max_fw_speed
struct RotWingStateSkewing rotwing_state_skewing
#define ROTWING_MIN_THRUST_IDLE_COUNTER
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
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_STATE_TRANSITION_PREF_PITCH
#define ROTWING_STATE_HOVER_PREF_PITCH
#define ROTWING_MIN_SKEW_ANGLE_DEG_QUAD
static void send_rotating_wing_state(struct transport_tx *trans, struct link_device *dev)
void rotwing_state_free_processor(void)
bool hover_motors_active
#define ROTWING_HALF_SKEW_ANGLE_DEG
#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
void rotwing_state_set_fw_hov_mot_idle_settings(void)
void periodic_rotwing_state(void)
uint8_t current_state
Definition: rotwing_state.h:48
uint8_t requested_config
Definition: rotwing_state.h:50
uint8_t desired_state
Definition: rotwing_state.h:49
struct Stabilization stabilization
Definition: stabilization.c:41
uint8_t mode
current mode
#define STABILIZATION_MODE_ATTITUDE
Definition: stabilization.h:41
uint8_t att_submode
current attitude sub-mode
#define STABILIZATION_ATT_SUBMODE_FORWARD
Definition: stabilization.h:47
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