Program Listing for File surface_dynamics.cc¶
↰ Return to documentation for file (dynamics/surface_dynamics.cc)
#include "lupnt/dynamics/surface_dynamics.h"
#include "lupnt/core/asset_factory.h"
#include "lupnt/core/definitions.h"
#include "lupnt/interfaces/yaml.h"
#include "lupnt/numerics/math_utils.h"
namespace lupnt {
// StaticDynamics
StaticDynamics::StaticDynamics() : Dynamics() {}
StaticDynamics::StaticDynamics(Config& config) : Dynamics(config) {}
State StaticDynamics::Propagate(const State& x0, Real t0, Real tf, const State* u) {
(void)t0;
(void)tf;
(void)u;
return x0;
}
REGISTER_FACTORY_CLASS(Dynamics, StaticDynamics)
// Surface2DDynamics
SurfaceDynamics2D::SurfaceDynamics2D() : Dynamics() {}
SurfaceDynamics2D::SurfaceDynamics2D(Config& config) : Dynamics(config) {
if (config["seed"]) {
seed_ = config["seed"].as<int>();
rng_ = MakePtr<std::mt19937>(seed_);
}
Q_.setZero();
if (config["sigma_r"]) {
Real sigma_r = config["sigma_r"].as<Real>();
Q_(0, 0) = sigma_r * sigma_r;
Q_(1, 1) = sigma_r * sigma_r;
add_noise_ = true;
}
if (config["sigma_theta"]) {
Real sigma_theta = RAD * config["sigma_theta"].as<Real>();
Q_(2, 2) = sigma_theta * sigma_theta;
add_noise_ = true;
}
}
State SurfaceDynamics2D::Propagate(const State& x0, Real t0, Real tf, const State* u) {
LUPNT_CHECK(u, "Control is required", "Surface2DDynamics");
LUPNT_CHECK(u->size() == 2, "Control must be a 2D vector", "Surface2DDynamics");
Real dt = tf - t0;
State xf = x0;
xf(0) += dt * (*u)(0) * cos(x0(2));
xf(1) += dt * (*u)(0) * sin(x0(2));
xf(2) += dt * (*u)(1);
if (add_noise_) xf += SampleMvNormal(Vec3d::Zero(), Q_ * dt * dt, 1, rng_.get()).transpose();
return xf;
}
REGISTER_FACTORY_CLASS(Dynamics, SurfaceDynamics2D)
} // namespace lupnt