Merge remote-tracking branch 'paparazzi/master' into dev

This commit is contained in:
Gautier Hattenberger
2011-09-29 10:45:21 +02:00
30 changed files with 520 additions and 282 deletions
+94 -137
View File
@@ -1,37 +1,69 @@
<!DOCTYPE airframe SYSTEM "../../airframe.dtd">
<!-- Fire Storm
Tiny 1.1
Tilted infrared sensor
Umarim
Radiotronix modem
Drop servo -->
-->
<airframe name="FireStorm">
<modules>
<load name="poles.xml"/>
<load name="baro_board.xml"/>
</modules>
<!-- commands section -->
<firmware name="fixedwing">
<define name="AGR_CLIMB"/>
<define name="ALT_KALMAN"/>
<define name="LOITER_TRIM"/>
<!--define name="PITCH_TRIM"/-->
<target name="sim" board="pc"/>
<target name="ap" board="umarim_1.0">
<configure name="FLASH_MODE" value="IAP"/>
<define name="USE_I2C0"/>
<define name="USE_I2C1"/>
</target>
<subsystem name="radio_control" type="ppm"/>
<!-- Communication -->
<subsystem name="telemetry" type="transparent">
<configure name="MODEM_BAUD" value="B57600"/>
</subsystem>
<!-- Actuators are automatically chosen according to board-->
<subsystem name="imu" type="umarim"/>
<subsystem name="ahrs" type="float_dcm">
<define name="USE_HIGH_ACCEL_FLAG"/>
</subsystem>
<subsystem name="control" type="adaptive"/>
<subsystem name="navigation"/>
<!-- Sensors -->
<subsystem name="gps" type="ublox"/>
<subsystem name="current_sensor">
<configure name="ADC_CURRENT_SENSOR" value="ADC_0"/>
</subsystem>
</firmware>
<!-- commands section -->
<servos>
<servo name="MOTOR" no="3" min="1250" neutral="1250" max="1800"/>
<servo name="AILEVON_LEFT" no="4" min="1850" neutral="1370" max="1000"/>
<servo name="AILEVON_RIGHT" no="5" min="1000" neutral="1515" max="1870"/>
<servo name="HATCH" no="6" min="1350" neutral="1900" max="1900"/>
<servo name="MOTOR" no="2" min="1250" neutral="1250" max="1800"/>
<servo name="AILEVON_LEFT" no="0" min="1850" neutral="1370" max="1000"/>
<servo name="AILEVON_RIGHT" no="1" min="1000" neutral="1515" max="1870"/>
</servos>
<commands>
<axis name="THROTTLE" failsafe_value="0"/>
<axis name="ROLL" failsafe_value="0"/>
<axis name="PITCH" failsafe_value="0"/>
<axis name="HATCH" failsafe_value="0"/>
</commands>
<rc_commands>
<set command="THROTTLE" value="@THROTTLE"/>
<set command="ROLL" value="@ROLL"/>
<set command="PITCH" value="@PITCH"/>
<set command="HATCH" value="@GAIN1"/>
</rc_commands>
<section name="MIXER">
@@ -44,7 +76,6 @@
<let var="aileron" value="@ROLL * AILEVON_AILERON_RATE"/>
<let var="elevator" value="@PITCH * AILEVON_ELEVATOR_RATE"/>
<set servo="MOTOR" value="@THROTTLE"/>
<set servo="HATCH" value="@HATCH"/>
<set servo="AILEVON_LEFT" value="$elevator + ($aileron > 0 ? 1 : AILERON_DIFF) * $aileron"/>
<set servo="AILEVON_RIGHT" value="$elevator - ($aileron > 0 ? AILERON_DIFF : 1) * $aileron"/>
</command_laws>
@@ -54,56 +85,51 @@
<define name="MAX_PITCH" value="0.6"/>
</section>
<section name="adc" prefix="ADC_CHANNEL_">
<define name="IR1" value="ADC_2"/>
<define name="IR2" value="ADC_1"/>
<define name="IR_TOP" value="ADC_0"/>
<define name="IR_NB_SAMPLES" value="16"/>
<section name="IMU" prefix="IMU_">
<define name="GYRO_P_SIGN" value="1"/>
<define name="GYRO_Q_SIGN" value="-1"/>
<define name="GYRO_R_SIGN" value="-1"/>
<define name="GYRO_ROLL" value="ADC_3"/>
<define name="GYRO_NB_SAMPLES" value="16"/>
<!-- Calibration Neutral -->
<define name="GYRO_P_NEUTRAL" value="-53"/>
<define name="GYRO_Q_NEUTRAL" value="33"/>
<define name="GYRO_R_NEUTRAL" value="-16"/>
<!-- SENS ITG3200 1/14.375 (deg/s)/LSB, rate frac 12bit => 1/14.375 * pi / 180 * 2^12 -->
<define name="GYRO_P_SENS" value="4.97312" integer="16"/>
<define name="GYRO_Q_SENS" value="4.97312" integer="16"/>
<define name="GYRO_R_SENS" value="4.97312" integer="16"/>
<define name="ACCEL_X_SIGN" value="1"/>
<define name="ACCEL_Y_SIGN" value="-1"/>
<define name="ACCEL_Z_SIGN" value="-1"/>
<define name="ACCEL_X_NEUTRAL" value="-2"/>
<define name="ACCEL_Y_NEUTRAL" value="1"/>
<define name="ACCEL_Z_NEUTRAL" value="-43"/>
<define name="ACCEL_X_SENS" value="38.9923420841" integer="16"/>
<define name="ACCEL_Y_SENS" value="39.2011913001" integer="16"/>
<define name="ACCEL_Z_SENS" value="39.4148057033" integer="16"/>
<!-- Just to compile -->
<define name="MAG_X_NEUTRAL" value="0"/>
<define name="MAG_Y_NEUTRAL" value="0"/>
<define name="MAG_Z_NEUTRAL" value="0"/>
<define name="BODY_TO_IMU_PHI" value="0"/>
<define name="BODY_TO_IMU_THETA" value="0"/>
<define name="BODY_TO_IMU_PSI" value="0"/>
</section>
<section name="INFRARED" prefix="IR_">
<define name="ADC_IR1_NEUTRAL" value="512"/>
<define name="ADC_IR2_NEUTRAL" value="512"/>
<define name="ADC_TOP_NEUTRAL" value="512"/>
<define name="LATERAL_CORRECTION" value="1."/>
<define name="LONGITUDINAL_CORRECTION" value="1."/>
<define name="VERTICAL_CORRECTION" value="1.2"/>
<define name="HORIZ_SENSOR_TILTED" value="1"/>
<define name="IR1_SIGN" value="-1"/>
<define name="IR2_SIGN" value="1"/>
<define name="TOP_SIGN" value="-1"/>
<define name="ROLL_NEUTRAL_DEFAULT" value="3.49504256248" unit="deg"/>
<define name="PITCH_NEUTRAL_DEFAULT" value="-0.114591561258" unit="deg"/>
<define name="CORRECTION_UP" value="1."/>
<define name="CORRECTION_DOWN" value="1."/>
<define name="CORRECTION_LEFT" value="1."/>
<define name="CORRECTION_RIGHT" value="1."/>
</section>
<section name="GYRO" prefix="GYRO_">
<define name="ADC_ROLL_NEUTRAL" value="492"/>
<define name="ADC_TEMP_NEUTRAL" value="512"/>
<define name="ADC_TEMP_SLOPE" value="0"/>
<define name="DYNAMIC_RANGE" value="300" unit="deg/s"/>
<define name="ADXRS300_RESISTOR_BRIDGE" value="(3.3/(3.3+1.8))"/>
<define name="ADXRS300_SENSITIVITY" value="5" unit="mV/(deg/s)"/>
<define name="ROLL_SCALE" value="3.3*1000./1024./(GYRO_ADXRS300_SENSITIVITY*GYRO_ADXRS300_RESISTOR_BRIDGE)" unit="deg/s/adc_unit"/>
<define name="ROLL_DIRECTION" value="1."/>
<section name="INS" prefix="INS_">
<define name="ROLL_NEUTRAL_DEFAULT" value="-0.0640000030398" unit="rad"/>
<define name="PITCH_NEUTRAL_DEFAULT" value="0.0670000016689" unit="rad"/>
</section>
<section name="BAT">
<define name="MILLIAMP_AT_FULL_THROTTLE" value="2000"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
<define name="MilliAmpereOfAdc(_adc)" value="(_adc-162)*17.4"/>
</section>
@@ -113,12 +139,10 @@
<define name="MAXIMUM_AIRSPEED" value="24." 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"/>
<define name="ALT_KALMAN_ENABLED" value="TRUE"/>
<define name="DEFAULT_CIRCLE_RADIUS" value="80."/>
<define name="UNLOCKED_HOME_MODE" value="TRUE"/>
<define name="TELEMETRY_MODE_AP" value="1"/>
</section>
<section name="VERTICAL CONTROL" prefix="V_CTL_">
@@ -135,10 +159,10 @@
<define name="AUTO_THROTTLE_MAX_CRUISE_THROTTLE" value="0.80"/>
<define name="AUTO_THROTTLE_LOITER_TRIM" value="1500"/>
<define name="AUTO_THROTTLE_DASH_TRIM" value="-2500"/>
<define name="AUTO_THROTTLE_CLIMB_THROTTLE_INCREMENT" value="0.1" unit="%/(m/s)"/>
<define name="AUTO_THROTTLE_PGAIN" value="-0.02"/>
<define name="AUTO_THROTTLE_IGAIN" value="0.1"/>
<define name="AUTO_THROTTLE_PITCH_OF_VZ_PGAIN" value="0.15"/>
<define name="AUTO_THROTTLE_CLIMB_THROTTLE_INCREMENT" value="0.05" unit="%/(m/s)"/>
<define name="AUTO_THROTTLE_PGAIN" value="-0.007"/>
<define name="AUTO_THROTTLE_IGAIN" value="0.067"/>
<define name="AUTO_THROTTLE_PITCH_OF_VZ_PGAIN" value="0.11"/>
<!-- auto pitch inner loop -->
<define name="AUTO_PITCH_PGAIN" value="-0.05"/>
@@ -151,7 +175,7 @@
</section>
<section name="HORIZONTAL CONTROL" prefix="H_CTL_">
<define name="COURSE_PGAIN" value="-1.23500001431"/>
<define name="COURSE_PGAIN" value="-0.9"/>
<define name="ROLL_MAX_SETPOINT" value="0.805000007153" unit="radians"/>
<define name="PITCH_MAX_SETPOINT" value="0.5" unit="radians"/>
@@ -162,8 +186,8 @@
<define name="ELEVATOR_OF_ROLL" value="2000."/>
<define name="ROLL_ATTITUDE_GAIN" value="-12000"/>
<define name="ROLL_RATE_GAIN" value="-2500"/>
<define name="ROLL_ATTITUDE_GAIN" value="-2600"/>
<define name="ROLL_RATE_GAIN" value="-850"/>
<define name="ROLL_KFF" value="-500"/>
<define name="ROLL_IGAIN" value="-00"/>
@@ -173,7 +197,6 @@
<section name="NAV">
<define name="NAV_PITCH" value="0."/>
<define name="NAV_GLIDE_PITCH_TRIM" value="0"/>
<define name="NAV_GROUND_SPEED_PGAIN" value="-0.01"/>
</section>
<section name="AGGRESSIVE" prefix="AGR_">
@@ -188,87 +211,21 @@
</section>
<section name="GYRO_GAINS">
<!--section name="GYRO_GAINS">
<define name="GYRO_MAX_RATE" value="200."/>
<define name="ROLLRATESUM_NB_SAMPLES" value="64"/>
<define name="ALT_ROLL__PGAIN" value="1.0"/>
<define name="ROLL_RATE_PGAIN" value="1000.0"/>
<define name="ROLL_RATE_IGAIN" value="0.0"/>
<define name="ROLL_RATE_DGAIN" value="0.0"/>
</section>
</section-->
<section name="FAILSAFE" prefix="FAILSAFE_">
<define name="DELAY_WITHOUT_GPS" value="1" 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"/>
<define name="HOME_RADIUS" value="100" unit="m"/>
</section>
<define name="DELAY_WITHOUT_GPS" value="1" 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"/>
<define name="HOME_RADIUS" value="100" unit="m"/>
</section>
<makefile>
CONFIG = \"tiny_1_1.h\"
include $(PAPARAZZI_SRC)/conf/autopilot/tiny.makefile
FLASH_MODE=IAP
ap.CFLAGS += -DFBW -DAP -DBOARD_CONFIG=$(CONFIG) -DUSE_LED -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.srcs += commands.c
ap.CFLAGS += -DACTUATORS=\"servos_4015_MAT_hw.h\" -DSERVOS_4015_MAT
ap.srcs += $(SRC_ARCH)/servos_4015_MAT_hw.c actuators.c
ap.CFLAGS += -DRADIO_CONTROL
ap.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.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)/mcu_periph/uart_arch.c datalink.c pprz_transport.c
ap.CFLAGS += -DINTER_MCU
ap.srcs += inter_mcu.c
ap.CFLAGS += -DADC -DUSE_ADC_0 -DUSE_ADC_1 -DUSE_ADC_2 -DUSE_ADC_3
ap.srcs += $(SRC_ARCH)/adc_hw.c
ap.CFLAGS += -DUSE_GPS -DUBX -DUSE_UART1 -DGPS_LINK=Uart1 -DUART1_BAUD=B38400 -DGPS_LED=2
#ap.CFLAGS += -DUSE_GPS -DUBX -DUSE_UART1 -DGPS_LINK=Uart1 -DUART1_BAUD=B9600 -DGPS_LED=2
#ap.CFLAGS += -DGPS_CONFIGURE -DGPS_BAUD=38400
ap.srcs += gps_ubx.c gps.c latlong.c
ap.CFLAGS += -DUSE_INFRARED -DALT_KALMAN
ap.srcs += infrared.c estimator.c
ap.CFLAGS += -DNAV -DAGR_CLIMB -DLOITER_TRIM
ap.srcs += subsystems/nav.c fw_h_ctl.c fw_v_ctl.c
ap.CFLAGS += -DUSE_GYRO -DADXRS150
ap.srcs += gyro.c subsystems/navigation/nav_line.c
ap.srcs += subsystems/navigation/nav_survey_rectangle.c
# Current sensor; Neutral=162
#ap.CFLAGS += -DUSE_ADC_7 -DUSE_ADC_GENERIC -DADC_CHANNEL_GENERIC1=ADC_7 -DADC_CHANNEL_GENERIC_NB_SAMPLES=16
#ap.srcs += adc_generic.c
ap.CFLAGS += -DUSE_ADC_7 -DADC_CHANNEL_CURRENT=ADC_7
ap.CFLAGS += -DUSE_MODULES
# Config for SITL simulation
#include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
sim.ARCHDIR = $(ARCHI)
sim.CFLAGS += -DSITL -DAP -DFBW -DRADIO_CONTROL -DINTER_MCU -DDOWNLINK -DDOWNLINK_TRANSPORT=IvyTransport -DUSE_INFRARED -DNAV -DUSE_LED -DWIND_INFO
sim.srcs = latlong.c radio_control.c downlink.c commands.c gps.c inter_mcu.c infrared.c fw_h_ctl.c fw_v_ctl.c subsystems/nav.c estimator.c sys_time.c main_fbw.c main_ap.c datalink.c $(SRC_ARCH)/ppm_hw.c $(SRC_ARCH)/sim_gps.c $(SRC_ARCH)/sim_ir.c $(SRC_ARCH)/sim_ap.c $(SRC_ARCH)/ivy_transport.c $(SRC_ARCH)/sim_adc_generic.c $(SRC_ARCH)/led_hw.c
sim.CFLAGS += -DBOARD_CONFIG=\"tiny.h\" -DAGR_CLIMB -DLOITER_TRIM -DALT_KALMAN
sim.srcs += subsystems/navigation/nav_line.c subsystems/navigation/nav_survey_rectangle.c
sim.CFLAGS += -DUSE_MODULES
</makefile>
</airframe>
+4 -2
View File
@@ -33,11 +33,13 @@
<!-- Actuators are automatically chosen according to board-->
<subsystem name="imu" type="umarim"/>
<subsystem name="ahrs" type="float_dcm"/>
<subsystem name="ahrs" type="float_dcm">
<define name="USE_HIGH_ACCEL_FLAG"/>
</subsystem>
<subsystem name="control" type="new"/>
<subsystem name="navigation"/>
<!-- Sensors -->
<subsystem name="gps" type="ublox_lea5h"/>
<subsystem name="gps" type="ublox"/>
</firmware>
+57 -26
View File
@@ -18,6 +18,7 @@
<target name="ap" board="booz_1.0">
<define name="FAILSAFE_GROUND_DETECT"/>
<define name="USE_GPS_ACC4R"/>
<define name="BOOZ_START_DELAY" value="3"/>
</target>
<target name="sim" board="pc">
<subsystem name="fdm" type="nps"/>
@@ -27,10 +28,15 @@
<subsystem name="radio_control" type="ppm"/>
<subsystem name="telemetry" type="transparent"/>
<subsystem name="actuators" type="asctec"/>
<!--subsystem name="actuators" type="mkk"/-->
<subsystem name="imu" type="b2_v1.1"/>
<subsystem name="gps" type="ublox"/>
<subsystem name="stabilization" type="euler"/>
<subsystem name="ahrs" type="int_cmpl_euler"/>
<subsystem name="gps" type="ublox">
<configure name="GPS_BAUD" value="B57600"/>
</subsystem>
<subsystem name="stabilization" type="euler"/>
<subsystem name="ahrs" type="int_cmpl_euler">
<define name="USE_NOISE_FILTER"/>
</subsystem>
<subsystem name="ins" type="hff"/>
</firmware>
@@ -47,6 +53,12 @@
<servo name="YAW" no="2" min="0" neutral="0" max="255"/>
<servo name="THRUST" no="3" min="0" neutral="0" max="255"/>
</servos>
<!--servos min="0" neutral="0" max="0xff">
<servo name="FRONT" no="0" min="0" neutral="0" max="255"/>
<servo name="BACK" no="1" min="0" neutral="0" max="255"/>
<servo name="RIGHT" no="2" min="0" neutral="0" max="255"/>
<servo name="LEFT" no="3" min="0" neutral="0" max="255"/>
</servos-->
<commands>
<axis name="PITCH" failsafe_value="0"/>
@@ -55,6 +67,31 @@
<axis name="THRUST" failsafe_value="0"/>
</commands>
<!--section name="ACTUATORS_MKK" prefix="ACTUATORS_MKK_">
<define name="NB" value="4"/>
<define name="ADDR" value="{ 0x52, 0x56, 0x54, 0x58 }"/>
</section-->
<section name="SUPERVISION" prefix="SUPERVISION_">
<define name="TRIM_A" value="0"/>
<define name="TRIM_E" value="0"/>
<define name="TRIM_R" value="0"/>
</section>
<!--section name="SUPERVISION" prefix="SUPERVISION_">
<define name="MIN_MOTOR" value="25"/>
<define name="MAX_MOTOR" value="243"/>
<define name="TRIM_A" value="0"/>
<define name="TRIM_E" value="0"/>
<define name="TRIM_R" value="0"/>
<define name="NB_MOTOR" value="4"/>
<define name="SCALE" value="256"/>
<define name="ROLL_COEF" value="{ 0, 0, -256, 256}"/>
<define name="PITCH_COEF" value="{ 256, -256, 0, 0}"/>
<define name="YAW_COEF" value="{ -256, -256, 256, 256}"/>
<define name="THRUST_COEF" value="{ 256, 256, 256, 256}"/>
</section-->
<section name="IMU" prefix="IMU_">
<define name="GYRO_P_CHAN" value="1"/>
@@ -93,9 +130,10 @@
<define name="MAG_Y_SENS" value="5.43740121157" integer="16"/>
<define name="MAG_Z_SENS" value="2.60492836649" integer="16"/>
<define name="BODY_TO_IMU_PHI" value="RadOfDeg(-1.5)"/>
<define name="BODY_TO_IMU_THETA" value="RadOfDeg(-1.5)"/>
<define name="BODY_TO_IMU_PSI" value="RadOfDeg(-45)"/> <!-- -13 -->
<define name="BODY_TO_IMU_PHI" value="RadOfDeg(0.)"/>
<define name="BODY_TO_IMU_THETA" value="RadOfDeg(0.)"/>
<!--define name="BODY_TO_IMU_PSI" value="RadOfDeg(45.)"/-->
<define name="BODY_TO_IMU_PSI" value="RadOfDeg(0.)"/>
</section>
@@ -136,32 +174,25 @@
<define name="REF_MAX_RDOT" value="RadOfDeg(900.)"/>
<!-- feedback -->
<define name="PHI_PGAIN" value="-1500"/>
<define name="PHI_DGAIN" value="-350"/>
<define name="PHI_IGAIN" value="-50"/>
<define name="PHI_PGAIN" value="-400"/>
<define name="PHI_DGAIN" value="-160"/>
<define name="PHI_IGAIN" value="-40"/>
<define name="THETA_PGAIN" value="-1500"/>
<define name="THETA_DGAIN" value="-350"/>
<define name="THETA_IGAIN" value="-50"/>
<define name="THETA_PGAIN" value="-400"/>
<define name="THETA_DGAIN" value="-160"/>
<define name="THETA_IGAIN" value="-40"/>
<define name="PSI_PGAIN" value="-1000"/>
<define name="PSI_DGAIN" value="-350"/>
<define name="PSI_IGAIN" value="-10"/>
<!-- feedforward -->
<define name="PHI_DDGAIN" value=" 350"/>
<define name="THETA_DDGAIN" value=" 350"/>
<define name="PHI_DDGAIN" value=" 300"/>
<define name="THETA_DDGAIN" value=" 300"/>
<define name="PSI_DDGAIN" value=" 300"/>
</section>
<section name="SUPERVISION" prefix="SUPERVISION_">
<define name="TRIM_A" value="0"/>
<define name="TRIM_E" value="0"/>
<define name="TRIM_R" value="0"/>
<define name="HACK_45" value="1"/>
</section>
<section name="INS" prefix="INS_">
<define name="BARO_SENS" value="16.5" integer="16"/>
</section>
@@ -178,8 +209,8 @@
<define name="REF_MAX_ZDD" value=" 0.8*9.81"/>
<define name="REF_MIN_ZD" value="-1.5"/>
<define name="REF_MAX_ZD" value=" 1.5"/>
<define name="HOVER_KP" value="-500"/>
<define name="HOVER_KD" value="-250"/>
<define name="HOVER_KP" value="-400"/>
<define name="HOVER_KD" value="-200"/>
<define name="HOVER_KI" value="0"/>
<!-- SPEED_BFP_OF_REAL(1.5) / (MAX_PPRZ/2) -->
<define name="RC_CLIMB_COEF" value ="163"/>
@@ -199,7 +230,7 @@
<section name="BAT">
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
<define name="BATTERY_SENS" value="0.25" integer="16"/>
<define name="VoltageOfAdc(adc)" value="(0.025*adc)"/>
</section>
<section name="AUTOPILOT">
@@ -222,7 +253,7 @@
<define name="PAN_MIN" value="0"/>
<define name="PAN_MAX" value="25736"/> <!-- 360 deg (2^12) -->
<define name="DEFAULT_MODE" value="BOOZ_CAM_MODE_MANUAL"/>
<!--define name="SetPwm(_v)" value="Booz2SetPwm1Value(_v)"/-->
<define name="SetPwm(_v)" value="Booz2SetPwm1Value(_v)"/>
</section>
@@ -230,7 +261,7 @@
<define name="BOOZ_ANALOG_BARO_THRESHOLD" value="800"/>
<define name="FACE_REINJ_1" value="1024"/>
<define name="DEFAULT_CIRCLE_RADIUS" value="10."/>
<define name="BoozDropPwm(_v)" value="BoozSetPwm1Value(_v)"/>
<define name="BoozDropPwm(_v)" value="BoozSetPwm0Value(_v)"/>
<define name="IMU_MAG_OFFSET" value="-9."/>
</section>
+68 -56
View File
@@ -1,9 +1,11 @@
<airframe name="BOOZ2_G1">
<modules main_freq="512">
<!--load name="booz_pwm.xml"/-->
<!--load name="booz_drop.xml"/-->
<!--load name="booz_cam.xml"/-->
<load name="booz_pwm.xml">
<define name="USE_PWM1"/>
</load>
<load name="booz_drop.xml"/>
<load name="booz_cam.xml"/>
<!--load name="sonar_maxbotix_booz.xml">
<configure name="ADC_SONAR" value="ADC_0"/>
</load-->
@@ -161,67 +163,77 @@
</section>
<section name="GUIDANCE_V" prefix="GUIDANCE_V_">
<define name="MIN_ERR_Z" value="POS_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_Z" value="POS_BFP_OF_REAL( 10.)"/>
<define name="MIN_ERR_ZD" value="SPEED_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_ZD" value="SPEED_BFP_OF_REAL( 10.)"/>
<define name="MAX_SUM_ERR" value="2000000"/>
<define name="REF_MIN_ZDD" value="-1.5*9.81"/>
<define name="REF_MAX_ZDD" value=" 0.5*9.81"/>
<define name="REF_MIN_ZD" value="-1.5"/>
<define name="REF_MAX_ZD" value=" 1.5"/>
<define name="HOVER_KP" value="-150"/>
<define name="HOVER_KD" value="-80"/>
<define name="HOVER_KI" value="0"/>
<!-- 1.5m/s for full stick : SPEED_BFP_OF_REAL(1.5) / (MAX_PPRZ/2) -->
<define name="RC_CLIMB_COEF" value ="163"/>
<!-- SPEED_BFP_OF_REAL(1.5) * 20% -->
<define name="RC_CLIMB_DEAD_BAND" value ="160000"/>
<!-- <define name="INV_M" value="0.118"/> -->
<define name="MIN_ERR_Z" value="POS_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_Z" value="POS_BFP_OF_REAL( 10.)"/>
<define name="MIN_ERR_ZD" value="SPEED_BFP_OF_REAL(-10.)"/>
<define name="MAX_ERR_ZD" value="SPEED_BFP_OF_REAL( 10.)"/>
<define name="MAX_SUM_ERR" value="2000000"/>
<define name="REF_MIN_ZDD" value="-1.5*9.81"/>
<define name="REF_MAX_ZDD" value=" 0.5*9.81"/>
<define name="REF_MIN_ZD" value="-1.5"/>
<define name="REF_MAX_ZD" value=" 1.5"/>
<define name="HOVER_KP" value="-150"/>
<define name="HOVER_KD" value="-80"/>
<define name="HOVER_KI" value="0"/>
<!-- 1.5m/s for full stick : SPEED_BFP_OF_REAL(1.5) / (MAX_PPRZ/2) -->
<define name="RC_CLIMB_COEF" value ="163"/>
<!-- SPEED_BFP_OF_REAL(1.5) * 20% -->
<define name="RC_CLIMB_DEAD_BAND" value ="160000"/>
<!-- <define name="INV_M" value="0.118"/> -->
</section>
<section name="GUIDANCE_H" prefix="GUIDANCE_H_">
<define name="PGAIN" value="-50"/>
<define name="DGAIN" value="-100"/>
<define name="IGAIN" value="-15"/>
<define name="NGAIN" value="-0"/>
<!-- feedforward -->
<define name="AGAIN" value="100"/>
</section>
<define name="PGAIN" value="-50"/>
<define name="DGAIN" value="-100"/>
<define name="IGAIN" value="-15"/>
<define name="NGAIN" value="-0"/>
<!-- feedforward -->
<define name="AGAIN" value="100"/>
</section>
<section name="BAT">
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
<define name="BATTERY_SENS" value="0.183" integer="16"/>
</section>
<section name="BAT">
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
<define name="BATTERY_SENS" value="0.183" integer="16"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_ATTITUDE_Z_HOLD"/>
<define name="MODE_AUTO2" value="AP_MODE_NAV"/>
</section>
<section name="AUTOPILOT">
<define name="MODE_MANUAL" value="AP_MODE_ATTITUDE_DIRECT"/>
<define name="MODE_AUTO1" value="AP_MODE_ATTITUDE_Z_HOLD"/>
<define name="MODE_AUTO2" value="AP_MODE_NAV"/>
</section>
<section name="FMS">
<define name="BOOZ_FMS_TIMEOUT" value="0"/>
</section>
<section name="FMS">
<define name="BOOZ_FMS_TIMEOUT" value="0"/>
</section>
<section name="CAM" prefix="BOOZ_CAM_">
<section name="CAM" prefix="BOOZ_CAM_">
<define name="ON" value="LED_ON(CAM_SWITCH_LED)"/>
<define name="OFF" value="LED_OFF(CAM_SWITCH_LED)"/>
<define name="TILT_NEUTRAL" value="1500"/>
<define name="TILT_MIN" value="1000"/>
<define name="TILT_MAX" value="2000"/>
<define name="TILT_ANGLE_MIN" value="RadOfDeg(-85.)" unit="rad"/>
<define name="TILT_ANGLE_MAX" value="RadOfDeg( 30.)" unit="rad"/>
<define name="TILT_MAX" value="1000"/>
<define name="TILT_MIN" value="2300"/>
<define name="TILT_ANGLE_MIN" value="RadOfDeg(-90.)" unit="rad"/>
<define name="TILT_ANGLE_MAX" value="RadOfDeg( 10.)" unit="rad"/>
<define name="PAN_NEUTRAL" value="0"/>
<define name="PAN_MIN" value="0"/>
<define name="PAN_MAX" value="25736"/> <!-- 360 deg (2^12) -->
</section>
<define name="SetPwm(_v)" value="BoozSetPwm1Value(_v)"/>
</section>
<section name="MISC">
<define name="BOOZ_ANALOG_BARO_THRESHOLD" value="800"/>
<define name="FACE_REINJ_1" value="1024"/>
<define name="DEFAULT_CIRCLE_RADIUS" value="10."/>
</section>
<section name="DROP">
<define name="DROP_SERVO_CLOSED" value="2120"/>
<define name="DROP_SERVO_OPEN" value="1060"/>
<!--define name="BoozDropPwm(_v)" value="BoozSetPwm0Value(_v)"/-->
</section>
<section name="MISC">
<define name="BOOZ_ANALOG_BARO_THRESHOLD" value="800"/>
<define name="FACE_REINJ_1" value="1024"/>
<define name="DEFAULT_CIRCLE_RADIUS" value="10."/>
<!--define name="IMU_MAG_OFFSET" value="-5.8"/-->
</section>
<section name="GCS">
<define name="ALT_SHIFT_PLUS_PLUS" value="5"/>
@@ -229,10 +241,10 @@
<define name="ALT_SHIFT_MINUS" value="-1"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="{&quot;front_motor&quot;, &quot;back_motor&quot;, &quot;right_motor&quot;, &quot;left_motor&quot;}"/>
<!--define name="INITIAL_CONDITITONS" value="&quot;reset_enac&quot;"/-->
<define name="SENSORS_PARAMS" value="&quot;nps_sensors_params_booz2_a1.h&quot;"/>
</section>
<section name="SIMULATOR" prefix="NPS_">
<define name="ACTUATOR_NAMES" value="{&quot;front_motor&quot;, &quot;back_motor&quot;, &quot;right_motor&quot;, &quot;left_motor&quot;}"/>
<!--define name="INITIAL_CONDITITONS" value="&quot;reset_enac&quot;"/-->
<define name="SENSORS_PARAMS" value="&quot;nps_sensors_params_booz2_a1.h&quot;"/>
</section>
</airframe>
+53 -16
View File
@@ -12,6 +12,7 @@
<define name="USE_INS_NAV_INIT"/>
<define name="USE_ADAPT_HOVER"/>
<define name="NO_FUCKING_STARTUP_DELAY"/>
<define name="USE_ATTITUDE_REF" value="0"/>
<!--define name="GUIDANCE_H_USE_REF"/-->
<target name="ap" board="navgo_1.0">
@@ -31,7 +32,9 @@
<subsystem name="imu" type="navgo"/>
<subsystem name="gps" type="ublox"/>
<subsystem name="stabilization" type="euler"/>
<subsystem name="ahrs" type="int_cmpl_euler"/>
<subsystem name="ahrs" type="int_cmpl_euler">
<define name="LOW_NOISE_THRESHOLD" value="50000"/>
</subsystem>
<subsystem name="ins" type="hff"/>
</firmware>
@@ -57,7 +60,7 @@
<section name="SUPERVISION" prefix="SUPERVISION_">
<define name="MIN_MOTOR" value="20"/>
<define name="MAX_MOTOR" value="255"/>
<define name="TRIM_A" value="0"/>
<define name="TRIM_A" value="6"/>
<define name="TRIM_E" value="0"/>
<define name="TRIM_R" value="0"/>
<define name="NB_MOTOR" value="4"/>
@@ -70,18 +73,52 @@
<section name="IMU" prefix="IMU_">
<define name="GYRO_P_NEUTRAL" value="5"/>
<define name="GYRO_Q_NEUTRAL" value="-10"/>
<define name="GYRO_R_NEUTRAL" value="17"/>
<define name="GYRO_P_NEUTRAL" value="-126"/>
<define name="GYRO_Q_NEUTRAL" value="-29"/>
<define name="GYRO_R_NEUTRAL" value="-32"/>
<!-- SENS ITG3200 1/14.375 (deg/s)/LSB, rate frac 12bit => 1/14.375 * pi / 180 * 2^12 -->
<define name="GYRO_P_SENS" value="4.97312" integer="16"/>
<define name="GYRO_Q_SENS" value="4.97312" integer="16"/>
<define name="GYRO_R_SENS" value="4.97312" integer="16"/>
<define name="ACCEL_X_NEUTRAL" value="-5"/>
<define name="ACCEL_X_NEUTRAL" value="4"/>
<define name="ACCEL_Y_NEUTRAL" value="-17"/>
<define name="ACCEL_Z_NEUTRAL" value="-22"/>
<!-- SENS ADXL345 16G 31.2 mg/LSB, accel frac 10bit => 31.2 * 2^10 / 1000 = 31.9488-->
<define name="ACCEL_X_SENS" value="38.2816633245" integer="16"/>
<define name="ACCEL_Y_SENS" value="38.7857058923" integer="16"/>
<define name="ACCEL_Z_SENS" value="39.7459254023" integer="16"/>
<define name="MAG_X_NEUTRAL" value="85"/>
<define name="MAG_Y_NEUTRAL" value="97"/>
<define name="MAG_Z_NEUTRAL" value="-43"/>
<define name="MAG_X_SENS" value="5.43371021972" integer="16"/>
<define name="MAG_Y_SENS" value="4.8961742578" integer="16"/>
<define name="MAG_Z_SENS" value="5.31527656902" integer="16"/>
<define name="BODY_TO_IMU_PHI" value="RadOfDeg(0.)"/> <!-- -10 -->
<define name="BODY_TO_IMU_THETA" value="RadOfDeg(0.)"/> <!-- -10 -->
<define name="BODY_TO_IMU_PSI" value="RadOfDeg(0.)"/>
</section>
<section name="IMU_PROTO" prefix="IMU_PROTO_">
<define name="GYRO_P_NEUTRAL" value="-24"/>
<define name="GYRO_Q_NEUTRAL" value="-8"/>
<define name="GYRO_R_NEUTRAL" value="21"/>
<!-- SENS ITG3200 1/14.375 (deg/s)/LSB, rate frac 12bit => 1/14.375 * pi / 180 * 2^12 -->
<define name="GYRO_P_SENS" value="4.97312" integer="16"/>
<define name="GYRO_Q_SENS" value="4.97312" integer="16"/>
<define name="GYRO_R_SENS" value="4.97312" integer="16"/>
<define name="ACCEL_X_NEUTRAL" value="-9"/>
<define name="ACCEL_Y_NEUTRAL" value="0"/>
<define name="ACCEL_Z_NEUTRAL" value="-20"/>
<define name="ACCEL_Z_NEUTRAL" value="-29"/>
<!-- SENS ADXL345 16G 31.2 mg/LSB, accel frac 10bit => 31.2 * 2^10 / 1000 = 31.9488-->
<define name="ACCEL_X_SENS" value="38.2683" integer="16"/>
@@ -153,22 +190,22 @@
<define name="REF_MAX_RDOT" value="RadOfDeg(900.)"/>
<!-- feedback -->
<define name="PHI_PGAIN" value="-700"/>
<define name="PHI_DGAIN" value="-200"/>
<define name="PHI_IGAIN" value="-50"/>
<define name="PHI_PGAIN" value="-350"/>
<define name="PHI_DGAIN" value="-190"/>
<define name="PHI_IGAIN" value="-100"/>
<define name="THETA_PGAIN" value="-700"/>
<define name="THETA_DGAIN" value="-200"/>
<define name="THETA_IGAIN" value="-50"/>
<define name="THETA_PGAIN" value="-350"/>
<define name="THETA_DGAIN" value="-190"/>
<define name="THETA_IGAIN" value="-100"/>
<define name="PSI_PGAIN" value="-700"/>
<define name="PSI_DGAIN" value="-250"/>
<define name="PSI_IGAIN" value="-20"/>
<!-- feedforward -->
<define name="PHI_DDGAIN" value=" 300"/>
<define name="THETA_DDGAIN" value=" 300"/>
<define name="PSI_DDGAIN" value=" 300"/>
<define name="PHI_DDGAIN" value=" 70"/>
<define name="THETA_DDGAIN" value=" 70"/>
<define name="PSI_DDGAIN" value=" 70"/>
</section>
+12
View File
@@ -0,0 +1,12 @@
<joystick>
<input>
<axis index="6" name="pan"/>
<axis index="7" name="tilt"/>
</input>
<messages period="0.1">
<message class="datalink" name="BOOZ_CAM_STICK">
<field name="tilt" value="-tilt"/>
<field name="pan" value="pan"/>
</message>
</messages>
</joystick>
+6
View File
@@ -2171,6 +2171,12 @@
<field name="yd" type="float" unit="m"/>
</message>
<message name="BOOZ_CAM_STICK" id="152" link="forwarded">
<field name="ac_id" type="uint8"/>
<field name="tilt" type="int8"/>
<field name="pan" type="int8"/>
</message>
</class>
+1
View File
@@ -7,6 +7,7 @@
</header>
<init fun="booz_cam_init()"/>
<periodic fun="booz_cam_periodic()" freq="10."/>
<datalink message="BOOZ_CAM_STICK" fun="BOOZ_CAM_STICK_PARSE(dl_buffer)"/>
<makefile>
<define name="USE_CAM"/>
<file name="booz_cam.c"/>
+4 -2
View File
@@ -1,4 +1,8 @@
<!DOCTYPE module SYSTEM "module.dtd">
<!--
DROP_SERVO_CLOSED and DROP_SERVO_OPEN can be redefined in airframe file
units: PWM width in us
-->
<module name="drop">
<!-- depend require="booz_pwm" -->
@@ -9,8 +13,6 @@
<periodic fun="booz_drop_periodic()" freq="10."/>
<makefile>
<define name="USE_DROP"/>
<define name="DROP_SERVO_OPEN" value="2120"/>
<define name="DROP_SERVO_CLOSED" value="1060"/>
<file name="booz_drop.c"/>
</makefile>
</module>
+1 -1
View File
@@ -2,7 +2,7 @@
<module name="poles">
<header>
<file name="subsystems/navigation/nav_poles.h"/>
<file name="nav_poles.h"/>
</header>
<makefile>
<file name="nav_poles.c"/>
+6 -6
View File
@@ -3,17 +3,17 @@
<dl_settings NAME="CAM">
<dl_setting var="booz_cam_mode" MIN="0" STEP="1" MAX="3" module="cam_control/booz_cam" shortname="mode" values="NONE|MAN|HEADING|WP" handler="SetCamMode">
<strip_button name="CN" value="0"/>
<strip_button name="CM" value="1"/>
<strip_button name="CH" value="2"/>
<strip_button name="CWP" value="3"/>
<strip_button name="CN" value="0" group="cam_mode1"/>
<strip_button name="CM" value="1" group="cam_mode1"/>
<strip_button name="CH" value="2" group="cam_mode2"/>
<strip_button name="CWP" value="3" group="cam_mode2"/>
<key_press key="F1" value="0"/>
<key_press key="F2" value="1"/>
</dl_setting>
<dl_setting var="booz_cam_tilt_pwm" min="1000" step="1" max="2500" shortname="tilt_pwm"/>
<dl_setting var="booz_cam_tilt" min="-90" step="1" max="0" shortname="tilt" alt_unit="deg" alt_unit_coef="0.0139882">
<strip_button name="Look Foreward" icon="lookfore.png" value="0"/>
<strip_button name="Look Down" icon="lookdown.png" value="-6434"/>
<strip_button name="Look Foreward" icon="lookfore.png" value="0" group="cam_look"/>
<strip_button name="Look Down" icon="lookdown.png" value="-6434" group="cam_look"/>
</dl_setting>
<dl_setting var="booz_cam_pan" MIN="0" STEP="1" MAX="360" shortname="pan" unit="1/2^12r" alt_unit="deg" alt_unit_coef="0.0139882"/>
</dl_settings>
+3 -1
View File
@@ -3,7 +3,9 @@
<settings>
<dl_settings>
<dl_settings NAME="Poles">
<dl_setting MAX="40" MIN="1" STEP="1" VAR="nav_poles_count" module="nav_poles"/>
<dl_setting MAX="40" MIN="1" STEP="1" VAR="nav_poles_count" module="modules/poles/nav_poles"/>
<dl_setting MAX="180" MIN="0" STEP="1" VAR="nav_poles_time"/>
<dl_setting MAX="1" MIN="-1" STEP="2" VAR="nav_poles_land" handler="SetLandDir"/>
</dl_settings>
</dl_settings>
</settings>
+2 -2
View File
@@ -5,8 +5,8 @@
<dl_settings NAME="Drop">
<dl_setting var="booz_drop_ball" min="0" step="1" max="1" module="drop/booz_drop" values="Closed|Open">
<strip_button name="OPEN" value="1"/>
<strip_button name="CLOSE" value="0"/>
<strip_button name="OPEN" value="1" group="drop"/>
<strip_button name="CLOSE" value="0" group="drop"/>
</dl_setting>
</dl_settings>
+1 -1
View File
@@ -24,7 +24,7 @@
<message name="ROTORCRAFT_NAV_STATUS" period="1.6"/>
<message name="WP_MOVED" period="1.3"/>
<message name="BOOZ2_CAM" period="1."/>
<message name="BOOZ2_GPS" period=".25"/>
<message name="GPS_INT" period=".25"/>
<message name="INS" period=".25"/>
</mode>
+1 -1
View File
@@ -217,7 +217,7 @@
static uint8_t i; \
int16_t climb = -gps.ned_vel.z; \
int16_t course = (DegOfRad(gps.course)/((int32_t)1e6)); \
DOWNLINK_SEND_GPS(DefaultChannel, &gps.fix, &gps.utm_pos.east, &gps.utm_pos.north, &course, &gps.lla_pos.alt, &gps.gspeed, &climb, &gps.week, &gps.tow, &gps.utm_pos.zone, &i); \
DOWNLINK_SEND_GPS(DefaultChannel, &gps.fix, &gps.utm_pos.east, &gps.utm_pos.north, &course, &gps.hmsl, &gps.gspeed, &climb, &gps.week, &gps.tow, &gps.utm_pos.zone, &i); \
if ((gps.fix != GPS_FIX_3D) && (i >= gps.nb_channels)) i = 0; \
if (i >= gps.nb_channels * 2) i = 0; \
if (i < gps.nb_channels && gps.svinfos[i].cno > 0) { \
+2 -1
View File
@@ -91,7 +91,7 @@ void imu_umarim_event( void )
// If the itg3200 I2C transaction has succeeded: convert the data
itg3200_event();
if (itg3200_data_available) {
RATES_COPY(imu.gyro_unscaled, itg3200_data);
RATES_ASSIGN(imu.gyro_unscaled, itg3200_data.p, itg3200_data.q, itg3200_data.r);
itg3200_data_available = FALSE;
gyr_valid = TRUE;
}
@@ -99,6 +99,7 @@ void imu_umarim_event( void )
// If the adxl345 I2C transaction has succeeded: convert the data
adxl345_event();
if (adxl345_data_available) {
// Be careful with orientation of the ADXL (ITG axes are taken as default reference)
VECT3_ASSIGN(imu.accel_unscaled, adxl345_data.y, -adxl345_data.x, adxl345_data.z);
adxl345_data_available = FALSE;
acc_valid = TRUE;
+33
View File
@@ -44,6 +44,39 @@
/* ADC */
#define ADC_0 AdcBank1(5)
#ifdef USE_ADC_0
#ifndef USE_AD1
#define USE_AD1
#endif
#define USE_AD1_5
#endif
#define ADC_1 AdcBank1(4)
#ifdef USE_ADC_1
#ifndef USE_AD1
#define USE_AD1
#endif
#define USE_AD1_4
#endif
#define ADC_2 AdcBank1(3)
#ifdef USE_ADC_2
#ifndef USE_AD1
#define USE_AD1
#endif
#define USE_AD1_3
#endif
#define ADC_3 AdcBank1(2)
#ifdef USE_ADC_3
#ifndef USE_AD1
#define USE_AD1
#endif
#define USE_AD1_2
#endif
/* battery */
#define ADC_CHANNEL_VSUPPLY AdcBank0(2)
#ifndef USE_AD0
@@ -69,11 +69,13 @@ void stabilization_attitude_ref_init(void) {
#define OMEGA_2_R_RES 7
#define OMEGA_2_R BFP_OF_REAL((OMEGA_R*OMEGA_R), OMEGA_2_R_RES)
#define USE_REF 1
#ifndef USE_ATTITUDE_REF
#define USE_ATTITUDE_REF 1
#endif
void stabilization_attitude_ref_update() {
#ifdef USE_REF
#if USE_ATTITUDE_REF
/* dumb integrate reference attitude */
const struct Int32Eulers d_angle = {
@@ -120,10 +122,10 @@ void stabilization_attitude_ref_update() {
/* saturate speed and trim accel accordingly */
SATURATE_SPEED_TRIM_ACCEL();
#else /* !USE_REF */
EULERS_COPY(stab_att_ref_euler, stabilization_att_sp);
#else /* !USE_ATTITUDE_REF */
EULERS_COPY(stab_att_ref_euler, stab_att_sp_euler);
INT_RATES_ZERO(stab_att_ref_rate);
INT_RATES_ZERO(stab_att_ref_accel);
#endif /* USE_REF */
#endif /* USE_ATTITUDE_REF */
}
@@ -135,6 +135,9 @@ void stabilization_rate_read_rc( void ) {
stabilization_rate_sp.r = (int32_t)-radio_control.values[RADIO_YAW] * STABILIZATION_RATE_SP_MAX_R / MAX_PPRZ;
else
stabilization_rate_sp.r = 0;
// Setpoint at ref resolution
INT_RATES_LSHIFT(stabilization_rate_sp, stabilization_rate_sp, REF_FRAC - INT32_RATE_FRAC);
}
void stabilization_rate_enter(void) {
+7
View File
@@ -299,6 +299,13 @@
(_c).r = (_a).r + (_b).r; \
}
/* c = a + _s * b */
#define RATES_SUM_SCALED(_c, _a, _b, _s) { \
(_c).p = (_a).p + (_s)*(_b).p; \
(_c).q = (_a).q + (_s)*(_b).q; \
(_c).r = (_a).r + (_s)*(_b).r; \
}
/* c = a - b */
#define RATES_DIFF(_c, _a, _b) { \
(_c).p = (_a).p - (_b).p; \
+14 -9
View File
@@ -72,7 +72,7 @@ int16_t booz_cam_pan;
#endif
void booz_cam_init(void) {
booz_cam_mode = BOOZ_CAM_DEFAULT_MODE;
booz_cam_SetCamMode(BOOZ_CAM_DEFAULT_MODE);
#ifdef BOOZ_CAM_USE_TILT
booz_cam_tilt_pwm = BOOZ_CAM_TILT_NEUTRAL;
BOOZ_CAM_SetPwm(booz_cam_tilt_pwm);
@@ -81,10 +81,15 @@ void booz_cam_init(void) {
#ifdef BOOZ_CAM_USE_PAN
booz_cam_pan = BOOZ_CAM_PAN_NEUTRAL;
#endif
if (booz_cam_mode == BOOZ_CAM_MODE_NONE) { LED_ON(CAM_SWITCH_LED); } // CAM OFF
else { LED_OFF(CAM_SWITCH_LED); } // CAM ON
}
#define ABS(_x) ((_x) < 0 ? -(_x) : (_x))
#define D_TILT (BOOZ_CAM_TILT_MAX - BOOZ_CAM_TILT_MIN)
#define CT_MIN Min(BOOZ_CAM_TILT_MIN,BOOZ_CAM_TILT_MAX)
#define CT_MAX Max(BOOZ_CAM_TILT_MIN,BOOZ_CAM_TILT_MAX)
#define CP_MIN Min(BOOZ_CAM_PAN_MIN,BOOZ_CAM_PAN_MAX)
#define CP_MAX Max(BOOZ_CAM_PAN_MIN,BOOZ_CAM_PAN_MAX)
void booz_cam_periodic(void) {
switch (booz_cam_mode) {
@@ -98,17 +103,17 @@ void booz_cam_periodic(void) {
break;
case BOOZ_CAM_MODE_MANUAL:
#ifdef BOOZ_CAM_USE_TILT
Bound(booz_cam_tilt_pwm,BOOZ_CAM_TILT_MIN,BOOZ_CAM_TILT_MAX);
Bound(booz_cam_tilt_pwm, CT_MIN, CT_MAX);
#endif
break;
case BOOZ_CAM_MODE_HEADING:
#ifdef BOOZ_CAM_USE_TILT_ANGLES
Bound(booz_cam_tilt,CAM_TA_MIN,CAM_TA_MAX);
booz_cam_tilt_pwm = BOOZ_CAM_TILT_MIN + (BOOZ_CAM_TILT_MAX - BOOZ_CAM_TILT_MIN) * (booz_cam_tilt - CAM_TA_MIN) / (CAM_TA_MAX - CAM_TA_MIN);
Bound(booz_cam_tilt_pwm,BOOZ_CAM_TILT_MIN,BOOZ_CAM_TILT_MAX);
booz_cam_tilt_pwm = BOOZ_CAM_TILT_MIN + D_TILT * (booz_cam_tilt - CAM_TA_MIN) / (CAM_TA_MAX - CAM_TA_MIN);
Bound(booz_cam_tilt_pwm, CT_MIN, CT_MAX);
#endif
#ifdef BOOZ_CAM_USE_PAN
Bound(booz_cam_pan,BOOZ_CAM_PAN_MIN,BOOZ_CAM_PAN_MAX);
Bound(booz_cam_pan, CP_MIN, CP_MAX);
nav_heading = booz_cam_pan;
#endif
break;
@@ -126,8 +131,8 @@ void booz_cam_periodic(void) {
height = (waypoints[WP_CAM].z - ins_enu_pos.z) >> INT32_POS_FRAC;
INT32_ATAN2(booz_cam_tilt, height, dist);
Bound(booz_cam_tilt, CAM_TA_MIN, CAM_TA_MAX);
booz_cam_tilt_pwm = BOOZ_CAM_TILT_MIN + (BOOZ_CAM_TILT_MAX - BOOZ_CAM_TILT_MIN) * (booz_cam_tilt - CAM_TA_MIN) / (CAM_TA_MAX - CAM_TA_MIN);
Bound(booz_cam_tilt_pwm, BOOZ_CAM_TILT_MIN, BOOZ_CAM_TILT_MAX);
booz_cam_tilt_pwm = BOOZ_CAM_TILT_MIN + D_TILT * (booz_cam_tilt - CAM_TA_MIN) / (CAM_TA_MAX - CAM_TA_MIN);
Bound(booz_cam_tilt_pwm, CT_MIN, CT_MAX);
#endif
}
#endif
+22 -2
View File
@@ -26,6 +26,7 @@
#define BOOZ_CAM_H
#include "generated/airframe.h"
#include "math/pprz_algebra_int.h"
#include "std.h"
#include "led.h"
@@ -34,6 +35,16 @@
#define BOOZ_CAM_MODE_HEADING 2
#define BOOZ_CAM_MODE_WP 3
// Warning:
// LED_ON set GPIO low
// LED_OFF set GPIO high
#ifndef BOOZ_CAM_ON
#define BOOZ_CAM_ON LED_OFF(CAM_SWITCH_LED)
#endif
#ifndef BOOZ_CAM_OFF
#define BOOZ_CAM_OFF LED_ON(CAM_SWITCH_LED)
#endif
extern uint8_t booz_cam_mode;
#ifdef BOOZ_CAM_TILT_NEUTRAL
@@ -49,8 +60,17 @@ extern void booz_cam_periodic(void);
#define booz_cam_SetCamMode(_v) { \
booz_cam_mode = _v; \
if (booz_cam_mode == BOOZ_CAM_MODE_NONE) { LED_ON(CAM_SWITCH_LED); } \
else { LED_OFF(CAM_SWITCH_LED); } \
if (booz_cam_mode == BOOZ_CAM_MODE_NONE) { BOOZ_CAM_OFF; } \
else { BOOZ_CAM_ON; } \
}
#define BOOZ_CAM_STICK_TILT_INC (ANGLE_BFP_OF_REAL(RadOfDeg(10.))/127.)
#define BOOZ_CAM_STICK_PAN_INC (ANGLE_BFP_OF_REAL(RadOfDeg(20.))/127.)
#define BOOZ_CAM_STICK_PARSE(_dl_buffer) { \
booz_cam_tilt += (int16_t)(BOOZ_CAM_STICK_TILT_INC*(float)DL_BOOZ_CAM_STICK_tilt(_dl_buffer)); \
booz_cam_pan += (int16_t)(BOOZ_CAM_STICK_PAN_INC*(float)DL_BOOZ_CAM_STICK_pan(dl_buffer)); \
INT32_COURSE_NORMALIZE(booz_cam_pan); \
}
#endif /* BOOZ2_CAM_H */
+1
View File
@@ -33,5 +33,6 @@ extern void booz_drop_init(void);
extern void booz_drop_periodic(void);
#define NavDropNow() ({ booz_drop_ball = TRUE; FALSE; })
#define NavDropClose() ({ booz_drop_ball = FALSE; FALSE; })
#endif /* BOOZ_DROP_H */
+4 -2
View File
@@ -1,9 +1,11 @@
#include "subsystems/navigation/nav_poles.h"
#include "modules/poles/nav_poles.h"
#include "subsystems/navigation/common_nav.h"
uint8_t nav_poles_count = 0;
float nav_poles_time = 0.;
int8_t nav_poles_land = 1;
#define SAFETY_MARGIN 0.9
#define SAFETY_MARGIN 0.7
/** computes position of wp1c and wp2c, reference points for an oval around
waypoints wp1 and wp2 */
+4
View File
@@ -5,9 +5,13 @@
#include "std.h"
extern uint8_t nav_poles_count;
extern float nav_poles_time;
extern int8_t nav_poles_land;
bool nav_poles_init(uint8_t wp1, uint8_t wp2,
uint8_t wp1c, uint8_t wp2c,
float radius );
#define nav_poles_SetLandDir(_d) { if (_d < 0) _d = -1; else _d = 1; }
#endif
@@ -91,6 +91,18 @@ int renorm_blowup_count = 0;
float imu_health = 0.;
#endif
#ifdef USE_HIGH_ACCEL_FLAG
// High Accel Flag
#define HIGH_ACCEL_LOW_SPEED 15.0
#define HIGH_ACCEL_LOW_SPEED_RESUME 4.0 // Hysteresis
#define HIGH_ACCEL_HIGH_THRUST (0.8*MAX_PPRZ)
#define HIGH_ACCEL_HIGH_THRUST_RESUME (0.1*MAX_PPRZ) // Hysteresis
bool_t high_accel_done;
bool_t high_accel_flag;
// Command vector for thrust (fixed_wing)
#include "inter_mcu.h"
#endif
static inline void set_dcm_matrix_from_rmat(struct FloatRMat *rmat)
{
@@ -175,6 +187,11 @@ void ahrs_init(void) {
/* set inital filter dcm */
set_dcm_matrix_from_rmat(&ahrs_float.ltp_to_imu_rmat);
#ifdef USE_HIGH_ACCEL_FLAG
high_accel_done = FALSE;
high_accel_flag = FALSE;
#endif
}
void ahrs_align(void)
@@ -411,6 +428,25 @@ void Drift_correction(void)
// Weight for accelerometer info (<0.5G = 0.0, 1G = 1.0 , >1.5G = 0.0)
Accel_weight = Chop(1 - 2*fabs(1 - Accel_magnitude),0,1); //
#ifdef USE_HIGH_ACCEL_FLAG
// Test for high acceleration:
// - low speed
// - high thrust
if (estimator_hspeed_mod < HIGH_ACCEL_LOW_SPEED && ap_state->commands[COMMAND_THROTTLE] > HIGH_ACCEL_HIGH_THRUST && !high_accel_done) {
high_accel_flag = TRUE;
} else {
high_accel_flag = FALSE;
if (estimator_hspeed_mod > HIGH_ACCEL_LOW_SPEED && !high_accel_done) {
high_accel_done = TRUE; // After takeoff, don't use high accel before landing (GS small, Throttle small)
}
if (estimator_hspeed_mod < HIGH_ACCEL_HIGH_THRUST_RESUME && ap_state->commands[COMMAND_THROTTLE] < HIGH_ACCEL_HIGH_THRUST_RESUME) {
high_accel_done = FALSE; // Activate high accel after landing
}
}
if (high_accel_flag) { Accel_weight = 0.; }
#endif
#if PERFORMANCE_REPORTING == 1
{
@@ -95,7 +95,41 @@ void ahrs_align(void) {
}
//#define USE_NOISE_CUT 1
//#define USE_NOISE_FILTER 1
#define NOISE_FILTER_GAIN 50
#ifdef USE_NOISE_CUT
#include "led.h"
static inline bool_t cut_rates (struct Int32Rates i1, struct Int32Rates i2, int32_t threshold) {
struct Int32Rates diff;
RATES_DIFF(diff, i1, i2);
if (diff.p < -threshold || diff.p > threshold ||
diff.q < -threshold || diff.q > threshold ||
diff.r < -threshold || diff.r > threshold) {
return TRUE;
} else {
return FALSE;
}
}
#define RATE_CUT_THRESHOLD RATE_BFP_OF_REAL(1)
static inline bool_t cut_accel (struct Int32Vect3 i1, struct Int32Vect3 i2, int32_t threshold) {
struct Int32Vect3 diff;
VECT3_DIFF(diff, i1, i2);
if (diff.x < -threshold || diff.x > threshold ||
diff.y < -threshold || diff.y > threshold ||
diff.z < -threshold || diff.z > threshold) {
LED_ON(4);
return TRUE;
} else {
LED_OFF(4);
return FALSE;
}
}
#define ACCEL_CUT_THRESHOLD ACCEL_BFP_OF_REAL(20)
#endif
/*
*
@@ -116,9 +150,22 @@ void ahrs_propagate(void) {
/* unbias gyro */
struct Int32Rates uf_rate;
RATES_DIFF(uf_rate, imu.gyro, ahrs_impl.gyro_bias);
/* low pass rate */
RATES_ADD(ahrs.imu_rate, uf_rate);
RATES_SDIV(ahrs.imu_rate, ahrs.imu_rate, 2);
#ifdef USE_NOISE_CUT
static struct Int32Rates last_uf_rate = { 0, 0, 0 };
if (!cut_rates(uf_rate, last_uf_rate, RATE_CUT_THRESHOLD)) {
#endif
/* low pass rate */
#ifdef USE_NOISE_FILTER
RATES_SUM_SCALED(ahrs.imu_rate, ahrs.imu_rate, uf_rate, NOISE_FILTER_GAIN);
RATES_SDIV(ahrs.imu_rate, ahrs.imu_rate, NOISE_FILTER_GAIN+1);
#else
RATES_ADD(ahrs.imu_rate, uf_rate);
RATES_SDIV(ahrs.imu_rate, ahrs.imu_rate, 2);
#endif
#ifdef USE_NOISE_CUT
}
RATES_COPY(last_uf_rate, uf_rate);
#endif
/* integrate eulers */
struct Int32Eulers euler_dot;
@@ -152,7 +199,21 @@ void ahrs_propagate(void) {
void ahrs_update_accel(void) {
get_phi_theta_measurement_fom_accel(&ahrs_impl.measurement.phi, &ahrs_impl.measurement.theta, imu.accel);
#if defined(USE_NOISE_CUT) || defined(USE_NOISE_FILTER)
static struct Int32Vect3 last_accel = { 0, 0, 0 };
#endif
#ifdef USE_NOISE_CUT
if (!cut_accel(imu.accel, last_accel, ACCEL_CUT_THRESHOLD)) {
#endif
#ifdef USE_NOISE_FILTER
VECT3_SUM_SCALED(imu.accel, imu.accel, last_accel, NOISE_FILTER_GAIN);
VECT3_SDIV(imu.accel, imu.accel, NOISE_FILTER_GAIN+1);
#endif
get_phi_theta_measurement_fom_accel(&ahrs_impl.measurement.phi, &ahrs_impl.measurement.theta, imu.accel);
#ifdef USE_NOISE_CUT
}
VECT3_COPY(last_accel, imu.accel);
#endif
}
+2 -1
View File
@@ -175,7 +175,8 @@ bool_t nav_approaching_xy(float x, float y, float from_x, float from_y, float ap
#define NavAttitude(_roll) { \
lateral_mode = LATERAL_MODE_ROLL; \
h_ctl_roll_setpoint = _roll; \
if(pprz_mode != PPRZ_MODE_AUTO1) \
{h_ctl_roll_setpoint = _roll;} \
}
#define nav_IncreaseShift(x) { if (x==0) nav_shift = 0; else nav_shift += x; }
+4 -4
View File
@@ -93,11 +93,11 @@ let get_last_geo_pos = fun lookup ->
and utm_north = float_of_string (lookup "GPS" "utm_north") /. 100.
and utm_zone = int_of_string (lookup "GPS" "utm_zone") in
Latlong.of_utm WGS84 {utm_x=utm_east; utm_y=utm_north; utm_zone=utm_zone}
else if lookup "NAV_REF" "x" <>"" && lookup "ROTORCRAFT_FP" "east" <>"" then
else if lookup "INS_REF" "ecef_x0" <>"" && lookup "ROTORCRAFT_FP" "east" <>"" then
let getf = fun m f -> float_of_string (lookup m f) in
let x0 = getf "NAV_REF" "x" /. 100.
and y0 = getf "NAV_REF" "y" /. 100.
and z0 = getf "NAV_REF" "z" /. 100.
let x0 = getf "INS_REF" "ecef_x0" /. 100.
and y0 = getf "INS_REF" "ecef_y0" /. 100.
and z0 = getf "INS_REF" "ecef_z0" /. 100.
and e = getf "ROTORCRAFT_FP" "east" /. 256.
and n = getf "ROTORCRAFT_FP" "north" /. 256.
and u = getf "ROTORCRAFT_FP" "up" /. 256. in
+3 -3
View File
@@ -543,10 +543,10 @@ let rec select_gps_values = function
l := (t, of_utm WGS84 utm, a) :: !l
done;
List.rev !l
| (m, values)::_ when m.Pprz.name = "BOOZ2_GPS" ->
| (m, values)::_ when m.Pprz.name = "GPS_INT" ->
let lats = List.assoc "lat" values
and lons = List.assoc "lon" values
and alts = List.assoc "alt" values in
and alts = List.assoc "hmsl" values in
let l = ref [] in
for i = 0 to Array.length lats - 1 do
let a = snd alts.(i) /. 1000. in
@@ -554,7 +554,7 @@ let rec select_gps_values = function
let t = fst lats.(i)
and lat = snd lats.(i) /. 1e7
and lon = snd lons.(i) /. 1e7 in
let wgs84 = make_geo_deg lat lon in
let wgs84 = make_geo lat lon in
l := (t, wgs84, a) :: !l
done;
List.rev !l