36 #ifndef ROTWING_MIN_SKEW_ANGLE_DEG_QUAD
37 #define ROTWING_MIN_SKEW_ANGLE_DEG_QUAD 10.0
39 #ifndef ROTWING_MIN_SKEW_ANGLE_COUNTER
40 #define ROTWING_MIN_SKEW_ANGLE_COUNTER 10
44 #ifndef ROTWING_SKEWING_COUNTER
45 #define ROTWING_SKEWING_COUNTER 10
49 #ifndef ROTWING_MAX_QUAD_AIRSPEED
50 #define ROTWING_MAX_QUAD_AIRSPEED 20.0
54 #ifndef ROTWING_HALF_SKEW_ANGLE_DEG
55 #define ROTWING_HALF_SKEW_ANGLE_DEG 55.0
57 #ifndef ROTWING_HALF_SKEW_ANGLE_RANG
58 #define ROTWING_HALF_SKEW_ANGLE_HALF_RANGE 10.0
60 #ifndef ROTWING_HALF_SKEW_COUNTER
61 #define ROTWING_HALF_SKEW_COUNTER 10
65 #ifndef ROTWING_MIN_FW_SKEW_ANGLE_DEG
66 #define ROTWING_MIN_FW_SKEW_ANGLE_DEG 80.0
68 #ifndef ROTWING_MIN_FW_COUNTER
69 #define ROTWING_MIN_FW_COUNTER 10
73 #ifndef ROTWING_MIN_THRUST_IDLE
74 #define ROTWING_MIN_THRUST_IDLE 100
76 #ifndef ROTWING_MIN_THRUST_IDLE_COUNTER
77 #define ROTWING_MIN_THRUST_IDLE_COUNTER 10
81 #ifndef ROTWING_HOV_MOT_RUN_RPM_TH
82 #define ROTWING_HOV_MOT_RUN_RPM_TH 800
84 #ifndef ROTWING_HOV_MOT_OFF_RPM_TH
85 #define ROTWING_HOV_MOT_OFF_RPM_TH 50
87 #ifndef ROTWING_HOV_MOT_OFF_COUNTER
88 #define ROTWING_HOV_MOT_OFF_COUNTER 10
91 #ifndef ROTWING_STATE_USE_ROTATION_REF_MODEL
92 #define ROTWING_STATE_USE_ROTATION_REF_MODEL FALSE
97 #ifndef ROTWING_STATE_HOVER_PREF_PITCH
98 #define ROTWING_STATE_HOVER_PREF_PITCH 0.0
102 #ifndef ROTWING_STATE_TRANSITION_PREF_PITCH
103 #define ROTWING_STATE_TRANSITION_PREF_PITCH 3.0
107 #ifndef ROTWING_STATE_FW_PREF_PITCH
108 #define ROTWING_STATE_FW_PREF_PITCH 8.0
112 #ifndef ADC_WING_ROTATION
113 #define ADC_WING_ROTATION FALSE
115 #if ADC_WING_ROTATION
120 #ifndef ROTWING_STATE_ACT_FEEDBACK_ID
121 #define ROTWING_STATE_ACT_FEEDBACK_ID ABI_BROADCAST
125 #define ROTWING_STATE_NUM_HOVER_RPM 4
160 #if PERIODIC_TELEMETRY
165 pprz_msg_send_ROTATING_WING_STATE(trans,
dev, AC_ID,
191 #if PERIODIC_TELEMETRY
241 switch (configuration) {
275 switch (prev_state) {
567 float wing_angle_scheduled_sp_deg = 0;
570 wing_angle_scheduled_sp_deg = 0;
572 wing_angle_scheduled_sp_deg = 55;
573 }
else if (airspeed > 10) {
574 wing_angle_scheduled_sp_deg = ((airspeed - 10.)) / 4. * 35. + 55.;
576 wing_angle_scheduled_sp_deg = 0;
579 Bound(wing_angle_scheduled_sp_deg, 0., 90.)
598 float cpsi = cosf(
psi);
599 float spsi = sinf(
psi);
600 struct FloatVect2 airspeed_v = { spsi * airspeed, cpsi * airspeed };
602 VECT2_DIFF(windspeed_v, *groundspeed, airspeed_v);
618 float max_speed_decel = sqrtf(max_speed_decel2);
625 VECT2_COPY(desired_airspeed_v, groundspeed_sp);
626 VECT2_ADD(desired_airspeed_v, windspeed_v);
632 if (max_speed_decel < current_groundspeed) {
634 }
else if ((
desired_airspeed > 15) && ((current_groundspeed + airspeed_error) < max_speed_decel)) {
644 Bound(wing_rotation_percentage, -1., 1.);
646 float servo_pprz_cmd =
MAX_PPRZ * wing_rotation_percentage;
650 #if ROTWING_STATE_USE_ROTATION_REF_MODEL
652 static float rotwing_state_skew_p_cmd = -
MAX_PPRZ;
653 static float rotwing_state_skew_d_cmd = 0;
654 float speed_sp = 0.001 * (servo_pprz_cmd - rotwing_state_skew_p_cmd);
655 rotwing_state_skew_d_cmd += 0.003 * (
speed_sp - rotwing_state_skew_d_cmd);
656 rotwing_state_skew_p_cmd += rotwing_state_skew_d_cmd;
673 feedback.
idx = SERVO_ROTATION_MECH_IDX;
675 feedback.set.position =
true;
685 for (
int i = 0; i < num_act_message; i++) {
687 for (
int i = 0; i < num_act_message; i++) {
689 if ((feedback_msg[i].set.position) && (feedback_msg[i].idx == SERVO_ROTATION_MECH_IDX)) {
691 float wing_angle_rad = 0.5 * M_PI - feedback_msg[i].position;
700 int idx = feedback_msg[i].idx;
701 if (feedback_msg[i].set.rpm) {
702 if ((
idx == SERVO_MOTOR_FRONT_IDX) || (
idx == SERVO_BMOTOR_FRONT_IDX)) {
704 }
else if ((
idx == SERVO_MOTOR_RIGHT_IDX) || (
idx == SERVO_BMOTOR_RIGHT_IDX)) {
706 }
else if ((
idx == SERVO_MOTOR_BACK_IDX) || (
idx == SERVO_BMOTOR_BACK_IDX)) {
708 }
else if ((
idx == SERVO_MOTOR_LEFT_IDX) || (
idx == SERVO_BMOTOR_LEFT_IDX)) {
731 Bound(fixed_wing_percentage, 0, 1);
732 #define AIRSPEED_IMPORTANCE_IN_FORWARD_WEIGHT 16
734 float Wv_original[GUIDANCE_INDI_HYBRID_V] = GUIDANCE_INDI_WLS_PRIORITIES;
737 wls_guid_p.Wv[0] = Wv_original[0] * (1.0f + fixed_wing_percentage *
759 Bound(du_min_thrust_z, -50., 0.);
762 Bound(du_max_thrust_z, 0., 50.);
769 float quad_pitch_limit_rad = RadOfDeg(5.0);
771 float scheduled_pitch_angle = 0;
772 float pitch_angle_range = 3.;
774 scheduled_pitch_angle = 0;
776 max_pitch_limit_rad = quad_pitch_limit_rad;
779 scheduled_pitch_angle = pitch_angle_range * pitch_progression;
781 max_pitch_limit_rad = quad_pitch_limit_rad + (fwd_pitch_limit_rad - quad_pitch_limit_rad) * pitch_progression;
784 scheduled_pitch_angle = 8.;
785 max_pitch_limit_rad = fwd_pitch_limit_rad;
787 Bound(scheduled_pitch_angle, -5., 8.);
793 wls_guid_p.u_min[0] = -roll_limit_rad - roll_angle;
794 wls_guid_p.u_min[1] = min_pitch_limit_rad - pitch_angle;
795 wls_guid_p.u_min[2] = du_min_thrust_z;
799 wls_guid_p.u_max[0] = roll_limit_rad - roll_angle;
800 wls_guid_p.u_max[1] = max_pitch_limit_rad - pitch_angle;
801 wls_guid_p.u_max[2] = du_max_thrust_z;
802 wls_guid_p.u_max[3] = 9.0;
805 wls_guid_p.u_pref[0] = 0;
806 wls_guid_p.u_pref[1] = -pitch_angle + pitch_pref_rad;
807 wls_guid_p.u_pref[2] = wls_guid_p.u_max[2];
808 wls_guid_p.u_pref[3] = body_v[0];
Main include for ABI (AirBorneInterface).
Event structure to store callbacks in a linked list.
#define ACT_FEEDBACK_UAVCAN_ID
struct pprz_autopilot autopilot
Global autopilot structure.
bool in_flight
in flight status
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)
#define VECT2_ADD(_a, _b)
#define VECT2_DIFF(_c, _a, _b)
#define VECT2_COPY(_a, _b)
static struct FloatQuat * stateGetNedToBodyQuat_f(void)
Get vehicle body attitude quaternion (float).
static struct EnuCoor_f * stateGetPositionEnu_f(void)
Get position in local ENU coordinates (float).
static struct EnuCoor_f * stateGetSpeedEnu_f(void)
Get ground speed in local ENU coordinates (float).
static float stateGetAirspeed_f(void)
Get airspeed (float).
float guidance_indi_max_bank
struct FloatVect3 speed_sp
bool force_forward
forward flight for hybrid nav
float guidance_indi_pitch_pref_deg
struct FloatEulers eulers_zxy
state eulers in zxy order
float guidance_indi_max_airspeed
struct FloatVect2 desired_airspeed
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)
struct EnuCoor_f to
end WP position
float dist2_to_wp
squared distance to next waypoint
struct NavBase_t nav_rotorcraft_base
Basic Nav struct.
float nav_max_deceleration_sp
float nav_hybrid_pos_gain
Specific navigation functions for hybrid aircraft.
vector in East North Up coordinates Units: meters
Rotorcraft specific autopilot interface and initialization.
struct HorizontalGuidance guidance_h
#define GUIDANCE_H_MODE_NAV
#define GUIDANCE_H_MODE_NONE
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
float Wu_gih_original[GUIDANCE_INDI_HYBRID_U]
void rotwing_state_set_fw_settings(void)
bool rotwing_state_hover_motors_running(void)
void rotwing_switch_state(void)
#define ROTWING_MIN_SKEW_ANGLE_COUNTER
#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
#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
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
#define ROTWING_HOV_MOT_RUN_RPM_TH
#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
static void send_rotating_wing_state(struct transport_tx *trans, struct link_device *dev)
void rotwing_state_free_processor(void)
#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 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)
#define ROTWING_CONFIGURATION_HYBRID
#define ROTWING_STATE_SKEWING
#define ROTWING_STATE_FW_HOV_MOT_IDLE
#define ROTWING_STATE_HOVER
Rotwing States.
#define ROTWING_STATE_PITCH_FW_SETTING
#define ROTWING_STATE_WING_FW_SETTING
#define ROTWING_CONFIGURATION_HOVER
Rotwing Configurations.
#define ROTWING_CONFIGURATION_FREE
#define ROTWING_STATE_PITCH_TRANSITION_SETTING
#define ROTWING_STATE_PITCH_QUAD_SETTING
#define ROTWING_STATE_FW_HOV_MOT_OFF
#define ROTWING_STATE_WING_QUAD_SETTING
#define ROTWING_STATE_WING_SCHEDULING_SETTING
#define ROTWING_CONFIGURATION_EFFICIENT
bool force_rotation_angle
bool hover_motors_disable
struct Stabilization stabilization
#define STABILIZATION_MODE_ATTITUDE
uint8_t att_submode
current attitude sub-mode
#define STABILIZATION_ATT_SUBMODE_FORWARD
int32_t cmd[COMMANDS_NB]
output command vector, range from [-MAX_PPRZ:MAX_PPRZ] (store for messages)
float g1g2[INDI_OUTPUTS][INDI_NUM_ACT]
float actuator_state_filt_vect[INDI_NUM_ACT]
static const struct usb_device_descriptor dev
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
int int32_t
Typedef defining 32 bit int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.