mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-03 01:11:36 +08:00
fix(mixer_module): change MixingOutput to use float outputs (#26724)
* refactor(mixer_module): change MixingOutput to use float outputs MixingOutput now passes float values to output drivers instead of uint16_t. This removes the need for the 8192 offset encoding and allows reversible motors to receive negative values directly. * fix(mixer_module): fix float safety issues -EscClient and voxl2_io: replace outputs[i] with fabs(outputs[i]) > 0.fto fix compilation issues -GZMixingInterface: add explicit double cast to prevent compilation error -PWMSim: replaced unit16 cast with lroundf given that now motors outputs can be negative and casting a negative float to unit16 is undefinder behaviour -mixer_module: same fix of PWM (unit126 cast on negative float is undefined behaviour) * refactor(mixer_module): float rounding suggestions * fix(pwm_sim): fix inverted disarmed condition * fix(mixer_module): more float rounding improvements * fix(mixer_module_tests): use casting method which are now in drivers for rounding tests --------- Co-authored-by: Matthias Grob <maetugr@gmail.com>
This commit is contained in:
co-authored by
Matthias Grob
parent
26c9ca115f
commit
00b27c56a8
@@ -169,7 +169,7 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
void update_outputs(uint16_t outputs[MAX_ACTUATORS], unsigned num_outputs)
|
||||
void update_outputs(float outputs[MAX_ACTUATORS], unsigned num_outputs)
|
||||
{
|
||||
if (_port_id == 0 || _port_id == CANARD_PORT_ID_UNSET) {
|
||||
return;
|
||||
@@ -178,7 +178,7 @@ public:
|
||||
uint8_t max_num_outputs = MAX_ACTUATORS > num_outputs ? num_outputs : MAX_ACTUATORS;
|
||||
|
||||
for (int8_t i = max_num_outputs - 1; i >= _max_number_of_nonzero_outputs; i--) {
|
||||
if (outputs[i] != 0) {
|
||||
if (fabsf(outputs[i]) > FLT_EPSILON) {
|
||||
_max_number_of_nonzero_outputs = i + 1;
|
||||
break;
|
||||
}
|
||||
@@ -187,7 +187,7 @@ public:
|
||||
uint16_t payload_buffer[reg_udral_service_actuator_common_sp_Vector31_0_1_value_ARRAY_CAPACITY_];
|
||||
|
||||
for (uint8_t i = 0; i < _max_number_of_nonzero_outputs; i++) {
|
||||
payload_buffer[i] = nunavutFloat16Pack(outputs[i] / 8192.0);
|
||||
payload_buffer[i] = nunavutFloat16Pack(outputs[i] / 8192.f); // Output is float16 so this would benefit rescaling to e.g. [-1,1]
|
||||
}
|
||||
|
||||
const CanardTransferMetadata transfer_metadata = {
|
||||
|
||||
Reference in New Issue
Block a user