| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,22 @@ | ||
| <!DOCTYPE module SYSTEM "module.dtd"> | ||
| <module name="rot_wing_auto_doublet" dir="system_identification"> | ||
| <doc> | ||
| <description>Module that automatically runs a doublet program for the rotating wing drone</description> | ||
| </doc> | ||
| <settings> | ||
| <dl_settings NAME="AutoDoublet"> | ||
| <dl_settings name="auto_doublet"> | ||
| <dl_setting min="0" max="1" step="1" values="Inactive|Active" shortname="activated" var="rot_wing_auto_doublet_activated" type="uint8_t" module="system_identification/rot_wing_auto_doublet" handler="on_activation"/> | ||
| </dl_settings> | ||
| </dl_settings> | ||
| </settings> | ||
| <header> | ||
| <file name="rot_wing_auto_doublet.h"/> | ||
| </header> | ||
| <init fun="init_rot_wing_auto_doublet()"/> | ||
| <periodic fun="periodic_rot_wing_auto_doublet()" freq="20.0"/> | ||
| <makefile> | ||
| <file name="rot_wing_auto_doublet.c"/> | ||
| <test/> | ||
| </makefile> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| <!DOCTYPE module SYSTEM "module.dtd"> | ||
| <module name="rot_wing_automation" dir="rot_wing_drone"> | ||
| <doc> | ||
| <description>Fucntions to automate the navigation and guidance of the rotating wing drone</description> | ||
| </doc> | ||
| <settings> | ||
| <dl_settings> | ||
| <dl_settings NAME="transition"> | ||
| <dl_setting var="rot_wing_a.trans_accel" min="0.1" max="5.0" step="0.1" shortname="trans_accel"/> | ||
| <dl_setting var="rot_wing_a.trans_decel" min="0.1" max="5.0" step="0.1" shortname="trans_decel"/> | ||
| <dl_setting var="rot_wing_a.trans_length" min="10" max="500." step="1.0" shortname="trans_distance"/> | ||
| <dl_setting var="rot_wing_a.trans_airspeed" min="10.0" max="20.0" step="0.1" shortname="trans_airspeed"/> | ||
| </dl_settings> | ||
| </dl_settings> | ||
| </settings> | ||
| <header> | ||
| <file name="rot_wing_automation.h"/> | ||
| </header> | ||
| <init fun="init_rot_wing_automation()"/> | ||
| <periodic fun="periodic_rot_wing_automation()" freq="10."/> | ||
| <makefile> | ||
| <file name="rot_wing_automation.c"/> | ||
| <test/> | ||
| </makefile> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| <!DOCTYPE module SYSTEM "module.dtd"> | ||
| <module name="rotwing_state" dir="rot_wing_drone"> | ||
| <doc> | ||
| <description>This module keeps track of the current state of a rotating wing drone and desired state set by the RC or flightplan. Paramters are being scheduled in each change of a current state and desired state. Functions are defined in this module to call the actual state and desired state and set a desired state.</description> | ||
| </doc> | ||
| <header> | ||
| <file name="rotwing_state.h"/> | ||
| </header> | ||
| <init fun="init_rotwing_state()"/> | ||
| <periodic fun="periodic_rotwing_state()" freq="10"/> | ||
| <makefile> | ||
| <file name="rotwing_state.c"/> | ||
| <test/> | ||
| </makefile> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| <!DOCTYPE module SYSTEM "module.dtd"> | ||
| <module name="wind_tunnel_rot_wing" dir="wind_tunnel"> | ||
| <doc> | ||
| <description>This module allows the user to control seperate actuators for example during wind tunnel experiments.</description> | ||
| </doc> | ||
| <settings> | ||
| <dl_settings name="Wind tunnel"> | ||
| <dl_settings name="Wt act control"> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="motors_on" var="motors_on_wt" type="bool"/> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="front_on" var="motor_on_wt[0]" type="bool"/> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="right_on" var="motor_on_wt[1]" type="bool"/> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="back_on" var="motor_on_wt[2]" type="bool"/> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="left_on" var="motor_on_wt[3]" type="bool"/> | ||
| <dl_setting min="0" max="1" step="1" values="Off|On" shortname="push_on" var="motor_on_wt[4]" type="bool"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="front_cmd" var="actuators_slider_wt[0]" type="int16_t"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="right_cmd" var="actuators_slider_wt[1]" type="int16_t"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="back_cmd" var="actuators_slider_wt[2]" type="int16_t"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="left_cmd" var="actuators_slider_wt[3]" type="int16_t"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="push_cmd" var="actuators_slider_wt[4]" type="int16_t"/> | ||
| <dl_setting min="-9600" max="9600" step="1" shortname="elevator_cmd" var="actuators_slider_wt[9]" type="int16_t"/> | ||
| <dl_setting min="-9600" max="9600" step="1" shortname="rudder_cmd" var="actuators_slider_wt[10]" type="int16_t"/> | ||
| <dl_setting min="0" max="9600" step="1" shortname="motors_cmd" var="motors_slider_wt" type="int16_t"/> | ||
| <dl_setting min="0" max="11" step="1" shortname="sweep_idx" var="wt_actuator_sweep_index" type="uint8_t"/> | ||
| <dl_setting min="-9600" max="9600" step="1" shortname="min_sweep" var="wt_input_min_cmd" type="int16_t"/> | ||
| <dl_setting min="-9600" max="9600" step="1" shortname="max_sweep" var="wt_input_max_cmd" type="int16_t"/> | ||
| <dl_setting min="0" max="20" step="0.1" shortname="steptime" var="wt_input_steptime" type="float"/> | ||
| <dl_setting min="0" max="1" step="1" values="Inactive|Active" var="wt_sweep_running" shortname="Sweep" type="bool" module="wind_tunnel/wind_tunnel_rot_wing" handler="sweep_handler"/> | ||
| <dl_setting min="0" max="1" step="1" values="Inactive|Active" var="wt_sweep_motors_running" shortname="Motors_sweep" type="bool" module="wind_tunnel/wind_tunnel_rot_wing" handler="sweep_motors_handler"/> | ||
| <!--<dl_setting min="0" max="1" step="1" values="Inactive|Active" shortname="Chirp" var="chirp_active" type="uint8_t" module="system_identification/sys_id_chirp" handler="activate_handler"/> | ||
| <dl_setting min="0" max="1" step="1" values="Inactive|Active" shortname="Fade in" var="chirp_fade_in" type="uint8_t" module="system_identification/sys_id_chirp" handler="fade_in_activate_handler"/> | ||
| <dl_setting min="0" max="1" step="1" values="Inactive|Active" shortname="Exponential" var="chirp_exponential" type="uint8_t" module="system_identification/sys_id_chirp" handler="exponential_activate_handler"/> | ||
| <dl_setting min="0" max="7" step="1" shortname="Chirp axis" var="chirp_axis" type="uint8_t" module="system_identification/sys_id_chirp" handler="axis_handler"/> | ||
| <dl_setting min="0" max="9600" step="100" shortname="Amplitude" var="chirp_amplitude" type="int32_t" module="system_identification/sys_id_chirp"/> | ||
| <dl_setting min="0" max="0.5" step="0.01" shortname="on-axis noise" var="chirp_noise_stdv_onaxis_ratio" type="float" module="system_identification/sys_id_chirp"/> | ||
| <dl_setting min="0" max="9600" step="50" shortname="off-axis noise" var="chirp_noise_stdv_offaxis" type="float" module="system_identification/sys_id_chirp"/> | ||
| <dl_setting min="0.05" max="20" step="0.05" shortname="Fstart_hz" var="chirp_fstart_hz" type="float" module="system_identification/sys_id_chirp" handler="fstart_handler"/> | ||
| <dl_setting min="0.1" max="20" step="0.1" shortname="Fend_hz" var="chirp_fstop_hz" type="float" module="system_identification/sys_id_chirp" handler="fstop_handler"/> | ||
| <dl_setting min="0" max="100" step="0.5" shortname="Length_s" var="chirp_length_s" type="float" module="system_identification/sys_id_chirp"/>--> | ||
| </dl_settings> | ||
| </dl_settings> | ||
| </settings> | ||
| <header> | ||
| <file name="wind_tunnel_rot_wing.h"/> | ||
| </header> | ||
| <init fun="init_wt_rot_wing()"/> | ||
| <event fun="event_wt_rot_wing()"/> | ||
| <makefile> | ||
| <file name="wind_tunnel_rot_wing.c"/> | ||
| <test/> | ||
| </makefile> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| <!DOCTYPE module SYSTEM "module.dtd"> | ||
| <module name="wing_rotation_controller_v3b" dir="rot_wing_drone"> | ||
| <doc> | ||
| <description>Module to control wing rotation servo command based on prefered angle setpoint</description> | ||
| </doc> | ||
| <settings> | ||
| <dl_settings NAME="wing_rotation"> | ||
| <dl_settings NAME="wing_rot"> | ||
| <dl_setting MAX="90" MIN="0" STEP="1" VAR="wing_rotation.wing_angle_deg_sp" shortname="wing_sp_deg"/> | ||
| <dl_setting MAX="1" MIN="0" STEP="1" VAR="wing_rotation.airspeed_scheduling" shortname="airspeed_sched"/> | ||
| <dl_setting MAX="18" MIN="14" STEP="0.1" VAR="wing_rotation.forward_airspeed" shortname="forward_airspeed"/> | ||
| <dl_setting MAX="0.01" MIN="0" STEP="0.0001" VAR="wing_rotation.wing_rotation_first_order_dynamics" shortname="first_dyn"/> | ||
| <dl_setting MAX="0.01" MIN="0" STEP="0.0001" VAR="wing_rotation.wing_rotation_second_order_dynamics" shortname="second_dyn"/> | ||
| </dl_settings> | ||
| </dl_settings> | ||
| </settings> | ||
| <header> | ||
| <file name="wing_rotation_controller_v3b.h"/> | ||
| </header> | ||
| <init fun="wing_rotation_init()"/> | ||
| <periodic fun="wing_rotation_periodic()" freq="1.0"/> | ||
| <periodic fun="wing_rotation_event()"/> | ||
| <makefile> | ||
| <file name="wing_rotation_controller_v3b.c"/> | ||
| <test/> | ||
| </makefile> | ||
| </module> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,259 @@ | ||
| <?xml version="1.0"?> | ||
| <?xml-stylesheet type="text/xsl" href="http://jsbsim.sourceforge.net/JSBSim.xsl"?> | ||
| <fdm_config name="QUAD COMPLETE EXT" version="2.0" release="BETA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd"> | ||
|
|
||
| <fileheader> | ||
| <author>Dennis van Wijngaarden </author> | ||
| <filecreationdate>08-04-2022</filecreationdate> | ||
| <version>Version 0.9 - beta</version> | ||
| <description>Rotating wing drone v3 with actuator dynamics (NE/SW turning CCW, NW/SE CW)</description> | ||
| </fileheader> | ||
|
|
||
| <metrics> | ||
| <wingarea unit="IN2"> 78.53 </wingarea> | ||
| <wingspan unit="IN"> 10 </wingspan> | ||
| <chord unit="IN"> 6.89 </chord> | ||
| <htailarea unit="FT2"> 0 </htailarea> | ||
| <htailarm unit="FT"> 0 </htailarm> | ||
| <vtailarea unit="FT2"> 0 </vtailarea> | ||
| <vtailarm unit="FT"> 0 </vtailarm> | ||
| <location name="AERORP" unit="IN"> | ||
| <x> 0 </x> | ||
| <y> 0 </y> | ||
| <z> 0 </z> | ||
| </location> | ||
| <location name="EYEPOINT" unit="IN"> | ||
| <x> 0 </x> | ||
| <y> 0 </y> | ||
| <z> 0 </z> | ||
| </location> | ||
| <location name="VRP" unit="IN"> | ||
| <x> 0 </x> | ||
| <y> 0 </y> | ||
| <z> 0 </z> | ||
| </location> | ||
| </metrics> | ||
|
|
||
| <mass_balance> | ||
| <ixx unit="SLUG*FT2"> 0.047772 </ixx> | ||
| <iyy unit="SLUG*FT2"> 0.054670 </iyy> | ||
| <izz unit="SLUG*FT2"> 1.203701 </izz> | ||
| <ixy unit="SLUG*FT2"> 0. </ixy> | ||
| <ixz unit="SLUG*FT2"> 0. </ixz> | ||
| <iyz unit="SLUG*FT2"> 0. </iyz> | ||
| <emptywt unit="LBS"> 14.52846 </emptywt> | ||
| <location name="CG" unit="M"> | ||
| <x> 0 </x> | ||
| <y> 0 </y> | ||
| <z> 0 </z> | ||
| </location> | ||
| </mass_balance> | ||
|
|
||
| <ground_reactions> | ||
| <contact type="STRUCTURE" name="CONTACT_FRONT"> | ||
| <location unit="M"> | ||
| <x>-0.15 </x> | ||
| <y> 0 </y> | ||
| <z>-0.1 </z> | ||
| </location> | ||
| <static_friction> 0.8 </static_friction> | ||
| <dynamic_friction> 0.5 </dynamic_friction> | ||
| <spring_coeff unit="N/M"> 500 </spring_coeff> | ||
| <damping_coeff unit="N/M/SEC"> 100 </damping_coeff> | ||
| <damping_coeff_rebound type="SQUARE" unit="N/M2/SEC2"> 1000 </damping_coeff_rebound> | ||
| <max_steer unit="DEG"> 0.0 </max_steer> | ||
| <brake_group> NONE </brake_group> | ||
| <retractable>0</retractable> | ||
| </contact> | ||
|
|
||
| <contact type="STRUCTURE" name="CONTACT_BACK"> | ||
| <location unit="M"> | ||
| <x> 0.15</x> | ||
| <y> 0 </y> | ||
| <z>-0.1 </z> | ||
| </location> | ||
| <static_friction> 0.8 </static_friction> | ||
| <dynamic_friction> 0.5 </dynamic_friction> | ||
| <spring_coeff unit="N/M"> 500 </spring_coeff> | ||
| <damping_coeff unit="N/M/SEC"> 100 </damping_coeff> | ||
| <damping_coeff_rebound type="SQUARE" unit="N/M2/SEC2"> 1000 </damping_coeff_rebound> | ||
| <max_steer unit="DEG"> 0.0 </max_steer> | ||
| <brake_group> NONE </brake_group> | ||
| <retractable>0</retractable> | ||
| </contact> | ||
|
|
||
| <contact type="STRUCTURE" name="CONTACT_RIGHT"> | ||
| <location unit="M"> | ||
| <x> 0. </x> | ||
| <y> 0.15</y> | ||
| <z>-0.1 </z> | ||
| </location> | ||
| <static_friction> 0.8 </static_friction> | ||
| <dynamic_friction> 0.5 </dynamic_friction> | ||
| <spring_coeff unit="N/M"> 500 </spring_coeff> | ||
| <damping_coeff unit="N/M/SEC"> 100 </damping_coeff> | ||
| <damping_coeff_rebound type="SQUARE" unit="N/M2/SEC2"> 1000 </damping_coeff_rebound> | ||
| <max_steer unit="DEG"> 0.0 </max_steer> | ||
| <brake_group> NONE </brake_group> | ||
| <retractable>0</retractable> | ||
| </contact> | ||
|
|
||
| <contact type="STRUCTURE" name="CONTACT_LEFT"> | ||
| <location unit="M"> | ||
| <x> 0. </x> | ||
| <y>-0.15</y> | ||
| <z>-0.1 </z> | ||
| </location> | ||
| <static_friction> 0.8 </static_friction> | ||
| <dynamic_friction> 0.5 </dynamic_friction> | ||
| <spring_coeff unit="N/M"> 500 </spring_coeff> | ||
| <damping_coeff unit="N/M/SEC"> 100 </damping_coeff> | ||
| <damping_coeff_rebound type="SQUARE" unit="N/M2/SEC2"> 1000 </damping_coeff_rebound> | ||
| <max_steer unit="DEG"> 0.0 </max_steer> | ||
| <brake_group> NONE </brake_group> | ||
| <retractable>0</retractable> | ||
| </contact> | ||
| </ground_reactions> | ||
|
|
||
| <flight_control name="actuator_dynamics"> | ||
| <channel name="filtering"> | ||
|
|
||
| <!--First order filter represents actuator dynamics--> | ||
| <lag_filter name="front_motor_lag"> | ||
| <input> fcs/front_motor </input> | ||
| <c1> 50 </c1> | ||
| <output> fcs/front_motor_lag</output> | ||
| </lag_filter> | ||
| <lag_filter name="right_motor_lag"> | ||
| <input> fcs/right_motor </input> | ||
| <c1> 50 </c1> | ||
| <output> fcs/right_motor_lag</output> | ||
| </lag_filter> | ||
| <lag_filter name="back_motor_lag"> | ||
| <input> fcs/back_motor </input> | ||
| <c1> 50 </c1> | ||
| <output> fcs/back_motor_lag</output> | ||
| </lag_filter> | ||
| <lag_filter name="left_motor_lag"> | ||
| <input> fcs/left_motor </input> | ||
| <c1> 50 </c1> | ||
| <output> fcs/left_motor_lag</output> | ||
| </lag_filter> | ||
| </channel> | ||
|
|
||
| </flight_control> | ||
|
|
||
| <external_reactions> | ||
|
|
||
| <property>fcs/front_motor</property> | ||
| <property>fcs/front_motor_lag</property> | ||
| <property>fcs/right_motor</property> | ||
| <property>fcs/right_motor_lag</property> | ||
| <property>fcs/back_motor</property> | ||
| <property>fcs/back_motor_lag</property> | ||
| <property>fcs/left_motor</property> | ||
| <property>fcs/left_motor_lag</property> | ||
|
|
||
|
|
||
| <!-- First the lift forces produced by each propeller --> | ||
|
|
||
| <force name="front_motor" frame="BODY" unit="LBS"> | ||
| <function> | ||
| <product> | ||
| <property>fcs/front_motor_lag</property> | ||
| <value> 7.0 </value> | ||
| </product> | ||
| </function> | ||
| <location unit="IN"> | ||
| <x>-18.504</x> | ||
| <y>0</y> | ||
| <z>0</z> | ||
| </location> | ||
| <direction> | ||
| <x>0</x> | ||
| <y>0</y> | ||
| <z>-1</z> | ||
| </direction> | ||
| </force> | ||
|
|
||
| <force name="right_motor" frame="BODY" unit="LBS"> | ||
| <function> | ||
| <product> | ||
| <property>fcs/right_motor_lag</property> | ||
| <value> 7.0 </value> | ||
| </product> | ||
| </function> | ||
| <location unit="IN"> | ||
| <x>0</x> | ||
| <y>14.567</y> | ||
| <z>0</z> | ||
| </location> | ||
| <direction> | ||
| <x>0</x> | ||
| <y>0</y> | ||
| <z>-1</z> | ||
| </direction> | ||
| </force> | ||
|
|
||
| <force name="back_motor" frame="BODY" unit="LBS"> | ||
| <function> | ||
| <product> | ||
| <property>fcs/back_motor_lag</property> | ||
| <value> 7.0 </value> | ||
| </product> | ||
| </function> | ||
| <location unit="IN"> | ||
| <x>18.504</x> | ||
| <y>0</y> | ||
| <z>0</z> | ||
| </location> | ||
| <direction> | ||
| <x>0</x> | ||
| <y>0</y> | ||
| <z>-1</z> | ||
| </direction> | ||
| </force> | ||
|
|
||
| <force name="left_motor" frame="BODY" unit="LBS"> | ||
| <function> | ||
| <product> | ||
| <property>fcs/left_motor_lag</property> | ||
| <value> 7.0 </value> | ||
| </product> | ||
| </function> | ||
| <location unit="IN"> | ||
| <x>0</x> | ||
| <y>-14.567</y> | ||
| <z>0</z> | ||
| </location> | ||
| <direction> | ||
| <x>0</x> | ||
| <y>0</y> | ||
| <z>-1</z> | ||
| </direction> | ||
| </force> | ||
|
|
||
| <!-- Then the Moment Couples --> | ||
|
|
||
|
|
||
| </external_reactions> | ||
|
|
||
| <propulsion/> | ||
|
|
||
| <flight_control name="FGFCS"/> | ||
|
|
||
| <aerodynamics> | ||
| <axis name="DRAG"> | ||
| <function name="aero/coefficient/CD"> | ||
| <description>Drag</description> | ||
| <product> | ||
| <property>aero/qbar-psf</property> | ||
| <value>47.9</value> <!-- Conversion to pascals --> | ||
| <value>0.0151</value> <!-- CD x Area (m^2) --> | ||
| <value>0.224808943</value> <!-- N to LBS --> | ||
| </product> | ||
| </function> | ||
| </axis> | ||
| </aerodynamics> | ||
|
|
||
| </fdm_config> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,254 @@ | ||
| <?xml version="1.0"?> | ||
| <!DOCTYPE telemetry SYSTEM "telemetry.dtd"> | ||
| <telemetry> | ||
|
|
||
|
|
||
| <process name="Main"> | ||
|
|
||
| <mode name="default" key_press="d"> | ||
| <message name="AUTOPILOT_VERSION" period="11.1"/> | ||
| <message name="DL_VALUE" period="0.7"/> | ||
| <message name="ROTORCRAFT_STATUS" period="0.4"/> | ||
| <message name="ROTORCRAFT_FP" period="0.20"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="INS_REF" period="5.1"/> | ||
| <message name="ROTORCRAFT_NAV_STATUS" period="1.6"/> | ||
| <message name="WP_MOVED" period="1.3"/> | ||
| <message name="ROTORCRAFT_CAM" period="1."/> | ||
| <message name="GPS_INT" period=".2"/> | ||
| <message name="INS" period=".2"/> | ||
| <message name="I2C_ERRORS" period="4.1"/> | ||
| <message name="UART_ERRORS" period="3.1"/> | ||
| <message name="SUPERBITRF" period="3"/> | ||
| <message name="ENERGY" period="0.5"/> | ||
| <message name="DATALINK_REPORT" period="5.1"/> | ||
| <message name="STATE_FILTER_STATUS" period="3.2"/> | ||
| <message name="AIR_DATA" period="0.6"/> | ||
| <message name="SURVEY" period="2.5"/> | ||
| <message name="OPTIC_FLOW_EST" period="0.05"/> | ||
| <message name="VECTORNAV_INFO" period="0.5"/> | ||
| <message name="OPTICAL_FLOW_HOVER" period="0.05"/> | ||
| <message name="VISUALTARGET" period="0.10"/> | ||
| <message name="VISION_POSITION_ESTIMATE" period="0.1"/> | ||
| <message name="DIVERGENCE" period="0.05"/> | ||
| <message name="DRAGSPEED" period="0.02"/> | ||
| <message name="LOGGER_STATUS" period="5.1"/> | ||
| <message name="LIDAR" period="1.2"/> | ||
| <message name="INS_EKF2" period=".25"/> | ||
| <message name="INS_EKF2_EXT" period="4.25"/> | ||
| <message name="FBW_STATUS" period="2.1"/> | ||
| <message name="WIND_INFO_RET" period="9.2"/> | ||
| <message name="AHRS_BIAS" period="7.5"/> | ||
| <message name="HOVER_LOOP" period="0.3"/> | ||
| <message name="GUIDANCE_H_REF_INT" period="0.31"/> | ||
| <message name="GUIDANCE_INDI_HYBRID" period="0.4"/> | ||
| <message name="HYBRID_GUIDANCE" period="0.4"/> | ||
| <message name="ESC" period="0.1"/> | ||
| <message name="AHRS_REF_QUAT" period="0.1"/> | ||
| <message name="GPS_RTK" period="0.1"/> | ||
| <message name="INDI_G" period="0.1"/> | ||
| <message name="ACTUATORS" period="0.1"/> | ||
| <message name="STAB_ATTITUDE_FULL_INDI" period="0.05"/> | ||
| <message name="ROT_WING_CONTROLLER" period="0.2"/> | ||
| </mode> | ||
|
|
||
| <mode name="calibration"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="IMU_ACCEL_RAW" period=".05"/> | ||
| <message name="IMU_GYRO_RAW" period=".05"/> | ||
| <message name="IMU_MAG_RAW" period=".05"/> | ||
| <message name="IMU_MAG_CURRENT_CALIBRATION" period=".05"/> | ||
| <message name="BARO_RAW" period=".1"/> | ||
| <message name="GPS_INT" period=".2"/> | ||
| </mode> | ||
|
|
||
| <mode name="ppm"> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="ROTORCRAFT_CMD" period=".05"/> | ||
| <message name="PPM" period="0.5"/> | ||
| <message name="RC" period="0.5"/> | ||
| <message name="ROTORCRAFT_RADIO_CONTROL" period="0.5"/> | ||
| <message name="ROTORCRAFT_STATUS" period="1"/> | ||
| <message name="BEBOP_ACTUATORS" period="0.2"/> | ||
| </mode> | ||
|
|
||
| <mode name="raw_sensors"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="IMU_ACCEL_RAW" period=".05"/> | ||
| <message name="IMU_GYRO_RAW" period=".05"/> | ||
| <message name="IMU_MAG_RAW" period=".05"/> | ||
| <message name="BARO_RAW" period=".1"/> | ||
| <message name="ARDRONE_NAVDATA" period=".05"/> | ||
| </mode> | ||
|
|
||
| <mode name="scaled_sensors"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="IMU_GYRO" period=".075"/> | ||
| <message name="IMU_GYRO_SCALED" period=".075"/> | ||
| <message name="IMU_ACCEL_SCALED" period=".075"/> | ||
| <message name="IMU_MAG_SCALED" period=".1"/> | ||
| </mode> | ||
|
|
||
| <mode name="ahrs"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="FILTER_ALIGNER" period="2.2"/> | ||
| <message name="FILTER" period=".5"/> | ||
| <message name="GEO_MAG" period="5."/> | ||
| <message name="AHRS_GYRO_BIAS_INT" period="0.08"/> | ||
| <message name="AHRS_QUAT_INT" period=".25"/> | ||
| <message name="AHRS_EULER_INT" period=".1"/> | ||
| <message name="AHRS_EULER" period=".1"/> | ||
| <!-- <message name="AHRS_RMAT_INT" period=".5"/> --> | ||
| </mode> | ||
|
|
||
| <mode name="rate_loop"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="RATE_LOOP" period=".02"/> | ||
| </mode> | ||
|
|
||
| <mode name="attitude_setpoint_viz" key_press="v"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="ROTORCRAFT_RADIO_CONTROL" period="0.1"/> | ||
| <message name="AHRS_REF_QUAT" period="0.05"/> | ||
| </mode> | ||
|
|
||
| <mode name="attitude_loop" key_press="a"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="STAB_ATTITUDE_INT" period=".03"/> | ||
| <message name="STAB_ATTITUDE_REF_INT" period=".03"/> | ||
| <message name="STAB_ATTITUDE_FLOAT" period=".03"/> | ||
| <message name="STAB_ATTITUDE_REF_FLOAT" period=".03"/> | ||
| <message name="STAB_ATTITUDE_INDI" period=".25"/> | ||
| <message name="INDI_G" period="2.0"/> | ||
| </mode> | ||
|
|
||
| <mode name="vert_loop" key_press="v"> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="DL_VALUE" period="0.5"/> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="VFF" period=".05"/> | ||
| <message name="VFF_EXTENDED" period=".05"/> | ||
| <message name="VERT_LOOP" period=".05"/> | ||
| <message name="INS_Z" period=".05"/> | ||
| <message name="INS" period=".11"/> | ||
| <message name="INS_REF" period="5.1"/> | ||
| </mode> | ||
|
|
||
| <mode name="vel_guidance" key_press="q"> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="HYBRID_GUIDANCE" period="0.062"/> | ||
| <!--<message name="STAB_ATTITUDE_REF" period="0.4"/>--> | ||
| <message name="ROTORCRAFT_FP" period="0.8"/> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="ROTORCRAFT_NAV_STATUS" period="1.6"/> | ||
| <message name="INS_REF" period="5.1"/> | ||
| <message name="WP_MOVED" period="1.3"/> | ||
| <message name="GPS_INT" period="1.0"/> | ||
| <message name="INS" period="1.0"/> | ||
| </mode> | ||
|
|
||
| <mode name="h_loop" key_press="h"> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="HOVER_LOOP" period="0.062"/> | ||
| <message name="GUIDANCE_H_REF_INT" period="0.062"/> | ||
| <message name="STAB_ATTITUDE_INT" period="0.4"/> | ||
| <message name="STAB_ATTITUDE_FLOAT" period="0.4"/> | ||
| <!--<message name="STAB_ATTITUDE_REF_INT" period="0.4"/>--> | ||
| <message name="ROTORCRAFT_FP" period="0.8"/> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="ROTORCRAFT_NAV_STATUS" period="1.6"/> | ||
| <message name="INS_REF" period="5.1"/> | ||
| <!-- HFF messages are only sent if USE_HFF --> | ||
| <message name="HFF" period=".05"/> | ||
| <message name="HFF_GPS" period=".03"/> | ||
| <message name="HFF_DBG" period=".2"/> | ||
| </mode> | ||
|
|
||
| <mode name="aligner"> | ||
| <message name="ALIVE" period="0.9"/> | ||
| <message name="FILTER_ALIGNER" period="0.02"/> | ||
| </mode> | ||
|
|
||
| <mode name="tune_hover"> | ||
| <message name="DL_VALUE" period="1.1"/> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="ALIVE" period="2.1"/> | ||
| <message name="GUIDANCE_H_INT" period="0.05"/> | ||
| <message name="ROTORCRAFT_TUNE_HOVER" period=".1"/> | ||
| <!-- <message name="GPS_INT" period=".20"/> --> | ||
| <!--<message name="INS2" period=".05"/> | ||
| <message name="INS3" period=".20"/>--> | ||
| <message name="INS_REF" period="5.1"/> | ||
| </mode> | ||
|
|
||
| <mode name="RTCM3" > | ||
| <message name="GPS_RXMRTCM" period="1"/> | ||
| <message name="GPS_INT" period=".25"/> | ||
| <message name="GPS_RTK" period="1"/> | ||
| </mode> | ||
|
|
||
| </process> | ||
|
|
||
| <process name="FlightRecorder"> | ||
| <mode name="default"> | ||
| <message name="AUTOPILOT_VERSION" period="11.1"/> | ||
| <message name="GPS" period="11.1"/> | ||
| <message name="DL_VALUE" period="2.5"/> | ||
| <message name="ROTORCRAFT_STATUS" period="1.2"/> | ||
| <message name="ROTORCRAFT_FP" period="0.002"/> | ||
| <message name="ROTORCRAFT_CMD" period=".002"/> | ||
| <message name="COMMANDS" period=".02"/> | ||
| <message name="INS_REF" period="5.1"/> | ||
| <message name="ROTORCRAFT_NAV_STATUS" period="1.6"/> | ||
| <message name="WP_MOVED" period="1.3"/> | ||
| <message name="GPS_INT" period=".1"/> | ||
| <message name="INS" period=".002"/> | ||
| <message name="INS_Z" period=".1"/> | ||
| <message name="I2C_ERRORS" period="4.1"/> | ||
| <message name="UART_ERRORS" period="3.1"/> | ||
| <message name="ENERGY" period="0.1"/> | ||
| <message name="DATALINK_REPORT" period="5.1"/> | ||
| <message name="STATE_FILTER_STATUS" period="3.2"/> | ||
| <message name="AIR_DATA" period="0.02"/> | ||
| <message name="SURVEY" period="2.5"/> | ||
| <message name="IMU_GYRO_SCALED" period=".0006667"/> | ||
| <message name="IMU_ACCEL_SCALED" period=".0006667"/> | ||
| <message name="IMU_MAG_SCALED" period=".0125"/> | ||
| <message name="LIDAR" period="0.05"/> | ||
| <message name="INS_EKF2" period="0.05"/> | ||
| <message name="INS_EKF2_EXT" period="0.1"/> | ||
| <message name="WIND_INFO_RET" period="0.2"/> | ||
| <message name="AHRS_BIAS" period="0.5"/> | ||
| <message name="AHRS_REF_QUAT" period="0.01"/> | ||
| <message name="GUIDANCE_H_REF_INT" period="0.02"/> | ||
| <message name="GUIDANCE_INDI_HYBRID" period="0.002"/> | ||
| <message name="HYBRID_GUIDANCE" period="0.02"/> | ||
| <message name="ESC" period="0.02"/> | ||
| <!-- <message name="STAB_ATTITUDE_INDI" period="0.002"/> --> | ||
| <message name="PPM" period="0.05"/> | ||
| <!-- <message name="INDI_G" period="0.1"/> --> | ||
| <message name="ACTUATORS" period="0.002"/> | ||
| <message name="GPS_RTK" period="0.1"/> | ||
| <!-- <message name="STAB_ATTITUDE_FULL_INDI" period="0.002"/> --> | ||
| <message name="ROT_WING_CONTROLLER" period="0.2"/> | ||
| <!--<message name="WINDTUNNEL_MEAS" period="0.005"/>--> | ||
| </mode> | ||
| </process> | ||
|
|
||
| </telemetry> | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| /* | ||
| * Copyright (C) 2015 Ewoud Smeur <ewoud.smeur@gmail.com> | ||
| * | ||
| * This file is part of paparazzi. | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, write to | ||
| * the Free Software Foundation, 59 Temple Place - Suite 330, | ||
| * Boston, MA 02111-1307, USA. | ||
| */ | ||
|
|
||
| /** | ||
| * @file firmwares/rotorcraft/guidance/guidance_indi_rot_wing.h | ||
| * | ||
| * A guidance mode based on Incremental Nonlinear Dynamic Inversion | ||
| * Come to ICRA2016 to learn more! | ||
| * | ||
| */ | ||
|
|
||
| #ifndef GUIDANCE_INDI_ROT_WING_H | ||
| #define GUIDANCE_INDI_ROT_WING_H | ||
|
|
||
| #include "std.h" | ||
| #include "math/pprz_algebra_int.h" | ||
| #include "math/pprz_algebra_float.h" | ||
| #include "filters/high_pass_filter.h" | ||
| #include "firmwares/rotorcraft/guidance.h" | ||
| #include "firmwares/rotorcraft/stabilization.h" | ||
|
|
||
| // TODO change names for _indi_hybrid_ | ||
|
|
||
| extern void guidance_indi_init(void); | ||
| extern void guidance_indi_enter(void); | ||
|
|
||
| enum GuidanceIndiHybrid_HMode { | ||
| GUIDANCE_INDI_HYBRID_H_POS, | ||
| GUIDANCE_INDI_HYBRID_H_SPEED, | ||
| GUIDANCE_INDI_HYBRID_H_ACCEL | ||
| }; | ||
|
|
||
| enum GuidanceIndiHybrid_VMode { | ||
| GUIDANCE_INDI_HYBRID_V_POS, | ||
| GUIDANCE_INDI_HYBRID_V_SPEED, | ||
| GUIDANCE_INDI_HYBRID_V_ACCEL | ||
| }; | ||
|
|
||
| extern struct StabilizationSetpoint guidance_indi_run(struct FloatVect3 *accep_sp, float heading_sp); | ||
| extern struct StabilizationSetpoint guidance_indi_run_mode(bool in_flight, struct HorizontalGuidance *gh, struct VerticalGuidance *gv, enum GuidanceIndiHybrid_HMode h_mode, enum GuidanceIndiHybrid_VMode v_mode); | ||
| extern void guidance_indi_propagate_filters(void); | ||
|
|
||
| struct guidance_indi_hybrid_params { | ||
| float pos_gain; | ||
| float pos_gainz; | ||
| float speed_gain; | ||
| float speed_gainz; | ||
| float heading_bank_gain; | ||
| }; | ||
|
|
||
| extern struct guidance_indi_hybrid_params gih_params; | ||
| extern float guidance_indi_specific_force_gain; | ||
| extern float guidance_indi_max_airspeed; | ||
| extern float nav_max_speed; | ||
| extern bool take_heading_control; | ||
| extern bool force_forward; ///< forward flight for hybrid nav | ||
|
|
||
| extern struct FloatRates ff_rates; | ||
| extern bool ff_rates_set; | ||
|
|
||
| extern float guidance_indi_max_bank; | ||
| extern float push_first_order_constant; | ||
| extern float hover_motor_slowdown; | ||
| extern float a_diff_limit; | ||
| extern float a_diff_limit_z; | ||
| extern float rot_wing_max_pitch_limit_deg; | ||
| extern float rot_wing_min_pitch_limit_deg; | ||
| extern float pitch_pref_deg; | ||
| extern float airspeed_turn_lower_bound; | ||
|
|
||
| extern bool hover_motors_active; | ||
| extern bool bool_disable_hover_motors; | ||
|
|
||
| extern bool weather_vane_on; | ||
| extern float weather_vane_gain; | ||
|
|
||
| extern float pitch_priority_factor; | ||
| extern float roll_priority_factor; | ||
| extern float thrust_priority_factor; | ||
| extern float pusher_priority_factor; | ||
|
|
||
| extern float horizontal_accel_weight; | ||
| extern float vertical_accel_weight; | ||
|
|
||
| extern float climb_vspeed_fwd; | ||
| extern float descend_vspeed_fwd; | ||
|
|
||
| #endif /* GUIDANCE_INDI_ROT_WING_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,51 @@ | ||
| /* | ||
| * Copyright (C) 2022 D.C. van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * | ||
| * This file is part of paparazzi | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, see | ||
| * <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| /** @file "modules/ctrl/ctrl_eff_sched_rot_wing_v3b.h" | ||
| * @author D.C. van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * Crtl effectiveness scheduler for thr rotating wing drone V3 | ||
| */ | ||
|
|
||
| #ifndef CTRL_EFF_SCHED_ROT_WING_V3B_H | ||
| #define CTRL_EFF_SCHED_ROT_WING_V3B_H | ||
|
|
||
| #include "std.h" | ||
|
|
||
| // Define settings | ||
| extern float lift_d_multiplier; | ||
| extern float g1_p_multiplier; | ||
| extern float g1_q_multiplier; | ||
| extern float g1_r_multiplier; | ||
| extern float g1_t_multiplier; | ||
|
|
||
| extern float pitch_angle_set; | ||
| extern float pitch_angle_range; | ||
|
|
||
| extern float rot_wing_aerodynamic_eff_const_g1_p[1]; | ||
| extern float rot_wing_aerodynamic_eff_const_g1_q[1]; | ||
| extern float rot_wing_aerodynamic_eff_const_g1_r[1]; | ||
|
|
||
| extern bool wing_rotation_sched_activated; | ||
| extern bool pusher_sched_activated; | ||
|
|
||
| extern void init_eff_scheduling(void); | ||
| extern void event_eff_scheduling(void); | ||
|
|
||
| #endif // CTRL_EFF_SCHED_ROT_WING_V3_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,145 @@ | ||
| #ifndef EKF_AW_H | ||
| #define EKF_AW_H | ||
|
|
||
| #ifdef __cplusplus | ||
| extern "C" { | ||
| #endif | ||
|
|
||
| #include "std.h" | ||
| #include "math/pprz_algebra_float.h" | ||
| #include "math/pprz_geodetic_float.h" | ||
|
|
||
| // Settings | ||
| struct ekfAwParameters { | ||
| // Q | ||
| float Q_accel; ///< accel process noise | ||
| float Q_gyro; ///< gyro process noise | ||
| float Q_mu; ///< wind process noise | ||
| float Q_k; ///< offset process noise | ||
|
|
||
| // R | ||
| float R_V_gnd; ///< speed measurement noise | ||
| float R_accel_filt[3]; ///< filtered accel measurement noise | ||
| float R_V_pitot; ///< airspeed measurement noise | ||
|
|
||
| // Model Based Parameters | ||
| float vehicle_mass; | ||
|
|
||
| // X Axis | ||
| float k_fx_drag[2]; // Temporary setting for fuselage + hover prop | ||
| float k_fx_fuselage[4]; | ||
| float k_fx_hover[3]; | ||
| float k_fx_wing[5]; | ||
| float k_fx_push[3]; | ||
| float k_fx_elev[3]; | ||
|
|
||
| // Y Axis | ||
| float k_fy_beta; | ||
| float k_fy_v; | ||
| float k_fy_wing[5]; | ||
|
|
||
| // Z Axis | ||
| float k_fz_fuselage[4]; | ||
| float k_fz_wing[4]; | ||
| float k_fz_hover[5]; | ||
| float k_fz_elev[2]; | ||
|
|
||
| // Other options | ||
| bool use_model[3]; | ||
| bool use_pitot; | ||
| bool propagate_offset; | ||
| bool quick_convergence; | ||
| }; | ||
|
|
||
| struct ekfHealth{ | ||
| bool healthy; | ||
| uint16_t crashes_n; | ||
| }; | ||
|
|
||
| extern struct ekfAwParameters ekf_aw_params; | ||
|
|
||
| // Init functions | ||
| extern void ekf_aw_init(void); | ||
| extern void ekf_aw_reset(void); | ||
|
|
||
| // Filtering functions | ||
| extern void ekf_aw_propagate(struct FloatVect3 *acc,struct FloatRates *gyro, struct FloatEulers *euler, float *pusher_RPM,float *hover_RPM_array, float *skew, float *elevator_angle, struct FloatVect3 * V_gnd, struct FloatVect3 *acc_filt, float *V_pitot,float dt); | ||
|
|
||
| // Getter/Setter functions | ||
| extern struct NedCoor_f ekf_aw_get_speed_body(void); | ||
| extern struct NedCoor_f ekf_aw_get_wind_ned(void); | ||
| extern struct NedCoor_f ekf_aw_get_offset(void); | ||
| extern struct FloatVect3 ekf_aw_get_innov_V_gnd(void); | ||
| extern struct FloatVect3 ekf_aw_get_innov_accel_filt(void); | ||
| extern float ekf_aw_get_innov_V_pitot(void); | ||
| extern void ekf_aw_get_meas_cov(float meas_cov[7]); | ||
| extern void ekf_aw_get_state_cov(float state_cov[9]); | ||
| extern void ekf_aw_get_process_cov(float process_cov[9]); | ||
| extern void ekf_aw_get_fuselage_force(float force[3]); | ||
| extern void ekf_aw_get_wing_force(float force[3]); | ||
| extern void ekf_aw_get_elevator_force(float force[3]); | ||
| extern void ekf_aw_get_hover_force(float force[3]); | ||
| extern void ekf_aw_get_pusher_force(float force[3]); | ||
| extern struct ekfAwParameters *ekf_aw_get_param_handle(void); | ||
|
|
||
| extern void ekf_aw_set_speed_body(struct NedCoor_f *s); | ||
| extern void ekf_aw_set_wind(struct NedCoor_f *s); | ||
| extern void ekf_aw_set_offset(struct NedCoor_f *s); | ||
| extern struct ekfHealth ekf_aw_get_health(void); | ||
|
|
||
| // Settings handlers | ||
| extern void ekf_aw_update_params(void); | ||
| extern void ekf_aw_reset_health(void); | ||
|
|
||
|
|
||
| // Handlers | ||
| #define ekf_aw_update_Q_accel(_v) { \ | ||
| ekf_aw_params.Q_accel = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_Q_gyro(_v) { \ | ||
| ekf_aw_params.Q_gyro = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_Q_mu(_v) { \ | ||
| ekf_aw_params.Q_mu = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_Q_k(_v) { \ | ||
| ekf_aw_params.Q_k = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_R_V_gnd(_v) { \ | ||
| ekf_aw_params.R_V_gnd = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_R_accel_filt_x(_v) { \ | ||
| ekf_aw_params.R_accel_filt[0] = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_R_accel_filt_y(_v) { \ | ||
| ekf_aw_params.R_accel_filt[1] = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_R_accel_filt_z(_v) { \ | ||
| ekf_aw_params.R_accel_filt[2] = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_update_R_V_pitot(_v) { \ | ||
| ekf_aw_params.R_V_pitot = _v; \ | ||
| ekf_aw_update_params(); \ | ||
| } | ||
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* EKF_AW_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,117 @@ | ||
| #ifndef EKF_AW_WRAPPER_H | ||
| #define EKF_AW_WRAPPER_H | ||
|
|
||
| #include "std.h" | ||
| #include "math/pprz_algebra_int.h" | ||
| #include "math/pprz_algebra_float.h" | ||
| #include "math/pprz_geodetic_float.h" | ||
| #include "modules/meteo/ekf_aw.h" | ||
|
|
||
|
|
||
| // EKF structure | ||
| struct ekfAw { | ||
|
|
||
| // States | ||
| struct NedCoor_f wind; | ||
| struct NedCoor_f V_body; | ||
| struct NedCoor_f offset; | ||
|
|
||
| // Inputs | ||
| struct FloatVect3 acc; ///< Last accelerometer measurements | ||
| struct FloatRates gyro; ///< Last gyroscope measurements | ||
| struct FloatEulers euler; /// Euler angles | ||
|
|
||
| int32_t last_RPM_hover[4]; // Value obtained from ABI Callback | ||
| int32_t last_RPM_pusher; // Value obtained from ABI Callback | ||
| float RPM_hover[4]; /// Hover motor RPM | ||
| float RPM_pusher; /// Pusher motor RPM | ||
| float skew; /// Skew | ||
| float elevator_angle; | ||
|
|
||
|
|
||
| // Measurements | ||
| struct FloatVect3 Vg_NED; /// Ground Speed | ||
| struct FloatVect3 acc_filt; ///< Last accelerometer measurements | ||
| float V_pitot; /// Pitot tube airspeed | ||
|
|
||
| // Innovation | ||
| struct FloatVect3 innov_V_gnd; | ||
| struct FloatVect3 innov_acc_filt; | ||
| float innov_V_pitot; | ||
|
|
||
| // Covariance | ||
| float meas_cov[7]; | ||
| float state_cov[9]; | ||
| float process_cov[12]; | ||
|
|
||
| // Forces | ||
| float fuselage_force[3]; | ||
| float wing_force[3]; | ||
| float elevator_force[3]; | ||
| float hover_force[3]; | ||
| float pusher_force[3]; | ||
|
|
||
| // Other | ||
| bool reset; | ||
| bool in_air; | ||
| struct NedCoor_f wind_guess; | ||
| struct NedCoor_f offset_guess; | ||
| struct ekfHealth health; | ||
| uint64_t internal_clock; | ||
| uint64_t time_last_on_gnd; | ||
| uint64_t time_last_in_air; | ||
| bool override_start; | ||
| bool override_quick_convergence; | ||
|
|
||
| }; | ||
|
|
||
| extern void ekf_aw_wrapper_init(void); | ||
| extern void ekf_aw_wrapper_periodic(void); | ||
| extern void ekf_aw_wrapper_fetch(void); | ||
|
|
||
| extern void set_in_air_status(bool); | ||
|
|
||
|
|
||
| extern float tau_filter_high; | ||
| extern float tau_filter_low; | ||
|
|
||
| extern struct ekfAw ekf_aw; | ||
|
|
||
| // Handlers | ||
| #define ekf_aw_wrapper_reset(_v) { \ | ||
| ekf_aw.reset = false; \ | ||
| ekf_aw_reset(); \ | ||
| ekf_aw_reset_health(); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_wind_N(_v) { \ | ||
| ekf_aw.wind_guess.x = _v; \ | ||
| ekf_aw_set_wind(&ekf_aw.wind_guess); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_wind_E(_v) { \ | ||
| ekf_aw.wind_guess.y = _v; \ | ||
| ekf_aw_set_wind(&ekf_aw.wind_guess); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_wind_D(_v) { \ | ||
| ekf_aw.wind_guess.z = _v; \ | ||
| ekf_aw_set_wind(&ekf_aw.wind_guess); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_offset_x(_v) { \ | ||
| ekf_aw.offset_guess.x = _v; \ | ||
| ekf_aw_set_offset(&ekf_aw.offset_guess); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_offset_y(_v) { \ | ||
| ekf_aw.offset_guess.y = _v; \ | ||
| ekf_aw_set_offset(&ekf_aw.offset_guess); \ | ||
| } | ||
|
|
||
| #define ekf_aw_wrapper_set_offset_z(_v) { \ | ||
| ekf_aw.offset_guess.z = _v; \ | ||
| ekf_aw_set_offset(&ekf_aw.offset_guess); \ | ||
| } | ||
|
|
||
| #endif /* EKF_AW_WRAPPER_H */ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| /* | ||
| * Copyright (C) 2023 Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * | ||
| * This file is part of paparazzi | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, see | ||
| * <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| /** @file "modules/nav/ground_detect_ship.c" | ||
| * @author Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * Ground detection module relying on lidar to detect ground on a ship | ||
| */ | ||
|
|
||
| #include "modules/nav/ground_detect_ship.h" | ||
| #include "firmwares/rotorcraft/stabilization/stabilization_indi.h" | ||
| #include "filters/low_pass_filter.h" | ||
| #include "modules/sonar/agl_dist.h" | ||
| #include "state.h" | ||
|
|
||
| #include "pprzlink/messages.h" | ||
| #include "modules/datalink/downlink.h" | ||
|
|
||
| int32_t counter = 0; | ||
| bool ground_detection_ship = false; | ||
| bool ground_detected = false; | ||
| float agl_vert_speed = 0.0; | ||
| bool agl_vert_speed_valid = false; | ||
| float agl_distance = 0.0; | ||
|
|
||
| #define GROUND_DETECT_SHIP_AGL_MIN_VALUE 0.1 | ||
| #define GROUND_DETECT_SHIP_AGL_MAX_VALUE 0.3 | ||
|
|
||
| #define GROUND_DETECT_SHIP_COUNTER_TRIGGER 10 | ||
|
|
||
| // Cutoff frequency of the vertical speed calculated from the lidar | ||
| #define GROUND_DETECT_SHIP_VERT_SPEED_FILT_FREQ 5.0 | ||
|
|
||
| Butterworth2LowPass vert_speed_filter; | ||
|
|
||
| void ground_detect_ship_init(void) | ||
| { | ||
| // init filters | ||
| float tau_vert_speed = 1.0 / (2.0 * M_PI * GROUND_DETECT_SHIP_VERT_SPEED_FILT_FREQ); | ||
| float sample_time = 1.0 / PERIODIC_FREQUENCY; | ||
| init_butterworth_2_low_pass(&vert_speed_filter, tau_vert_speed, sample_time, 0.0); | ||
| } | ||
|
|
||
| bool ground_detect(void) { | ||
| return ground_detected; | ||
| } | ||
|
|
||
| void ground_detect_periodic(void) | ||
| { | ||
| // Evaluate thrust given (less than hover thrust) | ||
| // Use the control effectiveness in thrust in order to estimate the thrust delivered (only works for multicopters) | ||
| float specific_thrust = 0.0; // m/s2 | ||
| uint8_t i; | ||
| for (i = 0; i < INDI_NUM_ACT; i++) { | ||
| specific_thrust += actuator_state_filt_vect[i] * g1g2[3][i] * -((int32_t) act_is_servo[i] - 1); | ||
| } | ||
|
|
||
| if (specific_thrust > -5.) { | ||
| counter += 1; | ||
| if (counter > GROUND_DETECT_SHIP_COUNTER_TRIGGER) { | ||
| ground_detected = true; | ||
| } | ||
| } else { | ||
| ground_detected = false; | ||
| counter = 0; | ||
| } | ||
|
|
||
| #ifdef DEBUG_GROUND_DETECT | ||
| uint8_t test_gd = ground_detected; | ||
| float payload[2]; | ||
| payload[0] = specific_thrust; | ||
| payload[1] = stateGetAccelNed_f()->z; | ||
|
|
||
| RunOnceEvery(10, {DOWNLINK_SEND_PAYLOAD(DefaultChannel, DefaultDevice, 1, &test_gd); DOWNLINK_SEND_PAYLOAD_FLOAT(DefaultChannel, DefaultDevice, 4, payload);} ); | ||
| #endif | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| /* | ||
| * Copyright (C) 2023 Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * | ||
| * This file is part of paparazzi | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, see | ||
| * <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| /** @file "modules/nav/ground_detect_ship.h" | ||
| * @author Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * Ground detection module relying on lidar to detect ground on a ship | ||
| */ | ||
|
|
||
| #ifndef GROUND_DETECT_SHIP_H | ||
| #define GROUND_DETECT_SHIP_H | ||
|
|
||
| extern void ground_detect_ship_init(void); | ||
| extern void ground_detect_periodic(void); | ||
|
|
||
| #endif // GROUND_DETECT_SHIP_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,150 @@ | ||
| /* | ||
| * Copyright (C) 2023 Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * | ||
| * This file is part of paparazzi | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, see | ||
| * <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| /** @file "modules/rot_wing_drone/rot_wing_automation.c" | ||
| * @author Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * Fucntions to automate the navigation and guidance of the rotating wing drone | ||
| */ | ||
|
|
||
| #include "modules/rot_wing_drone/rot_wing_automation.h" | ||
| #include "state.h" | ||
| #include "modules/datalink/telemetry.h" | ||
|
|
||
| #ifndef ROT_WING_AUTOMATION_TRANS_ACCEL | ||
| #define ROT_WING_AUTOMATION_TRANS_ACCEL 1.0 | ||
| #endif | ||
|
|
||
| #ifndef ROT_WING_AUTOMATION_TRANS_DECEL | ||
| #define ROT_WING_AUTOMATION_TRANS_DECEL 0.5 | ||
| #endif | ||
|
|
||
| #ifndef ROT_WING_AUTOMATION_TRANS_LENGTH | ||
| #define ROT_WING_AUTOMATION_TRANS_LENGTH 200.0 | ||
| #endif | ||
|
|
||
| #ifndef ROT_WING_AUTOMATION_TRANS_AIRSPEED | ||
| #define ROT_WING_AUTOMATION_TRANS_AIRSPEED 15.0 | ||
| #endif | ||
|
|
||
| struct rot_wing_automation rot_wing_a; | ||
|
|
||
| // declare function | ||
| inline void update_waypoint_rot_wing_automation(uint8_t wp_id, struct FloatVect3 * target_ned); | ||
|
|
||
| void init_rot_wing_automation(void) | ||
| { | ||
| rot_wing_a.trans_accel = ROT_WING_AUTOMATION_TRANS_ACCEL; | ||
| rot_wing_a.trans_decel = ROT_WING_AUTOMATION_TRANS_DECEL; | ||
| rot_wing_a.trans_length = ROT_WING_AUTOMATION_TRANS_LENGTH; | ||
| rot_wing_a.trans_airspeed = ROT_WING_AUTOMATION_TRANS_AIRSPEED; | ||
| rot_wing_a.transitioned = false; | ||
| } | ||
|
|
||
| // periodic function | ||
| void periodic_rot_wing_automation(void) | ||
| { | ||
| float airspeed = stateGetAirspeed_f(); | ||
| if (airspeed > rot_wing_a.trans_airspeed) | ||
| { | ||
| rot_wing_a.transitioned = true; | ||
| } else { | ||
| rot_wing_a.transitioned = false; | ||
| } | ||
| } | ||
|
|
||
| // Update a waypoint such that you can see on the GCS where the drone wants to go | ||
| void update_waypoint_rot_wing_automation(uint8_t wp_id, struct FloatVect3 * target_ned) { | ||
|
|
||
| // Update the waypoint | ||
| struct EnuCoor_f target_enu; | ||
| ENU_OF_TO_NED(target_enu, *target_ned); | ||
| waypoint_set_enu(wp_id, &target_enu); | ||
|
|
||
| // Send waypoint update every half second | ||
| RunOnceEvery(100/2, { | ||
| // Send to the GCS that the waypoint has been moved | ||
| DOWNLINK_SEND_WP_MOVED_ENU(DefaultChannel, DefaultDevice, &wp_id, | ||
| &waypoints[wp_id].enu_i.x, | ||
| &waypoints[wp_id].enu_i.y, | ||
| &waypoints[wp_id].enu_i.z); | ||
| } ); | ||
| } | ||
|
|
||
| // Function to visualize from flightplan, call repeadely | ||
| void rot_wing_vis_transition(uint8_t wp_transition_id, uint8_t wp_decel_id, uint8_t wp_end_id) | ||
| { | ||
| //state eulers in zxy order | ||
| struct FloatEulers eulers_zxy; | ||
|
|
||
| // get heading and cos and sin of heading | ||
| float_eulers_of_quat_zxy(&eulers_zxy, stateGetNedToBodyQuat_f()); | ||
| float psi = eulers_zxy.psi; | ||
| float cpsi = cosf(psi); | ||
| float spsi = sinf(psi); | ||
|
|
||
| // get airspeed | ||
| float airspeed = stateGetAirspeed_f(); | ||
| // get groundspeed | ||
| float ground_speed = stateGetHorizontalSpeedNorm_f(); | ||
|
|
||
| // get drone position | ||
| struct NedCoor_f *drone_pos = stateGetPositionNed_f(); | ||
|
|
||
| // Move reference waypoints | ||
| // Move end transition waypoint at the correct length | ||
| struct FloatVect3 end_transition_rel_pos; | ||
| VECT3_COPY(end_transition_rel_pos, *drone_pos); | ||
| end_transition_rel_pos.x = cpsi * rot_wing_a.trans_length; | ||
| end_transition_rel_pos.y = spsi * rot_wing_a.trans_length; | ||
| struct FloatVect3 end_transition_pos; | ||
| VECT3_SUM(end_transition_pos, end_transition_rel_pos, *drone_pos); | ||
| end_transition_pos.z = drone_pos->z; | ||
| update_waypoint_rot_wing_automation(wp_end_id, &end_transition_pos); | ||
|
|
||
| // Move transition waypoint | ||
| float airspeed_error = rot_wing_a.trans_airspeed - airspeed; | ||
| float transition_time = airspeed_error / rot_wing_a.trans_accel; | ||
| float average_ground_speed = ground_speed + airspeed_error / 2.; | ||
| float transition_distance = average_ground_speed * transition_time; | ||
|
|
||
| struct FloatVect3 transition_rel_pos; | ||
| VECT3_COPY(transition_rel_pos, *drone_pos); | ||
| transition_rel_pos.x = cpsi * transition_distance; | ||
| transition_rel_pos.y = spsi * transition_distance; | ||
| struct FloatVect3 transition_pos; | ||
| VECT3_SUM(transition_pos, transition_rel_pos, *drone_pos); | ||
| transition_pos.z = drone_pos->z; | ||
| update_waypoint_rot_wing_automation(wp_transition_id, &transition_pos); | ||
|
|
||
| // Move decel point | ||
| float final_groundspeed = ground_speed + airspeed_error; | ||
| float decel_time = final_groundspeed / rot_wing_a.trans_decel; | ||
| float decel_distance = (final_groundspeed / 2.) * decel_time; | ||
| float decel_distance_from_drone = rot_wing_a.trans_length - decel_distance; | ||
|
|
||
| struct FloatVect3 decel_rel_pos; | ||
| VECT3_COPY(decel_rel_pos, *drone_pos); | ||
| decel_rel_pos.x = cpsi * decel_distance_from_drone; | ||
| decel_rel_pos.y = spsi * decel_distance_from_drone; | ||
| struct FloatVect3 decel_pos; | ||
| VECT3_SUM(decel_pos, decel_rel_pos, *drone_pos); | ||
| decel_pos.z = drone_pos->z; | ||
| update_waypoint_rot_wing_automation(wp_decel_id, &decel_pos); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| /* | ||
| * Copyright (C) 2023 Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * | ||
| * This file is part of paparazzi | ||
| * | ||
| * paparazzi is free software; you can redistribute it and/or modify | ||
| * it under the terms of the GNU General Public License as published by | ||
| * the Free Software Foundation; either version 2, or (at your option) | ||
| * any later version. | ||
| * | ||
| * paparazzi is distributed in the hope that it will be useful, | ||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| * GNU General Public License for more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with paparazzi; see the file COPYING. If not, see | ||
| * <http://www.gnu.org/licenses/>. | ||
| */ | ||
|
|
||
| /** @file "modules/rot_wing_drone/rot_wing_automation.h" | ||
| * @author Dennis van Wijngaarden <D.C.vanWijngaarden@tudelft.nl> | ||
| * Fucntions to automate the navigation and guidance of the rotating wing drone | ||
| */ | ||
|
|
||
| #ifndef ROT_WING_AUTOMATION_H | ||
| #define ROT_WING_AUTOMATION_H | ||
|
|
||
| #include "std.h" | ||
| #include "math/pprz_algebra_float.h" | ||
|
|
||
| extern void init_rot_wing_automation(void); | ||
| extern void periodic_rot_wing_automation(void); | ||
| extern void rot_wing_vis_transition(uint8_t wp_transition_id, uint8_t wp_decel_id, uint8_t wp_end_id); | ||
|
|
||
| struct rot_wing_automation { | ||
| float trans_accel; | ||
| float trans_decel; | ||
| float trans_length; | ||
| float trans_airspeed; | ||
| bool transitioned; | ||
| }; | ||
|
|
||
| extern struct rot_wing_automation rot_wing_a; | ||
|
|
||
| #endif // ROT_WING_AUTOMATION_H |