10 #include <mrpt/core/format.h> 29 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF) 30 #include <mvsim/mvsim-msgs/GenericObservation.pb.h> 31 #include <mvsim/mvsim-msgs/ObservationLidar2D.pb.h> 34 using namespace mvsim;
42 static bool done =
false;
77 const mrpt::opengl::CSetOfObjects::Ptr& o)
100 if (!root)
throw runtime_error(
"[SensorBase::factory] XML node is nullptr");
101 if (0 != strcmp(root->
name(),
"sensor"))
102 throw runtime_error(mrpt::format(
103 "[SensorBase::factory] XML root element is '%s' ('sensor' " 109 if (!sensor_class || !sensor_class->
value())
111 "[VehicleBase::factory] Missing mandatory attribute 'class' in " 114 const string sName = string(sensor_class->
value());
120 throw runtime_error(mrpt::format(
121 "[SensorBase::factory] Unknown sensor type '%s'", root->
name()));
124 we->parseVisual(*root);
131 const std::map<std::string, std::string>& varValues)
135 if (node ==
nullptr)
return false;
147 bool publishEnabled =
true;
149 auxPar[
"enabled"] =
TParamEntry(
"%bool", &publishEnabled);
161 const std::shared_ptr<mrpt::obs::CObservation>& obs,
170 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF) 173 mvsim_msgs::GenericObservation msg;
174 msg.set_unixtimestamp(mrpt::Clock::toDouble(obs->timestamp));
177 std::vector<uint8_t> serializedData;
178 mrpt::serialization::ObjectToOctetVector(obs.get(), serializedData);
180 msg.set_mrptserializedobservation(
181 serializedData.data(), serializedData.size());
192 rawlog_io_ = std::make_shared<mrpt::io::CFileGZOutputStream>(
196 auto arch = mrpt::serialization::archiveFrom(*
rawlog_io_);
202 const std::shared_ptr<mrpt::obs::CObservation2DRangeScan>& obs,
205 using namespace std::string_literals;
207 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF) 210 mvsim_msgs::ObservationLidar2D msg;
211 msg.set_unixtimestamp(mrpt::Clock::toDouble(obs->timestamp));
214 msg.set_aperture(obs->aperture);
215 for (
size_t i = 0; i < obs->getScanSize(); i++)
217 msg.add_scanranges(obs->getScanRange(i));
218 msg.add_validranges(obs->getScanRangeValidity(i));
221 msg.set_ccw(obs->rightToLeft);
222 msg.set_maxrange(obs->maxRange);
224 const auto& p = obs->sensorPose;
225 auto sp = msg.mutable_sensorpose();
229 sp->set_yaw(p.yaw());
230 sp->set_pitch(p.pitch());
231 sp->set_roll(p.roll());
242 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF) 257 varValues_[
"NAME"] =
name_;
273 if (!
name_.empty())
return;
276 if (
auto v = dynamic_cast<VehicleBase*>(&
vehicle_); v)
277 nextIdx = v->getSensors().size() + 1;
279 name_ = mrpt::format(
280 "%s%u", prefix.c_str(),
static_cast<unsigned int>(nextIdx));
286 const double timeEpsilon = 1e-6;
295 <<
"[mvsim::SensorBase] WARNING: " 296 "At least one sensor sample has been lost due to too coarse " 297 "discrete time steps. sensor_period=" 298 <<
sensor_period_ <<
" [s], (simul_time - sensor_last_timestamp)=" static auto gAllSensorsFOVViz
This file contains rapidxml parser and DOM implementation.
std::string publishTopic_
std::map< std::string, TParamEntry > TParameterDefinitions
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions ¶ms, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
A 2D lidar scanner, with FOV up to 360 degrees.
static std::shared_ptr< mrpt::opengl::CSetOfObjects > GetAllSensorsFOVViz()
static void RegisterSensorFOVViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
static std::shared_ptr< mrpt::opengl::CSetOfObjects > GetAllSensorsOriginViz()
double simul_time
Current time in the simulated world.
void publishTopic(const std::string &topicName, const google::protobuf::Message &msg)
bool should_simulate_sensor(const TSimulContext &context)
std::map< std::string, std::string > varValues_
Filled in by SensorBase::loadConfigFrom()
void parse_xmlnode_attribs(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions ¶ms, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="")
bool parseSensorPublish(const rapidxml::xml_node< char > *node, const std::map< std::string, std::string > &varValues)
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
static void RegisterSensorOriginViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
Simulable & vehicle_
The vehicle this sensor is attached to.
void registerOnServer(mvsim::Client &c) override
std::shared_ptr< mrpt::io::CFileGZOutputStream > rawlog_io_
void reportNewObservation(const std::shared_ptr< mrpt::obs::CObservation > &obs, const TSimulContext &context)
std::shared_ptr< SensorBase > Ptr
static std::mutex gAllSensorVizMtx
void register_all_sensors()
const std::map< std::string, std::string > & user_defined_variables() const
virtual void registerOnServer(mvsim::Client &c)
An Inertial Measurement Unit (IMU) sensor.
const std::string & getName() const
void dispatchOnObservation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root)
double sensor_last_timestamp_
A 3D LiDAR sensor, with 360 degrees horizontal fielf-of-view, and a configurable vertical FOV...
TClassFactory_sensors classFactory_sensors
void advertiseTopic(const std::string &topicName)
#define REGISTER_SENSOR(TEXTUAL_NAME, CLASS_NAME)
Ptr create(const std::string &class_name, ARG1 a1) const
This file contains rapidxml printer implementation.
void reportNewObservation_lidar_2d(const std::shared_ptr< mrpt::obs::CObservation2DRangeScan > &obs, const TSimulContext &context)
mvsim::Client & commsClient()
std::string save_to_rawlog_
SensorBase(Simulable &vehicle)
static SensorBase::Ptr factory(Simulable &parent, const rapidxml::xml_node< char > *xml_node)
void make_sure_we_have_a_name(const std::string &prefix)
Assign a sensible default name/sensor label if none is provided:
static auto gAllSensorsOriginViz
xml_attribute< Ch > * first_attribute(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
World * getSimulableWorldObject()