Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b095445
Add configuration options for the embedded parameter struct
Apr 22, 2026
d02251d
Modify the GPS auto switching script for more robust checks
Apr 28, 2026
52a45a1
Add check to make sure both GPS instances exist
Apr 29, 2026
b38f8a4
Remove unnecesary guard from the numsats assignment
May 5, 2026
b50e960
Fix auto disarm parameters and disable autodisarm monitor after motor…
Jun 12, 2026
61d6167
Add code to restore desired pitch to 0 when actual pitch exceeds Q_A_…
Jun 10, 2026
59d8ee0
In Copter Attitude controller
Jun 12, 2026
e6e30ea
Merge remote-tracking branch 'origin/pr-modified-gps-script' into pr-…
Jun 12, 2026
5f386e0
Merge remote-tracking branch 'origin/pr-airbound-4.5.7-embedded_param…
Jun 12, 2026
8bf6929
Change version to 4.5.7.5 - rc2-fixes
Jun 12, 2026
5e5c25e
Merge pull request #104 from AirboundInc/pr-airbound-4575-rc2
akshar-airbound Jun 15, 2026
3ef3824
Improve tailsitter transition by adding heading alignment, timeout sa…
Tarun24-airbound Jan 28, 2026
136ec4e
Resolve belly flop and rough transition issues with improved tailsitt…
Tarun24-airbound Jan 28, 2026
7ba3056
Disable weathervane and lock climb rate during transition alignment
Tarun24-airbound Jan 30, 2026
babd278
Implement internal yaw angle controller, replacing manual P-gain control
Tarun24-airbound Feb 4, 2026
e578002
Fix weathervane issue and update version to Auto Yaw Align
Tarun24-airbound Feb 4, 2026
7a31a29
Add version name (Auto Yaw Align)
Tarun24-airbound Feb 4, 2026
04fb2b3
Change force climb rate
Tarun24-airbound Jun 17, 2026
0386c04
Remove weathervane logic, change constants & print target bearing
Tarun24-airbound Jun 18, 2026
9d12039
Fix bearing edge cases, shortest yaw turn, 6s align phase
Tarun24-airbound Jun 18, 2026
3f4e94a
Change ahrs.Yaw_sensor to ahrs_view yaw sensor and tight static const…
Tarun24-airbound Jun 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion ArduPlane/quadplane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ const AP_Param::GroupInfo QuadPlane::var_info2[] = {
// @Range: 0.1 0.6
// @Increment: 0.05
// @User: Standard
AP_GROUPINFO("LAND_ALTCHG", 31, QuadPlane, landing_detect.detect_alt_change, 1.5),
AP_GROUPINFO("LAND_ALTCHG", 31, QuadPlane, landing_detect.detect_alt_change, 0.2),

// @Param: NAVALT_MIN
// @DisplayName: Minimum navigation altitude
Expand Down Expand Up @@ -3628,6 +3628,9 @@ bool QuadPlane::check_land_complete(void)
// only apply to final landing phase
return false;
}
if (!motors->armed()) {
return false;
}
// ---- disarm watchdog ----
const float wdg_t = landing_detect.wdg_timeout_s.get();
if (wdg_t > 0 && motors->armed() &&
Expand Down
129 changes: 127 additions & 2 deletions ArduPlane/tailsitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,133 @@ void Tailsitter_Transition::update()
switch (transition_state) {

case TRANSITION_ANGLE_WAIT_FW: {

const uint32_t now_ = AP_HAL::millis();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Redundant millis() call and confusing now_ shadow variable

now is already declared at line 973 for the same timestamp. Introducing a second now_ from a separate AP_HAL::millis() call is a minor timing inconsistency and creates a confusing naming shadow throughout the alignment block. Use the existing now variable directly.

Suggested change
const uint32_t now_ = AP_HAL::millis();
// Use the 'now' timestamp already captured at the top of update()

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

// -----------------------------------------------------------
// 1. INITIALIZATION
// -----------------------------------------------------------
quadplane.set_desired_spool_state(AP_Motors::DesiredSpoolState::THROTTLE_UNLIMITED);

// -----------------------------------------------------------
// 2. TAILSITTER HEADING ALIGNMENT & WAIT
// -----------------------------------------------------------
if (quadplane.tailsitter.enabled()) {

// Constants
const int32_t ALIGN_TOLERANCE_CD = 2000; // 20.0 degrees
const float MAX_SPIN_RATE_DEG = 8.0f; // Max yaw rate allowed
const uint32_t ALIGN_PHASE_LIMIT_MS = 6000; // 6s Total Timeout
const uint32_t WAIT_DELAY_MS = 1000; // 1s Wait

// Static Variables (State Tracking)
static uint32_t align_phase_start_ms = 0;
static uint32_t alignment_done_ms = 0;
static uint32_t last_run_ms = 0;
static uint32_t last_log_ms = 0;
static int32_t target_bearing_cd = 0;
static bool alignment_completed_for_this_flight = false;
static bool target_bearing_latched = false;

// --- DETECT NEW FLIGHT/TRANSITION ENTRY ---
// If this function hasn't run for >200ms, assume it's a new attempt.
if (now_ - last_run_ms > 200) {
align_phase_start_ms = now_;
alignment_done_ms = 0;
last_log_ms = 0;
alignment_completed_for_this_flight = false; // Reset flag for new transition
target_bearing_latched = false;
target_bearing_cd = 0;
}
last_run_ms = now_;
Comment thread
greptile-apps[bot] marked this conversation as resolved.

// Check Validity & Only run if we haven't finished aligning yet
bool should_run_alignment = !alignment_completed_for_this_flight &&
(plane.control_mode == &plane.mode_auto || plane.control_mode == &plane.mode_guided) &&
(plane.nav_controller != nullptr);

if (should_run_alignment) {
if (!target_bearing_latched) {
target_bearing_cd = plane.prev_WP_loc.get_bearing_to(plane.next_WP_loc);
quadplane.attitude_control->reset_rate_controller_I_terms();
gcs().send_text(MAV_SEVERITY_INFO, "Alignment start: Target Heading %.1f",
target_bearing_cd * 0.01f);
target_bearing_latched = true;
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
int32_t current_yaw_cd = quadplane.ahrs_view->yaw_sensor;
int32_t error_cd = wrap_180_cd(target_bearing_cd - current_yaw_cd);
Vector3f gyro = quadplane.ahrs.get_gyro();
float yaw_rate_deg = degrees(gyro.x);

// LOGIC: Are we aligned right now?
bool is_aligned = (abs(error_cd) <= ALIGN_TOLERANCE_CD) && (abs(yaw_rate_deg) <= MAX_SPIN_RATE_DEG);

// TIMER LOGIC
if (is_aligned) {
if (alignment_done_ms == 0) alignment_done_ms = now_;
} else {
alignment_done_ms = 0; // Reset if we drift out
}

// EXIT CRITERIA
bool wait_complete = (alignment_done_ms != 0) && (now_ - alignment_done_ms >= WAIT_DELAY_MS);
bool timeout_expired = (now_ - align_phase_start_ms >= ALIGN_PHASE_LIMIT_MS);

Comment on lines +1007 to +1059

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Start the alignment timeout only when alignment is actually active.
align_phase_start_ms is set on entry regardless of should_run_alignment. If the vehicle enters TRANSITION_ANGLE_WAIT_FW in a non-AUTO/GUIDED mode and later switches into AUTO/GUIDED, the timeout can already be expired, causing alignment to be skipped immediately. Consider arming the timer when alignment becomes active (or clearing it while inactive).

💡 One way to gate the timer
-            // --- DETECT NEW FLIGHT/TRANSITION ENTRY ---
-            // If this function hasn't run for >200ms, assume it's a new attempt.
+            // --- DETECT NEW FLIGHT/TRANSITION ENTRY ---
             if (now_ - last_run_ms > 200) {
                 align_phase_start_ms = now_;
                 alignment_done_ms = 0;
                 last_log_ms = 0;
                 alignment_completed_for_this_flight = false; // Reset flag for new transition
             }
             last_run_ms = now_;

             // Check Validity & Only run if we haven't finished aligning yet
             bool should_run_alignment = !alignment_completed_for_this_flight &&
                                         (plane.control_mode == &plane.mode_auto || plane.control_mode == &plane.mode_guided) &&
                                         (plane.nav_controller != nullptr);
+
+            if (!should_run_alignment) {
+                align_phase_start_ms = 0;
+                alignment_done_ms = 0;
+            } else if (align_phase_start_ms == 0) {
+                align_phase_start_ms = now_;
+            }
🤖 Prompt for AI Agents
In `@ArduPlane/tailsitter.cpp` around lines 924 - 972, The timeout start
(align_phase_start_ms) is set unconditionally on detecting a "new attempt" which
can expire before alignment actually becomes active; change the logic so
align_phase_start_ms is only initialized when alignment is actually active
(should_run_alignment == true) — e.g., on the new-attempt branch do not set
align_phase_start_ms unconditionally but only set it when should_run_alignment
is true (or set it to 0/clear it when should_run_alignment is false), and ensure
you detect the transition from inactive->active to start the timer (use
last_run_ms and alignment_completed_for_this_flight to gate this), updating the
places that use align_phase_start_ms, timeout_expired, and WAIT_DELAY_MS
accordingly.

// --- BLOCKING CONTROL LOOP ---
// Run this ONLY if we are NOT done waiting AND haven't timed out
if (!wait_complete && !timeout_expired) {

// Log (2Hz)
if (now_ - last_log_ms > 500) {
if (is_aligned) {
float remaining = (WAIT_DELAY_MS - (now_ - alignment_done_ms)) * 0.001f;
gcs().send_text(MAV_SEVERITY_INFO, "Aligned. Waiting: %.1fs", (double)remaining);
} else {
gcs().send_text(MAV_SEVERITY_INFO, "Aligning: Err %.1f", abs(error_cd) * 0.01f);
}
last_log_ms = now_;
}
//Force zero climb rate (Altitude Hold)
quadplane.set_climb_rate_cms(0);

// Control
quadplane.pos_control->update_z_controller();

@atharva-airbound atharva-airbound Feb 9, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are manually calling update_z_controller() here but there is a comment in quadplane.cpp mentioning this shouldn't be done during transition

// never run Z controller in tailsitter transtion

Here is a relevant PR from when the comment was added: ArduPilot#19286
Needs investigation.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can try calling hold_hover(0) instead of running the position controllers to get the roll and pitch setpoints.

Will try this when I have time.

quadplane.pos_control->update_xy_controller();
quadplane.attitude_control->input_euler_angle_roll_pitch_yaw(
quadplane.pos_control->get_roll_cd(),
quadplane.pos_control->get_pitch_cd(),
(float)target_bearing_cd,
false
);

quadplane.motors_output();
set_last_fw_pitch(); // Keep tracking pitch so we don't snap later
return; // BLOCK TRANSITION
}

// --- HANDOVER LOGIC (Runs ONCE when done) ---

if (timeout_expired) {
gcs().send_text(MAV_SEVERITY_WARNING, "Align Timeout: Proceeding");
} else {
gcs().send_text(MAV_SEVERITY_INFO, "Alignment Complete: Transitioning");
}

// 1. Mark as complete so we NEVER enter this 'if' block again for this flight
alignment_completed_for_this_flight = true;

// 2. Reset Standard Transition Timer to now
fw_transition_start_ms = now_;

// 3. Reset Integrators and Pitch Target
quadplane.attitude_control->reset_rate_controller_I_terms();
plane.nav_pitch_cd = constrain_float(quadplane.ahrs.pitch_sensor, -8500, 8500);
plane.nav_roll_cd = 0;
set_last_fw_pitch();
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}
}

// Normal transition code continues here for non-tailsitters
// or after tailsitter alignment completes...
if (tailsitter.transition_fw_complete()) {
// To inform the attitude controller that FW_DONE
quadplane.attitude_control->set_tailsitter_transition(false);
Expand Down Expand Up @@ -1050,8 +1177,6 @@ void Tailsitter_Transition::VTOL_update()
if (!quadplane.tailsitter.transition_vtol_complete()) {
return;
}
// To inform the attitude controller that VTOL_DONE
quadplane.attitude_control->set_tailsitter_back_transition_done(true);
// transition to VTOL complete, if armed set vtol rate limit starting point
if (plane.arming.is_armed_and_safety_off()) {
vtol_limit_start_ms = now;
Expand Down
2 changes: 1 addition & 1 deletion ArduPlane/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include "ap_version.h"

#define THISFIRMWARE "AB ArduPlane V4.5.7.5 - rc1"
#define THISFIRMWARE "AB ArduPlane V4.5.7.5 - rc3-AutoYawAlign"

// the following line is parsed by the autotest scripts
#define FIRMWARE_VERSION 4,5,7,FIRMWARE_VERSION_TYPE_DEV
Expand Down
90 changes: 44 additions & 46 deletions libraries/AC_AttitudeControl/AC_AttitudeControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,14 +150,14 @@ const AP_Param::GroupInfo AC_AttitudeControl::var_info[] = {
// @User: Standard
AP_GROUPINFO("INPUT_TC", 20, AC_AttitudeControl, _input_tc, AC_ATTITUDE_CONTROL_INPUT_TC_DEFAULT),

// @Param: RELX_TC
// @DisplayName: Relaxation time constant
// @Description: Time constant for relaxing the attitude controller
// @Units: s
// @Range: 0.01 10
// @Increment: 0.01
// @Param: RELX_LO
// @DisplayName: Relaxation low threshold angle
// @Description: Pitch angle (degrees) below which the hysteresis deactivates attitude relaxation
// @Units: deg
// @Range: 0 90
// @Increment: 0.1
// @User: Standard
AP_GROUPINFO("RELX_TC", 21, AC_AttitudeControl, _relax_time_constant, 0.4f),
AP_GROUPINFO("RELX_LO", 21, AC_AttitudeControl, _low_tilt_relax, 30.0f),

// @Param: RELX_ANG
// @DisplayName: Max tilt angle for position controller relaxation
Expand All @@ -166,15 +166,24 @@ const AP_Param::GroupInfo AC_AttitudeControl::var_info[] = {
// @Range: 0 90
// @Increment: 0.01
// @User: Standard
AP_GROUPINFO("RELX_ANG", 22, AC_AttitudeControl, _max_tilt_relax, 45.0f),
AP_GROUPINFO("RELX_HI", 22, AC_AttitudeControl, _high_tilt_relax, 45.0f),

// @Param: RELX_EN
// @DisplayName: Position control relaxation enable
// @Description: Enable/disable flag for postion controller relaxation
// @Description: Enable/disable flag for position controller relaxation
// @Values: 0:Disabled, 1:Enabled
// @User: Advanced
AP_GROUPINFO("RELX_EN", 23, AC_AttitudeControl, _att_relax_enabled, 0),

// @Param: RELX_TC
// @DisplayName: Relaxation time constant
// @Description: Time constant for the low pass filter on the relaxation factor
// @Units: s
// @Range: 0.01 10
// @Increment: 0.01
// @User: Advanced
AP_GROUPINFO("RELX_TC", 24, AC_AttitudeControl, _tc_tilt_relax, 1.0f),
Comment on lines 150 to +185

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 AP_Param index 21 reused for a different parameter, breaking saved configurations

RELX_TC was at group index 21 in the previous firmware and stored that way in EEPROM. The new code repurposes index 21 for RELX_LO (low hysteresis threshold, 30°). Any vehicle upgraded from the previous firmware that had Q_A_RELX_TC stored in flash will have its value—nominally 0.4 s—loaded directly into RELX_LO, setting the low-activation threshold to 0.4° instead of 30°. Because RELX_EN is now 1 in defaults.parm, the relaxation will be active for virtually every hover attitude, silently suppressing the pitch setpoint. New RELX_TC must use a previously unused index (e.g., 25) or the existing RELX_TC index must be kept at 21 and a different index chosen for RELX_LO.


AP_GROUPEND
};

Expand Down Expand Up @@ -738,43 +747,32 @@ void AC_AttitudeControl::attitude_controller_run_quat()

// This vector represents the angular error to rotate the thrust vector using x and y and heading using z
Vector3f attitude_error;

if(_ts_enabled && _att_relax_enabled){
float attitude_tilt;
compute_tilt_angle(attitude_tilt);
// Gradually relax roll/pitch setpoint toward zero when tilt exceeds limit
Vector3f euler;
_attitude_target.to_euler(euler.x, euler.y, euler.z);
const float alpha = _dt / (_dt + _relax_time_constant);
// Gradually bring the setpoint towards zero
if (fabsf(attitude_tilt) > _max_tilt_relax && !_ts_in_transition) {
_relaxed_roll *= (1.0f - alpha);
_relaxed_pitch *= (1.0f - alpha);
_attitude_target.from_euler(_relaxed_roll, _relaxed_pitch, euler.z);
_ang_vel_target.x *= (1.0f - alpha);
_ang_vel_target.y *= (1.0f - alpha);
static float relaxation_factor_lpf = 0.0f;
float alpha_relax = _dt / (_dt + _tc_tilt_relax);
static bool _att_relax_active = false;
if(_ts_enabled && _att_relax_enabled && !_ts_in_transition){
// Linearly relax pitch setpoint toward zero based euler pitch angle.
Vector3f euler_sp,euler_ang;
_attitude_target.to_euler(euler_sp.x, euler_sp.y, euler_sp.z);
attitude_body.to_euler(euler_ang.x, euler_ang.y, euler_ang.z);
float pitch_tilt = fabsf(degrees(euler_ang.y));
if (pitch_tilt > _high_tilt_relax) {
_att_relax_active = true;
} else if (pitch_tilt < _low_tilt_relax) {
_att_relax_active = false;
}
// When the attitude is relaxed, gradually recover the setpoint as the vehicle returns within limits
// 0.5f degree threshold is used to prevent oscillations around the limit when recovering
else if (fabsf(_relaxed_roll - euler.x) > radians(0.5f) ||fabsf(_relaxed_pitch - euler.y) > radians(0.5f)) {
// After back transition, set the position control demanded attitude setpoint as the relaxed attitude setpoint.
if (_ts_back_transition_done) {
_relaxed_pitch = euler.y;
_relaxed_roll = euler.x;
_ts_back_transition_done = false;
// Run recovery when relaxed attitude is different from current attitude target
}else{
_relaxed_roll += (euler.x - _relaxed_roll) * alpha;
_relaxed_pitch += (euler.y - _relaxed_pitch) * alpha;
if (fabsf(_relaxed_roll - euler.x) < radians(0.5f)) _relaxed_roll = euler.x;
if (fabsf(_relaxed_pitch - euler.y) < radians(0.5f)) _relaxed_pitch = euler.y;
_attitude_target.from_euler(_relaxed_roll, _relaxed_pitch, euler.z);
}
} else {
// Fully recovered — update the relaxed angles to original setpoint
_relaxed_roll = euler.x;
_relaxed_pitch = euler.y;
//During relaxation pitch setpoint is relaxed towards zero.
if(_att_relax_active) {
relaxation_factor_lpf += alpha_relax * (1.0f - relaxation_factor_lpf);
}
// When not relaxing, return the setpoint back to the commanded angle.
else {
relaxation_factor_lpf += alpha_relax * (0.0f - relaxation_factor_lpf);
}
relaxation_factor_lpf = constrain_float(relaxation_factor_lpf, 0.0f, 1.0f);
euler_sp.y *= (1.0f - relaxation_factor_lpf);
_ang_vel_target.y *= (1.0f - relaxation_factor_lpf);
_attitude_target.from_euler(euler_sp.x, euler_sp.y, euler_sp.z);
}
thrust_heading_rotation_angles(_attitude_target, attitude_body, attitude_error, _thrust_angle, _thrust_error_angle);

Expand All @@ -792,10 +790,10 @@ void AC_AttitudeControl::attitude_controller_run_quat()

// Correct the thrust vector and smoothly add feedforward and yaw input
_feedforward_scalar = 1.0f;
if (_thrust_error_angle > AC_ATTITUDE_THRUST_ERROR_ANGLE * 2.0f) {
if (_thrust_error_angle > AC_ATTITUDE_THRUST_ERROR_ANGLE * 3.0f) {
_ang_vel_body.z = _ahrs.get_gyro().z;
get_rate_yaw_pid().reset_I();
} else if (_thrust_error_angle > AC_ATTITUDE_THRUST_ERROR_ANGLE) {
} else if (_thrust_error_angle > AC_ATTITUDE_THRUST_ERROR_ANGLE * 2.0f) {
_feedforward_scalar = (1.0f - (_thrust_error_angle - AC_ATTITUDE_THRUST_ERROR_ANGLE) / AC_ATTITUDE_THRUST_ERROR_ANGLE);
_ang_vel_body.x += ang_vel_body_feedforward.x * _feedforward_scalar;
_ang_vel_body.y += ang_vel_body_feedforward.y * _feedforward_scalar;
Expand Down
13 changes: 3 additions & 10 deletions libraries/AC_AttitudeControl/AC_AttitudeControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -429,8 +429,6 @@ class AC_AttitudeControl {
// To check the transition state
void set_tailsitter_transition(bool in_transition) { _ts_in_transition = in_transition; }

// To check the back transition complete state
void set_tailsitter_back_transition_done(bool back_transition_done) { _ts_back_transition_done = back_transition_done; }
protected:

// Update rate_target_ang_vel using attitude_error_rot_vec_rad
Expand All @@ -451,8 +449,9 @@ class AC_AttitudeControl {
AP_Float _ang_vel_pitch_max;
AP_Float _ang_vel_yaw_max;

AP_Float _max_tilt_relax;
AP_Float _relax_time_constant;
AP_Float _high_tilt_relax;
AP_Float _low_tilt_relax;
AP_Float _tc_tilt_relax;

// Enable/Disable attitude relaxation
AP_Int8 _att_relax_enabled;
Expand Down Expand Up @@ -575,11 +574,6 @@ class AC_AttitudeControl {

static AC_AttitudeControl *_singleton;

// Relaxed pitch and roll setpoint values
float _relaxed_roll = 0.0f;
float _relaxed_pitch = 0.0f;


protected:
/*
state of control monitoring
Expand All @@ -600,7 +594,6 @@ class AC_AttitudeControl {
bool _inverted_flight;
bool _ts_enabled = false; // tailsitter enabled flag
bool _ts_in_transition = false; // tailsitter transition flag
bool _ts_back_transition_done = false; // tailsitter back transition done flag

public:
// log a CTRL message
Expand Down
11 changes: 7 additions & 4 deletions libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C-bdshot/defaults.parm
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,10 @@ Q_A_RAT_YAW_FLTT 25
Q_A_RAT_YAW_I 0.35
Q_A_RAT_YAW_IMAX 0.2
Q_A_RAT_YAW_P 0.29
Q_A_RELX_ANG 45.0
Q_A_RELX_TC 0.4
Q_A_RELX_EN 0
Q_A_RELX_HI 45
Q_A_RELX_LO 30
Q_A_RELX_EN 1
Q_A_RELX_TC 1
Q_A_THR_MIX_MAN 0.5
Q_A_THR_MIX_MAX 0.9
Q_A_THR_MIX_MIN 0.15
Expand All @@ -160,11 +161,13 @@ Q_FRAME_CLASS 10
Q_FRAME_TYPE 1
Q_FW_LND_APR_RAD 60
Q_FWD_MANTHR_MAX 100
Q_LAND_ALTCHG 0.3
Q_LAND_ALTCHG 1.5
Q_LAND_FINAL_ALT 10
Q_LAND_FINAL_SPD 0.3
Q_LAND_ICE_CUT 0
Q_LND_FRZ_TIM 3
Q_LND_DET_TIM 200
Q_DARM_WDG_T 10.0
Q_LOIT_ANG_MAX 0
Q_LOIT_BRK_DELAY 0.05
Q_LOIT_SPEED 400
Expand Down
6 changes: 6 additions & 0 deletions libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C-bdshot/hwdef.dat
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ PA0 TIM5_CH1 TIM5 PWM(7) GPIO(56) BIDIR
PA1 TIM5_CH2 TIM5 PWM(8) GPIO(57)

DMA_PRIORITY TIM* SPI* SDMMC* USART6* ADC* UART* USART*

# To create the default parameters struct in the firmware
FORCE_APJ_DEFAULT_PARAMETERS 1

# Increase the size of the embedded param struct to fit all default parameters
define AP_PARAM_MAX_EMBEDDED_PARAM 16384
Loading
Loading