*** empty log message ***

This commit is contained in:
Antoine Drouin
2006-07-18 07:12:12 +00:00
parent 2f4e016bb1
commit f2baa55149
11 changed files with 423 additions and 92 deletions
+7 -7
View File
@@ -26,14 +26,14 @@
</rc_commands>
<command_laws>
<let var="roll" value="0.3 * @ROLL"/>
<let var="pitch" value="0.3 * @PITCH"/>
<let var="yaw" value="-0.4 * @YAW"/>
<let var="roll" value="trim_roll + 0.3 * @ROLL"/>
<let var="pitch" value="trim_pitch + 0.3 * @PITCH"/>
<let var="yaw" value="trim_yaw + -0.4 * @YAW"/>
<let var="throttle" value="@THROTTLE"/>
<set servo="MOTOR_FRONT" value="$throttle < 500 ? 0 : $throttle + $pitch - $yaw"/>
<set servo="MOTOR_BACK" value="$throttle < 500 ? 0 : $throttle - $pitch - $yaw"/>
<set servo="MOTOR_RIGHT" value="$throttle < 500 ? 0 : $throttle + $roll + $yaw"/>
<set servo="MOTOR_LEFT" value="$throttle < 500 ? 0 : $throttle - $roll + $yaw"/>
<set servo="MOTOR_FRONT" value="rc_values[RADIO_THROTTLE] < 500 ? 0 : $throttle + $pitch - $yaw"/>
<set servo="MOTOR_BACK" value="rc_values[RADIO_THROTTLE] < 500 ? 0 : $throttle - $pitch - $yaw"/>
<set servo="MOTOR_RIGHT" value="rc_values[RADIO_THROTTLE] < 500 ? 0 : $throttle + $roll + $yaw"/>
<set servo="MOTOR_LEFT" value="rc_values[RADIO_THROTTLE] < 500 ? 0 : $throttle - $roll + $yaw"/>
</command_laws>
<section name="adc" prefix="ADC_CHANNEL_">
+222
View File
@@ -0,0 +1,222 @@
<airframe name="Microjet5">
<!-- tiny test airframe -->
<!-- commands section -->
<servos>
<servo name="GAZ" no="0" min="1000" neutral="1000" max="2000"/>
<servo name="AILEVON_LEFT" no="1" max="1150" neutral="1530" min="1950"/>
<servo name="AILEVON_RIGHT" no="2" max="1900" neutral="1450" min="1050"/>
</servos>
<commands>
<axis name="THROTTLE" failsafe_value="0"/>
<axis name="ROLL" failsafe_value="0"/>
<axis name="PITCH" failsafe_value="0"/>
</commands>
<rc_commands>
<set command="THROTTLE" value="@THROTTLE"/>
<set command="ROLL" value="@ROLL"/>
<set command="PITCH" value="@PITCH"/>
</rc_commands>
<section name="MIXER">
<define name="AILEVON_AILERON_RATE" value="0.3"/>
<define name="AILEVON_ELEVATOR_RATE" value="0.7"/>
</section>
<command_laws>
<let var="aileron" value="@ROLL * AILEVON_AILERON_RATE"/>
<let var="elevator" value="@PITCH * AILEVON_ELEVATOR_RATE"/>
<set servo="GAZ" value="@THROTTLE"/>
<set servo="AILEVON_LEFT" value="$elevator + $aileron"/>
<set servo="AILEVON_RIGHT" value="$elevator - $aileron"/>
</command_laws>
<section name="AUTO1" prefix="AUTO1_">
<define name="MAX_ROLL" value="0.6"/>
<define name="MAX_PITCH" value="0.6"/>
</section>
<section name="adc" prefix="ADC_CHANNEL_">
<define name="IR1" value="ADC_0"/>
<define name="IR2" value="ADC_1"/>
<define name="IR_TOP" value="ADC_6"/>
<define name="IR_NB_SAMPLES" value="16"/>
<define name="VSUPPLY" value="ADC_3"/>
<define name="GYRO_ROLL" value="ADC_4"/>
<define name="GYRO_TEMP" value="ADC_5"/>
<define name="GYRO_NB_SAMPLES" value="16"/>
</section>
<section name="INFRARED" prefix="IR_">
<define name="ROLL_NEUTRAL_DEFAULT" value="0" unit="deg"/>
<define name="PITCH_NEUTRAL_DEFAULT" value="0" unit="deg"/>
<define name="DEFAULT_CONTRAST" value="200"/>
<define name="RAD_OF_IR_CONTRAST" value="0.75"/>
<linear name="RollOfIrs" arity="2" coeff1="-0.5" coeff2="0.5"/>
<linear name="PitchOfIrs" arity="2" coeff1="-0.5" coeff2="-0.5"/>
<linear name="TopOfIr" arity="1" coeff1="-1"/>
<define name="RAD_OF_IR_MAX_VALUE" value="0.0045"/>
<define name="RAD_OF_IR_MIN_VALUE" value="0.00075"/>
<define name="ADC_ROLL_NEUTRAL" value="0"/>
<define name="ADC_PITCH_NEUTRAL" value="-512"/>
<define name="ADC_TOP_NEUTRAL" value="512"/>
</section>
<section name="GYRO" prefix="GYRO_">
<define name="ADC_ROLL_COEF" value="1"/>
<define name="ADC_ROLL_NEUTRAL" value="500"/>
<define name="ADC_TEMP_NEUTRAL" value="476"/>
<define name="ADC_TEMP_SLOPE" value="0"/>
</section>
<section name="BAT">
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
<define name="VOLTAGE_ADC_A" value="0.0177531"/>
<define name="VOLTAGE_ADC_B" value="0.173626"/>
<define name="VoltageOfAdc(adc)" value="(VOLTAGE_ADC_A * adc + VOLTAGE_ADC_B)"/>
<define name="LOW_BATTERY" value="9.3" unit="V"/>
</section>
<section name="MISC">
<define name="NOMINAL_AIRSPEED" value="12." 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_RATE" value="60" unit="Hz"/>
</section>
<section name="PID">
<define name="ROLL_PGAIN" value="5000."/>
<define name="PITCH_OF_ROLL" value="0.0"/>
<define name="PITCH_PGAIN" value="8000."/>
<define name="MAX_ROLL" value="0.35"/>
<define name="MAX_PITCH" value="0.35"/>
<define name="MIN_PITCH" value="-0.35"/>
<define name="AILERON_OF_GAZ" value="0.0"/>
</section>
<section name="ALT" prefix="CLIMB_">
<define name="PITCH_PGAIN" value="-0.1"/>
<define name="PITCH_IGAIN" value="0.025"/>
<define name="PGAIN" value="-0.03"/>
<define name="IGAIN" value="0.1"/>
<define name="MAX" value="1."/>
<define name="LEVEL_GAZ" value="0.50"/>
<define name="PITCH_OF_VZ_PGAIN" value="0.05"/>
<define name="GAZ_OF_CLIMB" value="0.2" unit="%/(m/s)"/>
</section>
<section name="NAV">
<define name="COURSE_PGAIN" value="-0.2"/>
<define name="ALTITUDE_PGAIN" value="-0.025"/>
<define name="NAV_PITCH" value="0."/>
</section>
<section name="SIMU">
<define name="ROLL_RESPONSE_FACTOR" value="2."/>
<define name="YAW_RESPONSE_FACTOR" value="1.35"/>
<define name="WEIGHT" value="1.3"/>
</section>
<section name="AGGRESSIVE" prefix="AGR_">
<define name="CLIMB_GAZ" value="0.75"/><!-- Gaz for Aggressive Climb -->
<define name="DESCENT_GAZ" value="0.1"/><!-- Gaz for Aggressive Decent -->
<define name="CLIMB_PITCH" value="0.3"/><!-- Pitch for Aggressive Climb -->
<define name="DESCENT_PITCH" value="-0.35"/><!-- Pitch for Aggressive Decent -->
<define name="BLEND_START" value="30"/><!-- Altitude Error to Initiate Aggressive Climb CANNOT BE ZERO!!-->
<define name="BLEND_END" value="15"/><!-- Altitude Error to Blend Aggressive to Regular Climb Modes CANNOT BE ZERO!!-->
<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="GYRO_GAINS">
<define name="GYRO_MAX_RATE" value="200."/>
<define name="ROLLRATESUM_NB_SAMPLES" value="60"/>
<define name="ATTITUDE_PGAIN" value="120.0"/>
<define name="ROLL_RATE_PGAIN" value="85.0"/>
<define name="ROLL_RATE_IGAIN" value="0.0"/>
<define name="ROLL_RATE_DGAIN" value="0.0"/>
<define name="ROLL_ATTITUDE_PGAIN" value="120.0"/><!-- new gyro ,was 600-->
</section>
<section name="FAILSAFE" prefix="FAILSAFE_">
<define name="DELAY_WITHOUT_GPS" value="1" unit="s"/>
<define name="DEFAULT_GAZ" value="0.0" unit="%"/>
<define name="DEFAULT_ROLL" value="0.3" unit="rad"/>
<define name="DEFAULT_PITCH" value="0.5" unit="rad"/>
<define name="HOME_RADIUS" value="100" unit="m"/>
</section>
<section name="DATALINK" prefix="DATALINK_">
<define name="DEVICE_TYPE" value="XBEE"/>
<define name="DEVICE_ADDRESS" value="...."/>
</section>
<makefile>
include $(PAPARAZZI_SRC)/conf/autopilot/tiny.makefile
FLASH_MODE=IAP
ap.CFLAGS += -DFBW -DAP -DCONFIG=\"tiny.h\" -DLED -DTIME_LED=1
ap.srcs = sys_time.c $(SRC_ARCH)/sys_time_hw.c $(SRC_ARCH)/armVIC.c main_fbw.c main_ap.c main.c
ap.CFLAGS += -DLED_3_BANK=0 -DLED_3_PIN=17 -DLED_4_BANK=0 -DLED_4_PIN=18 -DLED_5_BANK=0 -DLED_5_PIN=19 -DLED_6_BANK=0 -DLED_6_PIN=20
ap.srcs += commands.c
ap.CFLAGS += -DACTUATORS=\"servos_4015_hw.h\" -DSERVOS_4015
ap.srcs += actuators.c $(SRC_ARCH)/servos_4015_hw.c
ap.CFLAGS += -DRADIO_CONTROL -DRADIO_CONTROL_TYPE=RC_FUTABA
ap.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.c
ap.CFLAGS += -DDOWNLINK -DUSE_UART0 -DDOWNLINK_TRANSPORT=XBeeTransport -DDOWNLINK_FBW_DEVICE=Uart0 -DDOWNLINK_AP_DEVICE=Uart0 -DXBEE_UART=Uart0 -DDATALINK=XBEE -DUART0_BAUD=B9600
ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c datalink.c xbee.c
#ap.CFLAGS += -DDOWNLINK -DUSE_UART0 -DDOWNLINK_TRANSPORT=PprzTransport -DDOWNLINK_FBW_DEVICE=Uart0 -DDOWNLINK_AP_DEVICE=Uart0 -DPPRZ_UART=Uart0 -DDATALINK=PPRZ -DUART0_BAUD=B9600
#ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c datalink.c pprz_transport.c
ap.CFLAGS += -DINTER_MCU
ap.srcs += inter_mcu.c
ap.CFLAGS += -DADC -DUSE_AD0 -DUSE_AD0_2 -DUSE_AD0_3 -DUSE_AD1 -DUSE_AD1_5 -DUSE_AD1_7 -DUSE_AD1_3 -DUSE_AD1_5
#ap.CFLAGS += -DADC -DUSE_AD0 -DUSE_AD0_1 -DUSE_AD0_2 -DUSE_AD0_3 -DUSE_AD1 -DUSE_AD1_5 -DUSE_AD1_7 -DUSE_AD1_3 -DUSE_AD1_5
ap.srcs += $(SRC_ARCH)/adc_hw.c
ap.CFLAGS += -DGPS -DUBX -DUSE_UART1 -DGPS_LINK=Uart1 -DUART1_BAUD=B19200
ap.srcs += gps_ubx.c gps.c
ap.CFLAGS += -DINFRARED
ap.srcs += infrared.c estimator.c
ap.CFLAGS += -DNAV
ap.srcs += nav.c pid.c
ap.CFLAGS += -DGYRO -DSPARK_FUN -DATTITUDE_RATE_MODE
ap.srcs += gyro.c
# Harware In The Loop
#ap.CFLAGS += -DHITL
# Config for SITL simulation
include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
test.CFLAGS += -DFBW -DCONFIG=\"tiny.h\" -DLED -DTIME_LED=1 -DACTUATORS=\"servos_4015_hw.h\" -DSERVOS_4015 -DUSE_UART0 -DUART0_BAUD=B9600 -DDATALINK=PPRZ -DPPRZ_UART=Uart0
test.srcs += sys_time.c $(SRC_ARCH)/sys_time_hw.c $(SRC_ARCH)/armVIC.c pprz_transport.c setup_actuators.c $(SRC_ARCH)/uart_hw.c $(SRC_ARCH)/servos_4015_hw.c main.c
#tunel.CFLAGS += -DFBW -DCONFIG=\"tiny.h\" -DLED -DTIME_LED=1
tunnel.srcs += $(SRC_ARCH)/uart_tunnel.c
</makefile>
</airframe>
+8 -6
View File
@@ -21,20 +21,20 @@
<dl_setting VAR="pitch_pgain" MAX="15000" STEP="250" MIN="1000"/>
</dl_settings>
<dl_settings name="rate_loop">
<dl_setting VAR="roll_rate_pgain" MIN="0." STEP="1.0" MAX="2000."/>
<dl_setting VAR="attitude_pgain" MAX="100" STEP="1" MIN="10"/>
</dl_settings>
<dl_settings name="nav">
<dl_setting VAR="climb_level_gaz" MAX="0.7" STEP="0.05" MIN="0.3"/>
<dl_setting VAR="climb_pgain" MAX="-0.01" STEP="0.01" MIN="-0.5"/>
<dl_setting VAR="course_pgain" MAX="-0.1" STEP="0.05" MIN="-2"/>
</dl_settings>
</dl_settings>
<!--
<dl_setting VAR="roll_rate_pgain" MIN="0." STEP="1.0" MAX="2000."/>
<dl_setting VAR="attitude_pgain" MAX="100" STEP="1" MIN="10"/>
-->
</dl_settings>
<waypoints>
<waypoint NAME="HOME" X="0" Y="0"/>
<waypoint NAME="1" X="200" Y="0"/>
@@ -43,9 +43,11 @@
<waypoint alt="450." name="S2" x="136.75000196" y="308.874998301"/>
</waypoints>
<!--
<include name="fs" procedure="failsafe_modes.xml">
<arg name="kill_pitch" value="-0.5"/>
</include>
-->
<blocks>
<block NAME="wait GPS">
+43 -7
View File
@@ -4,23 +4,38 @@
<dl_settings>
<dl_setting VAR="roll_dot_pid.p_gain" MAX="6000" STEP="100" MIN="2000"/>
<dl_setting VAR="roll_dot_pid.i_gain" MAX="1000" STEP="10" MIN="0"/>
<dl_setting VAR="roll_dot_pid.d_gain" MAX="10" STEP="0.5" MIN="0"/>
<dl_settings name="trim">
<dl_setting var="trim_roll" min="-1000" step="10" max="1000"/>
<dl_setting var="trim_pitch" min="-1000" step="10" max="1000"/>
<dl_setting var="trim_yaw" min="-1000" step="10" max="1000"/>
</dl_settings>
<dl_setting VAR="pitch_dot_pid.p_gain" MAX="-2000" STEP="100" MIN="-6000"/>
<dl_setting VAR="pitch_dot_pid.i_gain" MAX="1000" STEP="10" MIN="0"/>
<dl_settings name="rate">
<dl_setting VAR="roll_dot_pid.p_gain" MAX="6000" STEP="100" MIN="2000"/>
<dl_setting VAR="roll_dot_pid.i_gain" MAX="750" STEP="0.05" MIN="0"/>
<dl_setting VAR="roll_dot_pid.d_gain" MAX="10" STEP="0.5" MIN="0"/>
<dl_setting VAR="roll_dot_pid.sum_err" MAX="1" STEP="1" MIN="0"/>
<dl_setting VAR="pitch_dot_pid.p_gain" MAX="-2000" STEP="100" MIN="-16000"/>
<dl_setting VAR="pitch_dot_pid.i_gain" MAX="5" STEP="0.05" MIN="0"/>
<dl_setting VAR="pitch_dot_pid.d_gain" MAX="10" STEP="0.5" MIN="0"/>
<dl_setting VAR="pitch_dot_pid.sum_err" MAX="1" STEP="1" MIN="0"/>
<dl_setting VAR="yaw_dot_pid.p_gain" MAX="-2000" STEP="100" MIN="-6000"/>
<dl_setting VAR="yaw_dot_pid.i_gain" MAX="10" STEP="0.5" MIN="0"/>
<dl_setting VAR="yaw_dot_pid.i_gain" MAX="5" STEP="0.05" MIN="0"/>
<dl_setting VAR="yaw_dot_pid.d_gain" MAX="10" STEP="0.5" MIN="0"/>
<dl_setting VAR="yaw_dot_pid.sum_err" MAX="1" STEP="1" MIN="0"/>
</dl_settings>
<dl_settings name="att">
<dl_setting VAR="roll_pid.p_gain" MAX="-0.1" STEP="0.1" MIN="-5."/>
<dl_setting VAR="roll_pid.i_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="roll_pid.d_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="pitch_pid.p_gain" MAX="-.1" STEP="0.1" MIN="-5."/>
<dl_setting VAR="pitch_pid.p_gain" MAX="-.1" STEP="0.1" MIN="-15."/>
<dl_setting VAR="pitch_pid.i_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="pitch_pid.d_gain" MAX="10" STEP="0.1" MIN="0"/>
@@ -28,6 +43,14 @@
<dl_setting VAR="yaw_pid.i_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="yaw_pid.d_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="yaw_pid.set_point" MAX="3" STEP="0.1" MIN="-3"/>
<dl_setting VAR="pitch_pid.set_point" MAX="0.3" STEP="0.05" MIN="-0.3"/>
<dl_setting VAR="roll_pid.set_point" MAX="0.3" STEP="0.05" MIN="-0.3"/>
</dl_settings>
<dl_settings name="alt">
<dl_setting VAR="ctl_grz_z_dot_pgain" MAX="-500" STEP="100" MIN="-6000"/>
<dl_setting VAR="ctl_grz_z_dot_igain" MAX="5" STEP="0.05" MIN="0"/>
<dl_setting VAR="ctl_grz_z_dot_dgain" MAX="10" STEP="0.5" MIN="0"/>
@@ -38,10 +61,23 @@
<dl_setting VAR="ctl_grz_z_igain" MAX="10" STEP="0.5" MIN="0"/>
<dl_setting VAR="ctl_grz_z_dgain" MAX="10" STEP="0.5" MIN="0"/>
</dl_settings>
<dl_settings name="speed">
<dl_setting VAR="ve_pid.p_gain" MAX="-0.01" STEP="0.01" MIN="-0.5"/>
<dl_setting VAR="ve_pid.i_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="ve_pid.d_gain" MAX="10" STEP="0.1" MIN="0"/>
<dl_setting VAR="estimator_hspeed_mod" MAX="2" STEP="0.1" MIN="0"/>
<dl_setting VAR="estimator_hspeed_dir" MAX="3" STEP="0.1" MIN="-3"/>
<dl_setting VAR="ve_pid.sum_err" MAX="1" STEP="1" MIN="0"/>
<dl_setting VAR="vn_pid.sum_err" MAX="1" STEP="1" MIN="0"/>
<dl_setting VAR="sum_err_reset" MAX="1" STEP="1" MIN="0"/>
</dl_settings>
</dl_settings>
+4 -4
View File
@@ -3,14 +3,14 @@
<telemetry>
<process name="Ap">
<mode name="default">
<message name="PPRZ_MODE" period="5"/>
<message name="DL_VALUE" period="1"/>
<message name="RANGEFINDER" period="2"/>
<message name="GRZ_MEASURE" period="0.5"/>
<message name="PPRZ_MODE" period="5"/>
<message name="RANGEFINDER" period="0.2"/>
<message name="GRZ_RATE_LOOP" period="0.5"/>
<message name="GRZ_ATTITUDE_LOOP" period="0.5"/>
<message name="SPEED_LOOP" period="0.5"/>
<message name="ATTITUDE" period="0.5"/>
<message name="GRZ_ATTITUDE_LOOP" period="0.5"/>
<message name="GRZ_MEASURE" period="0.5"/>
</mode>
<mode name="debug">
<message name="PPRZ_MODE" period="5"/>
+28 -6
View File
@@ -1,4 +1,5 @@
#include "std.h"
#include "ahrs_new.h"
#include <math.h>
@@ -118,7 +119,7 @@ real_t Qdot[4];
*/
//#define Q_gyro 0.0075
/* I measured about 0.009 rad/s noise */
#define Q_gyro 8e-05
#define Q_gyro 8e-03
/*
@@ -131,6 +132,7 @@ real_t Qdot[4];
#define R_pitch 1.3 * 1.3
#define R_roll 1.3 * 1.3
#define R_yaw 2.5 * 2.5
// #define R_yaw 1. * 1.
//#define R_pitch 0.1 * 0.1
//#define R_roll 0.1 * 0.1
//#define R_yaw 0.5 * 0.5
@@ -535,13 +537,17 @@ run_kalman(
bias_p += K[4] * error;
bias_q += K[5] * error;
bias_r += K[6] * error;
/* Bound(bias_p, -0.1, 0.1); */
/* Bound(bias_q, -0.1, 0.1); */
/* Bound(bias_r, -0.1, 0.1); */
#endif
/*
* We would normally normalize our quaternion here, but
* instead we will allow our caller to do it
*/
//norm_quat();
// norm_quat();
}
@@ -660,11 +666,27 @@ ahrs_pitch_update(
*/
real_t ahrs_heading_of_mag( const int16_t* mag ) {
const real_t ctheta = cos( ahrs_euler[1] );
const real_t mn = ctheta * mag[0]
- (dcm12 * mag[1] + dcm22 * mag[2]) * dcm02 / ctheta;
/* const real_t mn = ctheta * mag[0] */
/* - (dcm12 * mag[1] + dcm22 * mag[2]) * dcm02 / ctheta; */
const real_t me =
(dcm22 * mag[1] - dcm12 * mag[2]) / ctheta;
/* const real_t me = */
/* (dcm22 * mag[1] - dcm12 * mag[2]) / ctheta; */
/***/
const real_t stheta = sin( ahrs_euler[AXIS_Y] );
const real_t cphi = cos( ahrs_euler[AXIS_X] );
const real_t sphi = sin( ahrs_euler[AXIS_X] );
const real_t mn =
ctheta* mag[0]+
sphi*stheta* mag[1]+
cphi*stheta* mag[2];
const real_t me =
0* mag[0]+
cphi* mag[1]+
-sphi* mag[2];
/***/
const real_t heading = -atan2( me, mn );
+85 -50
View File
@@ -37,24 +37,29 @@
while ( n < lower) { n += (uper - lower);} \
}
float trim_roll = -450;
float trim_yaw = -250;
float trim_pitch = 0;
float max_roll_dot_sp = (1.5/MAX_PPRZ);
float max_pitch_dot_sp = (1.5/MAX_PPRZ);
float max_yaw_dot_sp = (1.5/MAX_PPRZ);
float max_roll_sp = (0.8/MAX_PPRZ);
float max_pitch_sp = (0.8/MAX_PPRZ);
float max_roll_sp = (0.4/MAX_PPRZ);
float max_pitch_sp = (0.4/MAX_PPRZ);
/* yaw is incremented acording to stick position */
#define UPDATE_SP_DT 0.016384
float max_yaw_sp = (0.8/MAX_PPRZ*UPDATE_SP_DT);
float max_v_sp = (3./MAX_PPRZ);
float max_v_sp = (6./MAX_PPRZ);
static float throttle_setpoint = 0.;
float max_z_dot_sp = (10./MAX_PPRZ);
float ctl_grz_z_dot_pgain = -1200;
float max_z_dot_sp = (5./MAX_PPRZ);
float ctl_grz_z_dot_pgain = -2000;
float ctl_grz_z_dot_igain = 3.;
float ctl_grz_z_dot_dgain = 5.;
float ctl_grz_z_dot_dgain = 8.;
float ctl_grz_z_dot = 0;
float ctl_grz_z_dot_setpoint = 0.;
float ctl_grz_z_dot_sum_err = 0.;
@@ -88,25 +93,24 @@ struct pid ve_pid;
void ctl_grz_init( void ) {
roll_dot_pid.p_gain = 4000.;
roll_dot_pid.i_gain = 0.;
roll_dot_pid.d_gain = 2.5;
roll_dot_pid.p_gain = 4700.;
roll_dot_pid.i_gain = 1.;
roll_dot_pid.d_gain = 1.875;
pitch_dot_pid.p_gain = -4000.;
pitch_dot_pid.i_gain = 0.;
pitch_dot_pid.d_gain = 2.5;
pitch_dot_pid.p_gain = -4700.;
pitch_dot_pid.i_gain = 1.;
pitch_dot_pid.d_gain = 1.875;
yaw_dot_pid.p_gain = -4500.;
yaw_dot_pid.i_gain = 0.;
yaw_dot_pid.d_gain = 0.;
yaw_dot_pid.p_gain = -4700.;
yaw_dot_pid.i_gain = 1.;
yaw_dot_pid.d_gain = 2.;
roll_pid.p_gain = -2.5;
roll_pid.p_gain = -5;
roll_pid.i_gain = 0.;
roll_pid.d_gain = 1.;
roll_pid.saturation = 3.;
pitch_pid.p_gain = -2.5;
pitch_pid.p_gain = -5;
pitch_pid.i_gain = 0.;
pitch_pid.d_gain = 1.;
pitch_pid.saturation = 3.;
@@ -115,15 +119,16 @@ void ctl_grz_init( void ) {
yaw_pid.i_gain = 0.;
yaw_pid.d_gain = 0.;
yaw_pid.saturation = 2.;
yaw_pid.set_point = 0.; // RadOfDeg(-20);
vn_pid.p_gain = -0.1;
vn_pid.i_gain = 0.;
vn_pid.d_gain = 0.;
vn_pid.saturation = .2;
ve_pid.p_gain = -0.1;
ve_pid.i_gain = 0.;
ve_pid.d_gain = 0.;
ve_pid.p_gain = -0.2;
ve_pid.i_gain = 1.;
ve_pid.d_gain = 1.;
ve_pid.saturation = .2;
}
@@ -149,25 +154,25 @@ void ctl_grz_set_setpoints_auto1( void ) {
}
#endif
// ctl_grz_z_dot_setpoint = (rc_values[RADIO_THROTTLE] - MAX_PPRZ/2) * max_z_dot_sp;
// throttle_setpoint = rc_values[RADIO_THROTTLE];
ctl_grz_z_setpoint = rc_values[RADIO_THROTTLE] * max_z_sp - 0.4;
throttle_setpoint = rc_values[RADIO_THROTTLE];
// ctl_grz_z_setpoint = rc_values[RADIO_THROTTLE] * max_z_sp - 0.5;
}
void ctl_grz_set_setpoints_auto2( void ) {
/* roll_pid.set_point = - rc_values[RADIO_ROLL] * max_roll_sp; */
/* pitch_pid.set_point = rc_values[RADIO_PITCH] * max_pitch_sp; */
roll_pid.set_point = - rc_values[RADIO_ROLL] * max_roll_sp;
pitch_pid.set_point = rc_values[RADIO_PITCH] * max_pitch_sp;
float vright = rc_values[RADIO_ROLL] * max_v_sp;
float vfront = rc_values[RADIO_PITCH] * max_v_sp;
/* float vright = - rc_values[RADIO_ROLL] * max_v_sp; */
/* float vfront = - rc_values[RADIO_PITCH] * max_v_sp; */
float alpha = M_PI/2. - yaw_pid.measure;
float cos_alpha = cos(alpha);
float sin_alpha = sin(alpha);
ve_pid.set_point = cos_alpha*vright + sin_alpha*vfront;
vn_pid.set_point = sin_alpha*vright - cos_alpha*vfront;
yaw_dot_pid.set_point = - rc_values[RADIO_YAW] * max_yaw_dot_sp;
ctl_grz_z_setpoint = rc_values[RADIO_THROTTLE] * max_z_sp - 0.4;
/* float alpha = M_PI/2. - yaw_pid.measure; */
/* float cos_alpha = cos(alpha); */
/* float sin_alpha = sin(alpha); */
/* ve_pid.set_point = sin_alpha*vright + cos_alpha*vfront; */
/* vn_pid.set_point = - cos_alpha*vright + sin_alpha*vfront; */
ctl_grz_z_dot_setpoint = (rc_values[RADIO_THROTTLE] - MAX_PPRZ/2) * max_z_dot_sp;
// ctl_grz_z_setpoint = rc_values[RADIO_THROTTLE] * max_z_sp - 0.5;
// throttle_setpoint = rc_values[RADIO_THROTTLE];
}
@@ -189,17 +194,34 @@ void ctl_grz_rate_run ( void ) {
float err = roll_dot_pid.measure - roll_dot_pid.set_point;
float d_err = err - roll_dot_pid.last_err;
roll_dot_pid.last_err = err;
commands[COMMAND_ROLL] = TRIM_PPRZ((int16_t)((err + d_err * roll_dot_pid.d_gain) * roll_dot_pid.p_gain));
if (flying) {
roll_dot_pid.sum_err += err/100;
Bound(roll_dot_pid.sum_err, -0.2, 0.2);
} else
roll_dot_pid.sum_err = 0.;
commands[COMMAND_ROLL] = TRIM_PPRZ((int16_t)((err + d_err * roll_dot_pid.d_gain + roll_dot_pid.sum_err * roll_dot_pid.i_gain) * roll_dot_pid.p_gain));
err = pitch_dot_pid.measure - pitch_dot_pid.set_point;
d_err = err - pitch_dot_pid.last_err;
pitch_dot_pid.last_err = err;
commands[COMMAND_PITCH] = TRIM_PPRZ((int16_t)((err + d_err * pitch_dot_pid.d_gain) * pitch_dot_pid.p_gain));
if (flying) {
pitch_dot_pid.sum_err += err/100;
Bound(pitch_dot_pid.sum_err, -0.2, 0.2);
} else
pitch_dot_pid.sum_err = 0;
commands[COMMAND_PITCH] = TRIM_PPRZ((int16_t)((err + d_err * pitch_dot_pid.d_gain + pitch_dot_pid.sum_err * pitch_dot_pid.i_gain) * pitch_dot_pid.p_gain));
err = yaw_dot_pid.measure - yaw_dot_pid.set_point;
d_err = err - yaw_dot_pid.last_err;
yaw_dot_pid.last_err = err;
commands[COMMAND_YAW] = TRIM_PPRZ((int16_t)((err + d_err * yaw_dot_pid.d_gain) * yaw_dot_pid.p_gain));
if (flying) {
yaw_dot_pid.sum_err += err/100;
Bound(yaw_dot_pid.sum_err, -0.2, 0.2);
} else
yaw_dot_pid.sum_err = 0;
commands[COMMAND_YAW] = TRIM_PPRZ((int16_t)((err + d_err * yaw_dot_pid.d_gain + yaw_dot_pid.sum_err * yaw_dot_pid.i_gain) * yaw_dot_pid.p_gain));
commands[COMMAND_THROTTLE] = throttle_setpoint;
}
@@ -207,7 +229,6 @@ void ctl_grz_rate_run ( void ) {
void ctl_grz_attitude_run ( void ) {
float err = roll_pid.measure - roll_pid.set_point;
float d_err = err - roll_pid.last_err;
roll_pid.last_err = err;
@@ -243,7 +264,7 @@ void ctl_grz_alt_run( void ) {
ctl_grz_z_dot_setpoint = Chop(((err + d_err * ctl_grz_z_dgain + ctl_grz_z_sum_err * ctl_grz_z_igain) * ctl_grz_z_pgain), MIN_Z_DOT, MAX_Z_DOT);
}
void ctl_grz_speed_run( void ) {
void ctl_grz_z_dot_run( void ) {
float err = ctl_grz_z_dot - ctl_grz_z_dot_setpoint;
static float z_dot_last_err;
float d_err = err - z_dot_last_err;
@@ -252,7 +273,8 @@ void ctl_grz_speed_run( void ) {
if (flying) {
ctl_grz_z_dot_sum_err += err/600;
Bound(ctl_grz_z_dot_sum_err, -1., 1.);
}
} else
ctl_grz_z_dot_sum_err = 0;
throttle_setpoint = TRIM_PPRZ(ctl_grz_throttle_level + (int16_t)((err + d_err * ctl_grz_z_dot_dgain + ctl_grz_z_dot_sum_err * ctl_grz_z_dot_igain) * ctl_grz_z_dot_pgain));
}
@@ -266,20 +288,33 @@ void ctl_grz_horiz_speed_run ( void ) {
float err = ve_pid.measure - ve_pid.set_point;
float d_err = err - ve_pid.last_err;
ve_pid.last_err = err;
east_angle_set_point = (err + d_err * ve_pid.d_gain) * ve_pid.p_gain;
Bound(east_angle_set_point, ve_pid.saturation, -ve_pid.saturation);
ve_pid.sum_err += err/100;
east_angle_set_point = (err + d_err * ve_pid.d_gain + ve_pid.sum_err * ve_pid.i_gain) * ve_pid.p_gain;
Bound(east_angle_set_point, -ve_pid.saturation, ve_pid.saturation);
Bound(ve_pid.sum_err, -3, 3);
err = ve_pid.measure - vn_pid.set_point;
err = vn_pid.measure - vn_pid.set_point;
d_err = err - vn_pid.last_err;
vn_pid.last_err = err;
north_angle_set_point = (err + d_err * ve_pid.d_gain) * ve_pid.p_gain;
Bound(north_angle_set_point, vn_pid.saturation, -vn_pid.saturation);
vn_pid.sum_err += err/100;
north_angle_set_point = - ((err + d_err * ve_pid.d_gain + vn_pid.sum_err * ve_pid.i_gain) * ve_pid.p_gain);
Bound(north_angle_set_point, -vn_pid.saturation, vn_pid.saturation);
Bound(vn_pid.sum_err, -3, 3);
float alpha = - (M_PI/2. - yaw_pid.measure);
float alpha = (M_PI/2. - yaw_pid.measure);
float cos_alpha = cos(alpha);
float sin_alpha = sin(alpha);
roll_pid.set_point = cos_alpha*east_angle_set_point + sin_alpha*north_angle_set_point;
pitch_pid.set_point = sin_alpha*east_angle_set_point - cos_alpha*north_angle_set_point;
roll_pid.set_point = sin_alpha*east_angle_set_point + cos_alpha*north_angle_set_point;
pitch_pid.set_point = - cos_alpha*east_angle_set_point + sin_alpha*north_angle_set_point;
}
void ctl_grz_reset( void ) {
ctl_grz_z_dot_sum_err = 0;
ve_pid.sum_err = 0;
vn_pid.sum_err = 0;
roll_dot_pid.sum_err = 0;
pitch_dot_pid.sum_err = 0;
yaw_dot_pid.sum_err = 0;
}
+5 -1
View File
@@ -74,7 +74,7 @@ extern void ctl_grz_set_measures( void );
extern void ctl_grz_rate_run ( void );
extern void ctl_grz_attitude_run ( void );
extern void ctl_grz_speed_run ( void );
extern void ctl_grz_z_dot_run ( void );
extern void ctl_grz_alt_run ( void );
extern void ctl_grz_horiz_speed_run ( void );
@@ -85,5 +85,9 @@ extern struct pid ve_pid;
extern bool_t flying;
void ctl_grz_reset( void );
extern float trim_roll, trim_yaw, trim_pitch;
#endif // CONTROL_GRZ_H
+1 -1
View File
@@ -52,7 +52,7 @@ extern struct adc_buf buf_bat;
#define IMU_GYRO_X_GAIN -0.000220177991888642784
#define IMU_GYRO_Y_GAIN -0.000214915108532129801
#define IMU_GYRO_Z_GAIN 0.0002
#define IMU_GYRO_Z_GAIN 0.0002104
#define ImuUpdateGyros() { \
\
+17 -8
View File
@@ -37,6 +37,10 @@ uint16_t rangemeter; /* cm */
#define SWITCH_PEDIOD_MIN 30 /* 60Hz */
bool_t sum_err_reset;
/** 60Hz */
void periodic_task_ap( void ) {
@@ -46,8 +50,13 @@ void periodic_task_ap( void ) {
_10Hz++;
if (_10Hz>=6) _10Hz = 0;
if (!_10Hz)
if (!_10Hz) {
PeriodicSendAp();
if (sum_err_reset) {
sum_err_reset = FALSE;
ctl_grz_reset();
}
}
static uint16_t last_rangemeters[NB_RANGES];
static uint8_t last_idx;
@@ -55,13 +64,13 @@ void periodic_task_ap( void ) {
// ClearBit(ADCSRA, ADIE);
rangemeter = RangeCmOfAdc(rangemeter_adc_buf.sum/rangemeter_adc_buf.av_nb_sample);
// SetBit(ADCSRA, ADIE);
ctl_grz_z = rangemeter / 100.; /* cm -> m */
last_idx++;
if (last_idx >= NB_RANGES) last_idx = 0;
float last_avg = (float)sum_rangemeters / NB_RANGES;
sum_rangemeters += rangemeter - last_rangemeters[last_idx];
last_rangemeters[last_idx] = rangemeter;
float avg = (float)sum_rangemeters / NB_RANGES;
ctl_grz_z = avg / 100.; /* cm -> m */
ctl_grz_z_dot = ((avg - last_avg) * 61. / 100.);
@@ -90,19 +99,19 @@ void periodic_task_ap( void ) {
if (pprz_mode == PPRZ_MODE_AUTO2) {
ctl_grz_set_setpoints_auto2();
}
else if (pprz_mode == PPRZ_MODE_AUTO1) {
ctl_grz_alt_run();
} else if (pprz_mode == PPRZ_MODE_AUTO1) {
ctl_grz_set_setpoints_auto1();
}
if (pprz_mode >= PPRZ_MODE_AUTO2) {
if (!_10Hz)
ctl_grz_horiz_speed_run();
ctl_grz_z_dot_run();
/* if (!_10Hz) */
/* ctl_grz_horiz_speed_run(); */
}
if (pprz_mode >= PPRZ_MODE_AUTO1) {
ctl_grz_speed_run();
// ctl_grz_alt_run();
// ctl_grz_z_dot_run();
ctl_grz_attitude_run();
}
+3 -2
View File
@@ -79,7 +79,7 @@ static inline void main_event_task( void ) {
micromag_data_available = FALSE;
spi_cur_slave = SPI_SLAVE_NONE;
ImuUpdateMag();
// DOWNLINK_SEND_AHRS_MAG(&imu_mag[AXIS_X], &imu_mag[AXIS_Y], &imu_mag[AXIS_Z]);
DOWNLINK_SEND_AHRS_MAG(&imu_mag[AXIS_X], &imu_mag[AXIS_Y], &imu_mag[AXIS_Z]);
spi_cur_slave = SPI_SLAVE_MAX;
max1167_read();
}
@@ -146,7 +146,8 @@ static inline void ahrs_task( void ) {
ahrs_state_update();
ahrs_compass_update(ahrs_heading_of_mag(imu_mag));
DOWNLINK_SEND_AHRS(&q0, &q1, &q2, &q3, &bias_p, &bias_q, &bias_r);
//DOWNLINK_SEND_AHRS2(&ahrs_euler[AXIS_X], &ahrs_euler[AXIS_Y], &ahrs_euler[AXIS_Z]);
// DOWNLINK_SEND_AHRS2(&ahrs_euler[AXIS_X], &ahrs_euler[AXIS_Y], &ahrs_euler[AXIS_Z]);
// DOWNLINK_SEND_AHRS2(&imu_gyro[AXIS_X], &imu_gyro[AXIS_Y], &imu_gyro[AXIS_Z]);
break;
}
ahrs_step++;