World.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2023 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 #pragma once
11 
12 #include <box2d/b2_body.h>
13 #include <box2d/b2_world.h>
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/math/TPoint3D.h>
20 #include <mrpt/obs/CObservation.h>
21 #include <mrpt/obs/CObservationImage.h>
22 #include <mrpt/obs/obs_frwds.h>
23 #include <mrpt/system/COutputLogger.h>
24 #include <mrpt/system/CTicTac.h>
25 #include <mrpt/system/CTimeLogger.h>
26 #include <mvsim/Block.h>
27 #include <mvsim/Comms/Client.h>
30 #include <mvsim/VehicleBase.h>
32 
33 #include <functional>
34 #include <list>
35 #include <map>
36 
37 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
38 // forward declarations:
39 namespace mvsim_msgs
40 {
41 class SrvGetPose;
42 class SrvGetPoseAnswer;
43 class SrvSetPose;
44 class SrvSetPoseAnswer;
45 class SrvSetControllerTwist;
46 class SrvSetControllerTwistAnswer;
47 class SrvShutdown;
48 class SrvShutdownAnswer;
49 } // namespace mvsim_msgs
50 #endif
51 
52 namespace mvsim
53 {
62 class World : public mrpt::system::COutputLogger
63 {
64  public:
67  World();
68  ~World();
69 
72  void clear_all();
73 
80  void load_from_XML_file(const std::string& xmlFileNamePath);
81 
82  void internal_initialize();
83 
91  void load_from_XML(
92  const std::string& xml_text,
93  const std::string& fileNameForPath = std::string("."));
100  double get_simul_time() const
101  {
102  auto lck = mrpt::lockHelper(simul_time_mtx_);
103  return simulTime_;
104  }
105 
107  void force_set_simul_time(double newSimulatedTime)
108  {
109  auto lck = mrpt::lockHelper(simul_time_mtx_);
110  simulTime_ = newSimulatedTime;
111  }
112 
118  mrpt::Clock::time_point get_simul_timestamp() const
119  {
120  auto lck = mrpt::lockHelper(simul_time_mtx_);
121  ASSERT_(simul_start_wallclock_time_.has_value());
122  return mrpt::Clock::fromDouble(
123  simulTime_ + simul_start_wallclock_time_.value());
124  }
125 
127  double get_simul_timestep() const;
128 
132  void set_simul_timestep(double timestep) { simulTimestep_ = timestep; }
133 
136  double get_gravity() const { return gravity_; }
137 
140  void set_gravity(double accel) { gravity_ = accel; }
141 
147  void run_simulation(double dt);
148 
151  {
152  int keycode = 0;
153  bool modifierShift = false;
154  bool modifierCtrl = false;
155  bool modifierAlt = false;
156  bool modifierSuper = false;
157 
158  TGUIKeyEvent() = default;
159  };
160 
162  {
164  std::string msg_lines;
165 
166  TUpdateGUIParams() = default;
167  };
168 
176  void update_GUI(TUpdateGUIParams* params = nullptr);
177 
178  const mrpt::gui::CDisplayWindowGUI::Ptr& gui_window() const
179  {
180  return gui_.gui_win;
181  }
182 
183  const mrpt::math::TPoint3D& gui_mouse_point() const
184  {
185  return gui_.clickedPt;
186  }
187 
193  mrpt::opengl::CSetOfObjects::Ptr guiUserObjectsPhysical_,
195  std::mutex guiUserObjectsMtx_;
196 
200  void internalGraphicsLoopTasksForSimulation();
201 
202  void internalRunSensorsOn3DScene(
203  mrpt::opengl::COpenGLScene& physicalObjects);
204 
205  void internalUpdate3DSceneObjects(
206  mrpt::opengl::COpenGLScene& viz, mrpt::opengl::COpenGLScene& physical);
207  void internal_GUI_thread();
208  void internal_process_pending_gui_user_tasks();
209 
211  bool pendingRunSensorsOn3DScene_ = false;
212 
214  {
215  pendingRunSensorsOn3DSceneMtx_.lock();
216  pendingRunSensorsOn3DScene_ = true;
217  pendingRunSensorsOn3DSceneMtx_.unlock();
218  }
220  {
221  pendingRunSensorsOn3DSceneMtx_.lock();
222  pendingRunSensorsOn3DScene_ = false;
223  pendingRunSensorsOn3DSceneMtx_.unlock();
224  }
226  {
227  pendingRunSensorsOn3DSceneMtx_.lock();
228  bool ret = pendingRunSensorsOn3DScene_;
229  pendingRunSensorsOn3DSceneMtx_.unlock();
230  return ret;
231  }
232 
233  std::string guiMsgLines_;
234  std::mutex guiMsgLinesMtx_;
235 
236  std::thread gui_thread_;
237 
238  std::atomic_bool gui_thread_running_ = false;
239  std::atomic_bool simulator_must_close_ = false;
240  mutable std::mutex gui_thread_start_mtx_;
241 
242  bool simulator_must_close() const
243  {
244  gui_thread_start_mtx_.lock();
245  const bool v = simulator_must_close_;
246  gui_thread_start_mtx_.unlock();
247  return v;
248  }
249  void simulator_must_close(bool value)
250  {
251  gui_thread_start_mtx_.lock();
252  simulator_must_close_ = value;
253  gui_thread_start_mtx_.unlock();
254  }
255 
256  void enqueue_task_to_run_in_gui_thread(const std::function<void(void)>& f)
257  {
258  guiUserPendingTasksMtx_.lock();
259  guiUserPendingTasks_.emplace_back(f);
260  guiUserPendingTasksMtx_.unlock();
261  }
262 
263  std::vector<std::function<void(void)>> guiUserPendingTasks_;
265 
267  std::atomic_bool lastKeyEventValid_ = false;
268  std::mutex lastKeyEventMtx_;
269 
270  bool is_GUI_open() const;
271 
273  void close_GUI();
274 
281  using VehicleList = std::multimap<std::string, VehicleBase::Ptr>;
282 
284  using WorldElementList = std::list<WorldElementBase::Ptr>;
285 
287  using BlockList = std::multimap<std::string, Block::Ptr>;
288 
291  using SimulableList = std::multimap<std::string, Simulable::Ptr>;
292 
297  std::unique_ptr<b2World>& getBox2DWorld() { return box2d_world_; }
298  const std::unique_ptr<b2World>& getBox2DWorld() const
299  {
300  return box2d_world_;
301  }
302  b2Body* getBox2DGroundBody() { return b2_ground_body_; }
303  const VehicleList& getListOfVehicles() const { return vehicles_; }
304  VehicleList& getListOfVehicles() { return vehicles_; }
305  const BlockList& getListOfBlocks() const { return blocks_; }
306  BlockList& getListOfBlocks() { return blocks_; }
308  {
309  return worldElements_;
310  }
311 
313  SimulableList& getListOfSimulableObjects() { return simulableObjects_; }
315  {
316  return simulableObjects_;
317  }
318  auto& getListOfSimulableObjectsMtx() { return simulableObjectsMtx_; }
319 
320  mrpt::system::CTimeLogger& getTimeLogger() { return timlogger_; }
321 
325  std::string local_to_abs_path(const std::string& in_path) const;
326 
333  std::string xmlPathToActualPath(const std::string& modelURI) const;
334 
340  using vehicle_visitor_t = std::function<void(VehicleBase&)>;
341  using world_element_visitor_t = std::function<void(WorldElementBase&)>;
342  using block_visitor_t = std::function<void(Block&)>;
343 
345  void runVisitorOnVehicles(const vehicle_visitor_t& v);
346 
348  void runVisitorOnWorldElements(const world_element_visitor_t& v);
349 
351  void runVisitorOnBlocks(const block_visitor_t& v);
352 
358  using on_observation_callback_t = std::function<void(
359  const Simulable& /*veh*/, const mrpt::obs::CObservation::Ptr& /*obs*/)>;
360 
362  {
363  callbacksOnObservation_.emplace_back(f);
364  }
365 
368  const Simulable& veh, const mrpt::obs::CObservation::Ptr& obs)
369  {
370  for (const auto& cb : callbacksOnObservation_) cb(veh, obs);
371  }
372 
377  void connectToServer();
378 
379  mvsim::Client& commsClient() { return client_; }
380  const mvsim::Client& commsClient() const { return client_; }
381 
382  void free_opengl_resources();
383 
384  auto& physical_objects_mtx() { return worldPhysicalMtx_; }
385 
386  bool headless() const { return guiOptions_.headless; }
387  void headless(bool setHeadless) { guiOptions_.headless = setHeadless; }
388 
389  bool sensor_has_to_create_egl_context();
390 
391  const std::map<std::string, std::string>& user_defined_variables() const
392  {
393  return userDefinedVariables_;
394  }
395 
396  private:
397  friend class VehicleBase;
398  friend class Block;
399 
400  mvsim::Client client_{"World"};
401 
402  std::vector<on_observation_callback_t> callbacksOnObservation_;
403 
404  // -------- World Params ----------
407  double gravity_ = 9.81;
408 
413  mutable double simulTimestep_ = 0;
414 
416  int b2dVelIters_ = 8, b2dPosIters_ = 3;
417 
418  std::string serverAddress_ = "localhost";
419 
420  const TParameterDefinitions otherWorldParams_ = {
421  {"server_address", {"%s", &serverAddress_}},
422  {"gravity", {"%lf", &gravity_}},
423  {"simul_timestep", {"%lf", &simulTimestep_}},
424  {"b2d_vel_iters", {"%i", &b2dVelIters_}},
425  {"b2d_pos_iters", {"%i", &b2dPosIters_}},
426  };
427 
430  std::map<std::string, std::string> userDefinedVariables_;
431 
434  double simulTime_ = 0;
435  std::optional<double> simul_start_wallclock_time_;
436  std::mutex simul_time_mtx_;
437 
439  std::string basePath_{"."};
440 
443  mrpt::opengl::CSetOfObjects::Ptr glUserObjsPhysical_ =
444  mrpt::opengl::CSetOfObjects::Create();
445  mrpt::opengl::CSetOfObjects::Ptr glUserObjsViz_ =
446  mrpt::opengl::CSetOfObjects::Create();
447 
448  // ------- GUI options -----
450  {
451  unsigned int win_w = 800, win_h = 600;
452  bool start_maximized = true;
453  int refresh_fps = 20;
454  bool ortho = false;
455  bool show_forces = false;
456  bool show_sensor_points = true;
457  double force_scale = 0.01;
458  double camera_distance = 80.0;
459  double camera_azimuth_deg = 45.0;
460  double camera_elevation_deg = 40.0;
461  double fov_deg = 60.0;
462  float clip_plane_min = 0.05f;
463  float clip_plane_max = 10e3f;
464  mrpt::math::TPoint3D camera_point_to{0, 0, 0};
465  std::string follow_vehicle;
466  bool headless = false;
467 
468  const TParameterDefinitions params = {
469  {"win_w", {"%u", &win_w}},
470  {"win_h", {"%u", &win_h}},
471  {"ortho", {"%bool", &ortho}},
472  {"show_forces", {"%bool", &show_forces}},
473  {"show_sensor_points", {"%bool", &show_sensor_points}},
474  {"force_scale", {"%lf", &force_scale}},
475  {"fov_deg", {"%lf", &fov_deg}},
476  {"follow_vehicle", {"%s", &follow_vehicle}},
477  {"start_maximized", {"%bool", &start_maximized}},
478  {"refresh_fps", {"%i", &refresh_fps}},
479  {"headless", {"%bool", &headless}},
480  {"clip_plane_min", {"%f", &clip_plane_min}},
481  {"clip_plane_max", {"%f", &clip_plane_max}},
482  {"cam_distance", {"%lf", &camera_distance}},
483  {"cam_azimuth", {"%lf", &camera_azimuth_deg}},
484  {"cam_elevation", {"%lf", &camera_elevation_deg}},
485  {"cam_point_to", {"%point3d", &camera_point_to}},
486  };
487 
488  TGUI_Options() = default;
489  void parse_from(
490  const rapidxml::xml_node<char>& node, COutputLogger& logger);
491  };
492 
496 
498  {
499  LightOptions() = default;
500 
501  void parse_from(
502  const rapidxml::xml_node<char>& node, COutputLogger& logger);
503 
504  bool enable_shadows = true;
505  int shadow_map_size = 2048;
506 
507  double light_azimuth = mrpt::DEG2RAD(45.0);
508  double light_elevation = mrpt::DEG2RAD(70.0);
509 
510  float light_clip_plane_min = 0.1f;
511  float light_clip_plane_max = 900.0f;
512 
513  float shadow_bias = 1e-5;
514  float shadow_bias_cam2frag = 1e-5;
515  float shadow_bias_normal = 1e-4;
516 
517  mrpt::img::TColor light_color = {0xff, 0xff, 0xff, 0xff};
518  float light_ambient = 0.5f;
519 
520  float eye_distance_to_shadow_map_extension = 2.0f;
521  float minimum_shadow_map_extension_ratio = 0.005f;
522 
523  const TParameterDefinitions params = {
524  {"enable_shadows", {"%bool", &enable_shadows}},
525  {"shadow_map_size", {"%i", &shadow_map_size}},
526  {"light_azimuth_deg", {"%lf_deg", &light_azimuth}},
527  {"light_elevation_deg", {"%lf_deg", &light_elevation}},
528  {"light_clip_plane_min", {"%f", &light_clip_plane_min}},
529  {"light_clip_plane_max", {"%f", &light_clip_plane_max}},
530  {"light_color", {"%color", &light_color}},
531  {"shadow_bias", {"%f", &shadow_bias}},
532  {"shadow_bias_cam2frag", {"%f", &shadow_bias_cam2frag}},
533  {"shadow_bias_normal", {"%f", &shadow_bias_normal}},
534  {"light_ambient", {"%f", &light_ambient}},
535  {"eye_distance_to_shadow_map_extension",
536  {"%f", &eye_distance_to_shadow_map_extension}},
537  {"minimum_shadow_map_extension_ratio",
538  {"%f", &minimum_shadow_map_extension_ratio}},
539  };
540  };
541 
544 
545  // -------- World contents ----------
547  std::recursive_mutex world_cs_;
548 
550  std::unique_ptr<b2World> box2d_world_;
551 
553  b2Body* b2_ground_body_ = nullptr;
554 
558 
559  bool initialized_ = false;
560 
561  // List of all objects above (vehicles, world_elements, blocks), but as
562  // shared_ptr to their Simulable interfaces, so we can easily iterate on
563  // this list only for common tasks:
566 
568  void internal_one_timestep(double dt);
569 
571 
573  struct GUI
574  {
575  GUI(World& parent) : parent_(parent) {}
576 
577  mrpt::gui::CDisplayWindowGUI::Ptr gui_win;
578  nanogui::Label* lbCpuUsage = nullptr;
579  std::vector<nanogui::Label*> lbStatuses;
580  nanogui::Button* btnReplaceObject = nullptr;
581 
583  {
584  nanogui::CheckBox* cb = nullptr;
586  VisualObject* visual = nullptr;
587  };
588 
589  // Buttons that must be {dis,en}abled when there is a selected object:
590  std::vector<nanogui::Widget*> btns_selectedOps;
591  std::vector<InfoPerObject> gui_cbObjects;
593 
594  mrpt::math::TPoint3D clickedPt{0, 0, 0};
595 
596  void prepare_control_window();
597  void prepare_status_window();
598  void prepare_editor_window();
599 
600  void handle_mouse_operations();
601 
602  private:
604  };
605  GUI gui_{*this};
606 
610  mrpt::opengl::COpenGLScene::Ptr worldVisual_ =
611  mrpt::opengl::COpenGLScene::Create();
612 
618  mrpt::opengl::COpenGLScene worldPhysical_;
619  std::recursive_mutex worldPhysicalMtx_;
620 
622  std::map<std::string, mrpt::math::TPose3D> copy_of_objects_dynstate_pose_;
623  std::map<std::string, mrpt::math::TTwist2D> copy_of_objects_dynstate_twist_;
624  std::set<std::string> copy_of_objects_had_collision_;
625  std::recursive_mutex copy_of_objects_dynstate_mtx_;
626 
627  std::set<std::string> reset_collision_flags_;
629 
630  void internal_gui_on_observation(
631  const Simulable& veh, const mrpt::obs::CObservation::Ptr& obs);
632  void internal_gui_on_observation_3Dscan(
633  const Simulable& veh,
634  const std::shared_ptr<mrpt::obs::CObservation3DRangeScan>& obs);
635  void internal_gui_on_observation_image(
636  const Simulable& veh,
637  const std::shared_ptr<mrpt::obs::CObservationImage>& obs);
638 
639  mrpt::math::TPoint2D internal_gui_on_image(
640  const std::string& label, const mrpt::img::CImage& im, int winPosX);
641 
642  std::map<std::string, nanogui::Window*> guiObsViz_;
643 
646  void setLightDirectionFromAzimuthElevation(
647  const float azimuth, const float elevation);
648  // end GUI stuff
650 
651  mrpt::system::CTimeLogger timlogger_{true /*enabled*/, "mvsim::World"};
652  mrpt::system::CTicTac timer_iteration_;
653 
654  void process_load_walls(const rapidxml::xml_node<char>& node);
655  void insertBlock(const Block::Ptr& block);
656 
658  {
660  const rapidxml::xml_node<char>* n, const std::string& basePath)
661  : node(n), currentBasePath(basePath)
662  {
663  }
664 
665  const rapidxml::xml_node<char>* node = nullptr;
666  const std::string currentBasePath;
667  };
668 
670  void internal_recursive_parse_XML(const XmlParserContext& ctx);
671 
673  std::function<void(const XmlParserContext&)>;
674 
675  std::map<std::string, xml_tag_parser_function_t> xmlParsers_;
676 
677  void register_standard_xml_tag_parsers();
678 
680  const std::string& xmlTagName, const xml_tag_parser_function_t& f)
681  {
682  xmlParsers_.emplace(xmlTagName, f);
683  }
685  const std::string& xmlTagName,
686  void (World::*f)(const XmlParserContext& ctx))
687  {
688  xmlParsers_.emplace(xmlTagName, [this, f](const XmlParserContext& ctx) {
689  (this->*f)(ctx);
690  });
691  }
692 
693  // ======== XML parser tags ========
694  void parse_tag_element(const XmlParserContext& ctx);
695  void parse_tag_vehicle(const XmlParserContext& ctx);
696 
697  void parse_tag_vehicle_class(const XmlParserContext& ctx);
698  void parse_tag_sensor(const XmlParserContext& ctx);
699  void parse_tag_block(const XmlParserContext& ctx);
700  void parse_tag_block_class(const XmlParserContext& ctx);
701  void parse_tag_gui(const XmlParserContext& ctx);
702  void parse_tag_lights(const XmlParserContext& ctx);
703  void parse_tag_walls(const XmlParserContext& ctx);
704  void parse_tag_include(const XmlParserContext& ctx);
705  void parse_tag_variable(const XmlParserContext& ctx);
706  void parse_tag_for(const XmlParserContext& ctx);
707  void parse_tag_if(const XmlParserContext& ctx);
708 
709  // ======== end of XML parser tags ========
710 
712 
713  // Services:
714  void internal_advertiseServices(); // called from connectToServer()
715 
716 #if MVSIM_HAS_ZMQ && MVSIM_HAS_PROTOBUF
717 
718  mvsim_msgs::SrvSetPoseAnswer srv_set_pose(
719  const mvsim_msgs::SrvSetPose& req);
720  mvsim_msgs::SrvGetPoseAnswer srv_get_pose(
721  const mvsim_msgs::SrvGetPose& req);
722  mvsim_msgs::SrvSetControllerTwistAnswer srv_set_controller_twist(
723  const mvsim_msgs::SrvSetControllerTwist& req);
724  mvsim_msgs::SrvShutdownAnswer srv_shutdown(
725  const mvsim_msgs::SrvShutdown& req);
726 #endif
727 };
728 } // namespace mvsim
void registerCallbackOnObservation(const on_observation_callback_t &f)
Definition: World.h:361
std::shared_ptr< Simulable > Ptr
Definition: Simulable.h:37
void set_simul_timestep(double timestep)
Definition: World.h:132
std::function< void(const XmlParserContext &)> xml_tag_parser_function_t
Definition: World.h:673
std::unique_ptr< b2World > box2d_world_
Definition: World.h:550
bool simulator_must_close() const
Definition: World.h:242
mrpt::opengl::COpenGLScene worldPhysical_
Definition: World.h:618
double get_simul_time() const
Definition: World.h:100
std::map< std::string, TParamEntry > TParameterDefinitions
std::multimap< std::string, Simulable::Ptr > SimulableList
Definition: World.h:291
const WorldElementList & getListOfWorldElements() const
Definition: World.h:307
SimulableList simulableObjects_
Definition: World.h:564
std::mutex guiUserPendingTasksMtx_
Definition: World.h:264
std::mutex guiMsgLinesMtx_
Definition: World.h:234
f
std::mutex pendingRunSensorsOn3DSceneMtx_
Definition: World.h:210
std::vector< InfoPerObject > gui_cbObjects
Definition: World.h:591
std::map< std::string, xml_tag_parser_function_t > xmlParsers_
Definition: World.h:675
XmlParserContext(const rapidxml::xml_node< char > *n, const std::string &basePath)
Definition: World.h:659
std::mutex simulationStepRunningMtx_
Definition: World.h:570
std::multimap< std::string, VehicleBase::Ptr > VehicleList
Definition: World.h:281
InfoPerObject gui_selectedObject
Definition: World.h:592
const VehicleList & getListOfVehicles() const
Definition: World.h:303
std::string follow_vehicle
Vehicle name to follow (empty=none)
Definition: World.h:465
std::function< void(const Simulable &, const mrpt::obs::CObservation::Ptr &)> on_observation_callback_t
Definition: World.h:359
std::string guiMsgLines_
Definition: World.h:233
std::unique_ptr< b2World > & getBox2DWorld()
Definition: World.h:297
std::mutex lastKeyEventMtx_
Definition: World.h:268
void force_set_simul_time(double newSimulatedTime)
Normally should not be called by users, for internal use only.
Definition: World.h:107
std::function< void(Block &)> block_visitor_t
Definition: World.h:342
mrpt::gui::CDisplayWindowGUI::Ptr gui_win
Definition: World.h:577
mrpt::system::CTicTac timer_iteration_
Definition: World.h:652
mrpt::Clock::time_point get_simul_timestamp() const
Definition: World.h:118
std::shared_ptr< Block > Ptr
Definition: Block.h:37
Simulable::Ptr simulable
Definition: World.h:585
std::function< void(VehicleBase &)> vehicle_visitor_t
Definition: World.h:340
std::multimap< std::string, Block::Ptr > BlockList
Definition: World.h:287
VehicleList vehicles_
Definition: World.h:555
TGUIKeyEvent keyevent
Keystrokes in the window are returned here.
Definition: World.h:163
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
void register_tag_parser(const std::string &xmlTagName, void(World::*f)(const XmlParserContext &ctx))
Definition: World.h:684
void set_gravity(double accel)
Definition: World.h:140
std::mutex guiUserObjectsMtx_
Definition: World.h:195
bool headless() const
Definition: World.h:386
auto & getListOfSimulableObjectsMtx()
Definition: World.h:318
std::mutex gui_thread_start_mtx_
Definition: World.h:240
std::recursive_mutex copy_of_objects_dynstate_mtx_
Definition: World.h:625
auto & physical_objects_mtx()
Definition: World.h:384
std::vector< on_observation_callback_t > callbacksOnObservation_
Definition: World.h:402
void simulator_must_close(bool value)
Definition: World.h:249
RemoteResourcesManager remoteResources_
Definition: World.h:711
std::string msg_lines
Messages to show.
Definition: World.h:164
const std::map< std::string, std::string > & user_defined_variables() const
Definition: World.h:391
IMGUI_API bool Button(const char *label, const ImVec2 &size=ImVec2(0, 0))
std::vector< nanogui::Label * > lbStatuses
Definition: World.h:579
const mvsim::Client & commsClient() const
Definition: World.h:380
const std::string currentBasePath
Definition: World.h:666
std::function< void(WorldElementBase &)> world_element_visitor_t
Definition: World.h:341
std::map< std::string, nanogui::Window * > guiObsViz_
by sensorLabel
Definition: World.h:642
std::vector< nanogui::Widget * > btns_selectedOps
Definition: World.h:590
bool pending_running_sensors_on_3D_scene()
Definition: World.h:225
void dispatchOnObservation(const Simulable &veh, const mrpt::obs::CObservation::Ptr &obs)
Definition: World.h:367
std::thread gui_thread_
Definition: World.h:236
const mrpt::math::TPoint3D & gui_mouse_point() const
Definition: World.h:183
typedef void(GLAD_API_PTR *GLDEBUGPROC)(GLenum source
mrpt::opengl::CSetOfObjects::Ptr guiUserObjectsViz_
Definition: World.h:193
const SimulableList & getListOfSimulableObjects() const
Definition: World.h:314
const mrpt::gui::CDisplayWindowGUI::Ptr & gui_window() const
Definition: World.h:178
mrpt::system::CTimeLogger & getTimeLogger()
Definition: World.h:320
std::map< std::string, mrpt::math::TPose3D > copy_of_objects_dynstate_pose_
Updated in internal_one_step()
Definition: World.h:622
const BlockList & getListOfBlocks() const
Definition: World.h:305
void clear_pending_running_sensors_on_3D_scene()
Definition: World.h:219
std::set< std::string > copy_of_objects_had_collision_
Definition: World.h:624
std::mutex reset_collision_flags_mtx_
Definition: World.h:628
const std::unique_ptr< b2World > & getBox2DWorld() const
Definition: World.h:298
std::recursive_mutex worldPhysicalMtx_
Definition: World.h:619
b2Body * getBox2DGroundBody()
Definition: World.h:302
std::recursive_mutex world_cs_
Definition: World.h:547
TGUI_Options guiOptions_
Definition: World.h:495
VehicleList & getListOfVehicles()
Definition: World.h:304
LightOptions lightOptions_
Definition: World.h:543
std::map< std::string, std::string > userDefinedVariables_
Definition: World.h:430
BlockList & getListOfBlocks()
Definition: World.h:306
std::optional< double > simul_start_wallclock_time_
Definition: World.h:435
World & parent_
Definition: World.h:603
std::mutex simul_time_mtx_
Definition: World.h:436
std::map< std::string, mrpt::math::TTwist2D > copy_of_objects_dynstate_twist_
Definition: World.h:623
BlockList blocks_
Definition: World.h:557
void register_tag_parser(const std::string &xmlTagName, const xml_tag_parser_function_t &f)
Definition: World.h:679
std::list< WorldElementBase::Ptr > WorldElementList
Definition: World.h:284
WorldElementList worldElements_
Definition: World.h:556
void mark_as_pending_running_sensors_on_3D_scene()
Definition: World.h:213
mvsim::Client & commsClient()
Definition: World.h:379
TGUIKeyEvent lastKeyEvent_
Definition: World.h:266
void headless(bool setHeadless)
Definition: World.h:387
std::set< std::string > reset_collision_flags_
Definition: World.h:627
double get_gravity() const
Definition: World.h:136
std::vector< std::function< void(void)> > guiUserPendingTasks_
Definition: World.h:263
SimulableList & getListOfSimulableObjects()
Always lock/unlock getListOfSimulableObjectsMtx() before using this:
Definition: World.h:313
std::mutex simulableObjectsMtx_
Definition: World.h:565
GUI(World &parent)
Definition: World.h:575
void enqueue_task_to_run_in_gui_thread(const std::function< void(void)> &f)
Definition: World.h:256


mvsim
Author(s):
autogenerated on Tue Jul 4 2023 03:08:22