Program Listing for File imu_dynamics.cc¶
↰ Return to documentation for file (dynamics/imu_dynamics.cc)
#include "lupnt/dynamics/imu_dynamics.h"
#include "lupnt/core/constants.h"
#include "lupnt/devices/imu.h"
#include "lupnt/numerics/math_utils.h"
#include "lupnt/states/state.h"
namespace lupnt {
ImuDynamics::ImuDynamics() { imu_model_ = ImuModel::UNDEFINED; }
ImuDynamics::ImuDynamics(Config& config) {
imu_model_ = ImuModel::UNDEFINED;
if (config["model"]) {
imu_model_ = enum_cast<ImuModel>(config["model"].as<std::string>()).value();
}
}
void ImuDynamics::SetModel(ImuModel imu_model) { imu_model_ = imu_model; }
ImuModel ImuDynamics::GetModel() const { return imu_model_; }
State ImuDynamics::Propagate(const State& x0, Real t0, Real tf, const State* u) {
LUPNT_CHECK(x0.GetType() == ImuState::TYPE || x0.GetType() == UNDEFINED,
"State must be of type ImuState", "ImuDynamics");
LUPNT_CHECK(x0.size() == 6, "State must be 6-dimensional", "ImuDynamics");
LUPNT_CHECK(u == nullptr, "ImuDynamics does not support control inputs", "ImuDynamics");
ImuParameters imu_params = Imu::GetParameters(imu_model_);
Real sqrt_f = 1.0 / sqrt(tf - t0);
ImuState imu_f;
ImuState imu_0 = x0;
for (int i = 0; i < 3; i++) {
imu_f.b_w()(i) += SampleNormal(imu_0.b_w()(i), imu_params.sigma_w_bias / sqrt_f, rng_.get());
imu_f.b_a()(i) += SampleNormal(imu_0.b_a()(i), imu_params.sigma_a_bias / sqrt_f, rng_.get());
}
return imu_f;
}
} // namespace lupnt