MVSim
Lightweight simulator for 2.5D vehicles and robots
LaserScanner.h
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2026 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 <mrpt/obs/CObservation2DRangeScan.h>
13 #include <mrpt/opengl/CFBORender.h>
14 #include <mrpt/opengl/CPlanarLaserScan.h>
15 #include <mrpt/poses/CPose2D.h>
16 #include <mvsim/Sensors/SensorBase.h>
17 
18 #include <mutex>
19 
20 namespace mvsim
21 {
31 class LaserScanner : public SensorBase
32 {
33  DECLARES_REGISTER_SENSOR(LaserScanner)
34  public:
35  LaserScanner(Simulable& parent, const rapidxml::xml_node<char>* root);
36  virtual ~LaserScanner();
37 
38  // See docs in base class
39  virtual void loadConfigFrom(const rapidxml::xml_node<char>* root) override;
40 
41  virtual void simul_pre_timestep(const TSimulContext& context) override;
42  virtual void simul_post_timestep(const TSimulContext& context) override;
43 
44  void simulateOn3DScene(mrpt::opengl::COpenGLScene& gl_scene) override;
45  void freeOpenGLResources() override;
46 
47  void registerOnServer(mvsim::Client& c) override;
48 
49  protected:
50  virtual void internalGuiUpdate(
51  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
52  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical, bool childrenOnly) override;
53 
54  void notifySimulableSetPose(const mrpt::math::TPose3D& newPose) override;
55 
56  mrpt::math::TPose3D getRelativePose() const override
57  {
58  return scan_model_.sensorPose.asTPose();
59  }
60  void setRelativePose(const mrpt::math::TPose3D& p) override
61  {
62  scan_model_.setSensorPose(mrpt::poses::CPose3D(p));
63  }
64 
65  // when not using the 3D raytrace mode.
66  void internal_simulate_lidar_2d_mode(const TSimulContext& context);
67 
68  int z_order_;
69 
70  double rangeStdNoise_ = 0.01;
71  double angleStdNoise_ = mrpt::DEG2RAD(0.01);
74  bool see_fixtures_ = true;
75 
78  bool raytrace_3d_ = false;
79 
80  bool ignore_parent_body_ = false;
81 
82  bool viz_visiblePlane_ = false;
83  bool viz_visibleLines_ = true;
84  bool viz_visiblePoints_ = false;
85  float viz_pointSize_ = 3.0f;
86  mrpt::img::TColor viz_pointsColor_ = {0xff, 0x00, 0x00, 0x80};
87  mrpt::img::TColor viz_planeColor_ = {0x00, 0x00, 0xff, 0x10};
88 
89  // Store here all scan parameters. This obj will be copied as a
90  // "pattern" to fill it with actual scan data.
91  mrpt::obs::CObservation2DRangeScan scan_model_;
92 
93  std::mutex last_scan_cs_;
95  mrpt::obs::CObservation2DRangeScan::Ptr last_scan_;
96  mrpt::obs::CObservation2DRangeScan::Ptr last_scan2gui_;
97 
100  bool gui_uptodate_ = false;
101 
102  mrpt::opengl::CPlanarLaserScan::Ptr gl_scan_;
103  mrpt::opengl::CSetOfObjects::Ptr gl_sensor_origin_, gl_sensor_origin_corner_;
104  mrpt::opengl::CSetOfObjects::Ptr gl_sensor_fov_;
105 
106  std::optional<TSimulContext> has_to_render_;
107  std::mutex has_to_render_mtx_;
108 
109  std::shared_ptr<mrpt::opengl::CFBORender> fbo_renderer_depth_;
110 
111  std::vector<size_t> angleIdx2pixelIdx_;
112  std::vector<float> angleIdx2secant_;
113 };
114 } // namespace mvsim
Definition: Client.h:49
Definition: LaserScanner.h:32
bool see_fixtures_
Definition: LaserScanner.h:74
virtual void simul_pre_timestep(const TSimulContext &context) override
virtual void simul_post_timestep(const TSimulContext &context) override
int z_order_
to help rendering multiple scans
Definition: LaserScanner.h:68
void setRelativePose(const mrpt::math::TPose3D &p) override
Definition: LaserScanner.h:60
mrpt::math::TPose3D getRelativePose() const override
Definition: LaserScanner.h:56
bool gui_uptodate_
Definition: LaserScanner.h:100
mrpt::obs::CObservation2DRangeScan::Ptr last_scan_
Definition: LaserScanner.h:95
bool raytrace_3d_
Definition: LaserScanner.h:78
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root) override
Virtual base class for all sensors.
Definition: SensorBase.h:35
Definition: Simulable.h:40
Definition: basic_types.h:58