Path: blob/master/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.h
9673 views
#pragma once12/// @file AC_AttitudeControl_Heli.h3/// @brief ArduCopter attitude control library for traditional helicopters45#include "AC_AttitudeControl.h"6#include <AP_Motors/AP_MotorsHeli.h>7#include <AC_PID/AC_HELI_PID.h>8#include <Filter/Filter.h>910// default rate controller PID gains11#define AC_ATC_HELI_RATE_RP_P 0.024f12#define AC_ATC_HELI_RATE_RP_I 0.15f13#define AC_ATC_HELI_RATE_RP_D 0.001f14#define AC_ATC_HELI_RATE_RP_IMAX 0.4f15#define AC_ATC_HELI_RATE_RP_FF 0.15f16#define AC_ATC_HELI_RATE_RP_FILT_HZ 20.0f17#define AC_ATC_HELI_RATE_RP_ILMI 0.05f // Default I-term Leak Minimum18#define AC_ATC_HELI_RATE_YAW_P 0.18f19#define AC_ATC_HELI_RATE_YAW_I 0.12f20#define AC_ATC_HELI_RATE_YAW_D 0.003f21#define AC_ATC_HELI_RATE_YAW_IMAX 0.4f22#define AC_ATC_HELI_RATE_YAW_FF 0.024f23#define AC_ATC_HELI_RATE_YAW_FILT_HZ 20.0f2425#define AC_ATTITUDE_HELI_ANGLE_LIMIT_THROTTLE_MAX 0.95f // Heli's use 95% of max collective before limiting frame angle26#define AC_ATTITUDE_HELI_RATE_INTEGRATOR_LEAK_RATE 0.02f27#define AC_ATTITUDE_HELI_RATE_RP_FF_FILTER 20.0f28#define AC_ATTITUDE_HELI_RATE_Y_FF_FILTER 20.0f29#define AC_ATTITUDE_HELI_HOVER_ROLL_TRIM_DEFAULT 30030#define AC_ATTITUDE_HELI_ACRO_OVERSHOOT_ANGLE_RAD radians(30.0f)31#define AC_ATTITUDE_HELI_INVERTED_TRANSITION_TIME 3.0f3233class AC_AttitudeControl_Heli : public AC_AttitudeControl {34public:35AC_AttitudeControl_Heli( AP_AHRS_View &ahrs,36AP_MotorsHeli& motors);3738// pid accessors39AC_PID& get_rate_roll_pid() override { return _pid_rate_roll; }40AC_PID& get_rate_pitch_pid() override { return _pid_rate_pitch; }41AC_PID& get_rate_yaw_pid() override { return _pid_rate_yaw; }42const AC_PID& get_rate_roll_pid() const override { return _pid_rate_roll; }43const AC_PID& get_rate_pitch_pid() const override { return _pid_rate_pitch; }44const AC_PID& get_rate_yaw_pid() const override { return _pid_rate_yaw; }4546// passthrough_bf_roll_pitch_rate_yaw_norm - roll and pitch are passed through directly, body-frame rate target for yaw47void passthrough_bf_roll_pitch_rate_yaw_norm(float roll_passthrough_norm, float pitch_passthrough_norm, float yaw_passthrough_norm) override;4849// subclass non-passthrough too, for external gyro, no flybar50void input_rate_bf_roll_pitch_yaw_rads(float roll_rate_bf_rads, float pitch_rate_bf_rads, float yaw_rate_bf_rads) override;5152// rate_controller_run - run lowest level body-frame rate controller and send outputs to the motors53// should be called at 100hz or more54virtual void rate_controller_run() override;5556// Update Alt_Hold angle maximum57void update_althold_lean_angle_max(float throttle_in) override;5859// use_leaky_i - controls whether we use leaky i term for body-frame to motor output stage60void use_leaky_i(bool leaky_i) override { _flags_heli.leaky_i = leaky_i; }6162// use_flybar_passthrough - controls whether we pass-through63// control inputs to swash-plate and tail64void use_flybar_passthrough(bool passthrough, bool tail_passthrough) override {65_flags_heli.flybar_passthrough = passthrough;66_flags_heli.tail_passthrough = tail_passthrough;67}6869// set_hover_roll_scalar - scales Hover Roll Trim parameter. To be used by vehicle code according to vehicle condition.70void set_hover_roll_trim_scalar(float scalar) override {_hover_roll_trim_scalar = constrain_float(scalar, 0.0f, 1.0f);}7172// get_roll_trim - angle in centi-degrees to be added to roll angle for learn hover collective. Used by helicopter to counter tail rotor thrust in hover73float get_roll_trim_cd() override;7475// Set output throttle76void set_throttle_out(float throttle_in, bool apply_angle_boost, float filt_cutoff) override;7778// calculate total body frame throttle required to produce the given earth frame throttle79float get_throttle_boosted(float throttle_in);8081// Sets desired roll and pitch angles (in radians) and yaw rate (in radians/s).82// Used when roll/pitch stabilization is needed with manual or autonomous yaw rate control.83// Applies acceleration-limited input shaping for smooth transitions and computes body-frame angular velocity targets.84void input_euler_angle_roll_pitch_euler_rate_yaw_rad(float euler_roll_angle_rad, float euler_pitch_angle_rad, float euler_yaw_rate_rads) override;8586// Sets desired roll, pitch, and yaw angles (in radians).87// Used to follow an absolute attitude setpoint. Input shaping and yaw slew limits are applied.88// Outputs are passed to the rate controller via shaped angular velocity targets.89void input_euler_angle_roll_pitch_yaw_rad(float euler_roll_angle_rad, float euler_pitch_angle_rad, float euler_yaw_angle_rad, bool slew_yaw) override;9091// Sets desired thrust vector and heading rate (in radians/s).92// Used for tilt-based navigation with independent yaw control.93// The thrust vector defines the desired orientation (e.g., pointing direction for vertical thrust),94// while the heading rate adjusts yaw. The input is shaped by acceleration and slew limits.95void input_thrust_vector_rate_heading_rads(const Vector3f& thrust_vector, float heading_rate_rads, bool slew_yaw = true) override;9697// Sets desired thrust vector and heading (in radians) with heading rate (in radians/s).98// Used for advanced attitude control where thrust direction is separated from yaw orientation.99// Heading slew is constrained based on configured limits.100void input_thrust_vector_heading_rad(const Vector3f& thrust_vector, float heading_angle_rad, float heading_rate_rads) override;101102// enable/disable inverted flight103void set_inverted_flight(bool inverted) override { _inverted_flight = inverted; }104105// accessor for inverted flight flag106bool get_inverted_flight() override { return _inverted_flight; }107108// set the PID notch sample rates109void set_notch_sample_rate(float sample_rate) override;110111// user settable parameters112static const struct AP_Param::GroupInfo var_info[];113114private:115116// To-Do: move these limits flags into the heli motors class117struct AttControlHeliFlags {118uint8_t leaky_i : 1; // 1 if we should use leaky i term for body-frame rate to motor stage119uint8_t flybar_passthrough : 1; // 1 if we should pass through pilots roll & pitch input directly to swash-plate120uint8_t tail_passthrough : 1; // 1 if we should pass through pilots yaw input to tail121} _flags_heli;122123// true in inverted flight mode124bool _inverted_flight;125126// Integrate vehicle rate into _att_error_rot_vec_rad127void integrate_bf_rate_error_to_angle_errors();128129//130// body-frame rate controller131//132// rate_bf_to_motor_roll_pitch - ask the rate controller to calculate the motor outputs to achieve the target body-frame rate (in radians/sec) for roll, pitch and yaw133// outputs are sent directly to motor class134void rate_bf_to_motor_roll_pitch(const Vector3f &rate_rads, float rate_roll_target_rads, float rate_pitch_target_rads);135float rate_target_to_motor_yaw(float rate_yaw_actual_rads, float rate_yaw_rads);136137//138// throttle methods139//140141// pass through for roll and pitch142float _passthrough_roll_norm;143float _passthrough_pitch_norm;144145// pass through for yaw if tail_passthrough is set146float _passthrough_yaw_norm;147148// internal variables149float _hover_roll_trim_scalar = 0; // scalar used to suppress Hover Roll Trim150151152// This represents an euler axis-angle rotation vector from the vehicles153// estimated attitude to the reference (setpoint) attitude used in the attitude154// controller, in radians in the vehicle body frame of reference.155Vector3f _att_error_rot_vec_rad;156157// parameters158AP_Int8 _piro_comp_enabled; // Flybar present or not. Affects attitude controller used during ACRO flight mode159AP_Int16 _hover_roll_trim_cd; // Angle in centi-degrees used to counter tail rotor thrust in hover160161// Roll and Pitch rate PIDs share the same defaults:162const AC_PID::Defaults rp_defaults {163AC_PID::Defaults{164.p = AC_ATC_HELI_RATE_RP_P,165.i = AC_ATC_HELI_RATE_RP_I,166.d = AC_ATC_HELI_RATE_RP_D,167.ff = AC_ATC_HELI_RATE_RP_FF,168.imax = AC_ATC_HELI_RATE_RP_IMAX,169.filt_T_hz = AC_ATTITUDE_HELI_RATE_RP_FF_FILTER,170.filt_E_hz = AC_ATC_HELI_RATE_RP_FILT_HZ,171.filt_D_hz = 0.0,172.srmax = 0,173.srtau = 1.0174}175};176AC_HELI_PID _pid_rate_roll { rp_defaults, AC_ATC_HELI_RATE_RP_ILMI };177AC_HELI_PID _pid_rate_pitch { rp_defaults, AC_ATC_HELI_RATE_RP_ILMI };178179AC_HELI_PID _pid_rate_yaw {180AC_PID::Defaults{181.p = AC_ATC_HELI_RATE_YAW_P,182.i = AC_ATC_HELI_RATE_YAW_I,183.d = AC_ATC_HELI_RATE_YAW_D,184.ff = AC_ATC_HELI_RATE_YAW_FF,185.imax = AC_ATC_HELI_RATE_YAW_IMAX,186.filt_T_hz = AC_ATTITUDE_HELI_RATE_Y_FF_FILTER,187.filt_E_hz = AC_ATC_HELI_RATE_YAW_FILT_HZ,188.filt_D_hz = 0.0,189.srmax = 0,190.srtau = 1.0191}192, 0.0f // default_ilmi193};194195};196197198