Go to the documentation of this file.
14 #include <mrpt/core/bits_math.h>
15 #include <mrpt/core/format.h>
16 #include <mrpt/gui/CDisplayWindowGUI.h>
17 #include <mrpt/img/CImage.h>
18 #include <mrpt/img/TColor.h>
19 #include <mrpt/io/CFileGZOutputStream.h>
20 #include <mrpt/math/TPoint3D.h>
21 #include <mrpt/obs/CObservation.h>
22 #include <mrpt/obs/CObservationImage.h>
23 #include <mrpt/obs/obs_frwds.h>
24 #include <mrpt/system/COutputLogger.h>
25 #include <mrpt/system/CTicTac.h>
26 #include <mrpt/system/CTimeLogger.h>
27 #include <mrpt/topography/data_types.h>
35 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
43 #include <unordered_map>
45 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
50 class SrvGetPoseAnswer;
52 class SrvSetPoseAnswer;
53 class SrvSetControllerTwist;
54 class SrvSetControllerTwistAnswer;
56 class SrvShutdownAnswer;
82 class World :
public mrpt::system::COutputLogger
112 const std::string& xml_text,
const std::string& fileNameForPath = std::string(
"."));
216 mrpt::opengl::COpenGLScene& viz, mrpt::opengl::COpenGLScene& physical);
297 using BlockList = std::multimap<std::string, Block::Ptr>;
360 std::function<
void(
const Simulable& ,
const mrpt::obs::CObservation::Ptr& )>;
376 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
410 std::set<float>
getElevationsAt(
const mrpt::math::TPoint2D& worldXY)
const;
422 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
496 mrpt::opengl::CSetOfObjects::Ptr
glUserObjsViz_ = mrpt::opengl::CSetOfObjects::Create();
519 {
"win_w", {
"%u", &
win_w}},
520 {
"win_h", {
"%u", &
win_h}},
521 {
"ortho", {
"%bool", &
ortho}},
525 {
"fov_deg", {
"%lf", &
fov_deg}},
616 {
"latitude", {
"%lf", &
georefCoord.lat.decimal_value}},
617 {
"longitude", {
"%lf", &
georefCoord.lon.decimal_value}},
691 return (
x == o.x &&
y == o.y);
695 static lut_2d_coordinates_t
xy_to_lut_coords(
const mrpt::math::TPoint2Df& p);
702 static_assert(
sizeof(int32_t) ==
sizeof(uint32_t));
706 const uint32_t* vec =
reinterpret_cast<const uint32_t*
>(&p);
707 return ((1 << 20) - 1) & (vec[0] * 73856093 ^ vec[1] * 19349663);
713 if (k1.x != k2.x)
return k1.x < k2.x;
719 std::unordered_map<lut_2d_coordinates_t, std::vector<Simulable::Ptr>,
LutIndexHash>;
741 nanogui::CheckBox*
cb =
nullptr;
767 mrpt::opengl::COpenGLScene::Ptr
worldVisual_ = mrpt::opengl::COpenGLScene::Create();
795 const Simulable& veh,
const std::shared_ptr<mrpt::obs::CObservation3DRangeScan>& obs);
797 const Simulable& veh,
const std::shared_ptr<mrpt::obs::CObservationImage>& obs);
800 const std::string& label,
const mrpt::img::CImage& im,
int winPosX);
908 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
910 mvsim_msgs::SrvSetPoseAnswer srv_set_pose(
const mvsim_msgs::SrvSetPose& req);
911 mvsim_msgs::SrvGetPoseAnswer srv_get_pose(
const mvsim_msgs::SrvGetPose& req);
912 mvsim_msgs::SrvSetControllerTwistAnswer srv_set_controller_twist(
913 const mvsim_msgs::SrvSetControllerTwist& req);
914 mvsim_msgs::SrvShutdownAnswer srv_shutdown(
const mvsim_msgs::SrvShutdown& req);
std::set< std::string > copy_of_objects_had_collision_
std::string follow_vehicle
Vehicle name to follow (empty=none)
double camera_elevation_deg
b2Body * getBox2DGroundBody()
mrpt::opengl::COpenGLScene::Ptr worldVisual_
void parse_tag_block(const XmlParserContext &ctx)
void parse_from(const rapidxml::xml_node< char > &node, COutputLogger &logger)
mrpt::poses::CPose3D applyWorldRenderOffset(mrpt::poses::CPose3D p) const
std::mutex reset_collision_flags_mtx_
std::mutex simulableObjectsMtx_
const LUTCache & getLUTCacheOfObjects() const
Ensure the cache is built and up-to-date, then return it:
XmlParserContext(const rapidxml::xml_node< char > *n, const std::string &basePath)
void enqueue_task_to_run_in_gui_thread(const std::function< void(void)> &f)
std::optional< double > simul_start_wallclock_time_
void parse_tag_lights(const XmlParserContext &ctx)
mrpt::topography::TUTMCoords utmRef
void setLightDirectionFromAzimuthElevation(const float azimuth, const float elevation)
std::multimap< std::string, VehicleBase::Ptr > VehicleList
void internal_simul_pre_step_terrain_elevation()
void registerCallbackOnObservation(const on_observation_callback_t &f)
const TParameterDefinitions params
void internalGraphicsLoopTasksForSimulation()
void internalPostSimulStepForTrajectory()
double max_slope_to_collide_
std::list< WorldElementBase::Ptr > WorldElementList
InfoPerObject gui_selectedObject
void dispatchOnObservation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
void register_tag_parser(const std::string &xmlTagName, void(World::*f)(const XmlParserContext &ctx))
mrpt::math::TPoint3D camera_point_to
const TParameterDefinitions params
void internalUpdate3DSceneObjects(mrpt::opengl::COpenGLScene &viz, mrpt::opengl::COpenGLScene &physical)
bool operator()(const lut_2d_coordinates_t &k1, const lut_2d_coordinates_t &k2) const noexcept
k1 < k2? for std::map containers
std::atomic_bool lastKeyEventValid_
void prepare_editor_window()
IMGUI_API bool Button(const char *label, const ImVec2 &size=ImVec2(0, 0))
void internal_GUI_thread()
mrpt::system::CTicTac timer_iteration_
static lut_2d_coordinates_t xy_to_lut_coords(const mrpt::math::TPoint2Df &p)
nanogui::Label * lbCpuUsage
auto & getListOfSimulableObjectsMtx()
SimulableList & getListOfSimulableObjects()
Always lock/unlock getListOfSimulableObjectsMtx() before using this:
void process_load_walls(const rapidxml::xml_node< char > &node)
mrpt::math::TPose3D applyWorldRenderOffset(mrpt::math::TPose3D p) const
auto & physical_objects_mtx()
float collisionThreshold() const
float getHighestElevationUnder(const mrpt::math::TPoint3Df &queryPt) const
TInfoPerCollidableobj()=default
void simulator_must_close(bool value)
float eye_distance_to_shadow_map_extension
[m/m]
void internal_process_pending_gui_user_tasks()
bool lut2d_objects_is_up_to_date_
void parse_tag_gui(const XmlParserContext &ctx)
void load_from_XML_file(const std::string &xmlFileNamePath)
float minimum_shadow_map_extension_ratio
[0,1]
bool evaluate_tag_if(const rapidxml::xml_node< char > &node) const
mrpt::math::TVector3D worldRenderOffset() const
(See docs for worldRenderOffset_)
double ground_truth_rate_
In Hz.
A rigid body. These are created via b2World::CreateBody.
double get_gravity() const
void internal_update_lut_cache() const
void internalOnObservation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
double world_to_enu_rotation
std::string save_to_rawlog_
bool sensor_has_to_create_egl_context()
void parse_tag_block_class(const XmlParserContext &ctx)
std::string save_ground_truth_trajectory_
std::function< void(const XmlParserContext &)> xml_tag_parser_function_t
void internal_gui_on_observation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
double camera_azimuth_deg
const std::vector< float > * wheel_heights
std::function< void(WorldElementBase &)> world_element_visitor_t
std::function< void(const Simulable &, const mrpt::obs::CObservation::Ptr &)> on_observation_callback_t
double force_scale
In meters/Newton.
void force_set_simul_time(double newSimulatedTime)
Normally should not be called by users, for internal use only.
std::function< void(Block &)> block_visitor_t
std::map< std::string, xml_tag_parser_function_t > xmlParsers_
double maxWorkableStepHeight
std::string msg_lines
Messages to show.
std::optional< double > gt_last_time_
const TParameterDefinitions params
void parse_tag_georeference(const XmlParserContext &ctx)
VehicleList & getListOfVehicles()
void parse_from(const rapidxml::xml_node< char > &node, COutputLogger &logger)
const SimulableList & getListOfSimulableObjects() const
const WorldElementList & getListOfWorldElements() const
SimulableList simulableObjects_
std::mutex guiMsgLinesMtx_
mrpt::gui::CDisplayWindowGUI::Ptr gui_win
void parse_from(const rapidxml::xml_node< char > &node, COutputLogger &logger)
void internal_gui_on_observation_image(const Simulable &veh, const std::shared_ptr< mrpt::obs::CObservationImage > &obs)
const std::string currentBasePath
mrpt::opengl::CSetOfObjects::Ptr guiUserObjectsPhysical_
typedef void(GLAD_API_PTR *GLDEBUGPROC)(GLenum source
mrpt::math::TPolygon2D contour
TUpdateGUIParams()=default
const VehicleList & getListOfVehicles() const
std::recursive_mutex worldPhysicalMtx_
std::string local_to_abs_path(const std::string &in_path) const
std::string serverAddress_
void load_from_XML(const std::string &xml_text, const std::string &fileNameForPath=std::string("."))
const GeoreferenceOptions & georeferenceOptions() const
mrpt::Clock::time_point get_simul_timestamp() const
const mrpt::math::TPoint3D & gui_mouse_point() const
double get_simul_time() const
std::string xmlPathToActualPath(const std::string &modelURI) const
std::vector< nanogui::Widget * > btns_selectedOps
std::optional< double > rawlog_last_odom_time_
std::map< std::string, TParamEntry > TParameterDefinitions
double min_slope_to_collide_
std::vector< std::optional< TInfoPerCollidableobj > > obstacles_for_each_obj_
std::mutex simulationStepRunningMtx_
std::mutex pendingRunSensorsOn3DSceneMtx_
GeoreferenceOptions georeferenceOptions_
World()
Default ctor: inits an empty world.
void headless(bool setHeadless)
void parse_tag_vehicle(const XmlParserContext &ctx)
<vehicle>
void parse_tag_vehicle_class(const XmlParserContext &ctx)
std::multimap< std::string, Block::Ptr > BlockList
std::recursive_mutex copy_of_objects_dynstate_mtx_
void run_simulation(double dt)
mrpt::poses::CPose3D pose
TGUIKeyEvent keyevent
Keystrokes in the window are returned here.
std::vector< on_observation_callback_t > callbacksOnObservation_
std::unique_ptr< b2World > & getBox2DWorld()
void runVisitorOnVehicles(const vehicle_visitor_t &v)
void mark_as_pending_running_sensors_on_3D_scene()
void parse_tag_element(const XmlParserContext &ctx)
<element>
void register_standard_xml_tag_parsers()
std::shared_ptr< Simulable > Ptr
std::map< std::string, std::shared_ptr< mrpt::io::CFileGZOutputStream > > rawlog_io_per_veh_
LightOptions lightOptions_
const std::unique_ptr< b2World > & getBox2DWorld() const
std::mutex guiUserObjectsMtx_
void parse_tag_walls(const XmlParserContext &ctx)
std::map< std::string, std::fstream > gt_io_per_veh_
float collisionThreshold_
BlockList & getListOfBlocks()
void runVisitorOnBlocks(const block_visitor_t &v)
void insertBlock(const Block::Ptr &block)
std::atomic_bool simulator_must_close_
std::mutex gui_thread_start_mtx_
void prepare_status_window()
void internal_advertiseServices()
std::map< std::string, std::string > userDefinedVariables_
std::vector< float > contour_heights
TGUIKeyEvent lastKeyEvent_
std::unordered_map< lut_2d_coordinates_t, std::vector< Simulable::Ptr >, LutIndexHash > LUTCache
bool operator==(const lut_2d_coordinates_t &o) const noexcept
void free_opengl_resources()
std::map< std::string, nanogui::Window * > guiObsViz_
by sensorLabel
std::vector< std::function< void(void)> > guiUserPendingTasks_
void internalPostSimulStepForRawlog()
std::map< std::string, mrpt::math::TTwist2D > copy_of_objects_dynstate_twist_
void internal_recursive_parse_XML(const XmlParserContext &ctx)
This will parse a main XML file, or its included.
void parse_tag_if(const XmlParserContext &ctx)
void register_tag_parser(const std::string &xmlTagName, const xml_tag_parser_function_t &f)
mrpt::opengl::COpenGLScene worldPhysical_
double rawlog_odometry_rate_
In Hz.
bool pending_running_sensors_on_3D_scene()
std::optional< mrpt::math::TVector3D > worldRenderOffset_
void parse_tag_sensor(const XmlParserContext &ctx)
<sensor>
void update_GUI(TUpdateGUIParams *params=nullptr)
void handle_mouse_operations()
float light_clip_plane_max
WorldElementList worldElements_
RemoteResourcesManager remoteResources_
const std::map< std::string, std::string > & user_defined_variables() const
mrpt::topography::TGeodeticCoords georefCoord
Latitude/longitude/height of the world (0,0,0) frame.
void worldRenderOffsetPropose(const mrpt::math::TVector3D &v)
(See docs for worldRenderOffset_)
void set_gravity(double accel)
std::mutex rawlog_io_mtx_
double representativeHeight
std::set< std::string > reset_collision_flags_
void prepare_control_window()
std::function< void(VehicleBase &)> vehicle_visitor_t
std::optional< mvsim::TJoyStickEvent > getJoystickState() const
void parse_tag_include(const XmlParserContext &ctx)
void internal_initialize()
const rapidxml::xml_node< char > * node
std::shared_ptr< Block > Ptr
mrpt::math::TPoint3D clickedPt
void parse_tag_for(const XmlParserContext &ctx)
std::size_t operator()(const lut_2d_coordinates_t &p) const noexcept
double get_simul_timestep() const
Simulation fixed-time interval for numerical integration.
std::map< std::string, mrpt::math::TPose3D > copy_of_objects_dynstate_pose_
Updated in internal_one_step()
const TParameterDefinitions otherWorldParams_
float shadow_bias_cam2frag
std::set< float > getElevationsAt(const mrpt::math::TPoint2D &worldXY) const
void internalRunSensorsOn3DScene(mrpt::opengl::COpenGLScene &physicalObjects)
nanogui::Button * btnReplaceObject
void parse_tag_marker(const XmlParserContext &ctx)
std::multimap< std::string, Simulable::Ptr > SimulableList
std::mutex guiUserPendingTasksMtx_
std::vector< TFixturePtr > collide_fixtures
mrpt::opengl::CSetOfObjects::Ptr guiUserObjectsViz_
void close_GUI()
a previous call to update_GUI()
GeoreferenceOptions()=default
std::vector< nanogui::Label * > lbStatuses
std::atomic_bool gui_thread_running_
mrpt::system::CTimeLogger & getTimeLogger()
mrpt::opengl::CSetOfObjects::Ptr glUserObjsPhysical_
mrpt::math::TPoint2D internal_gui_on_image(const std::string &label, const mrpt::img::CImage &im, int winPosX)
mrpt::system::CTimeLogger timlogger_
const BlockList & getListOfBlocks() const
void clear_pending_running_sensors_on_3D_scene()
std::vector< InfoPerObject > gui_cbObjects
bool pendingRunSensorsOn3DScene_
void set_simul_timestep(double timestep)
void parse_tag_variable(const XmlParserContext &ctx)
mrpt::opengl::CSetOfObjects::Ptr glUserObjsViz_
std::unique_ptr< b2World > box2d_world_
mrpt::img::TColor light_color
bool simulator_must_close() const
int keycode
0=no Key. Otherwise, ASCII code.
void runVisitorOnWorldElements(const world_element_visitor_t &v)
geometry_msgs::TransformStamped t
const mrpt::gui::CDisplayWindowGUI::Ptr & gui_window() const
float light_clip_plane_min
void internal_one_timestep(double dt)
std::recursive_mutex world_cs_
void internal_gui_on_observation_3Dscan(const Simulable &veh, const std::shared_ptr< mrpt::obs::CObservation3DRangeScan > &obs)
std::optional< Joystick > joystick_
std::mutex lastKeyEventMtx_
std::mutex simul_time_mtx_
mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:08