Go to the documentation of this file.
10 #include <mrpt/core/format.h>
30 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
31 #include <mvsim/mvsim-msgs/GenericObservation.pb.h>
32 #include <mvsim/mvsim-msgs/ObservationLidar2D.pb.h>
35 using namespace mvsim;
43 static bool done =
false;
86 Simulable(vehicle.getSimulableWorldObject()),
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());
121 mrpt::format(
"[SensorBase::factory] Unknown sensor type '%s'",
root->name()));
124 we->parseVisual(*
root);
134 if (node ==
nullptr)
return false;
146 bool publishEnabled =
true;
148 auxPar[
"enabled"] =
TParamEntry(
"%bool", &publishEnabled);
160 const std::shared_ptr<mrpt::obs::CObservation>& obs,
const TSimulContext& context)
168 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
171 mvsim_msgs::GenericObservation msg;
172 msg.set_unixtimestamp(mrpt::Clock::toDouble(obs->timestamp));
175 std::vector<uint8_t> serializedData;
176 mrpt::serialization::ObjectToOctetVector(obs.get(), serializedData);
178 msg.set_mrptserializedobservation(serializedData.data(), serializedData.size());
186 const std::shared_ptr<mrpt::obs::CObservation2DRangeScan>& obs,
const TSimulContext& context)
188 using namespace std::string_literals;
190 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
193 mvsim_msgs::ObservationLidar2D msg;
194 msg.set_unixtimestamp(mrpt::Clock::toDouble(obs->timestamp));
197 msg.set_aperture(obs->aperture);
198 for (
size_t i = 0; i < obs->getScanSize(); i++)
200 msg.add_scanranges(obs->getScanRange(i));
201 msg.add_validranges(obs->getScanRangeValidity(i));
204 msg.set_ccw(obs->rightToLeft);
205 msg.set_maxrange(obs->maxRange);
207 const auto& p = obs->sensorPose;
208 auto sp = msg.mutable_sensorpose();
212 sp->set_yaw(p.yaw());
213 sp->set_pitch(p.pitch());
214 sp->set_roll(p.roll());
225 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
254 if (!
name_.empty())
return;
257 if (
auto v =
dynamic_cast<VehicleBase*
>(&
vehicle_); v) nextIdx = v->getSensors().size() + 1;
259 name_ = mrpt::format(
"%s%u", prefix.c_str(),
static_cast<unsigned int>(nextIdx));
265 const double timeEpsilon = 1e-6;
271 std::cout <<
"[mvsim::SensorBase] WARNING: "
272 "At least one sensor sample has been lost due to too coarse "
273 "discrete time steps. sensor_period="
274 <<
sensor_period_ <<
" [s], (simul_time - sensor_last_timestamp)="
void reportNewObservation_lidar_2d(const std::shared_ptr< mrpt::obs::CObservation2DRangeScan > &obs, const TSimulContext &context)
const std::string & getName() const
void make_sure_we_have_a_name(const std::string &prefix)
Assign a sensible default name/sensor label if none is provided:
std::map< std::string, std::string > varValues_
Filled in by SensorBase::loadConfigFrom()
void reportNewObservation(const std::shared_ptr< mrpt::obs::CObservation > &obs, const TSimulContext &context)
void dispatchOnObservation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
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)
static auto gAllSensorsOriginViz
Simulable & vehicle_
The vehicle this sensor is attached to.
Ptr create(const std::string &class_name, ARG1 a1) const
double simul_time
Current time in the simulated world.
void registerOnServer(mvsim::Client &c) override
static std::shared_ptr< mrpt::opengl::CSetOfObjects > GetAllSensorsOriginViz()
#define REGISTER_SENSOR(TEXTUAL_NAME, CLASS_NAME)
bool should_simulate_sensor(const TSimulContext &context)
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
std::map< std::string, TParamEntry > TParameterDefinitions
static SensorBase::Ptr factory(Simulable &parent, const rapidxml::xml_node< char > *xml_node)
static std::mutex gAllSensorVizMtx
std::shared_ptr< SensorBase > Ptr
virtual void registerOnServer(mvsim::Client &c)
std::string publishTopic_
SensorBase(Simulable &vehicle)
static std::shared_ptr< mrpt::opengl::CSetOfObjects > GetAllSensorsFOVViz()
const std::map< std::string, std::string > & user_defined_variables() const
double sensor_last_timestamp_
void advertiseTopic(const std::string &topicName)
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root)
TClassFactory_sensors classFactory_sensors
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="")
void register_all_sensors()
static void RegisterSensorFOVViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
static void RegisterSensorOriginViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
static auto gAllSensorsFOVViz
mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08