mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-26 22:53:34 +08:00
systemlib mixer: Add public method for multi_rotor saturation status
This commit is contained in:
committed by
Lorenz Meier
parent
eb67686b11
commit
8b55c8ec55
@@ -169,6 +169,12 @@ NullMixer::mix(float *outputs, unsigned space, uint16_t *status_reg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
NullMixer::get_saturation_status()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NullMixer::groups_required(uint32_t &groups)
|
NullMixer::groups_required(uint32_t &groups)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -176,6 +176,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg) = 0;
|
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the saturation status.
|
||||||
|
*
|
||||||
|
* @return Integer bitmask containing saturation_status from multirotor_motor_limits.msg .
|
||||||
|
*/
|
||||||
|
virtual uint16_t get_saturation_status(void) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Analyses the mix configuration and updates a bitmask of groups
|
* Analyses the mix configuration and updates a bitmask of groups
|
||||||
* that are required.
|
* that are required.
|
||||||
@@ -261,6 +268,7 @@ public:
|
|||||||
~MixerGroup();
|
~MixerGroup();
|
||||||
|
|
||||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
||||||
|
virtual uint16_t get_saturation_status(void);
|
||||||
virtual void groups_required(uint32_t &groups);
|
virtual void groups_required(uint32_t &groups);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -394,6 +402,7 @@ public:
|
|||||||
static NullMixer *from_text(const char *buf, unsigned &buflen);
|
static NullMixer *from_text(const char *buf, unsigned &buflen);
|
||||||
|
|
||||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
||||||
|
virtual uint16_t get_saturation_status(void);
|
||||||
virtual void groups_required(uint32_t &groups);
|
virtual void groups_required(uint32_t &groups);
|
||||||
virtual void set_offset(float trim) {};
|
virtual void set_offset(float trim) {};
|
||||||
unsigned set_trim(float trim)
|
unsigned set_trim(float trim)
|
||||||
@@ -465,6 +474,7 @@ public:
|
|||||||
uint16_t max);
|
uint16_t max);
|
||||||
|
|
||||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
||||||
|
virtual uint16_t get_saturation_status(void);
|
||||||
virtual void groups_required(uint32_t &groups);
|
virtual void groups_required(uint32_t &groups);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -571,6 +581,7 @@ public:
|
|||||||
unsigned &buflen);
|
unsigned &buflen);
|
||||||
|
|
||||||
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
virtual unsigned mix(float *outputs, unsigned space, uint16_t *status_reg);
|
||||||
|
virtual uint16_t get_saturation_status(void);
|
||||||
virtual void groups_required(uint32_t &groups);
|
virtual void groups_required(uint32_t &groups);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -602,19 +613,19 @@ private:
|
|||||||
multirotor_motor_limits_s _limits;
|
multirotor_motor_limits_s _limits;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint16_t motor_pos : 1; // 0 - true when any motor has saturated in the positive direction
|
uint16_t motor_pos : 1; // 0 - true when any motor has saturated in the positive direction
|
||||||
uint16_t motor_neg : 1; // 1 - true when any motor has saturated in the negative direction
|
uint16_t motor_neg : 1; // 1 - true when any motor has saturated in the negative direction
|
||||||
uint16_t roll_pos : 1; // 2 - true when a positive roll demand change will increase saturation
|
uint16_t roll_pos : 1; // 2 - true when a positive roll demand change will increase saturation
|
||||||
uint16_t roll_neg : 1; // 3 - true when a negative roll demand change will increase saturation
|
uint16_t roll_neg : 1; // 3 - true when a negative roll demand change will increase saturation
|
||||||
uint16_t pitch_pos : 1; // 4 - true when a positive pitch demand change will increase saturation
|
uint16_t pitch_pos : 1; // 4 - true when a positive pitch demand change will increase saturation
|
||||||
uint16_t pitch_neg : 1; // 5 - true when a negative pitch demand change will increase saturation
|
uint16_t pitch_neg : 1; // 5 - true when a negative pitch demand change will increase saturation
|
||||||
uint16_t yaw_pos : 1; // 6 - true when a positive yaw demand change will increase saturation
|
uint16_t yaw_pos : 1; // 6 - true when a positive yaw demand change will increase saturation
|
||||||
uint16_t yaw_neg : 1; // 7 - true when a negative yaw demand change will increase saturation
|
uint16_t yaw_neg : 1; // 7 - true when a negative yaw demand change will increase saturation
|
||||||
uint16_t thrust_pos : 1; // 8 - true when a positive thrust demand change will increase saturation
|
uint16_t thrust_pos : 1; // 8 - true when a positive thrust demand change will increase saturation
|
||||||
uint16_t thrust_neg : 1; // 9 - true when a negative thrust demand change will increase saturation
|
uint16_t thrust_neg : 1; // 9 - true when a negative thrust demand change will increase saturation
|
||||||
} flags;
|
} flags;
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
} _saturation_status;
|
} _saturation_status;
|
||||||
|
|
||||||
void update_saturation_status(unsigned index, bool clipping_high, bool clipping_low);
|
void update_saturation_status(unsigned index, bool clipping_high, bool clipping_low);
|
||||||
|
|||||||
@@ -141,6 +141,13 @@ MixerGroup::set_trims(int16_t *values, unsigned n)
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
MixerGroup::get_saturation_status()
|
||||||
|
{
|
||||||
|
Mixer *mixer = _first;
|
||||||
|
return mixer->get_saturation_status();
|
||||||
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
MixerGroup::count()
|
MixerGroup::count()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ MultirotorMixer::mix(float *outputs, unsigned space, uint16_t *status_reg)
|
|||||||
if (min_out < 0.0f) {
|
if (min_out < 0.0f) {
|
||||||
_saturation_status.flags.motor_neg = true;
|
_saturation_status.flags.motor_neg = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_out > 1.0f) {
|
if (max_out > 1.0f) {
|
||||||
_saturation_status.flags.motor_pos = true;
|
_saturation_status.flags.motor_pos = true;
|
||||||
}
|
}
|
||||||
@@ -334,6 +335,7 @@ MultirotorMixer::mix(float *outputs, unsigned space, uint16_t *status_reg)
|
|||||||
yaw = -((roll * _rotors[i].roll_scale + pitch * _rotors[i].pitch_scale) *
|
yaw = -((roll * _rotors[i].roll_scale + pitch * _rotors[i].pitch_scale) *
|
||||||
roll_pitch_scale + thrust + boost) / _rotors[i].yaw_scale;
|
roll_pitch_scale + thrust + boost) / _rotors[i].yaw_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (out > 1.0f) {
|
} else if (out > 1.0f) {
|
||||||
// allow to reduce thrust to get some yaw response
|
// allow to reduce thrust to get some yaw response
|
||||||
float thrust_reduction = fminf(0.15f, out - 1.0f);
|
float thrust_reduction = fminf(0.15f, out - 1.0f);
|
||||||
@@ -506,3 +508,7 @@ MultirotorMixer::groups_required(uint32_t &groups)
|
|||||||
groups |= (1 << 0);
|
groups |= (1 << 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t MultirotorMixer::get_saturation_status()
|
||||||
|
{
|
||||||
|
return _saturation_status.value;
|
||||||
|
}
|
||||||
|
|||||||
@@ -308,6 +308,12 @@ SimpleMixer::mix(float *outputs, unsigned space, uint16_t *status_reg)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t
|
||||||
|
SimpleMixer::get_saturation_status()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SimpleMixer::groups_required(uint32_t &groups)
|
SimpleMixer::groups_required(uint32_t &groups)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user