Nederdrone ctrl scheduling + moving target app (#2957)

* Nederdrone ctrl scheduling + moving target app

- Nederdrone airframe files
- Ctrl effectiveness scheduling
- Target position communication and planning
- Approach to a moving target guidance

* Update conf

* fix compilation problems

* flight plan compatible new GCS

* remove module test

Co-authored-by: Freek van Tienen <freek.v.tienen@gmail.com>
This commit is contained in:
Ewoud Smeur
2022-12-16 16:02:16 +01:00
committed by GitHub
parent 3502cab856
commit dc998be91d
23 changed files with 3136 additions and 41 deletions
+5 -1
View File
@@ -73,6 +73,10 @@
<configure name="MODEM_BAUD" value="B115200"/>
</module>
<module name="approach_moving_target">
<define name="AMT_ERR_SLOWDOWN_GAIN" value="0.25"/>
</module>
<module name="actuators" type="uavcan">
<configure name="UAVCAN_USE_CAN1" value="TRUE"/>
<configure name="UAVCAN_USE_CAN2" value="TRUE"/>
@@ -84,7 +88,7 @@
<module name="stabilization" type="indi_simple"/>
<module name="stabilization" type="rate_indi"/>
<module name="ins" type="ekf2" />
<module name="air_data"/>
<!-- Internal MAG -->
+6 -2
View File
@@ -70,6 +70,10 @@
<configure name="MODEM_BAUD" value="B115200"/>
</module>
<module name="approach_moving_target">
<define name="AMT_ERR_SLOWDOWN_GAIN" value="0.25"/>
</module>
<module name="actuators" type="uavcan">
<configure name="UAVCAN_USE_CAN1" value="TRUE"/>
<configure name="UAVCAN_USE_CAN2" value="TRUE"/>
@@ -80,7 +84,7 @@
<module name="stabilization" type="indi_simple"/>
<module name="stabilization" type="rate_indi"/>
<module name="ins" type="ekf2" />
<module name="air_data"/>
<!-- Internal MAG -->
@@ -193,7 +197,7 @@
<set servo="MOTOR_10" value="($th_hold? -9600 : motor_mixing.commands[9])"/>
<set servo="MOTOR_11" value="($th_hold? -9600 : motor_mixing.commands[10])"/>
<set servo="MOTOR_12" value="($th_hold? -9600 : motor_mixing.commands[11])"/>
<!-- Removed ApplyDiff for differential control -->
<set servo="AIL_1" value="-2*@PITCH + ( 2*@YAW)"/>
<set servo="AIL_2" value="-2*@PITCH + (- 2*@YAW)"/>
+394
View File
@@ -0,0 +1,394 @@
<!DOCTYPE airframe SYSTEM "../airframe.dtd">
<!-- This is a Nedderdrone with Trailing edge motors
* Airframe: TUD00???
* Autopilot: Pixhawk 4
* Actuators: 12x T-Motor ESC + Motors and 8x Servos (all CAN)
* Datalink: Herelink
* GPS: UBlox F9P
* RC: SBUS Crossfire
-->
<airframe name="Neddrone6">
<description>Neddrone6</description>
<firmware name="rotorcraft">
<target name="ap" board="px4fmu_5.0_chibios">
<configure name="PERIODIC_FREQUENCY" value="500"/>
<configure name="FLASH_MODE" value="SWD"/>
<define name="USE_BARO_BOARD" value="1"/>
<module name="radio_control" type="sbus">
<configure name="SBUS_PORT" value="UART3"/>
</module>
<!-- Forward FuelCell data back to the GCS -->
<!--module name="generic_uart_sensor"/-->
<!-- Logger -->
<module name="tlsf"/>
<module name="pprzlog"/>
<module name="logger" type="sd_chibios"/>
<module name="flight_recorder"/>
<!-- Airspeed sensors -->
<module name="airspeed" type="ms45xx_i2c">
<define name="USE_I2C4"/>
<define name="MS45XX_I2C_DEV" value="i2c4"/>
</module>
<!--module name="airspeed" type="uavcan"/-->
<!-- Monitoring -->
<module name="sys_mon"/>
<!--module name="status_nederdrone"/-->
<define name="ADC_CURRENT_DISABLE" value="TRUE"/>
<define name="RADIO_TH_HOLD" value="RADIO_AUX1"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="RADIO_AUX2"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="RADIO_AUX3"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="RADIO_AUX1"/>
<!-- <module name="ahrs" type="int_cmpl_quat">
<configure name="USE_MAGNETOMETER" value="FALSE"/>
<define name="AHRS_USE_GPS_HEADING" value="TRUE"/>
<define name="AHRS_HEADING_UPDATE_GPS_MIN_SPEED" value="0"/>
</module> -->
<!--module name="ins" type="extended">
<define name="INS_USE_GPS_ALT" value="1"/>
<define name="INS_USE_GPS_ALT_SPEED" value="1"/>
<define name="INS_VFF_R_GPS" value="0.01"/>
</module-->
</target>
<target name="nps" board="pc">
<!-- <module name="eff_scheduling_nederdrone_dummy"/> -->
<module name="radio_control" type="datalink"/>
<module name="fdm" type="jsbsim"/>
<module name="logger_file">
<define name="FILE_LOGGER_PATH" value="/home/ewoud/Documents"/>
</module>
<!--Not dealing with these in the simulation-->
<define name="RADIO_TH_HOLD" value="0"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="0"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="0"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="0"/>
</target>
<module name="eff_scheduling_nederdrone"/>
<module name="telemetry" type="transparent">
<configure name="MODEM_BAUD" value="B115200"/>
</module>
<module name="approach_moving_target">
<define name="AMT_ERR_SLOWDOWN_GAIN" value="0.25"/>
</module>
<module name="ins" type="ekf2" />
<module name="actuators" type="uavcan">
<configure name="UAVCAN_USE_CAN1" value="TRUE"/>
<configure name="UAVCAN_USE_CAN2" value="TRUE"/>
</module>
<module name="imu" type="mpu6000"/>
<!--module name="gps" type="datalink"/-->
<module name="gps" type="ublox">
<configure name="UBX_GPS_BAUD" value="B460800"/>
<define name="USE_GPS_UBX_RTCM" value="TRUE"/>
</module>
<module name="stabilization" type="indi">
<configure name="INDI_NUM_ACT" value="8"/>
<define name="TILT_TWIST_CTRL" value="TRUE"/>
</module>
<module name="stabilization" type="rate_indi"/>
<module name="air_data">
<define name="AIR_DATA_BARO_DIFF_ID" value="MS45XX_SENDER_ID"/> <!-- UAVCAN_SENDER_ID -->
<define name="AIR_DATA_CALC_AMSL_BARO" value="TRUE" />
</module>
<!-- Internal MAG -->
<!--module name="mag_ist8310">
<define name="MODULE_IST8310_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_IST8310_I2C_DEV" value="I2C3"/>
</module-->
<!-- External MAG on GPS -->
<module name="mag_lis3mdl">
<define name="MODULE_LIS3MDL_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_LIS3MDL_I2C_DEV" value="I2C1"/>
<define name="LIS3MDL_CHAN_X_SIGN" value="-"/>
<define name="LIS3MDL_CHAN_Y_SIGN" value="-"/>
</module>
<!--module name="lidar" type="tfmini">
<configure name="TFMINI_PORT" value="UART4"/>
<configure name="USE_TFMINI_AGL" value="FALSE"/>
</module-->
<module name="guidance" type="indi_hybrid">
<define name="GUIDANCE_INDI_RC_DEBUG" value="FALSE"/>
<define name="GUIDANCE_INDI_POS_GAIN" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAIN" value="0.5"/>
<define name="GUIDANCE_INDI_POS_GAINZ" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAINZ" value="0.5"/>
<define name="GUIDANCE_INDI_PITCH_EFF_SCALING" value="1.0"/>
<define name="GUIDANCE_H_REF_MAX_SPEED" value="18.0"/> <!--not used-->
<define name="GUIDANCE_INDI_MAX_AIRSPEED" value="17.0"/>
<define name="GUIDANCE_HEADING_IS_FREE" value="FALSE"/> <!--heading can not be set by navigation-->
<define name="GUIDANCE_INDI_HEADING_BANK_GAIN" value="5"/>
<!--define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN" value="-943.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_45" value="-500.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_FWD" value="-1600.0"/-->
<!-- <define name="GUIDANCE_INDI_FILTER_CUTOFF" value="0.5"/> -->
<define name="GUIDANCE_INDI_LINE_GAIN" value="0.2"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE" value="1500"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE_FWD" value="1500"/>
<define name="GUIDANCE_INDI_LIFTD_P50" value="6.0"/>
<define name="GUIDANCE_INDI_LIFTD_P80" value="10.0"/>
<define name="GUIDANCE_INDI_LIFTD_ASQ" value="0.15"/>
</module>
<module name="motor_mixing"/>
</firmware>
<!-- CAN BUS 1 (Front Wing) -->
<servos driver="Uavcan1">
<servo name="MOTOR_1" no="0" min="-8191" neutral="1500" max="8191"/>
<servo name="MOTOR_2" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_3" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_4" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_5" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_6" no="5" min="-8191" neutral="1500" max="8191"/>
<servo name="AIL_1" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_2" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<!-- CAN BUS 2 (Back Wing) -->
<servos driver="Uavcan2">
<servo name="MOTOR_7" no="0" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_8" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_9" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_10" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_11" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_12" no="5" min="0" neutral="600" max="8191"/>
<servo name="AIL_3" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_4" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<commands>
<axis name="ROLL" failsafe_value="0"/>
<axis name="PITCH" failsafe_value="-300"/>
<axis name="YAW" failsafe_value="0"/>
<axis name="THRUST" failsafe_value="0"/>
</commands>
<rc_commands>
<set command="THRUST" value="@THROTTLE" />
<set command="ROLL" value="@YAW" />
<set command="PITCH" value="@PITCH/2" />
<set command="YAW" value="-@ROLL/4" />
</rc_commands>
<section name="MIXING" prefix="MOTOR_MIXING_">
<!-- frontleft left (CCW), frontleft mid (CW), frontleft right (CCW), frontright left (CW), frontright mid (CCW), frontright right (CW) -->
<!-- backleft left (CW), backleft mid (CCW), backleft right (CW), backright left (CCW), backright mid (CW), backright right (CCW) -->
<define name="NB_MOTOR" value="12"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{256, 157, 56, -56, -157, -256, 256, 157, 56, -56, -157, -256}"/>
<define name="PITCH_COEF" value="{256, 256, 256, 256, 256, 256, -256, -256, -256, -256, -256, -256}"/>
<define name="YAW_COEF" value="{251, -256, 252, -252, 256, -251, -256, 252, -254, 254, -252, 256}"/>
<!--<define name="YAW_COEF" value="{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}"/>-->
<define name="THRUST_COEF" value="{256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256}"/>
</section>
<command_laws>
<let var="th_hold" value="Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), !autopilot_get_motors_on())"/>
<!-- Tip props always at 80% -->
<call fun="actuators_pprz[8] = (Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), 0.01 > sched_ratio_tip_props)? -9600 : 9600/100*70*sched_ratio_tip_props);"/>
<set servo="MOTOR_1" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_2" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_3" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_4" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_5" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_6" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_7" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_8" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_9" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_10" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_11" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_12" value="($th_hold? -9600 : actuators_pprz[3])"/>
<!-- Removed ApplyDiff for differential control -->
<set servo="AIL_1" value="($th_hold? 9600 : actuators_pprz[4])"/>
<set servo="AIL_2" value="($th_hold? 9600 : actuators_pprz[5])"/>
<set servo="AIL_3" value="actuators_pprz[6]"/>
<set servo="AIL_4" value="actuators_pprz[7]"/>
</command_laws>
<section name="MISC">
<define name="VoltageOfAdc(adc)" value="((3.3f/4096.0f) * 18.028 * adc)"/>
<define name="NO_RC_THRUST_LIMIT" value="TRUE"/>
<!-- Basic navigation settings -->
<define name="NAV_CLIMB_VSPEED" value="3.5"/>
<define name="NAV_DESCEND_VSPEED" value="-0.7"/>
<define name="ARRIVED_AT_WAYPOINT" value="50.0"/>
<!-- Settings for circle -->
<define name="DEFAULT_CIRCLE_RADIUS" value="700"/>
<define name="NAV_CARROT_DIST" value="200"/>
<!-- Avoid GPS loss behavior when having RC or datalink -->
<define name="NO_GPS_LOST_WITH_DATALINK_TIME" value="20"/>
<define name="NO_GPS_LOST_WITH_RC_VALID" value="TRUE"/>
</section>
<section name="FORWARD">
<!--The Nederdrone uses a slightly different axis system for the setpoint, to make both hovering and flying forward intuitive-->
<define name="USE_EARTH_BOUND_RC_SETPOINT" value="TRUE"/>
<!-- This is the pitch angle that the Nederdrone will have in forward flight, where 0 degrees is hover-->
<define name="TRANSITION_MAX_OFFSET" value="-80.0" unit="deg"/>
<!-- For RC coordinated turns, lower because the yawing was too slow -->
<define name="MAX_FWD_SPEED" value="20.0"/>
<!-- For hybrid guidance -->
<define name="MAX_AIRSPEED" value="20.0"/>
<!-- Enable airspeed measurements -->
<define name="USE_AIRSPEED" value="TRUE"/>
</section>
<section name="IMU" prefix="IMU_">
<!-- Rotate the IMU -->
<define name="MPU_CHAN_X" value="0"/>
<define name="MPU_CHAN_Y" value="2"/>
<define name="MPU_CHAN_Z" value="1"/>
<define name="MPU_X_SIGN" value="-1"/>
<define name="MPU_Y_SIGN" value="1"/>
<define name="MPU_Z_SIGN" value="1"/>
<!-- Calibrated with body only (29-06-2022) -->
<define name="ACCEL_X_NEUTRAL" value="-45"/>
<define name="ACCEL_Y_NEUTRAL" value="13"/>
<define name="ACCEL_Z_NEUTRAL" value="-257"/>
<define name="ACCEL_X_SENS" value="4.895116343046987" integer="16"/>
<define name="ACCEL_Y_SENS" value="4.83753590244878" integer="16"/>
<define name="ACCEL_Z_SENS" value="4.670246691763502" integer="16"/>
<!-- Calibrated at valkenburg (15-07-2022) -->
<define name="MAG_X_NEUTRAL" value="432"/>
<define name="MAG_Y_NEUTRAL" value="1679"/>
<define name="MAG_Z_NEUTRAL" value="3433"/>
<define name="MAG_X_SENS" value="0.6409337832137453" integer="16"/>
<define name="MAG_Y_SENS" value="0.652074798089911" integer="16"/>
<define name="MAG_Z_SENS" value="0.6537789401490781" integer="16"/>
<!-- Define axis in hover frame -->
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="72.3" unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE" prefix="STABILIZATION_ATTITUDE_">
<!-- setpoints -->
<define name="SP_MAX_PHI" value="60." unit="deg"/>
<define name="SP_MAX_THETA" value="80." unit="deg"/>
<define name="SP_MAX_R" value="180." unit="deg/s"/>
<define name="DEADBAND_R" value="200"/>
<define name="SP_PSI_DELTA_LIMIT" value="60" unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE_INDI" prefix="STABILIZATION_INDI_">
<define name="G1_ROLL" value="{ 0.8, -0.8, 1.6, -1.6, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH" value="{ 0.95, 0.95, -1.425, -1.425, -0.5, -0.5, -0.5, -0.5}"/>
<define name="G1_YAW" value="{ 0.00, 0.0, -0.00, 0.00, 0.4, -0.4, -0.4, 0.4}"/>
<define name="G1_THRUST" value="{ -0.3, -0.3, -0.45, -0.45, 0.0, 0.0, 0.0, 0.0}"/>
<!--Counter torque effect of spinning up a rotor-->
<define name="G2" value="{0, 0, 0, 0, 0, 0, 0, 0}"/>
<!-- Forward gains -->
<define name="G1_ROLL_FWD" value="{ 0.5, -0.5, 0.96, -0.96, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH_FWD" value="{ 0.6, 0.6, -0.86, -0.86, -1.4, -1.4, -1.4, -1.4}"/>
<define name="G1_YAW_FWD" value="{ 0.0, 0.0, 0.0, 0.0, 0.94, -0.94, -0.94, 0.94}"/>
<define name="G1_THRUST_FWD" value="{-0.18 -0.18, -0.27, -0.27, 0.0, 0.0, 0.0, 0.0}"/>
<!-- reference acceleration for attitude control -->
<define name="REF_ERR_P" value="30.0"/>
<define name="REF_ERR_Q" value="30.0"/>
<define name="REF_ERR_R" value="20.0"/>
<define name="REF_RATE_P" value="6.0"/>
<define name="REF_RATE_Q" value="6.0"/>
<define name="REF_RATE_R" value="6.0"/>
<!--Maxium yaw rate, to avoid instability-->
<define name="MAX_R" value="180.0" unit="deg/s"/>
<!-- Maximum rate setpoint in rate control mode -->
<define name="MAX_RATE" value="3.0" unit="rad/s"/>
<!-- second order filter parameters -->
<define name="FILT_CUTOFF" value="1.5"/>
<define name="FILT_CUTOFF_RDOT" value="0.5"/>
<define name="ESTIMATION_FILT_CUTOFF" value="5.0"/>
<define name="FILT_CUTOFF_R" value="4."/>
<define name="FILT_CUTOFF_P" value="20."/>
<define name="FILT_CUTOFF_Q" value="20."/>
<!-- first order actuator dynamics -->
<!--define name="ACT_DYN" value="{0.009, 0.009, 0.009, 0.009, 0.05, 0.05, 0.05, 0.05}"/-->
<define name="ACT_DYN" value="{0.028, 0.028, 0.028, 0.028, 0.05, 0.05, 0.05, 0.05}"/>
<define name="ACT_RATE_LIMIT" value="{9600, 9600, 9600, 9600, 170, 170, 170, 170}"/>
<define name="ACT_IS_SERVO" value="{0, 0, 0, 0, 1, 1, 1, 1}"/>
<!-- Adaptive Learning Rate -->
<define name="USE_ADAPTIVE" value="FALSE"/>
<define name="ADAPTIVE_MU" value="0.0001"/>
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="HOVER_KP" value="310"/>
<define name="HOVER_KD" value="130"/>
<define name="HOVER_KI" value="10"/>
<define name="NOMINAL_HOVER_THROTTLE" value="0.42"/>
<define name="ADAPT_THROTTLE_ENABLED" value="FALSE"/>
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="MAX_BANK" value="28" unit="deg"/>
<define name="USE_SPEED_REF" value="TRUE"/>
<define name="PGAIN" value="60"/>
<define name="DGAIN" value="100"/>
<define name="AGAIN" value="0"/>
<define name="IGAIN" value="20"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="a0,a1,a2,a3,a4,a5,a6,a7,a8" type="string[]"/>
<define name="JSBSIM_MODEL" value="nederdrone4_tem" type="string"/>
<define name="NO_MOTOR_MIXING" value="TRUE"/>
<define name="COMMANDS_NB" value="9"/>
<define name="SENSORS_PARAMS" value="nps_sensors_params_default.h" type="string"/>
<!-- mode switch on joystick channel 5 (axis numbering starting at zero) -->
<define name="JS_AXIS_MODE" value="4"/>
<define name="DEBUG_SPEED_SP" value="false"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_FORWARD"/>
<define name="MODE_AUTO2" value="AP_MODE_NAV"/>
<define name="MODE_STARTUP" value="AP_MODE_NAV"/>
</section>
<section name="BAT">
<define name="CATASTROPHIC_BAT_LEVEL" value="18.0" unit="V"/>
<define name="CRITIC_BAT_LEVEL" value="18.6" unit="V"/>
<define name="LOW_BAT_LEVEL" value="19.2" unit="V"/>
<define name="MAX_BAT_LEVEL" value="25.2" unit="V"/>
<define name="BAT_NB_CELLS" value="6"/>
</section>
</airframe>
+393
View File
@@ -0,0 +1,393 @@
<!DOCTYPE airframe SYSTEM "../airframe.dtd">
<!-- This is a Nedderdrone with Trailing edge motors
* Airframe: TUD00???
* Autopilot: Pixhawk 4
* Actuators: 12x T-Motor ESC + Motors and 8x Servos (all CAN)
* Datalink: Herelink
* GPS: UBlox F9P
* RC: SBUS Crossfire
-->
<airframe name="Neddrone7">
<description>Neddrone7</description>
<firmware name="rotorcraft">
<target name="ap" board="px4fmu_5.0_chibios">
<configure name="PERIODIC_FREQUENCY" value="500"/>
<configure name="FLASH_MODE" value="SWD"/>
<define name="USE_BARO_BOARD" value="1"/>
<module name="radio_control" type="sbus">
<configure name="SBUS_PORT" value="UART3"/>
</module>
<!-- Forward FuelCell data back to the GCS -->
<!--module name="generic_uart_sensor"/-->
<!-- Logger -->
<module name="tlsf"/>
<module name="pprzlog"/>
<module name="logger" type="sd_chibios"/>
<module name="flight_recorder"/>
<!-- Airspeed sensors -->
<module name="airspeed" type="ms45xx_i2c">
<define name="USE_I2C4"/>
<define name="MS45XX_I2C_DEV" value="i2c4"/>
</module>
<!--module name="airspeed" type="uavcan"/-->
<!-- Monitoring -->
<module name="sys_mon"/>
<!--module name="status_nederdrone"/-->
<define name="ADC_CURRENT_DISABLE" value="TRUE"/>
<define name="RADIO_TH_HOLD" value="RADIO_AUX1"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="RADIO_AUX2"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="RADIO_AUX3"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="RADIO_AUX1"/>
<!-- <module name="ahrs" type="int_cmpl_quat">
<configure name="USE_MAGNETOMETER" value="FALSE"/>
<define name="AHRS_USE_GPS_HEADING" value="TRUE"/>
<define name="AHRS_HEADING_UPDATE_GPS_MIN_SPEED" value="0"/>
</module> -->
<!--module name="ins" type="extended">
<define name="INS_USE_GPS_ALT" value="1"/>
<define name="INS_USE_GPS_ALT_SPEED" value="1"/>
<define name="INS_VFF_R_GPS" value="0.01"/>
</module-->
</target>
<target name="nps" board="pc">
<module name="radio_control" type="datalink"/>
<module name="fdm" type="jsbsim"/>
<module name="logger_file">
<define name="FILE_LOGGER_PATH" value="/home/ewoud/Documents"/>
</module>
<!--Not dealing with these in the simulation-->
<define name="RADIO_TH_HOLD" value="0"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="0"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="0"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="0"/>
</target>
<module name="eff_scheduling_nederdrone"/>
<module name="telemetry" type="transparent">
<configure name="MODEM_BAUD" value="B115200"/>
</module>
<module name="approach_moving_target">
<define name="AMT_ERR_SLOWDOWN_GAIN" value="0.25"/>
</module>
<module name="ins" type="ekf2" />
<module name="actuators" type="uavcan">
<configure name="UAVCAN_USE_CAN1" value="TRUE"/>
<configure name="UAVCAN_USE_CAN2" value="TRUE"/>
</module>
<module name="imu" type="mpu6000"/>
<!--module name="gps" type="datalink"/-->
<module name="gps" type="ublox">
<configure name="UBX_GPS_BAUD" value="B460800"/>
<define name="USE_GPS_UBX_RTCM" value="TRUE"/>
</module>
<module name="stabilization" type="indi">
<configure name="INDI_NUM_ACT" value="8"/>
<define name="TILT_TWIST_CTRL" value="TRUE"/>
</module>
<module name="stabilization" type="rate_indi"/>
<module name="air_data">
<define name="AIR_DATA_BARO_DIFF_ID" value="MS45XX_SENDER_ID"/> <!-- UAVCAN_SENDER_ID -->
<define name="AIR_DATA_CALC_AMSL_BARO" value="TRUE" />
</module>
<!-- Internal MAG -->
<!--module name="mag_ist8310">
<define name="MODULE_IST8310_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_IST8310_I2C_DEV" value="I2C3"/>
</module-->
<!-- External MAG on GPS -->
<module name="mag_lis3mdl">
<define name="MODULE_LIS3MDL_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_LIS3MDL_I2C_DEV" value="I2C1"/>
<define name="LIS3MDL_CHAN_X_SIGN" value="-"/>
<define name="LIS3MDL_CHAN_Y_SIGN" value="-"/>
</module>
<!--module name="lidar" type="tfmini">
<configure name="TFMINI_PORT" value="UART4"/>
<configure name="USE_TFMINI_AGL" value="FALSE"/>
</module-->
<module name="guidance" type="indi_hybrid">
<define name="GUIDANCE_INDI_RC_DEBUG" value="FALSE"/>
<define name="GUIDANCE_INDI_POS_GAIN" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAIN" value="0.5"/>
<define name="GUIDANCE_INDI_POS_GAINZ" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAINZ" value="0.5"/>
<define name="GUIDANCE_INDI_PITCH_EFF_SCALING" value="1.0"/>
<define name="GUIDANCE_H_REF_MAX_SPEED" value="18.0"/> <!--not used-->
<define name="GUIDANCE_INDI_MAX_AIRSPEED" value="17.0"/>
<define name="GUIDANCE_HEADING_IS_FREE" value="FALSE"/> <!--heading can not be set by navigation-->
<define name="GUIDANCE_INDI_HEADING_BANK_GAIN" value="5"/>
<!--define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN" value="-943.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_45" value="-500.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_FWD" value="-1600.0"/-->
<!-- <define name="GUIDANCE_INDI_FILTER_CUTOFF" value="0.5"/> -->
<define name="GUIDANCE_INDI_LINE_GAIN" value="0.2"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE" value="1500"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE_FWD" value="1500"/>
<define name="GUIDANCE_INDI_LIFTD_P50" value="6.0"/>
<define name="GUIDANCE_INDI_LIFTD_P80" value="10.0"/>
<define name="GUIDANCE_INDI_LIFTD_ASQ" value="0.15"/>
</module>
<module name="motor_mixing"/>
</firmware>
<!-- CAN BUS 1 (Front Wing) -->
<servos driver="Uavcan1">
<servo name="MOTOR_1" no="0" min="-8191" neutral="1500" max="8191"/>
<servo name="MOTOR_2" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_3" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_4" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_5" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_6" no="5" min="-8191" neutral="1500" max="8191"/>
<servo name="AIL_1" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_2" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<!-- CAN BUS 2 (Back Wing) -->
<servos driver="Uavcan2">
<servo name="MOTOR_7" no="0" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_8" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_9" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_10" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_11" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_12" no="5" min="0" neutral="600" max="8191"/>
<servo name="AIL_3" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_4" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<commands>
<axis name="ROLL" failsafe_value="0"/>
<axis name="PITCH" failsafe_value="-300"/>
<axis name="YAW" failsafe_value="0"/>
<axis name="THRUST" failsafe_value="0"/>
</commands>
<rc_commands>
<set command="THRUST" value="@THROTTLE" />
<set command="ROLL" value="@YAW" />
<set command="PITCH" value="@PITCH/2" />
<set command="YAW" value="-@ROLL/4" />
</rc_commands>
<section name="MIXING" prefix="MOTOR_MIXING_">
<!-- frontleft left (CCW), frontleft mid (CW), frontleft right (CCW), frontright left (CW), frontright mid (CCW), frontright right (CW) -->
<!-- backleft left (CW), backleft mid (CCW), backleft right (CW), backright left (CCW), backright mid (CW), backright right (CCW) -->
<define name="NB_MOTOR" value="12"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{256, 157, 56, -56, -157, -256, 256, 157, 56, -56, -157, -256}"/>
<define name="PITCH_COEF" value="{256, 256, 256, 256, 256, 256, -256, -256, -256, -256, -256, -256}"/>
<define name="YAW_COEF" value="{251, -256, 252, -252, 256, -251, -256, 252, -254, 254, -252, 256}"/>
<!--<define name="YAW_COEF" value="{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}"/>-->
<define name="THRUST_COEF" value="{256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256}"/>
</section>
<command_laws>
<let var="th_hold" value="Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), !autopilot_get_motors_on())"/>
<!-- Tip props always at 80% -->
<call fun="actuators_pprz[8] = (Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), 0.01 > sched_ratio_tip_props)? -9600 : 9600/100*70*sched_ratio_tip_props);"/>
<set servo="MOTOR_1" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_2" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_3" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_4" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_5" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_6" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_7" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_8" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_9" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_10" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_11" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_12" value="($th_hold? -9600 : actuators_pprz[3])"/>
<!-- Removed ApplyDiff for differential control -->
<set servo="AIL_1" value="($th_hold? 9600 : actuators_pprz[4])"/>
<set servo="AIL_2" value="($th_hold? 9600 : actuators_pprz[5])"/>
<set servo="AIL_3" value="actuators_pprz[6]"/>
<set servo="AIL_4" value="actuators_pprz[7]"/>
</command_laws>
<section name="MISC">
<define name="VoltageOfAdc(adc)" value="((3.3f/4096.0f) * 18.028 * adc)"/>
<define name="NO_RC_THRUST_LIMIT" value="TRUE"/>
<!-- Basic navigation settings -->
<define name="NAV_CLIMB_VSPEED" value="3.5"/>
<define name="NAV_DESCEND_VSPEED" value="-0.7"/>
<define name="ARRIVED_AT_WAYPOINT" value="50.0"/>
<!-- Settings for circle -->
<define name="DEFAULT_CIRCLE_RADIUS" value="700"/>
<define name="NAV_CARROT_DIST" value="200"/>
<!-- Avoid GPS loss behavior when having RC or datalink -->
<define name="NO_GPS_LOST_WITH_DATALINK_TIME" value="20"/>
<define name="NO_GPS_LOST_WITH_RC_VALID" value="TRUE"/>
</section>
<section name="FORWARD">
<!--The Nederdrone uses a slightly different axis system for the setpoint, to make both hovering and flying forward intuitive-->
<define name="USE_EARTH_BOUND_RC_SETPOINT" value="TRUE"/>
<!-- This is the pitch angle that the Nederdrone will have in forward flight, where 0 degrees is hover-->
<define name="TRANSITION_MAX_OFFSET" value="-80.0" unit="deg"/>
<!-- For RC coordinated turns, lower because the yawing was too slow -->
<define name="MAX_FWD_SPEED" value="20.0"/>
<!-- For hybrid guidance -->
<define name="MAX_AIRSPEED" value="20.0"/>
<!-- Enable airspeed measurements -->
<define name="USE_AIRSPEED" value="TRUE"/>
</section>
<section name="IMU" prefix="IMU_">
<!-- Rotate the IMU -->
<define name="MPU_CHAN_X" value="0"/>
<define name="MPU_CHAN_Y" value="2"/>
<define name="MPU_CHAN_Z" value="1"/>
<define name="MPU_X_SIGN" value="-1"/>
<define name="MPU_Y_SIGN" value="1"/>
<define name="MPU_Z_SIGN" value="1"/>
<!-- Calibrated with body only at cyberzoo (2022-08-22) -->
<define name="ACCEL_X_NEUTRAL" value="-92"/>
<define name="ACCEL_Y_NEUTRAL" value="11"/>
<define name="ACCEL_Z_NEUTRAL" value="-233"/>
<define name="ACCEL_X_SENS" value="4.893773666824744" integer="16"/>
<define name="ACCEL_Y_SENS" value="4.830763157841358" integer="16"/>
<define name="ACCEL_Z_SENS" value="4.700942730229992" integer="16"/>
<!-- NOT CALIBRATED -->
<define name="MAG_X_NEUTRAL" value="-2351"/>
<define name="MAG_Y_NEUTRAL" value="2060"/>
<define name="MAG_Z_NEUTRAL" value="4214"/>
<define name="MAG_X_SENS" value="0.6016027350789249" integer="16"/>
<define name="MAG_Y_SENS" value="0.6409447896809923" integer="16"/>
<define name="MAG_Z_SENS" value="0.648324840639345" integer="16"/>
<!-- Define axis in hover frame -->
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="77.7" unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE" prefix="STABILIZATION_ATTITUDE_">
<!-- setpoints -->
<define name="SP_MAX_PHI" value="60." unit="deg"/>
<define name="SP_MAX_THETA" value="80." unit="deg"/>
<define name="SP_MAX_R" value="180." unit="deg/s"/>
<define name="DEADBAND_R" value="200"/>
<define name="SP_PSI_DELTA_LIMIT" value="60" unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE_INDI" prefix="STABILIZATION_INDI_">
<define name="G1_ROLL" value="{ 0.8, -0.8, 1.6, -1.6, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH" value="{ 0.95, 0.95, -1.425, -1.425, -0.5, -0.5, -0.5, -0.5}"/>
<define name="G1_YAW" value="{ 0.00, 0.0, -0.00, 0.00, 0.4, -0.4, -0.4, 0.4}"/>
<define name="G1_THRUST" value="{ -0.3, -0.3, -0.45, -0.45, 0.0, 0.0, 0.0, 0.0}"/>
<!--Counter torque effect of spinning up a rotor-->
<define name="G2" value="{0, 0, 0, 0, 0, 0, 0, 0}"/>
<!-- Forward gains -->
<define name="G1_ROLL_FWD" value="{ 0.5, -0.5, 0.96, -0.96, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH_FWD" value="{ 0.6, 0.6, -0.86, -0.86, -1.4, -1.4, -1.4, -1.4}"/>
<define name="G1_YAW_FWD" value="{ 0.0, 0.0, 0.0, 0.0, 0.94, -0.94, -0.94, 0.94}"/>
<define name="G1_THRUST_FWD" value="{-0.18 -0.18, -0.27, -0.27, 0.0, 0.0, 0.0, 0.0}"/>
<!-- reference acceleration for attitude control -->
<define name="REF_ERR_P" value="30.0"/>
<define name="REF_ERR_Q" value="30.0"/>
<define name="REF_ERR_R" value="20.0"/>
<define name="REF_RATE_P" value="6.0"/>
<define name="REF_RATE_Q" value="6.0"/>
<define name="REF_RATE_R" value="6.0"/>
<!--Maxium yaw rate, to avoid instability-->
<define name="MAX_R" value="180.0" unit="deg/s"/>
<!-- Maximum rate setpoint in rate control mode -->
<define name="MAX_RATE" value="3.0" unit="rad/s"/>
<!-- second order filter parameters -->
<define name="FILT_CUTOFF" value="1.5"/>
<define name="FILT_CUTOFF_RDOT" value="0.5"/>
<define name="ESTIMATION_FILT_CUTOFF" value="5.0"/>
<define name="FILT_CUTOFF_P" value="20."/>
<define name="FILT_CUTOFF_Q" value="20."/>
<define name="FILT_CUTOFF_R" value="4."/>
<!-- first order actuator dynamics -->
<!--define name="ACT_DYN" value="{0.009, 0.009, 0.009, 0.009, 0.05, 0.05, 0.05, 0.05}"/-->
<define name="ACT_DYN" value="{0.028, 0.028, 0.028, 0.028, 0.05, 0.05, 0.05, 0.05}"/>
<define name="ACT_RATE_LIMIT" value="{9600, 9600, 9600, 9600, 170, 170, 170, 170}"/>
<define name="ACT_IS_SERVO" value="{0, 0, 0, 0, 1, 1, 1, 1}"/>
<!-- Adaptive Learning Rate -->
<define name="USE_ADAPTIVE" value="FALSE"/>
<define name="ADAPTIVE_MU" value="0.0001"/>
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="HOVER_KP" value="310"/>
<define name="HOVER_KD" value="130"/>
<define name="HOVER_KI" value="10"/>
<define name="NOMINAL_HOVER_THROTTLE" value="0.42"/>
<define name="ADAPT_THROTTLE_ENABLED" value="FALSE"/>
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="MAX_BANK" value="28" unit="deg"/>
<define name="USE_SPEED_REF" value="TRUE"/>
<define name="PGAIN" value="60"/>
<define name="DGAIN" value="100"/>
<define name="AGAIN" value="0"/>
<define name="IGAIN" value="20"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="a0,a1,a2,a3,a4,a5,a6,a7,a8" type="string[]"/>
<define name="JSBSIM_MODEL" value="nederdrone4_tem" type="string"/>
<define name="NO_MOTOR_MIXING" value="TRUE"/>
<define name="COMMANDS_NB" value="9"/>
<define name="SENSORS_PARAMS" value="nps_sensors_params_default.h" type="string"/>
<!-- mode switch on joystick channel 5 (axis numbering starting at zero) -->
<define name="JS_AXIS_MODE" value="4"/>
<define name="DEBUG_SPEED_SP" value="false"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_FORWARD"/>
<define name="MODE_AUTO2" value="AP_MODE_NAV"/>
<define name="MODE_STARTUP" value="AP_MODE_NAV"/>
</section>
<section name="BAT">
<define name="CATASTROPHIC_BAT_LEVEL" value="18.0" unit="V"/>
<define name="CRITIC_BAT_LEVEL" value="18.6" unit="V"/>
<define name="LOW_BAT_LEVEL" value="19.2" unit="V"/>
<define name="MAX_BAT_LEVEL" value="25.2" unit="V"/>
<define name="BAT_NB_CELLS" value="6"/>
</section>
</airframe>
+396
View File
@@ -0,0 +1,396 @@
<!DOCTYPE airframe SYSTEM "../airframe.dtd">
<!-- This is a Nedderdrone with Trailing edge motors
* Airframe: TUD00???
* Autopilot: Pixhawk 4
* Actuators: 12x T-Motor ESC + Motors and 8x Servos (all CAN)
* Datalink: Herelink
* GPS: UBlox F9P
* RC: SBUS Crossfire
-->
<airframe name="Neddrone8">
<description>Neddrone8</description>
<firmware name="rotorcraft">
<target name="ap" board="px4fmu_5.0_chibios">
<configure name="PERIODIC_FREQUENCY" value="500"/>
<configure name="FLASH_MODE" value="SWD"/>
<define name="USE_BARO_BOARD" value="1"/>
<module name="radio_control" type="sbus">
<configure name="SBUS_PORT" value="UART3"/>
</module>
<!-- Forward FuelCell data back to the GCS -->
<!--module name="generic_uart_sensor"/-->
<!-- Logger -->
<module name="tlsf"/>
<module name="pprzlog"/>
<module name="logger" type="sd_chibios"/>
<module name="flight_recorder"/>
<!-- Airspeed sensors -->
<module name="airspeed" type="ms45xx_i2c">
<define name="USE_I2C4"/>
<define name="MS45XX_I2C_DEV" value="i2c4"/>
</module>
<!--module name="airspeed" type="uavcan"/-->
<!-- Monitoring -->
<module name="sys_mon"/>
<!--module name="status_nederdrone"/-->
<define name="ADC_CURRENT_DISABLE" value="TRUE"/>
<define name="RADIO_TH_HOLD" value="RADIO_AUX1"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="RADIO_AUX2"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="RADIO_AUX3"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="RADIO_AUX1"/>
<!-- <module name="ahrs" type="int_cmpl_quat">
<configure name="USE_MAGNETOMETER" value="FALSE"/>
<define name="AHRS_USE_GPS_HEADING" value="TRUE"/>
<define name="AHRS_HEADING_UPDATE_GPS_MIN_SPEED" value="0"/>
</module> -->
<!--module name="ins" type="extended">
<define name="INS_USE_GPS_ALT" value="1"/>
<define name="INS_USE_GPS_ALT_SPEED" value="1"/>
<define name="INS_VFF_R_GPS" value="0.01"/>
</module-->
</target>
<target name="nps" board="pc">
<module name="radio_control" type="datalink"/>
<module name="fdm" type="jsbsim"/>
<module name="logger_file">
<define name="FILE_LOGGER_PATH" value="/home/ewoud/Documents"/>
</module>
<!--Not dealing with these in the simulation-->
<define name="RADIO_TH_HOLD" value="0"/> <!-- Throttle hold in command laws -->
<define name="RADIO_FMODE" value="0"/> <!-- Throttle curve select -->
<define name="RADIO_FBW_MODE" value="0"/> <!-- Switch between AP and FBW control -->
<define name="RADIO_KILL_SWITCH" value="0"/>
</target>
<module name="eff_scheduling_nederdrone"/>
<module name="telemetry" type="transparent">
<configure name="MODEM_BAUD" value="B115200"/>
</module>
<module name="approach_moving_target">
<define name="AMT_ERR_SLOWDOWN_GAIN" value="0.25"/>
</module>
<module name="ins" type="ekf2" />
<module name="actuators" type="uavcan">
<configure name="UAVCAN_USE_CAN1" value="TRUE"/>
<configure name="UAVCAN_USE_CAN2" value="TRUE"/>
</module>
<module name="imu" type="mpu6000"/>
<!--module name="gps" type="datalink"/-->
<module name="gps" type="ublox">
<configure name="UBX_GPS_BAUD" value="B460800"/>
<define name="USE_GPS_UBX_RTCM" value="TRUE"/>
</module>
<module name="stabilization" type="indi">
<configure name="INDI_NUM_ACT" value="8"/>
<define name="TILT_TWIST_CTRL" value="TRUE"/>
</module>
<module name="stabilization" type="rate_indi"/>
<module name="air_data">
<define name="AIR_DATA_BARO_DIFF_ID" value="MS45XX_SENDER_ID"/> <!-- UAVCAN_SENDER_ID -->
<define name="AIR_DATA_CALC_AMSL_BARO" value="TRUE" />
</module>
<!-- Internal MAG -->
<!--module name="mag_ist8310">
<define name="MODULE_IST8310_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_IST8310_I2C_DEV" value="I2C3"/>
</module-->
<!-- External MAG on GPS -->
<module name="mag_lis3mdl">
<define name="MODULE_LIS3MDL_UPDATE_AHRS" value="TRUE"/>
<configure name="MAG_LIS3MDL_I2C_DEV" value="I2C1"/>
<define name="LIS3MDL_CHAN_X_SIGN" value="-"/>
<define name="LIS3MDL_CHAN_Y_SIGN" value="-"/>
</module>
<!--module name="lidar" type="tfmini">
<configure name="TFMINI_PORT" value="UART4"/>
<configure name="USE_TFMINI_AGL" value="FALSE"/>
</module-->
<module name="guidance" type="indi_hybrid">
<define name="GUIDANCE_INDI_RC_DEBUG" value="FALSE"/>
<define name="GUIDANCE_INDI_POS_GAIN" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAIN" value="0.5"/>
<define name="GUIDANCE_INDI_POS_GAINZ" value="0.3"/>
<define name="GUIDANCE_INDI_SPEED_GAINZ" value="0.5"/>
<define name="GUIDANCE_INDI_PITCH_EFF_SCALING" value="1.0"/>
<define name="GUIDANCE_H_REF_MAX_SPEED" value="18.0"/> <!--not used-->
<define name="GUIDANCE_INDI_MAX_AIRSPEED" value="17.0"/>
<define name="GUIDANCE_HEADING_IS_FREE" value="FALSE"/> <!--heading can not be set by navigation-->
<define name="GUIDANCE_INDI_HEADING_BANK_GAIN" value="5"/>
<!--define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN" value="-943.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_45" value="-500.0"/>
<define name="GUIDANCE_INDI_SPECIFIC_FORCE_GAIN_FWD" value="-1600.0"/-->
<!-- <define name="GUIDANCE_INDI_FILTER_CUTOFF" value="0.5"/> -->
<define name="GUIDANCE_INDI_LINE_GAIN" value="0.2"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE" value="1500"/>
<define name="GUIDANCE_INDI_MIN_THROTTLE_FWD" value="1500"/>
<define name="GUIDANCE_INDI_LIFTD_P50" value="6.0"/>
<define name="GUIDANCE_INDI_LIFTD_P80" value="10.0"/>
<define name="GUIDANCE_INDI_LIFTD_ASQ" value="0.15"/>
</module>
<module name="motor_mixing"/>
</firmware>
<!-- CAN BUS 1 (Front Wing) -->
<servos driver="Uavcan1">
<servo name="MOTOR_1" no="0" min="-8191" neutral="1500" max="8191"/>
<servo name="MOTOR_2" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_3" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_4" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_5" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_6" no="5" min="-8191" neutral="1500" max="8191"/>
<servo name="AIL_1" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_2" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<!-- CAN BUS 2 (Back Wing) -->
<servos driver="Uavcan2">
<servo name="MOTOR_7" no="0" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_8" no="1" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_9" no="2" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_10" no="3" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_11" no="4" min="0" neutral="600" max="8191"/>
<servo name="MOTOR_12" no="5" min="0" neutral="600" max="8191"/>
<servo name="AIL_3" no="6" min="-6000" neutral="0" max="6000"/>
<servo name="AIL_4" no="7" min="6000" neutral="0" max="-6000"/>
</servos>
<commands>
<axis name="ROLL" failsafe_value="0"/>
<axis name="PITCH" failsafe_value="-300"/>
<axis name="YAW" failsafe_value="0"/>
<axis name="THRUST" failsafe_value="0"/>
</commands>
<rc_commands>
<set command="THRUST" value="@THROTTLE" />
<set command="ROLL" value="@YAW" />
<set command="PITCH" value="@PITCH/2" />
<set command="YAW" value="-@ROLL/4" />
</rc_commands>
<section name="MIXING" prefix="MOTOR_MIXING_">
<!-- frontleft left (CCW), frontleft mid (CW), frontleft right (CCW), frontright left (CW), frontright mid (CCW), frontright right (CW) -->
<!-- backleft left (CW), backleft mid (CCW), backleft right (CW), backright left (CCW), backright mid (CW), backright right (CCW) -->
<define name="NB_MOTOR" value="12"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{256, 157, 56, -56, -157, -256, 256, 157, 56, -56, -157, -256}"/>
<define name="PITCH_COEF" value="{256, 256, 256, 256, 256, 256, -256, -256, -256, -256, -256, -256}"/>
<define name="YAW_COEF" value="{251, -256, 252, -252, 256, -251, -256, 252, -254, 254, -252, 256}"/>
<!--<define name="YAW_COEF" value="{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}"/>-->
<define name="THRUST_COEF" value="{256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256}"/>
</section>
<command_laws>
<let var="th_hold" value="Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), !autopilot_get_motors_on())"/>
<!-- Tip props always at 80% -->
<call fun="actuators_pprz[8] = (Or(LessThan(RadioControlValues(RADIO_TH_HOLD), -4800), 0.01 > sched_ratio_tip_props)? -9600 : 9600/100*70*sched_ratio_tip_props);"/>
<set servo="MOTOR_1" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_2" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_3" value="($th_hold? -9600 : actuators_pprz[0])"/>
<set servo="MOTOR_4" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_5" value="($th_hold? -9600 : actuators_pprz[1])"/>
<set servo="MOTOR_6" value="($th_hold? -9600 : actuators_pprz[8])"/>
<set servo="MOTOR_7" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_8" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_9" value="($th_hold? -9600 : actuators_pprz[2])"/>
<set servo="MOTOR_10" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_11" value="($th_hold? -9600 : actuators_pprz[3])"/>
<set servo="MOTOR_12" value="($th_hold? -9600 : actuators_pprz[3])"/>
<!-- Removed ApplyDiff for differential control -->
<set servo="AIL_1" value="($th_hold? 9600 : actuators_pprz[4])"/>
<set servo="AIL_2" value="($th_hold? 9600 : actuators_pprz[5])"/>
<set servo="AIL_3" value="actuators_pprz[6]"/>
<set servo="AIL_4" value="actuators_pprz[7]"/>
</command_laws>
<section name="MISC">
<define name="VoltageOfAdc(adc)" value="((3.3f/4096.0f) * 17.8574 * adc)"/>
<define name="NO_RC_THRUST_LIMIT" value="TRUE"/>
<!-- Basic navigation settings -->
<define name="NAV_CLIMB_VSPEED" value="3.5"/>
<define name="NAV_DESCEND_VSPEED" value="-0.7"/>
<define name="ARRIVED_AT_WAYPOINT" value="50.0"/>
<!-- Settings for circle -->
<define name="DEFAULT_CIRCLE_RADIUS" value="700"/>
<define name="NAV_CARROT_DIST" value="200"/>
<!-- Avoid GPS loss behavior when having RC or datalink -->
<define name="NO_GPS_LOST_WITH_DATALINK_TIME" value="20"/>
<define name="NO_GPS_LOST_WITH_RC_VALID" value="TRUE"/>
</section>
<section name="FORWARD">
<!--The Nederdrone uses a slightly different axis system for the setpoint, to make both hovering and flying forward intuitive-->
<define name="USE_EARTH_BOUND_RC_SETPOINT" value="TRUE"/>
<!-- This is the pitch angle that the Nederdrone will have in forward flight, where 0 degrees is hover-->
<define name="TRANSITION_MAX_OFFSET" value="-80.0" unit="deg"/>
<!-- For RC coordinated turns, lower because the yawing was too slow -->
<define name="MAX_FWD_SPEED" value="20.0"/>
<!-- For hybrid guidance -->
<define name="MAX_AIRSPEED" value="20.0"/>
<!-- Enable airspeed measurements -->
<define name="USE_AIRSPEED" value="TRUE"/>
</section>
<section name="IMU" prefix="IMU_">
<!-- Rotate the IMU -->
<define name="MPU_CHAN_X" value="0"/>
<define name="MPU_CHAN_Y" value="2"/>
<define name="MPU_CHAN_Z" value="1"/>
<define name="MPU_X_SIGN" value="-1"/>
<define name="MPU_Y_SIGN" value="1"/>
<define name="MPU_Z_SIGN" value="1"/>
<!-- Calibated 2022-08-30 (Next to cyberzoo body only) -->
<define name="ACCEL_X_NEUTRAL" value="-40"/>
<define name="ACCEL_Y_NEUTRAL" value="45"/>
<define name="ACCEL_Z_NEUTRAL" value="-34"/>
<define name="ACCEL_X_SENS" value="4.892994928744868" integer="16"/>
<define name="ACCEL_Y_SENS" value="4.83273312391633" integer="16"/>
<define name="ACCEL_Z_SENS" value="4.92376963825951" integer="16"/>
<!-- Calibrated 2022-08-31 (Outside TU Delft) -->
<define name="MAG_X_NEUTRAL" value="69"/>
<define name="MAG_Y_NEUTRAL" value="2352"/>
<define name="MAG_Z_NEUTRAL" value="3381"/>
<define name="MAG_X_SENS" value="0.611984316047597" integer="16"/>
<define name="MAG_Y_SENS" value="0.6321285137117578" integer="16"/>
<define name="MAG_Z_SENS" value="0.6495870967651789" integer="16"/>
<!-- Define axis in hover frame -->
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="75.3" unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE" prefix="STABILIZATION_ATTITUDE_">
<!-- setpoints -->
<define name="SP_MAX_PHI" value="60." unit="deg"/>
<define name="SP_MAX_THETA" value="80." unit="deg"/>
<define name="SP_MAX_R" value="180." unit="deg/s"/>
<define name="DEADBAND_R" value="200"/>
<define name="SP_PSI_DELTA_LIMIT" value="60" unit="deg"/>
</section>
<section name="STABILIZATION_ATTITUDE_INDI" prefix="STABILIZATION_INDI_">
<define name="G1_ROLL" value="{ 0.8, -0.8, 1.6, -1.6, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH" value="{ 0.95, 0.95, -1.425, -1.425, -0.5, -0.5, -0.5, -0.5}"/>
<define name="G1_YAW" value="{ 0.00, 0.0, -0.00, 0.00, 0.4, -0.4, -0.4, 0.4}"/>
<define name="G1_THRUST" value="{ -0.3, -0.3, -0.45, -0.45, 0.0, 0.0, 0.0, 0.0}"/>
<!--Counter torque effect of spinning up a rotor-->
<define name="G2" value="{0, 0, 0, 0, 0, 0, 0, 0}"/>
<!-- Forward gains -->
<define name="G1_ROLL_FWD" value="{ 0.5, -0.5, 0.96, -0.96, 0.0, 0.0, 0.0, 0.0}"/>
<define name="G1_PITCH_FWD" value="{ 0.6, 0.6, -0.86, -0.86, -1.4, -1.4, -1.4, -1.4}"/>
<define name="G1_YAW_FWD" value="{ 0.0, 0.0, 0.0, 0.0, 0.94, -0.94, -0.94, 0.94}"/>
<define name="G1_THRUST_FWD" value="{-0.3 -0.3, -0.45, -0.45, 0.0, 0.0, 0.0, 0.0}"/>
<!-- reference acceleration for attitude control -->
<define name="REF_ERR_P" value="30.0"/>
<define name="REF_ERR_Q" value="30.0"/>
<define name="REF_ERR_R" value="20.0"/>
<define name="REF_RATE_P" value="6.0"/>
<define name="REF_RATE_Q" value="6.0"/>
<define name="REF_RATE_R" value="6.0"/>
<!--Maxium yaw rate, to avoid instability-->
<define name="MAX_R" value="180.0" unit="deg/s"/>
<!-- Maximum rate setpoint in rate control mode -->
<define name="MAX_RATE" value="3.0" unit="rad/s"/>
<!-- second order filter parameters -->
<define name="FILT_CUTOFF" value="1.5"/>
<define name="FILT_CUTOFF_RDOT" value="0.5"/>
<define name="ESTIMATION_FILT_CUTOFF" value="5.0"/>
<define name="FILT_CUTOFF_P" value="20."/>
<define name="FILT_CUTOFF_Q" value="20."/>
<define name="FILT_CUTOFF_R" value="4."/>
<!-- first order actuator dynamics -->
<!--define name="ACT_DYN" value="{0.009, 0.009, 0.009, 0.009, 0.05, 0.05, 0.05, 0.05}"/-->
<define name="ACT_DYN" value="{0.028, 0.028, 0.028, 0.028, 0.05, 0.05, 0.05, 0.05}"/>
<define name="ACT_RATE_LIMIT" value="{9600, 9600, 9600, 9600, 170, 170, 170, 170}"/>
<define name="ACT_IS_SERVO" value="{0, 0, 0, 0, 1, 1, 1, 1}"/>
<!-- Adaptive Learning Rate -->
<define name="USE_ADAPTIVE" value="FALSE"/>
<define name="ADAPTIVE_MU" value="0.0001"/>
<!-- Trims -->
<define name="TRIM_ELEVATOR" value="1800"/>
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="HOVER_KP" value="310"/>
<define name="HOVER_KD" value="130"/>
<define name="HOVER_KI" value="10"/>
<define name="NOMINAL_HOVER_THROTTLE" value="0.42"/>
<define name="ADAPT_THROTTLE_ENABLED" value="FALSE"/>
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="MAX_BANK" value="28" unit="deg"/>
<define name="USE_SPEED_REF" value="TRUE"/>
<define name="PGAIN" value="60"/>
<define name="DGAIN" value="100"/>
<define name="AGAIN" value="0"/>
<define name="IGAIN" value="20"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="a0,a1,a2,a3,a4,a5,a6,a7,a8" type="string[]"/>
<define name="JSBSIM_MODEL" value="nederdrone4_tem" type="string"/>
<define name="NO_MOTOR_MIXING" value="TRUE"/>
<define name="COMMANDS_NB" value="9"/>
<define name="SENSORS_PARAMS" value="nps_sensors_params_default.h" type="string"/>
<!-- mode switch on joystick channel 5 (axis numbering starting at zero) -->
<define name="JS_AXIS_MODE" value="4"/>
<define name="DEBUG_SPEED_SP" value="false"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_FORWARD"/>
<define name="MODE_AUTO2" value="AP_MODE_NAV"/>
<define name="MODE_STARTUP" value="AP_MODE_NAV"/>
</section>
<section name="BAT">
<define name="CATASTROPHIC_BAT_LEVEL" value="18.0" unit="V"/>
<define name="CRITIC_BAT_LEVEL" value="18.6" unit="V"/>
<define name="LOW_BAT_LEVEL" value="19.2" unit="V"/>
<define name="MAX_BAT_LEVEL" value="25.2" unit="V"/>
<define name="BAT_NB_CELLS" value="6"/>
</section>
</airframe>