mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-02 03:49:12 +08:00
temperature_calibration: reduce code duplication by adding a TemperatureCalibrationCommon class
This commit is contained in:
@@ -45,7 +45,7 @@
|
|||||||
#include <mathlib/mathlib.h>
|
#include <mathlib/mathlib.h>
|
||||||
|
|
||||||
TemperatureCalibrationAccel::TemperatureCalibrationAccel(float min_temperature_rise)
|
TemperatureCalibrationAccel::TemperatureCalibrationAccel(float min_temperature_rise)
|
||||||
: TemperatureCalibrationBase(min_temperature_rise)
|
: TemperatureCalibrationCommon(min_temperature_rise)
|
||||||
{
|
{
|
||||||
|
|
||||||
//init subscriptions
|
//init subscriptions
|
||||||
@@ -145,33 +145,6 @@ int TemperatureCalibrationAccel::update_sensor_instance(PerSensorData &data, int
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TemperatureCalibrationAccel::update()
|
|
||||||
{
|
|
||||||
|
|
||||||
int num_not_complete = 0;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
num_not_complete += update_sensor_instance(_data[uorb_index], _sensor_subs[uorb_index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_not_complete > 0) {
|
|
||||||
// calculate progress
|
|
||||||
float min_diff = _min_temperature_rise;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
float cur_diff = _data[uorb_index].high_temp - _data[uorb_index].low_temp;
|
|
||||||
|
|
||||||
if (cur_diff < min_diff) {
|
|
||||||
min_diff = cur_diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return math::min(100, (int)(min_diff / _min_temperature_rise * 100.f));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 110;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TemperatureCalibrationAccel::finish()
|
int TemperatureCalibrationAccel::finish()
|
||||||
{
|
{
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
||||||
|
|||||||
@@ -36,17 +36,12 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "polyfit.hpp"
|
#include "polyfit.hpp"
|
||||||
|
|
||||||
class TemperatureCalibrationAccel : public TemperatureCalibrationBase
|
class TemperatureCalibrationAccel : public TemperatureCalibrationCommon<3, 3>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TemperatureCalibrationAccel(float min_temperature_rise);
|
TemperatureCalibrationAccel(float min_temperature_rise);
|
||||||
virtual ~TemperatureCalibrationAccel();
|
virtual ~TemperatureCalibrationAccel();
|
||||||
|
|
||||||
/**
|
|
||||||
* @see TemperatureCalibrationBase::update()
|
|
||||||
*/
|
|
||||||
int update();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see TemperatureCalibrationBase::finish()
|
* @see TemperatureCalibrationBase::finish()
|
||||||
*/
|
*/
|
||||||
@@ -59,29 +54,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct PerSensorData {
|
virtual inline int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
||||||
float sensor_sample_filt[4];
|
|
||||||
polyfitter<4> P[3];
|
|
||||||
unsigned hot_soak_sat = 0;
|
|
||||||
uint32_t device_id = 0;
|
|
||||||
bool cold_soaked = false;
|
|
||||||
bool hot_soaked = false;
|
|
||||||
bool tempcal_complete = false;
|
|
||||||
float low_temp = 0.f;
|
|
||||||
float high_temp = 0.f;
|
|
||||||
float ref_temp = 0.f;
|
|
||||||
};
|
|
||||||
|
|
||||||
PerSensorData _data[SENSOR_COUNT_MAX];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* update a single sensor instance
|
|
||||||
* @return 0 when done, 1 not finished yet
|
|
||||||
*/
|
|
||||||
inline int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
|
||||||
|
|
||||||
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
||||||
|
|
||||||
int _num_sensor_instances;
|
|
||||||
int _sensor_subs[SENSOR_COUNT_MAX];
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
#include <mathlib/mathlib.h>
|
#include <mathlib/mathlib.h>
|
||||||
|
|
||||||
TemperatureCalibrationBaro::TemperatureCalibrationBaro(float min_temperature_rise)
|
TemperatureCalibrationBaro::TemperatureCalibrationBaro(float min_temperature_rise)
|
||||||
: TemperatureCalibrationBase(min_temperature_rise)
|
: TemperatureCalibrationCommon(min_temperature_rise)
|
||||||
{
|
{
|
||||||
|
|
||||||
//init subscriptions
|
//init subscriptions
|
||||||
@@ -124,38 +124,11 @@ int TemperatureCalibrationBaro::update_sensor_instance(PerSensorData &data, int
|
|||||||
|
|
||||||
//update linear fit matrices
|
//update linear fit matrices
|
||||||
data.sensor_sample_filt[1] -= data.ref_temp;
|
data.sensor_sample_filt[1] -= data.ref_temp;
|
||||||
data.P.update((double)data.sensor_sample_filt[1], (double)data.sensor_sample_filt[0]);
|
data.P[0].update((double)data.sensor_sample_filt[1], (double)data.sensor_sample_filt[0]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TemperatureCalibrationBaro::update()
|
|
||||||
{
|
|
||||||
|
|
||||||
int num_not_complete = 0;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
num_not_complete += update_sensor_instance(_data[uorb_index], _sensor_subs[uorb_index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_not_complete > 0) {
|
|
||||||
// calculate progress
|
|
||||||
float min_diff = _min_temperature_rise;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
float cur_diff = _data[uorb_index].high_temp - _data[uorb_index].low_temp;
|
|
||||||
|
|
||||||
if (cur_diff < min_diff) {
|
|
||||||
min_diff = cur_diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return math::min(100, (int)(min_diff / _min_temperature_rise * 100.f));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 110;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TemperatureCalibrationBaro::finish()
|
int TemperatureCalibrationBaro::finish()
|
||||||
{
|
{
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
||||||
@@ -179,7 +152,7 @@ int TemperatureCalibrationBaro::finish_sensor_instance(PerSensorData &data, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
double res[POLYFIT_ORDER + 1] = {};
|
double res[POLYFIT_ORDER + 1] = {};
|
||||||
data.P.fit(res);
|
data.P[0].fit(res);
|
||||||
res[POLYFIT_ORDER] =
|
res[POLYFIT_ORDER] =
|
||||||
0.0; // normalise the correction to be zero at the reference temperature by setting the X^0 coefficient to zero
|
0.0; // normalise the correction to be zero at the reference temperature by setting the X^0 coefficient to zero
|
||||||
PX4_INFO("Result baro %u %.20f %.20f %.20f %.20f %.20f %.20f", sensor_index, (double)res[0],
|
PX4_INFO("Result baro %u %.20f %.20f %.20f %.20f %.20f %.20f", sensor_index, (double)res[0],
|
||||||
|
|||||||
@@ -39,17 +39,12 @@
|
|||||||
#define POLYFIT_ORDER 5
|
#define POLYFIT_ORDER 5
|
||||||
|
|
||||||
|
|
||||||
class TemperatureCalibrationBaro : public TemperatureCalibrationBase
|
class TemperatureCalibrationBaro : public TemperatureCalibrationCommon<1, POLYFIT_ORDER>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TemperatureCalibrationBaro(float min_temperature_rise);
|
TemperatureCalibrationBaro(float min_temperature_rise);
|
||||||
virtual ~TemperatureCalibrationBaro();
|
virtual ~TemperatureCalibrationBaro();
|
||||||
|
|
||||||
/**
|
|
||||||
* @see TemperatureCalibrationBase::update()
|
|
||||||
*/
|
|
||||||
int update();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see TemperatureCalibrationBase::finish()
|
* @see TemperatureCalibrationBase::finish()
|
||||||
*/
|
*/
|
||||||
@@ -62,29 +57,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct PerSensorData {
|
virtual int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
||||||
float sensor_sample_filt[2];
|
|
||||||
polyfitter < POLYFIT_ORDER + 1 > P;
|
|
||||||
unsigned hot_soak_sat = 0;
|
|
||||||
uint32_t device_id = 0;
|
|
||||||
bool cold_soaked = false;
|
|
||||||
bool hot_soaked = false;
|
|
||||||
bool tempcal_complete = false;
|
|
||||||
float low_temp = 0.f;
|
|
||||||
float high_temp = 0.f;
|
|
||||||
float ref_temp = 0.f;
|
|
||||||
};
|
|
||||||
|
|
||||||
PerSensorData _data[SENSOR_COUNT_MAX];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* update a single sensor instance
|
|
||||||
* @return 0 when done, 1 not finished yet
|
|
||||||
*/
|
|
||||||
inline int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
|
||||||
|
|
||||||
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
||||||
|
|
||||||
int _num_sensor_instances;
|
|
||||||
int _sensor_subs[SENSOR_COUNT_MAX];
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,11 +41,14 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <px4_log.h>
|
#include <px4_log.h>
|
||||||
|
#include <mathlib/mathlib.h>
|
||||||
|
|
||||||
|
#include "polyfit.hpp"
|
||||||
|
|
||||||
#define SENSOR_COUNT_MAX 3
|
#define SENSOR_COUNT_MAX 3
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for temperature calibration types (for all different sensor types)
|
* Base class for temperature calibration types with abstract methods (for all different sensor types)
|
||||||
*/
|
*/
|
||||||
class TemperatureCalibrationBase
|
class TemperatureCalibrationBase
|
||||||
{
|
{
|
||||||
@@ -99,3 +102,71 @@ int TemperatureCalibrationBase::set_parameter(const char *format_str, unsigned i
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
** class TemperatureCalibrationCommon
|
||||||
|
* Common base class for all sensor types, contains shared code & data.
|
||||||
|
*/
|
||||||
|
template <int Dim, int PolyfitOrder>
|
||||||
|
class TemperatureCalibrationCommon : public TemperatureCalibrationBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TemperatureCalibrationCommon(float min_temperature_rise)
|
||||||
|
: TemperatureCalibrationBase(min_temperature_rise) {}
|
||||||
|
|
||||||
|
virtual ~TemperatureCalibrationCommon() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see TemperatureCalibrationBase::update()
|
||||||
|
*/
|
||||||
|
int update()
|
||||||
|
{
|
||||||
|
int num_not_complete = 0;
|
||||||
|
|
||||||
|
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
||||||
|
num_not_complete += update_sensor_instance(_data[uorb_index], _sensor_subs[uorb_index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num_not_complete > 0) {
|
||||||
|
// calculate progress
|
||||||
|
float min_diff = _min_temperature_rise;
|
||||||
|
|
||||||
|
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
||||||
|
float cur_diff = _data[uorb_index].high_temp - _data[uorb_index].low_temp;
|
||||||
|
|
||||||
|
if (cur_diff < min_diff) {
|
||||||
|
min_diff = cur_diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return math::min(100, (int)(min_diff / _min_temperature_rise * 100.f));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 110;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
struct PerSensorData {
|
||||||
|
float sensor_sample_filt[Dim + 1]; ///< last value is the temperature
|
||||||
|
polyfitter < PolyfitOrder + 1 > P[Dim];
|
||||||
|
unsigned hot_soak_sat = 0;
|
||||||
|
uint32_t device_id = 0;
|
||||||
|
bool cold_soaked = false;
|
||||||
|
bool hot_soaked = false;
|
||||||
|
bool tempcal_complete = false;
|
||||||
|
float low_temp = 0.f;
|
||||||
|
float high_temp = 0.f;
|
||||||
|
float ref_temp = 0.f;
|
||||||
|
};
|
||||||
|
|
||||||
|
PerSensorData _data[SENSOR_COUNT_MAX];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update a single sensor instance
|
||||||
|
* @return 0 when done, 1 not finished yet
|
||||||
|
*/
|
||||||
|
virtual int update_sensor_instance(PerSensorData &data, int sensor_sub) = 0;
|
||||||
|
|
||||||
|
int _num_sensor_instances;
|
||||||
|
int _sensor_subs[SENSOR_COUNT_MAX];
|
||||||
|
};
|
||||||
|
|||||||
@@ -44,8 +44,13 @@
|
|||||||
#include "gyro.h"
|
#include "gyro.h"
|
||||||
|
|
||||||
TemperatureCalibrationGyro::TemperatureCalibrationGyro(float min_temperature_rise, int gyro_subs[], int num_gyros)
|
TemperatureCalibrationGyro::TemperatureCalibrationGyro(float min_temperature_rise, int gyro_subs[], int num_gyros)
|
||||||
: TemperatureCalibrationBase(min_temperature_rise), _num_sensor_instances(num_gyros), _sensor_subs(gyro_subs)
|
: TemperatureCalibrationCommon(min_temperature_rise)
|
||||||
{
|
{
|
||||||
|
for (int i = 0; i < num_gyros; ++i) {
|
||||||
|
_sensor_subs[i] = gyro_subs[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
_num_sensor_instances = num_gyros;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,33 +132,6 @@ int TemperatureCalibrationGyro::update_sensor_instance(PerSensorData &data, int
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TemperatureCalibrationGyro::update()
|
|
||||||
{
|
|
||||||
|
|
||||||
int num_not_complete = 0;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
num_not_complete += update_sensor_instance(_data[uorb_index], _sensor_subs[uorb_index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_not_complete > 0) {
|
|
||||||
// calculate progress
|
|
||||||
float min_diff = _min_temperature_rise;
|
|
||||||
|
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
|
||||||
float cur_diff = _data[uorb_index].high_temp - _data[uorb_index].low_temp;
|
|
||||||
|
|
||||||
if (cur_diff < min_diff) {
|
|
||||||
min_diff = cur_diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return math::min(100, (int)(min_diff / _min_temperature_rise * 100.f));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 110;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TemperatureCalibrationGyro::finish()
|
int TemperatureCalibrationGyro::finish()
|
||||||
{
|
{
|
||||||
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
for (unsigned uorb_index = 0; uorb_index < _num_sensor_instances; uorb_index++) {
|
||||||
|
|||||||
@@ -36,17 +36,12 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "polyfit.hpp"
|
#include "polyfit.hpp"
|
||||||
|
|
||||||
class TemperatureCalibrationGyro : public TemperatureCalibrationBase
|
class TemperatureCalibrationGyro : public TemperatureCalibrationCommon<3, 3>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TemperatureCalibrationGyro(float min_temperature_rise, int gyro_subs[], int num_gyros);
|
TemperatureCalibrationGyro(float min_temperature_rise, int gyro_subs[], int num_gyros);
|
||||||
virtual ~TemperatureCalibrationGyro() {}
|
virtual ~TemperatureCalibrationGyro() {}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see TemperatureCalibrationBase::update()
|
|
||||||
*/
|
|
||||||
int update();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see TemperatureCalibrationBase::finish()
|
* @see TemperatureCalibrationBase::finish()
|
||||||
*/
|
*/
|
||||||
@@ -59,29 +54,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct PerSensorData {
|
virtual int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
||||||
float sensor_sample_filt[4];
|
|
||||||
polyfitter<4> P[3];
|
|
||||||
unsigned hot_soak_sat = 0;
|
|
||||||
uint32_t device_id = 0;
|
|
||||||
bool cold_soaked = false;
|
|
||||||
bool hot_soaked = false;
|
|
||||||
bool tempcal_complete = false;
|
|
||||||
float low_temp = 0.f;
|
|
||||||
float high_temp = 0.f;
|
|
||||||
float ref_temp = 0.f;
|
|
||||||
};
|
|
||||||
|
|
||||||
PerSensorData _data[SENSOR_COUNT_MAX];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* update a single sensor instance
|
|
||||||
* @return 0 when done, 1 not finished yet
|
|
||||||
*/
|
|
||||||
inline int update_sensor_instance(PerSensorData &data, int sensor_sub);
|
|
||||||
|
|
||||||
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
inline int finish_sensor_instance(PerSensorData &data, int sensor_index);
|
||||||
|
|
||||||
int _num_sensor_instances;
|
|
||||||
int *_sensor_subs;
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user