Program Listing for File measurement.h¶
↰ Return to documentation for file (measurements/measurement.h)
#pragma once
#include "lupnt/core/definitions.h"
#include "lupnt/numerics/filters/filter.h"
#include "lupnt/states/state.h"
namespace lupnt {
struct MeasData {
Real timestamp = 0.0;
VecXd value;
MatXd covariance;
};
struct ImuMeasurement {
Real timestamp = 0.0;
Vec3 w = Vec3::Zero();
Vec3 a = Vec3::Zero();
};
class Measurement {
public:
virtual ~Measurement() = default;
virtual MeasData Compute(const State& x, MatXd* H = nullptr) const = 0;
virtual Ptr<Measurement> Clone() const = 0;
virtual FilterMeasurementFunction CreateFunction() const {
Ptr<Measurement> self = Clone();
return [self](const State& x, MatXd* H, MatXd* R) -> VecXd {
MeasData md = self->Compute(x, H);
if (R != nullptr) *R = md.covariance;
return md.value;
};
}
};
template <typename Derived> class MeasurementClone : public Measurement {
public:
Ptr<Measurement> Clone() const override {
return MakePtr<Derived>(static_cast<const Derived&>(*this));
}
};
struct NavErrorContext {
Vec3d r = Vec3d::Zero();
Vec3d v = Vec3d::Zero();
Mat3d R_b2n = Mat3d::Identity();
double clock_bias_s = 0.0;
double clock_drift_sps = 0.0;
int error_state_size = 0;
};
class ErrorStateMeasurement {
public:
virtual ~ErrorStateMeasurement() = default;
virtual MeasData Compute(const NavErrorContext& nominal, MatXd* H = nullptr) const = 0;
};
} // namespace lupnt