mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-31 09:41:35 +08:00
Merge pull request #1222 from PX4/asfilter
Airspeed filtering, reinstate TECS for testing
This commit is contained in:
@@ -11,4 +11,8 @@ then
|
|||||||
param set NAV_RTL_ALT 100
|
param set NAV_RTL_ALT 100
|
||||||
param set NAV_RTL_LAND_T -1
|
param set NAV_RTL_LAND_T -1
|
||||||
param set NAV_ACCEPT_RAD 50
|
param set NAV_ACCEPT_RAD 50
|
||||||
|
param set FW_T_HRATE_P 0.01
|
||||||
|
param set FW_T_RLL2THR 15
|
||||||
|
param set FW_T_SRATE_P 0.01
|
||||||
|
param set FW_T_TIME_CONST 5
|
||||||
fi
|
fi
|
||||||
@@ -80,6 +80,7 @@ LIBRARIES += lib/mathlib/CMSIS
|
|||||||
MODULES += lib/mathlib
|
MODULES += lib/mathlib
|
||||||
MODULES += lib/mathlib/math/filter
|
MODULES += lib/mathlib/math/filter
|
||||||
MODULES += lib/ecl
|
MODULES += lib/ecl
|
||||||
|
MODULES += lib/external_lgpl
|
||||||
MODULES += lib/geo
|
MODULES += lib/geo
|
||||||
MODULES += lib/geo_lookup
|
MODULES += lib/geo_lookup
|
||||||
MODULES += lib/conversion
|
MODULES += lib/conversion
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ LIBRARIES += lib/mathlib/CMSIS
|
|||||||
MODULES += lib/mathlib
|
MODULES += lib/mathlib
|
||||||
MODULES += lib/mathlib/math/filter
|
MODULES += lib/mathlib/math/filter
|
||||||
MODULES += lib/ecl
|
MODULES += lib/ecl
|
||||||
|
MODULES += lib/external_lgpl
|
||||||
MODULES += lib/geo
|
MODULES += lib/geo
|
||||||
MODULES += lib/geo_lookup
|
MODULES += lib/geo_lookup
|
||||||
MODULES += lib/conversion
|
MODULES += lib/conversion
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ LIBRARIES += lib/mathlib/CMSIS
|
|||||||
MODULES += lib/mathlib
|
MODULES += lib/mathlib
|
||||||
MODULES += lib/mathlib/math/filter
|
MODULES += lib/mathlib/math/filter
|
||||||
MODULES += lib/ecl
|
MODULES += lib/ecl
|
||||||
|
MODULES += lib/external_lgpl
|
||||||
MODULES += lib/geo
|
MODULES += lib/geo
|
||||||
MODULES += lib/geo_lookup
|
MODULES += lib/geo_lookup
|
||||||
MODULES += lib/conversion
|
MODULES += lib/conversion
|
||||||
|
|||||||
@@ -92,7 +92,7 @@
|
|||||||
#include <drivers/airspeed/airspeed.h>
|
#include <drivers/airspeed/airspeed.h>
|
||||||
|
|
||||||
/* I2C bus address is 1010001x */
|
/* I2C bus address is 1010001x */
|
||||||
#define I2C_ADDRESS_MS4525DO 0x28 //0x51 /* 7-bit address. */
|
#define I2C_ADDRESS_MS4525DO 0x28 /**< 7-bit address. Depends on the order code (this is for code "I") */
|
||||||
#define PATH_MS4525 "/dev/ms4525"
|
#define PATH_MS4525 "/dev/ms4525"
|
||||||
/* The MS5525DSO address is 111011Cx, where C is the complementary value of the pin CSB */
|
/* The MS5525DSO address is 111011Cx, where C is the complementary value of the pin CSB */
|
||||||
#define I2C_ADDRESS_MS5525DSO 0x77 //0x77/* 7-bit address, addr. pin pulled low */
|
#define I2C_ADDRESS_MS5525DSO 0x77 //0x77/* 7-bit address, addr. pin pulled low */
|
||||||
@@ -102,9 +102,9 @@
|
|||||||
#define ADDR_READ_MR 0x00 /* write to this address to start conversion */
|
#define ADDR_READ_MR 0x00 /* write to this address to start conversion */
|
||||||
|
|
||||||
/* Measurement rate is 100Hz */
|
/* Measurement rate is 100Hz */
|
||||||
#define MEAS_RATE 100.0f
|
#define MEAS_RATE 100
|
||||||
#define MEAS_DRIVER_FILTER_FREQ 3.0f
|
#define MEAS_DRIVER_FILTER_FREQ 1.5f
|
||||||
#define CONVERSION_INTERVAL (1000000 / 100) /* microseconds */
|
#define CONVERSION_INTERVAL (1000000 / MEAS_RATE) /* microseconds */
|
||||||
|
|
||||||
class MEASAirspeed : public Airspeed
|
class MEASAirspeed : public Airspeed
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -39,3 +39,5 @@ SRCS = attitude_fw/ecl_pitch_controller.cpp \
|
|||||||
attitude_fw/ecl_roll_controller.cpp \
|
attitude_fw/ecl_roll_controller.cpp \
|
||||||
attitude_fw/ecl_yaw_controller.cpp \
|
attitude_fw/ecl_yaw_controller.cpp \
|
||||||
l1/ecl_l1_pos_controller.cpp
|
l1/ecl_l1_pos_controller.cpp
|
||||||
|
|
||||||
|
MAXOPTIMIZATION = -Os
|
||||||
|
|||||||
@@ -46,3 +46,5 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
SRCS = tecs/tecs.cpp
|
SRCS = tecs/tecs.cpp
|
||||||
|
|
||||||
|
MAXOPTIMIZATION = -Os
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ int blockLimitSymTest()
|
|||||||
|
|
||||||
float BlockLowPass::update(float input)
|
float BlockLowPass::update(float input)
|
||||||
{
|
{
|
||||||
|
if (!isfinite(getState())) {
|
||||||
|
setState(input);
|
||||||
|
}
|
||||||
float b = 2 * float(M_PI) * getFCut() * getDt();
|
float b = 2 * float(M_PI) * getFCut() * getDt();
|
||||||
float a = b / (1 + b);
|
float a = b / (1 + b);
|
||||||
setState(a * input + (1 - a)*getState());
|
setState(a * input + (1 - a)*getState());
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ public:
|
|||||||
// methods
|
// methods
|
||||||
BlockLowPass(SuperBlock *parent, const char *name) :
|
BlockLowPass(SuperBlock *parent, const char *name) :
|
||||||
Block(parent, name),
|
Block(parent, name),
|
||||||
_state(0),
|
_state(0.0f/0.0f /* initialize to invalid val, force into is_finite() check on first call */),
|
||||||
_fCut(this, "") // only one parameter, no need to name
|
_fCut(this, "") // only one parameter, no need to name
|
||||||
{};
|
{};
|
||||||
virtual ~BlockLowPass() {};
|
virtual ~BlockLowPass() {};
|
||||||
|
|||||||
@@ -42,8 +42,8 @@
|
|||||||
* Proceedings of the AIAA Guidance, Navigation and Control
|
* Proceedings of the AIAA Guidance, Navigation and Control
|
||||||
* Conference, Aug 2004. AIAA-2004-4900.
|
* Conference, Aug 2004. AIAA-2004-4900.
|
||||||
*
|
*
|
||||||
* Implementation for total energy control class:
|
* Original implementation for total energy control class:
|
||||||
* Thomas Gubler
|
* Paul Riseborough and Andrew Tridgell, 2013 (code in lib/external_lgpl)
|
||||||
*
|
*
|
||||||
* More details and acknowledgements in the referenced library headers.
|
* More details and acknowledgements in the referenced library headers.
|
||||||
*
|
*
|
||||||
@@ -87,10 +87,13 @@
|
|||||||
#include <mavlink/mavlink_log.h>
|
#include <mavlink/mavlink_log.h>
|
||||||
#include <launchdetection/LaunchDetector.h>
|
#include <launchdetection/LaunchDetector.h>
|
||||||
#include <ecl/l1/ecl_l1_pos_controller.h>
|
#include <ecl/l1/ecl_l1_pos_controller.h>
|
||||||
|
#include <external_lgpl/tecs/tecs.h>
|
||||||
#include <drivers/drv_range_finder.h>
|
#include <drivers/drv_range_finder.h>
|
||||||
#include "landingslope.h"
|
#include "landingslope.h"
|
||||||
#include "mtecs/mTecs.h"
|
#include "mtecs/mTecs.h"
|
||||||
|
|
||||||
|
static int _control_task = -1; /**< task handle for sensor task */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* L1 control app start / stop handling function
|
* L1 control app start / stop handling function
|
||||||
@@ -115,9 +118,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Start the sensors task.
|
* Start the sensors task.
|
||||||
*
|
*
|
||||||
* @return OK on success.
|
* @return OK on success.
|
||||||
*/
|
*/
|
||||||
int start();
|
static int start();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task status
|
* Task status
|
||||||
@@ -131,7 +134,6 @@ private:
|
|||||||
|
|
||||||
bool _task_should_exit; /**< if true, sensor task should exit */
|
bool _task_should_exit; /**< if true, sensor task should exit */
|
||||||
bool _task_running; /**< if true, task is running in its mainloop */
|
bool _task_running; /**< if true, task is running in its mainloop */
|
||||||
int _control_task; /**< task handle for sensor task */
|
|
||||||
|
|
||||||
int _global_pos_sub;
|
int _global_pos_sub;
|
||||||
int _pos_sp_triplet_sub;
|
int _pos_sp_triplet_sub;
|
||||||
@@ -192,6 +194,7 @@ private:
|
|||||||
math::Matrix<3, 3> _R_nb; ///< current attitude
|
math::Matrix<3, 3> _R_nb; ///< current attitude
|
||||||
|
|
||||||
ECL_L1_Pos_Controller _l1_control;
|
ECL_L1_Pos_Controller _l1_control;
|
||||||
|
TECS _tecs;
|
||||||
fwPosctrl::mTecs _mTecs;
|
fwPosctrl::mTecs _mTecs;
|
||||||
bool _was_pos_control_mode;
|
bool _was_pos_control_mode;
|
||||||
|
|
||||||
@@ -199,6 +202,21 @@ private:
|
|||||||
float l1_period;
|
float l1_period;
|
||||||
float l1_damping;
|
float l1_damping;
|
||||||
|
|
||||||
|
float time_const;
|
||||||
|
float min_sink_rate;
|
||||||
|
float max_sink_rate;
|
||||||
|
float max_climb_rate;
|
||||||
|
float heightrate_p;
|
||||||
|
float speedrate_p;
|
||||||
|
float throttle_damp;
|
||||||
|
float integrator_gain;
|
||||||
|
float vertical_accel_limit;
|
||||||
|
float height_comp_filter_omega;
|
||||||
|
float speed_comp_filter_omega;
|
||||||
|
float roll_throttle_compensation;
|
||||||
|
float speed_weight;
|
||||||
|
float pitch_damping;
|
||||||
|
|
||||||
float airspeed_min;
|
float airspeed_min;
|
||||||
float airspeed_trim;
|
float airspeed_trim;
|
||||||
float airspeed_max;
|
float airspeed_max;
|
||||||
@@ -226,6 +244,21 @@ private:
|
|||||||
param_t l1_period;
|
param_t l1_period;
|
||||||
param_t l1_damping;
|
param_t l1_damping;
|
||||||
|
|
||||||
|
param_t time_const;
|
||||||
|
param_t min_sink_rate;
|
||||||
|
param_t max_sink_rate;
|
||||||
|
param_t max_climb_rate;
|
||||||
|
param_t heightrate_p;
|
||||||
|
param_t speedrate_p;
|
||||||
|
param_t throttle_damp;
|
||||||
|
param_t integrator_gain;
|
||||||
|
param_t vertical_accel_limit;
|
||||||
|
param_t height_comp_filter_omega;
|
||||||
|
param_t speed_comp_filter_omega;
|
||||||
|
param_t roll_throttle_compensation;
|
||||||
|
param_t speed_weight;
|
||||||
|
param_t pitch_damping;
|
||||||
|
|
||||||
param_t airspeed_min;
|
param_t airspeed_min;
|
||||||
param_t airspeed_trim;
|
param_t airspeed_trim;
|
||||||
param_t airspeed_max;
|
param_t airspeed_max;
|
||||||
@@ -361,7 +394,6 @@ FixedwingPositionControl::FixedwingPositionControl() :
|
|||||||
_mavlink_fd(-1),
|
_mavlink_fd(-1),
|
||||||
_task_should_exit(false),
|
_task_should_exit(false),
|
||||||
_task_running(false),
|
_task_running(false),
|
||||||
_control_task(-1),
|
|
||||||
|
|
||||||
/* subscriptions */
|
/* subscriptions */
|
||||||
_global_pos_sub(-1),
|
_global_pos_sub(-1),
|
||||||
@@ -438,6 +470,21 @@ FixedwingPositionControl::FixedwingPositionControl() :
|
|||||||
_parameter_handles.land_heading_hold_horizontal_distance = param_find("FW_LND_HHDIST");
|
_parameter_handles.land_heading_hold_horizontal_distance = param_find("FW_LND_HHDIST");
|
||||||
_parameter_handles.range_finder_rel_alt = param_find("FW_LND_RFRALT");
|
_parameter_handles.range_finder_rel_alt = param_find("FW_LND_RFRALT");
|
||||||
|
|
||||||
|
_parameter_handles.time_const = param_find("FW_T_TIME_CONST");
|
||||||
|
_parameter_handles.min_sink_rate = param_find("FW_T_SINK_MIN");
|
||||||
|
_parameter_handles.max_sink_rate = param_find("FW_T_SINK_MAX");
|
||||||
|
_parameter_handles.max_climb_rate = param_find("FW_T_CLMB_MAX");
|
||||||
|
_parameter_handles.throttle_damp = param_find("FW_T_THR_DAMP");
|
||||||
|
_parameter_handles.integrator_gain = param_find("FW_T_INTEG_GAIN");
|
||||||
|
_parameter_handles.vertical_accel_limit = param_find("FW_T_VERT_ACC");
|
||||||
|
_parameter_handles.height_comp_filter_omega = param_find("FW_T_HGT_OMEGA");
|
||||||
|
_parameter_handles.speed_comp_filter_omega = param_find("FW_T_SPD_OMEGA");
|
||||||
|
_parameter_handles.roll_throttle_compensation = param_find("FW_T_RLL2THR");
|
||||||
|
_parameter_handles.speed_weight = param_find("FW_T_SPDWEIGHT");
|
||||||
|
_parameter_handles.pitch_damping = param_find("FW_T_PTCH_DAMP");
|
||||||
|
_parameter_handles.heightrate_p = param_find("FW_T_HRATE_P");
|
||||||
|
_parameter_handles.speedrate_p = param_find("FW_T_SRATE_P");
|
||||||
|
|
||||||
/* fetch initial parameter values */
|
/* fetch initial parameter values */
|
||||||
parameters_update();
|
parameters_update();
|
||||||
}
|
}
|
||||||
@@ -488,6 +535,22 @@ FixedwingPositionControl::parameters_update()
|
|||||||
|
|
||||||
param_get(_parameter_handles.throttle_land_max, &(_parameters.throttle_land_max));
|
param_get(_parameter_handles.throttle_land_max, &(_parameters.throttle_land_max));
|
||||||
|
|
||||||
|
param_get(_parameter_handles.time_const, &(_parameters.time_const));
|
||||||
|
param_get(_parameter_handles.min_sink_rate, &(_parameters.min_sink_rate));
|
||||||
|
param_get(_parameter_handles.max_sink_rate, &(_parameters.max_sink_rate));
|
||||||
|
param_get(_parameter_handles.throttle_damp, &(_parameters.throttle_damp));
|
||||||
|
param_get(_parameter_handles.integrator_gain, &(_parameters.integrator_gain));
|
||||||
|
param_get(_parameter_handles.vertical_accel_limit, &(_parameters.vertical_accel_limit));
|
||||||
|
param_get(_parameter_handles.height_comp_filter_omega, &(_parameters.height_comp_filter_omega));
|
||||||
|
param_get(_parameter_handles.speed_comp_filter_omega, &(_parameters.speed_comp_filter_omega));
|
||||||
|
param_get(_parameter_handles.roll_throttle_compensation, &(_parameters.roll_throttle_compensation));
|
||||||
|
param_get(_parameter_handles.speed_weight, &(_parameters.speed_weight));
|
||||||
|
param_get(_parameter_handles.pitch_damping, &(_parameters.pitch_damping));
|
||||||
|
param_get(_parameter_handles.max_climb_rate, &(_parameters.max_climb_rate));
|
||||||
|
|
||||||
|
param_get(_parameter_handles.heightrate_p, &(_parameters.heightrate_p));
|
||||||
|
param_get(_parameter_handles.speedrate_p, &(_parameters.speedrate_p));
|
||||||
|
|
||||||
param_get(_parameter_handles.land_slope_angle, &(_parameters.land_slope_angle));
|
param_get(_parameter_handles.land_slope_angle, &(_parameters.land_slope_angle));
|
||||||
param_get(_parameter_handles.land_H1_virt, &(_parameters.land_H1_virt));
|
param_get(_parameter_handles.land_H1_virt, &(_parameters.land_H1_virt));
|
||||||
param_get(_parameter_handles.land_flare_alt_relative, &(_parameters.land_flare_alt_relative));
|
param_get(_parameter_handles.land_flare_alt_relative, &(_parameters.land_flare_alt_relative));
|
||||||
@@ -500,6 +563,23 @@ FixedwingPositionControl::parameters_update()
|
|||||||
_l1_control.set_l1_period(_parameters.l1_period);
|
_l1_control.set_l1_period(_parameters.l1_period);
|
||||||
_l1_control.set_l1_roll_limit(math::radians(_parameters.roll_limit));
|
_l1_control.set_l1_roll_limit(math::radians(_parameters.roll_limit));
|
||||||
|
|
||||||
|
_tecs.set_time_const(_parameters.time_const);
|
||||||
|
_tecs.set_min_sink_rate(_parameters.min_sink_rate);
|
||||||
|
_tecs.set_max_sink_rate(_parameters.max_sink_rate);
|
||||||
|
_tecs.set_throttle_damp(_parameters.throttle_damp);
|
||||||
|
_tecs.set_integrator_gain(_parameters.integrator_gain);
|
||||||
|
_tecs.set_vertical_accel_limit(_parameters.vertical_accel_limit);
|
||||||
|
_tecs.set_height_comp_filter_omega(_parameters.height_comp_filter_omega);
|
||||||
|
_tecs.set_speed_comp_filter_omega(_parameters.speed_comp_filter_omega);
|
||||||
|
_tecs.set_roll_throttle_compensation(_parameters.roll_throttle_compensation);
|
||||||
|
_tecs.set_speed_weight(_parameters.speed_weight);
|
||||||
|
_tecs.set_pitch_damping(_parameters.pitch_damping);
|
||||||
|
_tecs.set_indicated_airspeed_min(_parameters.airspeed_min);
|
||||||
|
_tecs.set_indicated_airspeed_max(_parameters.airspeed_max);
|
||||||
|
_tecs.set_max_climb_rate(_parameters.max_climb_rate);
|
||||||
|
_tecs.set_heightrate_p(_parameters.heightrate_p);
|
||||||
|
_tecs.set_speedrate_p(_parameters.speedrate_p);
|
||||||
|
|
||||||
/* sanity check parameters */
|
/* sanity check parameters */
|
||||||
if (_parameters.airspeed_max < _parameters.airspeed_min ||
|
if (_parameters.airspeed_max < _parameters.airspeed_min ||
|
||||||
_parameters.airspeed_max < 5.0f ||
|
_parameters.airspeed_max < 5.0f ||
|
||||||
@@ -561,6 +641,9 @@ FixedwingPositionControl::vehicle_airspeed_poll()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* update TECS state */
|
||||||
|
_tecs.enable_airspeed(_airspeed_valid);
|
||||||
|
|
||||||
return airspeed_updated;
|
return airspeed_updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,7 +704,17 @@ FixedwingPositionControl::vehicle_setpoint_poll()
|
|||||||
void
|
void
|
||||||
FixedwingPositionControl::task_main_trampoline(int argc, char *argv[])
|
FixedwingPositionControl::task_main_trampoline(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
l1_control::g_control = new FixedwingPositionControl();
|
||||||
|
|
||||||
|
if (l1_control::g_control == nullptr) {
|
||||||
|
warnx("OUT OF MEM");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* only returns on exit */
|
||||||
l1_control::g_control->task_main();
|
l1_control::g_control->task_main();
|
||||||
|
delete l1_control::g_control;
|
||||||
|
l1_control::g_control = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
@@ -733,6 +826,14 @@ FixedwingPositionControl::control_position(const math::Vector<2> ¤t_positi
|
|||||||
|
|
||||||
float eas2tas = 1.0f; // XXX calculate actual number based on current measurements
|
float eas2tas = 1.0f; // XXX calculate actual number based on current measurements
|
||||||
|
|
||||||
|
/* filter speed and altitude for controller */
|
||||||
|
math::Vector<3> accel_body(_sensor_combined.accelerometer_m_s2);
|
||||||
|
math::Vector<3> accel_earth = _R_nb * accel_body;
|
||||||
|
|
||||||
|
if (!_mTecs.getEnabled()) {
|
||||||
|
_tecs.update_50hz(_global_pos.alt /* XXX might switch to alt err here */, _airspeed.indicated_airspeed_m_s, _R_nb, accel_body, accel_earth);
|
||||||
|
}
|
||||||
|
|
||||||
/* define altitude error */
|
/* define altitude error */
|
||||||
float altitude_error = _pos_sp_triplet.current.alt - _global_pos.alt;
|
float altitude_error = _pos_sp_triplet.current.alt - _global_pos.alt;
|
||||||
|
|
||||||
@@ -758,6 +859,9 @@ FixedwingPositionControl::control_position(const math::Vector<2> ¤t_positi
|
|||||||
/* get circle mode */
|
/* get circle mode */
|
||||||
bool was_circle_mode = _l1_control.circle_mode();
|
bool was_circle_mode = _l1_control.circle_mode();
|
||||||
|
|
||||||
|
/* restore speed weight, in case changed intermittently (e.g. in landing handling) */
|
||||||
|
_tecs.set_speed_weight(_parameters.speed_weight);
|
||||||
|
|
||||||
/* current waypoint (the one currently heading for) */
|
/* current waypoint (the one currently heading for) */
|
||||||
math::Vector<2> next_wp((float)pos_sp_triplet.current.lat, (float)pos_sp_triplet.current.lon);
|
math::Vector<2> next_wp((float)pos_sp_triplet.current.lat, (float)pos_sp_triplet.current.lon);
|
||||||
|
|
||||||
@@ -1066,9 +1170,9 @@ FixedwingPositionControl::control_position(const math::Vector<2> ¤t_positi
|
|||||||
_att_sp.thrust = launchDetector.getThrottlePreTakeoff();
|
_att_sp.thrust = launchDetector.getThrottlePreTakeoff();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_att_sp.thrust = math::min(_mTecs.getThrottleSetpoint(), throttle_max);
|
_att_sp.thrust = math::min(_mTecs.getEnabled() ? _mTecs.getThrottleSetpoint() : _tecs.get_throttle_demand(), throttle_max);
|
||||||
}
|
}
|
||||||
_att_sp.pitch_body = _mTecs.getPitchSetpoint();
|
_att_sp.pitch_body = _mTecs.getEnabled() ? _mTecs.getPitchSetpoint() : _tecs.get_pitch_demand();
|
||||||
|
|
||||||
if (_control_mode.flag_control_position_enabled) {
|
if (_control_mode.flag_control_position_enabled) {
|
||||||
last_manual = false;
|
last_manual = false;
|
||||||
@@ -1084,10 +1188,6 @@ void
|
|||||||
FixedwingPositionControl::task_main()
|
FixedwingPositionControl::task_main()
|
||||||
{
|
{
|
||||||
|
|
||||||
/* inform about start */
|
|
||||||
warnx("Initializing..");
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do subscriptions
|
* do subscriptions
|
||||||
*/
|
*/
|
||||||
@@ -1248,20 +1348,29 @@ void FixedwingPositionControl::tecs_update_pitch_throttle(float alt_sp, float v_
|
|||||||
const math::Vector<3> &ground_speed,
|
const math::Vector<3> &ground_speed,
|
||||||
tecs_mode mode)
|
tecs_mode mode)
|
||||||
{
|
{
|
||||||
/* Using mtecs library: prepare arguments for mtecs call */
|
if (_mTecs.getEnabled()) {
|
||||||
float flightPathAngle = 0.0f;
|
/* Using mtecs library: prepare arguments for mtecs call */
|
||||||
float ground_speed_length = ground_speed.length();
|
float flightPathAngle = 0.0f;
|
||||||
if (ground_speed_length > FLT_EPSILON) {
|
float ground_speed_length = ground_speed.length();
|
||||||
flightPathAngle = -asinf(ground_speed(2)/ground_speed_length);
|
if (ground_speed_length > FLT_EPSILON) {
|
||||||
}
|
flightPathAngle = -asinf(ground_speed(2)/ground_speed_length);
|
||||||
fwPosctrl::LimitOverride limitOverride;
|
}
|
||||||
if (climbout_mode) {
|
fwPosctrl::LimitOverride limitOverride;
|
||||||
limitOverride.enablePitchMinOverride(M_RAD_TO_DEG_F * climbout_pitch_min_rad);
|
if (climbout_mode) {
|
||||||
|
limitOverride.enablePitchMinOverride(M_RAD_TO_DEG_F * climbout_pitch_min_rad);
|
||||||
|
} else {
|
||||||
|
limitOverride.disablePitchMinOverride();
|
||||||
|
}
|
||||||
|
_mTecs.updateAltitudeSpeed(flightPathAngle, altitude, alt_sp, _airspeed.true_airspeed_m_s, v_sp, mode,
|
||||||
|
limitOverride);
|
||||||
} else {
|
} else {
|
||||||
limitOverride.disablePitchMinOverride();
|
/* Using tecs library */
|
||||||
|
_tecs.update_pitch_throttle(_R_nb, _att.pitch, altitude, alt_sp, v_sp,
|
||||||
|
_airspeed.indicated_airspeed_m_s, eas2tas,
|
||||||
|
climbout_mode, climbout_pitch_min_rad,
|
||||||
|
throttle_min, throttle_max, throttle_cruise,
|
||||||
|
pitch_min_rad, pitch_max_rad);
|
||||||
}
|
}
|
||||||
_mTecs.updateAltitudeSpeed(flightPathAngle, altitude, alt_sp, _airspeed.true_airspeed_m_s, v_sp, mode,
|
|
||||||
limitOverride);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -1295,14 +1404,7 @@ int fw_pos_control_l1_main(int argc, char *argv[])
|
|||||||
if (l1_control::g_control != nullptr)
|
if (l1_control::g_control != nullptr)
|
||||||
errx(1, "already running");
|
errx(1, "already running");
|
||||||
|
|
||||||
l1_control::g_control = new FixedwingPositionControl;
|
if (OK != FixedwingPositionControl::start()) {
|
||||||
|
|
||||||
if (l1_control::g_control == nullptr)
|
|
||||||
errx(1, "alloc failed");
|
|
||||||
|
|
||||||
if (OK != l1_control::g_control->start()) {
|
|
||||||
delete l1_control::g_control;
|
|
||||||
l1_control::g_control = nullptr;
|
|
||||||
err(1, "start failed");
|
err(1, "start failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -154,6 +154,182 @@ PARAM_DEFINE_FLOAT(FW_THR_MIN, 0.0f);
|
|||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(FW_THR_LND_MAX, 1.0f);
|
PARAM_DEFINE_FLOAT(FW_THR_LND_MAX, 1.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum climb rate
|
||||||
|
*
|
||||||
|
* This is the best climb rate that the aircraft can achieve with
|
||||||
|
* the throttle set to THR_MAX and the airspeed set to the
|
||||||
|
* default value. For electric aircraft make sure this number can be
|
||||||
|
* achieved towards the end of flight when the battery voltage has reduced.
|
||||||
|
* The setting of this parameter can be checked by commanding a positive
|
||||||
|
* altitude change of 100m in loiter, RTL or guided mode. If the throttle
|
||||||
|
* required to climb is close to THR_MAX and the aircraft is maintaining
|
||||||
|
* airspeed, then this parameter is set correctly. If the airspeed starts
|
||||||
|
* to reduce, then the parameter is set to high, and if the throttle
|
||||||
|
* demand required to climb and maintain speed is noticeably less than
|
||||||
|
* FW_THR_MAX, then either FW_T_CLMB_MAX should be increased or
|
||||||
|
* FW_THR_MAX reduced.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_CLMB_MAX, 5.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum descent rate
|
||||||
|
*
|
||||||
|
* This is the sink rate of the aircraft with the throttle
|
||||||
|
* set to THR_MIN and flown at the same airspeed as used
|
||||||
|
* to measure FW_T_CLMB_MAX.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_SINK_MIN, 2.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum descent rate
|
||||||
|
*
|
||||||
|
* This sets the maximum descent rate that the controller will use.
|
||||||
|
* If this value is too large, the aircraft can over-speed on descent.
|
||||||
|
* This should be set to a value that can be achieved without
|
||||||
|
* exceeding the lower pitch angle limit and without over-speeding
|
||||||
|
* the aircraft.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_SINK_MAX, 5.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TECS time constant
|
||||||
|
*
|
||||||
|
* This is the time constant of the TECS control algorithm (in seconds).
|
||||||
|
* Smaller values make it faster to respond, larger values make it slower
|
||||||
|
* to respond.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_TIME_CONST, 5.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throttle damping factor
|
||||||
|
*
|
||||||
|
* This is the damping gain for the throttle demand loop.
|
||||||
|
* Increase to add damping to correct for oscillations in speed and height.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_THR_DAMP, 0.5f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integrator gain
|
||||||
|
*
|
||||||
|
* This is the integrator gain on the control loop.
|
||||||
|
* Increasing this gain increases the speed at which speed
|
||||||
|
* and height offsets are trimmed out, but reduces damping and
|
||||||
|
* increases overshoot.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_INTEG_GAIN, 0.1f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum vertical acceleration
|
||||||
|
*
|
||||||
|
* This is the maximum vertical acceleration (in metres/second square)
|
||||||
|
* either up or down that the controller will use to correct speed
|
||||||
|
* or height errors. The default value of 7 m/s/s (equivalent to +- 0.7 g)
|
||||||
|
* allows for reasonably aggressive pitch changes if required to recover
|
||||||
|
* from under-speed conditions.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_VERT_ACC, 7.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Complementary filter "omega" parameter for height
|
||||||
|
*
|
||||||
|
* This is the cross-over frequency (in radians/second) of the complementary
|
||||||
|
* filter used to fuse vertical acceleration and barometric height to obtain
|
||||||
|
* an estimate of height rate and height. Increasing this frequency weights
|
||||||
|
* the solution more towards use of the barometer, whilst reducing it weights
|
||||||
|
* the solution more towards use of the accelerometer data.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_HGT_OMEGA, 3.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Complementary filter "omega" parameter for speed
|
||||||
|
*
|
||||||
|
* This is the cross-over frequency (in radians/second) of the complementary
|
||||||
|
* filter used to fuse longitudinal acceleration and airspeed to obtain an
|
||||||
|
* improved airspeed estimate. Increasing this frequency weights the solution
|
||||||
|
* more towards use of the arispeed sensor, whilst reducing it weights the
|
||||||
|
* solution more towards use of the accelerometer data.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_SPD_OMEGA, 2.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Roll -> Throttle feedforward
|
||||||
|
*
|
||||||
|
* Increasing this gain turn increases the amount of throttle that will
|
||||||
|
* be used to compensate for the additional drag created by turning.
|
||||||
|
* Ideally this should be set to approximately 10 x the extra sink rate
|
||||||
|
* in m/s created by a 45 degree bank turn. Increase this gain if
|
||||||
|
* the aircraft initially loses energy in turns and reduce if the
|
||||||
|
* aircraft initially gains energy in turns. Efficient high aspect-ratio
|
||||||
|
* aircraft (eg powered sailplanes) can use a lower value, whereas
|
||||||
|
* inefficient low aspect-ratio models (eg delta wings) can use a higher value.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_RLL2THR, 10.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Speed <--> Altitude priority
|
||||||
|
*
|
||||||
|
* This parameter adjusts the amount of weighting that the pitch control
|
||||||
|
* applies to speed vs height errors. Setting it to 0.0 will cause the
|
||||||
|
* pitch control to control height and ignore speed errors. This will
|
||||||
|
* normally improve height accuracy but give larger airspeed errors.
|
||||||
|
* Setting it to 2.0 will cause the pitch control loop to control speed
|
||||||
|
* and ignore height errors. This will normally reduce airspeed errors,
|
||||||
|
* but give larger height errors. The default value of 1.0 allows the pitch
|
||||||
|
* control to simultaneously control height and speed.
|
||||||
|
* Note to Glider Pilots - set this parameter to 2.0 (The glider will
|
||||||
|
* adjust its pitch angle to maintain airspeed, ignoring changes in height).
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_SPDWEIGHT, 1.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pitch damping factor
|
||||||
|
*
|
||||||
|
* This is the damping gain for the pitch demand loop. Increase to add
|
||||||
|
* damping to correct for oscillations in height. The default value of 0.0
|
||||||
|
* will work well provided the pitch to servo controller has been tuned
|
||||||
|
* properly.
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_PTCH_DAMP, 0.0f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Height rate P factor
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_HRATE_P, 0.05f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Speed rate P factor
|
||||||
|
*
|
||||||
|
* @group L1 Control
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(FW_T_SRATE_P, 0.05f);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Landing slope angle
|
* Landing slope angle
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ mTecs::mTecs() :
|
|||||||
_counter(0),
|
_counter(0),
|
||||||
_debug(false)
|
_debug(false)
|
||||||
{
|
{
|
||||||
|
warnx("starting");
|
||||||
}
|
}
|
||||||
|
|
||||||
mTecs::~mTecs()
|
mTecs::~mTecs()
|
||||||
|
|||||||
@@ -241,7 +241,14 @@ PARAM_DEFINE_FLOAT(MT_FPA_MAX, 30.0f);
|
|||||||
*
|
*
|
||||||
* @group mTECS
|
* @group mTECS
|
||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(MT_A_LP, 1.0f);
|
PARAM_DEFINE_FLOAT(MT_A_LP, 0.5f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Airspeed derivative calculation lowpass
|
||||||
|
*
|
||||||
|
* @group mTECS
|
||||||
|
*/
|
||||||
|
PARAM_DEFINE_FLOAT(MT_AD_LP, 0.5f);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* P gain for the airspeed control
|
* P gain for the airspeed control
|
||||||
@@ -268,7 +275,7 @@ PARAM_DEFINE_FLOAT(MT_ACC_D, 0.0f);
|
|||||||
*
|
*
|
||||||
* @group mTECS
|
* @group mTECS
|
||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(MT_ACC_D_LP, 1.0f);
|
PARAM_DEFINE_FLOAT(MT_ACC_D_LP, 0.5f);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Minimal acceleration (air)
|
* Minimal acceleration (air)
|
||||||
@@ -286,13 +293,6 @@ PARAM_DEFINE_FLOAT(MT_ACC_MIN, -40.0f);
|
|||||||
*/
|
*/
|
||||||
PARAM_DEFINE_FLOAT(MT_ACC_MAX, 40.0f);
|
PARAM_DEFINE_FLOAT(MT_ACC_MAX, 40.0f);
|
||||||
|
|
||||||
/**
|
|
||||||
* Airspeed derivative calculation lowpass
|
|
||||||
*
|
|
||||||
* @group mTECS
|
|
||||||
*/
|
|
||||||
PARAM_DEFINE_FLOAT(MT_AD_LP, 1.0f);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Minimal throttle during takeoff
|
* Minimal throttle during takeoff
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user