Skip to content

Commit a81515f

Browse files
RomanBapstJaeyoung-Lim
authored andcommitted
FixedWingPositionControl: control only height rate when using pitch stick
in manual altitude controlled modes Signed-off-by: RomanBapst <[email protected]>
1 parent 545bf1e commit a81515f

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

src/modules/fw_pos_control_l1/FixedwingPositionControl.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -641,14 +641,22 @@ FixedwingPositionControl::update_desired_altitude(float dt)
641641
if (_manual_control_setpoint_altitude > deadBand) {
642642
/* pitching down */
643643
float pitch = -(_manual_control_setpoint_altitude - deadBand) / factor;
644-
_hold_alt += (_param_sinkrate_target.get() * dt) * pitch;
645-
_was_in_deadband = false;
644+
645+
if (pitch * _param_sinkrate_target.get() < _tecs.hgt_rate_setpoint()) {
646+
_hold_alt += (_param_sinkrate_target.get() * dt) * pitch;
647+
_manual_height_rate_setpoint_m_s = pitch * _param_sinkrate_target.get();
648+
_was_in_deadband = false;
649+
}
646650

647651
} else if (_manual_control_setpoint_altitude < - deadBand) {
648652
/* pitching up */
649653
float pitch = -(_manual_control_setpoint_altitude + deadBand) / factor;
650-
_hold_alt += (_param_climbrate_target.get() * dt) * pitch;
651-
_was_in_deadband = false;
654+
655+
if (pitch * _param_climbrate_target.get() > _tecs.hgt_rate_setpoint()) {
656+
_hold_alt += (_param_climbrate_target.get() * dt) * pitch;
657+
_manual_height_rate_setpoint_m_s = pitch * _param_climbrate_target.get();
658+
_was_in_deadband = false;
659+
}
652660

653661
} else if (!_was_in_deadband) {
654662
/* store altitude at which manual.x was inside deadBand
@@ -657,6 +665,7 @@ FixedwingPositionControl::update_desired_altitude(float dt)
657665
_hold_alt = _current_altitude;
658666
_althold_epv = _local_pos.epv;
659667
_was_in_deadband = true;
668+
_manual_height_rate_setpoint_m_s = NAN;
660669
}
661670

662671
if (_vehicle_status.is_vtol) {
@@ -1113,7 +1122,8 @@ FixedwingPositionControl::control_position(const hrt_abstime &now, const Vector2
11131122
_param_fw_thr_cruise.get(),
11141123
false,
11151124
pitch_limit_min,
1116-
tecs_status_s::TECS_MODE_NORMAL);
1125+
tecs_status_s::TECS_MODE_NORMAL,
1126+
_manual_height_rate_setpoint_m_s);
11171127

11181128
/* heading control */
11191129
if (fabsf(_manual_control_setpoint.y) < HDG_HOLD_MAN_INPUT_THRESH &&
@@ -1225,7 +1235,8 @@ FixedwingPositionControl::control_position(const hrt_abstime &now, const Vector2
12251235
_param_fw_thr_cruise.get(),
12261236
false,
12271237
pitch_limit_min,
1228-
tecs_status_s::TECS_MODE_NORMAL);
1238+
tecs_status_s::TECS_MODE_NORMAL,
1239+
_manual_height_rate_setpoint_m_s);
12291240

12301241
_att_sp.roll_body = _manual_control_setpoint.y * radians(_param_fw_man_r_max.get());
12311242
_att_sp.yaw_body = 0;

src/modules/fw_pos_control_l1/FixedwingPositionControl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class FixedwingPositionControl final : public ModuleBase<FixedwingPositionContro
179179
float _global_local_alt0{NAN};
180180

181181
float _hold_alt{0.0f}; ///< hold altitude for altitude mode
182+
float _manual_height_rate_setpoint_m_s{NAN};
182183
float _takeoff_ground_alt{0.0f}; ///< ground altitude at which plane was launched
183184
float _hdg_hold_yaw{0.0f}; ///< hold heading for velocity mode
184185
bool _hdg_hold_enabled{false}; ///< heading hold enabled

0 commit comments

Comments
 (0)