mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-19 06:23:33 +08:00
Implement RC and DL failsafe action handling for multirotors
Move RC and DL failsafe actions handling from navigator to commander (credits to @AndreasAntener) Separate manual kill switch handling via manual_lockdown to prevent override and release of software lockdown by RC switch Other changes: Add failsafe tune Fix LED blinking for Pixracer Return back support for rc inputs in simulator but now it is configurable via cmake
This commit is contained in:
committed by
Lorenz Meier
parent
964dabe179
commit
3a17c07b1e
@@ -333,7 +333,7 @@ int ardrone_interface_thread_main(int argc, char *argv[])
|
||||
/* for now only spin if armed and immediately shut down
|
||||
* if in failsafe
|
||||
*/
|
||||
if (armed.armed && !armed.lockdown) {
|
||||
if (armed.armed && !(armed.lockdown || armed.manual_lockdown)) {
|
||||
ardrone_mixing_and_output(ardrone_write, &actuator_controls);
|
||||
|
||||
} else {
|
||||
|
||||
@@ -373,7 +373,7 @@ void task_main(int argc, char *argv[])
|
||||
pwm,
|
||||
&_pwm_limit);
|
||||
|
||||
if (_armed.lockdown) {
|
||||
if (_armed.lockdown || _armed.manual_lockdown) {
|
||||
send_outputs_pwm(disarmed_pwm);
|
||||
|
||||
} else {
|
||||
|
||||
@@ -88,6 +88,8 @@ class PWMSim : public device::CDev
|
||||
class PWMSim : public device::VDev
|
||||
#endif
|
||||
{
|
||||
const uint32_t PWM_SIM_DISARMED_MAGIC = 900;
|
||||
const uint32_t PWM_SIM_FAILSAFE_MAGIC = 600;
|
||||
public:
|
||||
enum Mode {
|
||||
MODE_2PWM,
|
||||
@@ -128,6 +130,8 @@ private:
|
||||
|
||||
volatile bool _task_should_exit;
|
||||
static bool _armed;
|
||||
static bool _lockdown;
|
||||
static bool _failsafe;
|
||||
|
||||
MixerGroup *_mixers;
|
||||
|
||||
@@ -170,6 +174,8 @@ PWMSim *g_pwm_sim;
|
||||
} // namespace
|
||||
|
||||
bool PWMSim::_armed = false;
|
||||
bool PWMSim::_lockdown = false;
|
||||
bool PWMSim::_failsafe = false;
|
||||
|
||||
PWMSim::PWMSim() :
|
||||
#ifdef __PX4_NUTTX
|
||||
@@ -508,10 +514,23 @@ PWMSim::task_main()
|
||||
* This will be clearly visible on the servo status and will limit the risk of accidentally
|
||||
* spinning motors. It would be deadly in flight.
|
||||
*/
|
||||
outputs.output[i] = 900;
|
||||
outputs.output[i] = PWM_SIM_DISARMED_MAGIC;
|
||||
}
|
||||
}
|
||||
|
||||
/* overwrite outputs in case of force_failsafe */
|
||||
if (_failsafe) {
|
||||
for (size_t i = 0; i < num_outputs; i++) {
|
||||
outputs.output[i] = PWM_SIM_FAILSAFE_MAGIC;
|
||||
}
|
||||
}
|
||||
|
||||
/* overwrite outputs in case of lockdown */
|
||||
if (_lockdown) {
|
||||
for (size_t i = 0; i < num_outputs; i++) {
|
||||
outputs.output[i] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
/* and publish for anyone that cares to see */
|
||||
orb_publish(ORB_ID(actuator_outputs), _outputs_pub, &outputs);
|
||||
@@ -526,6 +545,8 @@ PWMSim::task_main()
|
||||
orb_copy(ORB_ID(actuator_armed), _armed_sub, &aa);
|
||||
/* do not obey the lockdown value, as lockdown is for PWMSim */
|
||||
_armed = aa.armed;
|
||||
_failsafe = aa.force_failsafe;
|
||||
_lockdown = aa.lockdown || aa.manual_lockdown;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1200,8 +1200,15 @@ PX4FMU::cycle()
|
||||
_disarmed_pwm, _min_pwm, _max_pwm, outputs, pwm_limited, &_pwm_limit);
|
||||
|
||||
|
||||
/* overwrite outputs in case of force_failsafe with _failsafe_pwm PWM values */
|
||||
if (_armed.force_failsafe) {
|
||||
for (size_t i = 0; i < num_outputs; i++) {
|
||||
pwm_limited[i] = _failsafe_pwm[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* overwrite outputs in case of lockdown with disarmed PWM values */
|
||||
if (_armed.lockdown) {
|
||||
if (_armed.lockdown || _armed.manual_lockdown) {
|
||||
for (size_t i = 0; i < num_outputs; i++) {
|
||||
pwm_limited[i] = _disarmed_pwm[i];
|
||||
}
|
||||
|
||||
@@ -1462,11 +1462,11 @@ PX4IO::io_set_arming_state()
|
||||
|
||||
_armed = armed.armed;
|
||||
|
||||
if (armed.lockdown && !_lockdown_override) {
|
||||
if ((armed.lockdown || armed.manual_lockdown) && !_lockdown_override) {
|
||||
set |= PX4IO_P_SETUP_ARMING_LOCKDOWN;
|
||||
_lockdown_override = true;
|
||||
|
||||
} else if (!armed.lockdown && _lockdown_override) {
|
||||
} else if (!(armed.lockdown || armed.manual_lockdown) && _lockdown_override) {
|
||||
clear |= PX4IO_P_SETUP_ARMING_LOCKDOWN;
|
||||
_lockdown_override = false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user