forked from Archive/PX4-Autopilot
ActuatorEffectiveness: add function to delectively stop motors with zero thrust
This commit is contained in:
parent
9b092d6d35
commit
4fc3f07cb1
|
@ -84,3 +84,19 @@ int ActuatorEffectiveness::Configuration::totalNumActuators() const
|
||||||
|
|
||||||
return total_count;
|
return total_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ActuatorEffectiveness::stopMaskedMotorsWithZeroThrust(uint32_t stoppable_motors_mask, ActuatorVector &actuator_sp)
|
||||||
|
{
|
||||||
|
for (int actuator_idx = 0; actuator_idx < NUM_ACTUATORS; actuator_idx++) {
|
||||||
|
const uint32_t motor_mask = (1u << actuator_idx);
|
||||||
|
|
||||||
|
if (stoppable_motors_mask & motor_mask) {
|
||||||
|
if (fabsf(actuator_sp(actuator_idx)) < .02f) {
|
||||||
|
_stopped_motors_mask |= motor_mask;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_stopped_motors_mask &= ~motor_mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -203,7 +203,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Get a bitmask of motors to be stopped
|
* Get a bitmask of motors to be stopped
|
||||||
*/
|
*/
|
||||||
virtual uint32_t getStoppedMotors() const { return 0; }
|
virtual uint32_t getStoppedMotors() const { return _stopped_motors_mask; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill in the unallocated torque and thrust, customized by effectiveness type.
|
* Fill in the unallocated torque and thrust, customized by effectiveness type.
|
||||||
|
@ -211,6 +211,15 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void getUnallocatedControl(int matrix_index, control_allocator_status_s &status) {}
|
virtual void getUnallocatedControl(int matrix_index, control_allocator_status_s &status) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops motors which are masked by stoppable_motors_mask and whose demanded thrust is zero
|
||||||
|
*
|
||||||
|
* @param stoppable_motors_mask mask of motors that should be stopped if there's no thrust demand
|
||||||
|
* @param actuator_sp outcome of the allocation to determine if the motor should be stopped
|
||||||
|
*/
|
||||||
|
virtual void stopMaskedMotorsWithZeroThrust(uint32_t stoppable_motors_mask, ActuatorVector &actuator_sp);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FlightPhase _flight_phase{FlightPhase::HOVER_FLIGHT}; ///< Current flight phase
|
FlightPhase _flight_phase{FlightPhase::HOVER_FLIGHT};
|
||||||
|
uint32_t _stopped_motors_mask{0};
|
||||||
};
|
};
|
||||||
|
|
|
@ -94,13 +94,13 @@ void ActuatorEffectivenessStandardVTOL::setFlightPhase(const FlightPhase &flight
|
||||||
// update stopped motors
|
// update stopped motors
|
||||||
switch (flight_phase) {
|
switch (flight_phase) {
|
||||||
case FlightPhase::FORWARD_FLIGHT:
|
case FlightPhase::FORWARD_FLIGHT:
|
||||||
_stopped_motors = _mc_motors_mask;
|
_stopped_motors_mask = _mc_motors_mask;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FlightPhase::HOVER_FLIGHT:
|
case FlightPhase::HOVER_FLIGHT:
|
||||||
case FlightPhase::TRANSITION_FF_TO_HF:
|
case FlightPhase::TRANSITION_FF_TO_HF:
|
||||||
case FlightPhase::TRANSITION_HF_TO_FF:
|
case FlightPhase::TRANSITION_HF_TO_FF:
|
||||||
_stopped_motors = 0;
|
_stopped_motors_mask = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,18 +77,14 @@ public:
|
||||||
|
|
||||||
void setFlightPhase(const FlightPhase &flight_phase) override;
|
void setFlightPhase(const FlightPhase &flight_phase) override;
|
||||||
|
|
||||||
uint32_t getStoppedMotors() const override { return _stopped_motors; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ActuatorEffectivenessRotors _rotors;
|
ActuatorEffectivenessRotors _rotors;
|
||||||
ActuatorEffectivenessControlSurfaces _control_surfaces;
|
ActuatorEffectivenessControlSurfaces _control_surfaces;
|
||||||
|
|
||||||
uint32_t _mc_motors_mask{}; ///< mc motors (stopped during forward flight)
|
uint32_t _mc_motors_mask{}; ///< mc motors (stopped during forward flight)
|
||||||
uint32_t _stopped_motors{}; ///< currently stopped motors
|
|
||||||
|
|
||||||
int _first_control_surface_idx{0}; ///< applies to matrix 1
|
int _first_control_surface_idx{0}; ///< applies to matrix 1
|
||||||
|
|
||||||
uORB::Subscription _flaps_setpoint_sub{ORB_ID(flaps_setpoint)};
|
uORB::Subscription _flaps_setpoint_sub{ORB_ID(flaps_setpoint)};
|
||||||
uORB::Subscription _spoilers_setpoint_sub{ORB_ID(spoilers_setpoint)};
|
uORB::Subscription _spoilers_setpoint_sub{ORB_ID(spoilers_setpoint)};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -100,13 +100,13 @@ void ActuatorEffectivenessTailsitterVTOL::setFlightPhase(const FlightPhase &flig
|
||||||
// update stopped motors //TODO: add option to switch off certain motors in FW
|
// update stopped motors //TODO: add option to switch off certain motors in FW
|
||||||
switch (flight_phase) {
|
switch (flight_phase) {
|
||||||
case FlightPhase::FORWARD_FLIGHT:
|
case FlightPhase::FORWARD_FLIGHT:
|
||||||
_stopped_motors = 0;
|
_stopped_motors_mask = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FlightPhase::HOVER_FLIGHT:
|
case FlightPhase::HOVER_FLIGHT:
|
||||||
case FlightPhase::TRANSITION_FF_TO_HF:
|
case FlightPhase::TRANSITION_FF_TO_HF:
|
||||||
case FlightPhase::TRANSITION_HF_TO_FF:
|
case FlightPhase::TRANSITION_HF_TO_FF:
|
||||||
_stopped_motors = 0;
|
_stopped_motors_mask = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,13 +180,13 @@ void ActuatorEffectivenessTiltrotorVTOL::setFlightPhase(const FlightPhase &fligh
|
||||||
// update stopped motors
|
// update stopped motors
|
||||||
switch (flight_phase) {
|
switch (flight_phase) {
|
||||||
case FlightPhase::FORWARD_FLIGHT:
|
case FlightPhase::FORWARD_FLIGHT:
|
||||||
_stopped_motors = _nontilted_motors;
|
_stopped_motors_mask = _nontilted_motors;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FlightPhase::HOVER_FLIGHT:
|
case FlightPhase::HOVER_FLIGHT:
|
||||||
case FlightPhase::TRANSITION_FF_TO_HF:
|
case FlightPhase::TRANSITION_FF_TO_HF:
|
||||||
case FlightPhase::TRANSITION_HF_TO_FF:
|
case FlightPhase::TRANSITION_HF_TO_FF:
|
||||||
_stopped_motors = 0;
|
_stopped_motors_mask = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue