mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-30 06:43:34 +08:00
Merge pull request #505 from PX4/rc_failsafe
Futaba RC failsafe support
This commit is contained in:
@@ -1598,8 +1598,8 @@ check_navigation_state_machine(struct vehicle_status_s *status, struct vehicle_c
|
|||||||
/* switch to failsafe mode */
|
/* switch to failsafe mode */
|
||||||
bool manual_control_old = control_mode->flag_control_manual_enabled;
|
bool manual_control_old = control_mode->flag_control_manual_enabled;
|
||||||
|
|
||||||
if (!status->condition_landed) {
|
if (!status->condition_landed && status->condition_local_position_valid) {
|
||||||
/* in air: try to hold position */
|
/* in air: try to hold position if possible */
|
||||||
res = navigation_state_transition(status, NAVIGATION_STATE_VECTOR, control_mode);
|
res = navigation_state_transition(status, NAVIGATION_STATE_VECTOR, control_mode);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -226,3 +226,7 @@ PARAM_DEFINE_INT32(RC_MAP_AUX3, 0); /**< default function: camera azimuth / yaw
|
|||||||
PARAM_DEFINE_FLOAT(RC_SCALE_ROLL, 0.6f);
|
PARAM_DEFINE_FLOAT(RC_SCALE_ROLL, 0.6f);
|
||||||
PARAM_DEFINE_FLOAT(RC_SCALE_PITCH, 0.6f);
|
PARAM_DEFINE_FLOAT(RC_SCALE_PITCH, 0.6f);
|
||||||
PARAM_DEFINE_FLOAT(RC_SCALE_YAW, 2.0f);
|
PARAM_DEFINE_FLOAT(RC_SCALE_YAW, 2.0f);
|
||||||
|
|
||||||
|
PARAM_DEFINE_INT32(RC_FS_CH, 0); /**< RC failsafe channel, 0 = disable */
|
||||||
|
PARAM_DEFINE_INT32(RC_FS_MODE, 0); /**< RC failsafe mode: 0 = too low means signal loss, 1 = too high means signal loss */
|
||||||
|
PARAM_DEFINE_FLOAT(RC_FS_THR, 800); /**< RC failsafe PWM threshold */
|
||||||
|
|||||||
@@ -260,6 +260,10 @@ private:
|
|||||||
float rc_scale_yaw;
|
float rc_scale_yaw;
|
||||||
float rc_scale_flaps;
|
float rc_scale_flaps;
|
||||||
|
|
||||||
|
int rc_fs_ch;
|
||||||
|
int rc_fs_mode;
|
||||||
|
float rc_fs_thr;
|
||||||
|
|
||||||
float battery_voltage_scaling;
|
float battery_voltage_scaling;
|
||||||
|
|
||||||
} _parameters; /**< local copies of interesting parameters */
|
} _parameters; /**< local copies of interesting parameters */
|
||||||
@@ -305,6 +309,10 @@ private:
|
|||||||
param_t rc_scale_yaw;
|
param_t rc_scale_yaw;
|
||||||
param_t rc_scale_flaps;
|
param_t rc_scale_flaps;
|
||||||
|
|
||||||
|
param_t rc_fs_ch;
|
||||||
|
param_t rc_fs_mode;
|
||||||
|
param_t rc_fs_thr;
|
||||||
|
|
||||||
param_t battery_voltage_scaling;
|
param_t battery_voltage_scaling;
|
||||||
|
|
||||||
param_t board_rotation;
|
param_t board_rotation;
|
||||||
@@ -517,6 +525,11 @@ Sensors::Sensors() :
|
|||||||
_parameter_handles.rc_scale_yaw = param_find("RC_SCALE_YAW");
|
_parameter_handles.rc_scale_yaw = param_find("RC_SCALE_YAW");
|
||||||
_parameter_handles.rc_scale_flaps = param_find("RC_SCALE_FLAPS");
|
_parameter_handles.rc_scale_flaps = param_find("RC_SCALE_FLAPS");
|
||||||
|
|
||||||
|
/* RC failsafe */
|
||||||
|
_parameter_handles.rc_fs_ch = param_find("RC_FS_CH");
|
||||||
|
_parameter_handles.rc_fs_mode = param_find("RC_FS_MODE");
|
||||||
|
_parameter_handles.rc_fs_thr = param_find("RC_FS_THR");
|
||||||
|
|
||||||
/* gyro offsets */
|
/* gyro offsets */
|
||||||
_parameter_handles.gyro_offset[0] = param_find("SENS_GYRO_XOFF");
|
_parameter_handles.gyro_offset[0] = param_find("SENS_GYRO_XOFF");
|
||||||
_parameter_handles.gyro_offset[1] = param_find("SENS_GYRO_YOFF");
|
_parameter_handles.gyro_offset[1] = param_find("SENS_GYRO_YOFF");
|
||||||
@@ -668,6 +681,9 @@ Sensors::parameters_update()
|
|||||||
param_get(_parameter_handles.rc_scale_pitch, &(_parameters.rc_scale_pitch));
|
param_get(_parameter_handles.rc_scale_pitch, &(_parameters.rc_scale_pitch));
|
||||||
param_get(_parameter_handles.rc_scale_yaw, &(_parameters.rc_scale_yaw));
|
param_get(_parameter_handles.rc_scale_yaw, &(_parameters.rc_scale_yaw));
|
||||||
param_get(_parameter_handles.rc_scale_flaps, &(_parameters.rc_scale_flaps));
|
param_get(_parameter_handles.rc_scale_flaps, &(_parameters.rc_scale_flaps));
|
||||||
|
param_get(_parameter_handles.rc_fs_ch, &(_parameters.rc_fs_ch));
|
||||||
|
param_get(_parameter_handles.rc_fs_mode, &(_parameters.rc_fs_mode));
|
||||||
|
param_get(_parameter_handles.rc_fs_thr, &(_parameters.rc_fs_thr));
|
||||||
|
|
||||||
/* update RC function mappings */
|
/* update RC function mappings */
|
||||||
_rc.function[THROTTLE] = _parameters.rc_map_throttle - 1;
|
_rc.function[THROTTLE] = _parameters.rc_map_throttle - 1;
|
||||||
@@ -1256,6 +1272,18 @@ Sensors::rc_poll()
|
|||||||
if (rc_input.channel_count < 4)
|
if (rc_input.channel_count < 4)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* failsafe check */
|
||||||
|
if (_parameters.rc_fs_ch != 0) {
|
||||||
|
if (_parameters.rc_fs_mode == 0) {
|
||||||
|
if (rc_input.values[_parameters.rc_fs_ch - 1] < _parameters.rc_fs_thr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else if (_parameters.rc_fs_mode == 1) {
|
||||||
|
if (rc_input.values[_parameters.rc_fs_ch - 1] > _parameters.rc_fs_thr)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unsigned channel_limit = rc_input.channel_count;
|
unsigned channel_limit = rc_input.channel_count;
|
||||||
|
|
||||||
if (channel_limit > _rc_max_chan_count)
|
if (channel_limit > _rc_max_chan_count)
|
||||||
|
|||||||
Reference in New Issue
Block a user