Command filter for vibrating airframes (#2226)

* Filtering commands + example airframe

Command filter + example airframe

* more generic implementation

* airframe move to the new tudelft location, gain tuning

* revert pprzlink

* revert opencv

* revert libopencm

* style fixed

* fix indenting & modules section moved

* added function declaration
This commit is contained in:
matejkarasek
2018-02-27 11:03:01 +01:00
committed by Kirk Scheper
parent d45b2d7149
commit cd659a78da
8 changed files with 350 additions and 204 deletions
-202
View File
@@ -1,202 +0,0 @@
<!DOCTYPE airframe SYSTEM "../airframe.dtd">
<!-- Delfly (http://www.delfly.nl/home.html)
Lisa/S v0.1 board (http://wiki.paparazziuav.org/wiki/Lisa/S)
Using Lisa/S V1.0 board file as it is software compatible.
-->
<airframe name="Delfly Lisa/S 0.1">
<description>DelFly Outdoor Auto2
</description>
<firmware name="fixedwing">
<target name="ap" board="lisa_s_1.0">
<module name="radio_control" type="spektrum">
<define name="RADIO_MODE" value="RADIO_FLAP"/>
<define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/>
<configure name="USE_SECONDARY_SPEKTRUM_RECEIVER" value="0"/>
</module>
<configure name="AHRS_PROPAGATE_FREQUENCY" value="500"/>
</target>
<define name="AGR_CLIMB"/>
<define name="LOITER_TRIM"/>
<define name="STRONG_WIND"/>
<!-- Communication -->
<module name="telemetry" type="transparent">
<!--<configure name="MODEM_BAUD" value="B57600"/>
<configure name="MODEM_PORT" value="UART1"/>-->
</module>
<!-- Sensors -->
<module name="imu" type="lisa_s_v1.0"/>
<module name="gps" type="ublox"/>
<module name="actuators" type="pwm">
<define name="SERVO_HZ" value="50"/>
<define name="USE_SERVOS_1AND2"/>
</module>
<module name="actuators" type="dualpwm">
<define name="DUAL_PWM_ON"/>
</module>
<!--<module name="ahrs" type="int_cmpl_quat"/>-->
<module name="control"/>
<module name="navigation"/>
<module name="ins" type="alt_float">
<define name="USE_BAROMETER" value="TRUE"/>
</module>
<!--<configure name="SYS_TIME_LED" value="none"/>-->
</firmware>
<modules>
<module name="baro_sim"/>
<module name="switch" type="servo"/>
<module name="gps" type="ubx_ucenter"/>
</modules>
<servos driver="Pwm">
<servo name="MOTOR" no="0" min="1290" neutral="1290" max="1810"/>
<!--<servo name="SWITCH" no="2" min="1100" neutral="1500" max="1900"/>
<servo name="SWITCH2" no="3" min="1100" neutral="1500" max="1900"/>-->
</servos>
<!-- comboPWM / mergedPWM / -->
<servos driver="Dualpwm">
<servo name="SWITCH" no="3" min="1100" neutral="1500" max="1900"/>
<servo name="pitchator" no="2" min="1100" neutral="1500" max="1900"/>
</servos>
<commands>
<axis name="THROTTLE" failsafe_value="0"/>
<axis name="ROLL" failsafe_value="4000"/>
<axis name="PITCH" failsafe_value="-8000"/>
</commands>
<rc_commands>
<set command="THROTTLE" value="@THROTTLE"/>
<set command="ROLL" value="@ROLL"/>
<set command="PITCH" value="@PITCH"/>
</rc_commands>
<command_laws>
<set servo="MOTOR" value="@THROTTLE"/>
<set servo="pitchator" value="@PITCH"/>
</command_laws>
<section name="IMU" prefix="IMU_">
<!-- ACCEL and GYRO calibration left out to take default datasheet values -->
<!-- replace this with your own mag calibration -->
<define name="MAG_X_NEUTRAL" value="-45"/>
<define name="MAG_Y_NEUTRAL" value="334"/>
<define name="MAG_Z_NEUTRAL" value="7"/>
<define name="MAG_X_SENS" value="4.47647816128" integer="16"/>
<define name="MAG_Y_SENS" value="4.71085671542" integer="16"/>
<define name="MAG_Z_SENS" value="4.41585354498" integer="16"/>
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="0." unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
</section>
<section name="AHRS" prefix="AHRS_">
<!-- replace this with your local magnetic field -->
<define name="H_X" value="0.3770441"/>
<define name="H_Y" value="0.0193986"/>
<define name="H_Z" value="0.9259921"/>
</section>
<section name="INS" prefix="INS_">
<define name="ROLL_NEUTRAL_DEFAULT" value="0" unit="deg"/>
<define name="PITCH_NEUTRAL_DEFAULT" value="0" unit="deg"/>
</section>
<section name="VERTICAL CONTROL" prefix="V_CTL_">
<define name="POWER_CTL_BAT_NOMINAL" value="7.3" unit="volt"/>
<!-- outer loop proportional gain -->
<define name="ALTITUDE_PGAIN" value="0.03"/>
<!-- outer loop saturation -->
<define name="ALTITUDE_MAX_CLIMB" value="2."/>
<!-- auto throttle inner loop -->
<define name="AUTO_THROTTLE_NOMINAL_CRUISE_THROTTLE" value="0.32"/>
<define name="AUTO_THROTTLE_MIN_CRUISE_THROTTLE" value="0.25"/>
<define name="AUTO_THROTTLE_MAX_CRUISE_THROTTLE" value="0.65"/>
<define name="AUTO_THROTTLE_LOITER_TRIM" value="1500"/>
<define name="AUTO_THROTTLE_DASH_TRIM" value="-4000"/>
<define name="AUTO_THROTTLE_CLIMB_THROTTLE_INCREMENT" value="0.15" unit="%/(m/s)"/>
<define name="AUTO_THROTTLE_PGAIN" value="0.01"/>
<define name="AUTO_THROTTLE_IGAIN" value="0.1"/>
<define name="AUTO_THROTTLE_PITCH_OF_VZ_PGAIN" value="0.05"/>
<define name="THROTTLE_SLEW_LIMITER" value="2" unit="s"/>
</section>
<section name="HORIZONTAL CONTROL" prefix="H_CTL_">
<define name="COURSE_PGAIN" value="1.0"/>
<define name="COURSE_DGAIN" value="0.3"/>
<define name="ROLL_MAX_SETPOINT" value="35" unit="deg"/>
<define name="PITCH_MAX_SETPOINT" value="30" unit="deg"/>
<define name="PITCH_MIN_SETPOINT" value="-30" unit="deg"/>
<define name="PITCH_PGAIN" value="12000."/>
<define name="PITCH_DGAIN" value="1.5"/>
<define name="ELEVATOR_OF_ROLL" value="1250"/>
<define name="ROLL_SLEW" value="0.1"/>
<define name="ROLL_ATTITUDE_GAIN" value="7500"/>
<define name="ROLL_RATE_GAIN" value="1500"/>
</section>
<section name="AGGRESSIVE" prefix="AGR_">
<define name="BLEND_START" value="20"/><!-- Altitude Error to Initiate Aggressive Climb CANNOT BE ZERO!!-->
<define name="BLEND_END" value="10"/><!-- Altitude Error to Blend Aggressive to Regular Climb Modes CANNOT BE ZERO!!-->
<define name="CLIMB_THROTTLE" value="1.00"/><!-- Gaz for Aggressive Climb -->
<define name="CLIMB_PITCH" value="0.3"/><!-- Pitch for Aggressive Climb -->
<define name="DESCENT_THROTTLE" value="0.1"/><!-- Gaz for Aggressive Decent -->
<define name="DESCENT_PITCH" value="-0.25"/><!-- Pitch for Aggressive Decent -->
<define name="CLIMB_NAV_RATIO" value="0.8"/><!-- Percent Navigation for Altitude Error Equal to Start Altitude -->
<define name="DESCENT_NAV_RATIO" value="1.0"/>
</section>
<section name="FAILSAFE" prefix="FAILSAFE_">
<define name="DELAY_WITHOUT_GPS" value="2" unit="s"/>
<define name="DEFAULT_THROTTLE" value="0.3" unit="%"/>
<define name="DEFAULT_ROLL" value="0.3" unit="rad"/>
<define name="DEFAULT_PITCH" value="0.5" unit="rad"/>
</section>
<section name="AUTO1" prefix="AUTO1_">
<define name="MAX_ROLL" value="40." unit="deg"/>
<define name="MAX_PITCH" value="35." unit="deg"/>
</section>
<section name="BAT">
<define name="MILLIAMP_AT_FULL_THROTTLE" value="1000"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="2.9" unit="V"/>
<define name="CRITIC_BAT_LEVEL" value="3.1" unit="V"/>
<define name="LOW_BAT_LEVEL" value="3.4" unit="V"/>
<define name="MAX_BAT_LEVEL" value="4.2" unit="V"/>
<!--<define name="VoltageOfAdc(adc)" value ="8"/>-->
</section>
<section name="MISC">
<define name="NOMINAL_AIRSPEED" value="13." unit="m/s"/>
<define name="CARROT" value="5." unit="s"/>
<define name="KILL_MODE_DISTANCE" value="(1.5*MAX_DIST_FROM_HOME)"/>
<define name="CONTROL_FREQUENCY" value="60" unit="Hz"/>
<define name="DEFAULT_CIRCLE_RADIUS" value="80."/>
<define name="UNLOCKED_HOME_MODE" value="TRUE"/>
<!--<define name="RC_LOST_MODE" value="mode_auto2"/>-->
</section>
</airframe>
+255
View File
@@ -0,0 +1,255 @@
<!-- this is a generic DelFly frame equiped with Lisa/S 1.0 -->
<!--
Applicable configuration:
airframe="airframes/tudelft/delfly_lisas.xml"
radio="radios/cockpitSX.xml" (SuperbitRF) / radio="radios/delfly_Rx31_Devo10.xml" (DelTang Rx31)
telemetry="telemetry/default_rotorcraft.xml" (no logger) / telemetry="telemetry/rotorcraft_with_logger.xml" (with logger)
flight_plan="flight_plans/rotorcraft_basic.xml"
settings="settings/rotorcraft_basic.xml settings/control/rotorcraft_guidance.xml settings/control/stabilization_att_int.xml ../conf/modules/logger_sd_spi_direct.xml (if SD logger is used)"
-->
<airframe name="delfly_lisa_s">
<!-- FIRMWARE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
<firmware name="rotorcraft">
<target name="ap" board="lisa_s_1.0">
<!-- SuperbitRF RC -->
<!-- module name="radio_control" type="superbitrf_rc"/-->
<!-- DelTang Rx31 -->
<module name="radio_control" type="ppm">
<configure name="RADIO_CONTROL_PPM_PIN" value="SERVO6"/>
<define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/>
<define name="RADIO_YAW" value="RADIO_ROLL"/>
</module>
<configure name="USE_MAGNETOMETER" value="0"/>
<configure name="AHRS_PROPAGATE_FREQUENCY" value="500"/>
<define name="USE_PERSISTENT_SETTINGS" value="TRUE"/>
</target>
<!-- Necessary to build succesfully, but not used -->
<module name="motor_mixing"/>
<!-- Rpm sensing settings (cannot be pushed to master) -->
<!--subsystem name="rpm_sensor" type="eagletree"-->
<!--define name="PULSES_PER_ROTATION" value="5"/-->
<!--/subsystem-->
<module name="actuators" type="pwm">
<define name="SERVO_HZ" value="400"/>
<define name="USE_SERVOS_1AND2"/>
</module>
<!-- TELEMETRY -->
<!-- SuperbitRF telemetry -->
<!--module name="telemetry" type="superbitrf"/-->
<!-- Debug serial interface telemetry -->
<module name="telemetry" type="transparent">
<configure name="MODEM_BAUD" value="B115200"/>
<configure name="MODEM_PORT" value="UART1"/>
</module>
<module name="imu" type="lisa_s_v1.0"/>
<module name="gps" type="ublox"/>
<module name="stabilization" type="int_euler" prefix="STABILIZATION_">
<define name="FILTER_CMD_ROLL_PITCH" value="1"/>
<define name="FILTER_CMD_YAW" value="1"/>
<define name="FILTER_CMD_ROLL_CUTOFF" value="15.0"/>
<define name="FILTER_CMD_PITCH_CUTOFF" value="15.0"/>
<define name="FILTER_CMD_YAW_CUTOFF" value="10.0"/>
<define name="ATTITUDE_SP_PSI_DELTA_LIMIT" value="1.57"/>
</module>
<module name="ahrs" type="int_cmpl_quat"/>
<module name="ins"/>
<module name="send_imu_mag_current"/>
<!-- When sd logger is used, then radio should be DelTang (PPM) and telemetry should
be transparent (cable/WiFi) -->
<module name="logger_sd_spi_direct.xml">
<define name="SDLOGGER_ON_ARM" value="TRUE"/>
<!--define name="LOGGER_LED" value="3"/-->
</module>
</firmware>
<!-- ACTUATORS & COMMANDS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
<servos driver="Pwm">
<servo name="MOTOR" no="4" min="1100" neutral="1100" max="1900"/>
<servo name="ELEVATOR" no="5" min="1100" neutral="1500" max="1900"/>
<servo name="RUDDER" no="0" min="1100" neutral="1500" max="1900"/>
</servos>
<commands>
<axis name="PITCH" failsafe_value="0"/>
<axis name="ROLL" failsafe_value="0"/>
<axis name="YAW" failsafe_value="0"/>
<axis name="THRUST" failsafe_value="0"/>
</commands>
<command_laws>
<!--call fun="motor_mixing_run(autopilot_motors_on,FALSE,values)"/-->
<set servo="MOTOR" value="@THRUST"/>
<set servo="ELEVATOR" value="@PITCH"/>
<set servo="RUDDER" value="@YAW"/>
</command_laws>
<!-- SETTINGS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
<section name="IMU" prefix="IMU_">
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="245." unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
<!-- MAGNETO CALIBRATION DELFT - calibration still needs to be done !!! -->
<define name="MAG_X_NEUTRAL" value="10"/>
<define name="MAG_Y_NEUTRAL" value="238"/>
<define name="MAG_Z_NEUTRAL" value="-74"/>
<define name="MAG_X_SENS" value="3.67001348283" integer="16"/>
<define name="MAG_Y_SENS" value="3.98840260231" integer="16"/>
<define name="MAG_Z_SENS" value="4.32568461736" integer="16"/>
<!-- MAGNETO CURRENT CALIBRATION -->
<define name= "MAG_X_CURRENT_COEF" value="-0.0176704713698"/>
<define name= "MAG_Y_CURRENT_COEF" value="0.0174222594634"/>
<define name= "MAG_Z_CURRENT_COEF" value="0.0187570316492"/>
</section>
<section name="AHRS" prefix="AHRS_">
<!-- Delft magnetic field -->
<define name="H_X" value="0.39049610"/>
<define name="H_Y" value="0.00278894"/>
<define name="H_Z" value="0.92060036"/>
<define name="USE_GPS_HEADING" value="0"/>
<!-- For vibrating airfames -->
<define name="GRAVITY_HEURISTIC_FACTOR" value="0"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_STARTUP" value="AP_MODE_RC_DIRECT"/>
<define name="MODE_MANUAL" value="AP_MODE_RC_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO2" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="USE_THROTTLE_FOR_MOTOR_ARMING" value="TRUE"/>
<define name="NO_RC_THRUST_LIMIT" value="TRUE"/>
</section>
<section name="STABILIZATION_ATTITUDE" prefix="STABILIZATION_ATTITUDE_">
<!-- setpoints -->
<define name="SP_MAX_PHI" value="45." unit="deg"/>
<define name="SP_MAX_THETA" value="45." unit="deg"/>
<define name="SP_MAX_PSI" value="45." unit="deg"/>
<define name="SP_MAX_R" value="90." unit="deg/s"/>
<define name="SP_MAX_P" value="90." unit="deg/s"/>
<define name="DEADBAND_R" value="250"/>
<define name="DEADBAND_A" value="250"/>
<!-- reference -->
<define name="REF_OMEGA_P" value="800" unit="deg/s"/>
<define name="REF_ZETA_P" value="0.85"/>
<define name="REF_MAX_P" value="400." unit="deg/s"/>
<define name="REF_MAX_PDOT" value="RadOfDeg(8000.)"/>
<define name="REF_OMEGA_Q" value="800" unit="deg/s"/>
<define name="REF_ZETA_Q" value="0.85"/>
<define name="REF_MAX_Q" value="400." unit="deg/s"/>
<define name="REF_MAX_QDOT" value="RadOfDeg(8000.)"/>
<define name="REF_OMEGA_R" value="500" unit="deg/s"/>
<define name="REF_ZETA_R" value="0.85"/>
<define name="REF_MAX_R" value="180." unit="deg/s"/>
<define name="REF_MAX_RDOT" value="RadOfDeg(900.)"/>
<!-- feedback -->
<define name="PHI_PGAIN" value="1"/>
<define name="PHI_DGAIN" value="1"/>
<define name="PHI_IGAIN" value="1"/>
<define name="THETA_PGAIN" value="4024"/>
<define name="THETA_DGAIN" value="200"/>
<define name="THETA_IGAIN" value="800"/>
<define name="PSI_PGAIN" value="4000"/>
<define name="PSI_DGAIN" value="2000"/>
<define name="PSI_IGAIN" value="60"/>
<!-- feedforward -->
<define name="PHI_DDGAIN" value="0"/>
<define name="THETA_DDGAIN" value="0"/>
<define name="PSI_DDGAIN" value=" 0"/>
<define name="PHI_AGAIN" value="0"/>
<define name="THETA_AGAIN" value="0"/>
<define name="PSI_AGAIN" value="0"/>
</section>
<section name="INS" prefix="INS_">
<define name="USE_GPS_ALT" value="1"/>
</section>
<section name="GPS" prefix="GPS_">
<define name="USE_DATALINK_SMALL" value="1"/>
<define name="LOCAL_ECEF_ORIGIN_X" value="392433200"/>
<define name="LOCAL_ECEF_ORIGIN_Y" value="30036200"/>
<define name="LOCAL_ECEF_ORIGIN_Z" value="500219700"/>
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="HOVER_KP" value="276"/>
<define name="HOVER_KD" value="455"/>
<define name="HOVER_KI" value="100"/>
<define name="NOMINAL_HOVER_THROTTLE" value="0.65"/>
<define name="ADAPT_THROTTLE_ENABLED" value="FALSE"/>
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="PGAIN" value="120"/>
<define name="DGAIN" value="40"/>
<define name="IGAIN" value="0"/>
<define name="REF_MAX_SPEED" value="0.5"/>
<define name="USE_REF" value="FALSE"/>
</section>
<section name="NAVIGATION" prefix="NAV_">
<define name="CLIMB_VSPEED" value="1.0"/>
<define name="DESCEND_VSPEED" value="-0.5"/>
</section>
<section name="MISC">
<define name="ARRIVED_AT_WAYPOINT" value="0.2"/>
</section>
<section name="BAT">
<define name="MILLIAMP_AT_FULL_THROTTLE" value="2000"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="3.0" unit="V"/>
<define name="CRITIC_BAT_LEVEL" value="3.2" unit="V"/>
<define name="LOW_BAT_LEVEL" value="3.5" unit="V"/>
<define name="MAX_BAT_LEVEL" value="4.1" unit="V"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="ne_motor, se_motor, sw_motor, nw_motor" type="string[]"/>
<define name="JSBSIM_MODEL" value="simple_x_quad_ccw" type="string"/>
<define name="SENSORS_PARAMS" value="nps_sensors_params_default.h" type="string"/>
</section>
<!--Motor mixing not used, presence necessary for a succesful build...-->
<section name="MIXING" prefix="MOTOR_MIXING_">
<define name="TRIM_ROLL" value="0"/>
<define name="TRIM_PITCH" value="0"/>
<define name="TRIM_YAW" value="0"/>
<define name="NB_MOTOR" value="4"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{ -256, -256, 256, 256 }"/>
<define name="PITCH_COEF" value="{ 256, -256, -256, 256 }"/>
<define name="YAW_COEF" value="{ 256, -256, 256, -256 }"/>
<define name="THRUST_COEF" value="{ 256, 256, 256, 256 }"/>
</section>
</airframe>
@@ -7,6 +7,13 @@
Also provide the direct mode 'stabilization_none'
As a durty hack, it also provides navigation and guidance: this should be done in the airframe at some point
</description>
<section name="STABILIZATION_FILTER_CMD" prefix="STABILIZATION_FILTER_CMD_">
<define name="ROLL_PITCH" value="0" description="roll and pitch command filter toggle" unit="bool"/>
<define name="YAW" value="0" description="yaw command filter toggle" unit="bool"/>
<define name="ROLL_CUTOFF" value="20.0" description="roll command filter cut-off" unit="Hz"/>
<define name="PITCH_CUTOFF" value="20.0" description="pitch command filter cut-off" unit="Hz"/>
<define name="YAW_CUTOFF" value="20.0" description="yaw command filter cut-off" unit="Hz"/>
</section>
</doc>
<autoload name="nav_basic_rotorcraft"/>
<header>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<!DOCTYPE radio SYSTEM "radio.dtd">
<radio name="DelFly Rx31 DEVO10" data_min="900" data_max="2050" sync_min ="5000" sync_max ="15000" pulse_type="NEGATIVE">
<channel ctl="A" function="THROTTLE" min="1110" neutral="1110" max="1900" average="0"/>
<channel ctl="D" function="ROLL" max="1110" neutral="1500" min="1900" average="0"/>
<channel ctl="C" function="PITCH" max="1110" neutral="1500" min="1900" average="0"/>
<channel ctl="B" function="GEAR" max="1110" neutral="1500" min="1900" average="0"/>
<channel ctl="G" function="FLAP" min="1110" neutral="1500" max="1900" average="1"/>
<channel ctl="E" function="MODE" min="1110" neutral="1500" max="1900" average="1"/>
<channel ctl="F" function="ELEV_DR" min="1110" neutral="1500" max="1900" average="1"/>
</radio>
+13
View File
@@ -0,0 +1,13 @@
<conf>
<aircraft
name="DelFly_LisaS"
ac_id="111"
airframe="airframes/tudelft/delfly_lisas.xml"
radio="radios/delfly_Rx31_DEVO10.xml"
telemetry="telemetry/rotorcraft_with_logger.xml"
flight_plan="flight_plans/rotorcraft_basic.xml"
settings="settings/rotorcraft_basic.xml settings/control/rotorcraft_guidance.xml settings/control/stabilization_att_int.xml ../conf/modules/logger_sd_spi_direct.xml"
settings_modules="modules/logger_sd_spi_direct.xml modules/ahrs_int_cmpl_quat.xml modules/stabilization_int_euler.xml modules/nav_basic_rotorcraft.xml modules/guidance_rotorcraft.xml modules/gps.xml modules/imu_common.xml"
gui_color="blue"
/>
</conf>
@@ -319,7 +319,7 @@ void guidance_h_read_rc(bool in_flight)
stabilization_attitude_read_rc(in_flight, FALSE, FALSE);
break;
case GUIDANCE_H_MODE_HOVER:
stabilization_attitude_read_rc_setpoint_eulers_f(&guidance_h.rc_sp, in_flight, FALSE, FALSE );
stabilization_attitude_read_rc_setpoint_eulers_f(&guidance_h.rc_sp, in_flight, FALSE, FALSE);
#if GUIDANCE_H_USE_SPEED_REF
read_rc_setpoint_speed_i(&guidance_h.sp.speed, in_flight);
/* enable x,y velocity setpoints */
@@ -374,6 +374,12 @@ void guidance_h_run(bool in_flight)
transition_run(false);
}
stabilization_attitude_run(in_flight);
#if (STABILIZATION_FILTER_CMD_ROLL_PITCH || STABILIZATION_FILTER_CMD_YAW)
if (in_flight) {
stabilization_filter_commands();
}
#endif
break;
case GUIDANCE_H_MODE_HOVER:
@@ -605,7 +611,7 @@ void guidance_h_from_nav(bool in_flight)
/* set final attitude setpoint */
int32_t heading_sp_i = ANGLE_BFP_OF_REAL(guidance_h.sp.heading);
stabilization_attitude_set_earth_cmd_i(&guidance_h_cmd_earth,
heading_sp_i);
heading_sp_i);
#endif
#endif
@@ -25,11 +25,66 @@
#include "firmwares/rotorcraft/stabilization.h"
#if (STABILIZATION_FILTER_COMMANDS_ROLL_PITCH || STABILIZATION_FILTER_COMMANDS_YAW)
#include "filters/low_pass_filter.h"
#endif
int32_t stabilization_cmd[COMMANDS_NB];
#if STABILIZATION_FILTER_CMD_ROLL_PITCH
#ifndef STABILIZATION_FILTER_CMD_ROLL_CUTOFF
#define STABILIZATION_FILTER_CMD_ROLL_CUTOFF 20.0
#endif
#ifndef STABILIZATION_FILTER_CMD_PITCH_CUTOFF
#define STABILIZATION_FILTER_CMD_PITCH_CUTOFF 20.0
#endif
struct SecondOrderLowPass_int filter_roll;
struct SecondOrderLowPass_int filter_pitch;
#endif
#if STABILIZATION_FILTER_CMD_YAW
#ifndef STABILIZATION_FILTER_CMD_YAW_CUTOFF
#define STABILIZATION_FILTER_CMD_YAW_CUTOFF 20.0
#endif
struct SecondOrderLowPass_int filter_yaw;
#endif
void stabilization_init(void)
{
for (uint8_t i = 0; i < COMMANDS_NB; i++) {
stabilization_cmd[i] = 0;
}
// Initialize low pass filters
#if STABILIZATION_FILTER_CMD_ROLL_PITCH
init_second_order_low_pass_int(&filter_roll, STABILIZATION_FILTER_CMD_ROLL_CUTOFF, 0.7071, 1.0 / PERIODIC_FREQUENCY,
0.0);
init_second_order_low_pass_int(&filter_pitch, STABILIZATION_FILTER_CMD_PITCH_CUTOFF, 0.7071, 1.0 / PERIODIC_FREQUENCY,
0.0);
#endif
#if STABILIZATION_FILTER_CMD_YAW
init_second_order_low_pass_int(&filter_yaw, STABILIZATION_FILTER_CMD_YAW_CUTOFF, 0.7071, 1.0 / PERIODIC_FREQUENCY, 0.0);
#endif
}
void stabilization_filter_commands(void)
{
/* Filter the commands & bound the result */
#if STABILIZATION_FILTER_CMD_ROLL_PITCH
stabilization_cmd[COMMAND_ROLL] = update_second_order_low_pass_int(&filter_roll, stabilization_cmd[COMMAND_ROLL]);
stabilization_cmd[COMMAND_PITCH] = update_second_order_low_pass_int(&filter_pitch, stabilization_cmd[COMMAND_PITCH]);
BoundAbs(stabilization_cmd[COMMAND_ROLL], MAX_PPRZ);
BoundAbs(stabilization_cmd[COMMAND_PITCH], MAX_PPRZ);
#endif
#if STABILIZATION_FILTER_CMD_YAW
stabilization_cmd[COMMAND_YAW] = update_second_order_low_pass_int(&filter_yaw, stabilization_cmd[COMMAND_YAW]);
BoundAbs(stabilization_cmd[COMMAND_YAW], MAX_PPRZ);
#endif
}
@@ -31,6 +31,7 @@
#include "generated/airframe.h"
extern void stabilization_init(void);
extern void stabilization_filter_commands(void);
/** Stabilization commands.
* Contains the resulting stabilization commands,