IMU.cpp
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #include <mrpt/core/lock_helper.h>
11 #include <mrpt/opengl/stock_objects.h>
12 #include <mrpt/version.h>
13 #include <mvsim/Sensors/IMU.h>
14 #include <mvsim/VehicleBase.h>
15 #include <mvsim/World.h>
16 
17 #include "xml_utils.h"
18 
19 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
20 // #include <mvsim/mvsim-msgs/ObservationXXX.pb.h>
21 #endif
22 
23 using namespace mvsim;
24 using namespace rapidxml;
25 
26 IMU::IMU(Simulable& parent, const rapidxml::xml_node<char>* root) : SensorBase(parent)
27 {
29 }
30 
32 
34 {
37 
38  TParameterDefinitions params;
39  params["pose"] = TParamEntry("%pose2d_ptr3d", &obs_model_.sensorPose);
40  params["pose_3d"] = TParamEntry("%pose3d", &obs_model_.sensorPose);
41  params["sensor_period"] = TParamEntry("%lf", &sensor_period_);
42  params["angular_velocity_std_noise"] = TParamEntry("%lf", &angularVelocityStdNoise_);
43  params["linear_acceleration_std_noise"] = TParamEntry("%lf", &linearAccelerationStdNoise_);
44 
45  // Parse XML params:
47 
48  // Pass params to the template obj:
49  obs_model_.sensorLabel = name_;
50 }
51 
53  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
54  [[maybe_unused]] const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
55  [[maybe_unused]] bool childrenOnly)
56 {
57  // 1st time?
58  if (!gl_sensor_origin_ && viz)
59  {
60  gl_sensor_origin_ = mrpt::opengl::CSetOfObjects::Create();
61 #if MRPT_VERSION >= 0x270
62  gl_sensor_origin_->castShadows(false);
63 #endif
64  gl_sensor_origin_corner_ = mrpt::opengl::stock_objects::CornerXYZSimple(0.15f);
65 
67 
68  gl_sensor_origin_->setVisibility(false);
69  viz->get().insert(gl_sensor_origin_);
71  }
72 
73  const mrpt::poses::CPose3D p = vehicle_.getCPose3D() + obs_model_.sensorPose;
74  const auto pp = parent()->applyWorldRenderOffset(p);
75 
76  if (gl_sensor_origin_) gl_sensor_origin_->setPose(pp);
77  if (glCustomVisual_) glCustomVisual_->setPose(pp);
78 }
79 
80 void IMU::simul_pre_timestep([[maybe_unused]] const TSimulContext& context) {}
81 
82 // Simulate sensor AFTER timestep, with the updated vehicle dynamical state:
84 {
86 
88  {
89  internal_simulate_imu(context);
90  }
91  // Keep sensor global pose up-to-date:
92  const auto& p = vehicle_.getPose();
93  const auto globalSensorPose = p + obs_model_.sensorPose.asTPose();
94  Simulable::setPose(globalSensorPose, false /*do not notify*/);
95 }
96 
98 {
99  using mrpt::obs::CObservationIMU;
100 
101  auto tle = mrpt::system::CTimeLoggerEntry(world_->getTimeLogger(), "sensor.IMU");
102 
103  auto outObs = CObservationIMU::Create(obs_model_);
104 
105  outObs->timestamp = world_->get_simul_timestamp();
106  outObs->sensorLabel = name_;
107 
108  // angular velocity:
109  mrpt::math::TVector3D w(0.0, 0.0, vehicle_.getTwist().omega);
110  rng_.drawGaussian1DVector(w, 0.0, angularVelocityStdNoise_);
111 
112  outObs->set(mrpt::obs::IMU_WX, w.x);
113  outObs->set(mrpt::obs::IMU_WY, w.y);
114  outObs->set(mrpt::obs::IMU_WZ, w.z);
115 
116  // linear acceleration:
117  const auto g = mrpt::math::TVector3D(.0, .0, -world_->get_gravity());
118 
119  mrpt::math::TVector3D linAccNoise(0, 0, 0);
120  rng_.drawGaussian1DVector(linAccNoise, 0.0, linearAccelerationStdNoise_);
121 
122  const mrpt::math::TVector3D linAccLocal =
123  vehicle_.getPose().inverseComposePoint(vehicle_.getLinearAcceleration() + g) + linAccNoise;
124 
125  outObs->set(mrpt::obs::IMU_X_ACC, linAccLocal.x);
126  outObs->set(mrpt::obs::IMU_Y_ACC, linAccLocal.y);
127  outObs->set(mrpt::obs::IMU_Z_ACC, linAccLocal.z);
128 
129  // Save:
130  {
131  std::lock_guard<std::mutex> csl(last_obs_cs_);
132  last_obs_ = std::move(outObs);
133  }
134 
135  // publish as generic Protobuf (mrpt serialized) object:
137 }
138 
139 void IMU::notifySimulableSetPose(const mrpt::math::TPose3D&)
140 {
141  // The editor has moved the sensor in global coordinates.
142  // Convert back to local:
143  // const auto& p = vehicle_.getPose();
144  // sensor_params_.sensorPose = mrpt::poses::CPose3D(newPose - p);
145 }
146 
148 {
149  using namespace std::string_literals;
150 
152 
153 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
154  // Topic:
155  if (!publishTopic_.empty())
156  {
157  // c.advertiseTopic<mvsim_msgs::ObservationIMU>(publishTopic_ +
158  // "_scan"s);
159  }
160 #endif
161 }
mvsim::VisualObject::parent
World * parent()
Definition: VisualObject.h:51
mvsim
Definition: Client.h:21
mvsim::VisualObject::world_
World * world_
Definition: VisualObject.h:73
mvsim::SensorBase::make_sure_we_have_a_name
void make_sure_we_have_a_name(const std::string &prefix)
Assign a sensible default name/sensor label if none is provided:
Definition: SensorBase.cpp:252
mvsim::SensorBase::varValues_
std::map< std::string, std::string > varValues_
Filled in by SensorBase::loadConfigFrom()
Definition: SensorBase.h:97
mvsim::SensorBase::reportNewObservation
void reportNewObservation(const std::shared_ptr< mrpt::obs::CObservation > &obs, const TSimulContext &context)
Definition: SensorBase.cpp:159
mvsim::IMU::last_obs_
mrpt::obs::CObservationIMU::Ptr last_obs_
Definition: IMU.h:65
mvsim::TParamEntry
Definition: TParameterDefinitions.h:38
mvsim::parse_xmlnode_children_as_param
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions &params, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
Definition: xml_utils.cpp:215
mvsim::IMU::internal_simulate_imu
void internal_simulate_imu(const TSimulContext &context)
Definition: IMU.cpp:97
mvsim::IMU::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: IMU.cpp:83
mvsim::World::applyWorldRenderOffset
mrpt::math::TPose3D applyWorldRenderOffset(mrpt::math::TPose3D p) const
Definition: World.h:631
World.h
mvsim::Simulable::getCPose3D
mrpt::poses::CPose3D getCPose3D() const
Alternative to getPose()
Definition: Simulable.cpp:157
mvsim::Client
Definition: Client.h:48
mvsim::SensorBase::vehicle_
Simulable & vehicle_
The vehicle this sensor is attached to.
Definition: SensorBase.h:82
mvsim::SensorBase
Virtual base class for all sensors.
Definition: SensorBase.h:34
mvsim::IMU::internalGuiUpdate
void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, [[maybe_unused]] const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, [[maybe_unused]] bool childrenOnly) override
Definition: IMU.cpp:52
mvsim::IMU::rng_
mrpt::random::CRandomGenerator rng_
Definition: IMU.h:69
mvsim::IMU::last_obs_cs_
std::mutex last_obs_cs_
Definition: IMU.h:62
mvsim::World::get_gravity
double get_gravity() const
Definition: World.h:154
mvsim::SensorBase::registerOnServer
void registerOnServer(mvsim::Client &c) override
Definition: SensorBase.cpp:220
xml_utils.h
f
f
mvsim::SensorBase::should_simulate_sensor
bool should_simulate_sensor(const TSimulContext &context)
Definition: SensorBase.cpp:262
mvsim::IMU::gl_sensor_origin_
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_origin_
Definition: IMU.h:67
mvsim::IMU::notifySimulableSetPose
void notifySimulableSetPose(const mrpt::math::TPose3D &newPose) override
Definition: IMU.cpp:139
VehicleBase.h
mvsim::IMU::gl_sensor_origin_corner_
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_origin_corner_
Definition: IMU.h:67
mvsim::IMU::linearAccelerationStdNoise_
double linearAccelerationStdNoise_
[m/s²]
Definition: IMU.h:56
rapidxml
Definition: rapidxml.hpp:57
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::IMU::angularVelocityStdNoise_
double angularVelocityStdNoise_
[rad/s]
Definition: IMU.h:55
mvsim::World::get_simul_timestamp
mrpt::Clock::time_point get_simul_timestamp() const
Definition: World.h:137
mvsim::IMU::obs_model_
mrpt::obs::CObservationIMU obs_model_
Definition: IMU.h:60
mvsim::TParameterDefinitions
std::map< std::string, TParamEntry > TParameterDefinitions
Definition: TParameterDefinitions.h:64
mvsim::IMU::registerOnServer
void registerOnServer(mvsim::Client &c) override
Definition: IMU.cpp:147
mvsim::Simulable::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:64
mvsim::IMU::loadConfigFrom
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root) override
Definition: IMU.cpp:33
mvsim::Simulable::name_
std::string name_
Definition: Simulable.h:145
mvsim::SensorBase::sensor_period_
double sensor_period_
Definition: SensorBase.h:88
mvsim::IMU::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: IMU.cpp:80
mvsim::SensorBase::publishTopic_
std::string publishTopic_
Definition: SensorBase.h:94
mvsim::Simulable::getLinearAcceleration
mrpt::math::TVector3D getLinearAcceleration() const
Definition: Simulable.cpp:504
mvsim::Simulable::setPose
void setPose(const mrpt::math::TPose3D &p, bool notifyChange=true) const
Definition: Simulable.cpp:474
mvsim::IMU::IMU
IMU(Simulable &parent, const rapidxml::xml_node< char > *root)
Definition: IMU.cpp:26
rapidxml::xml_node< char >
mvsim::Simulable
Definition: Simulable.h:39
mvsim::SensorBase::loadConfigFrom
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root)
Definition: SensorBase.cpp:231
mvsim::Simulable::getPose
mrpt::math::TPose3D getPose() const
Definition: Simulable.cpp:490
mvsim::Simulable::getTwist
mrpt::math::TTwist2D getTwist() const
Definition: Simulable.cpp:498
IMU.h
mvsim::World::getTimeLogger
mrpt::system::CTimeLogger & getTimeLogger()
Definition: World.h:321
root
root
mvsim::VisualObject::glCustomVisual_
std::shared_ptr< mrpt::opengl::CSetOfObjects > glCustomVisual_
Definition: VisualObject.h:77
mvsim::SensorBase::RegisterSensorOriginViz
static void RegisterSensorOriginViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
Definition: SensorBase.cpp:78
mvsim::IMU::~IMU
virtual ~IMU()
Definition: IMU.cpp:31


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08