CameraSensor.cpp
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 #include <mrpt/core/lock_helper.h>
11 #include <mrpt/opengl/CFrustum.h>
12 #include <mrpt/opengl/COpenGLScene.h>
13 #include <mrpt/opengl/stock_objects.h>
14 #include <mrpt/random.h>
15 #include <mrpt/version.h>
17 #include <mvsim/VehicleBase.h>
18 #include <mvsim/World.h>
19 
20 #include "xml_utils.h"
21 
22 using namespace mvsim;
23 using namespace rapidxml;
24 
26  Simulable& parent, const rapidxml::xml_node<char>* root)
27  : SensorBase(parent)
28 {
29  this->loadConfigFrom(root);
30 }
31 
33 
35 {
36  gui_uptodate_ = false;
37 
40 
41  fbo_renderer_rgb_.reset();
42 
43  using namespace mrpt; // _deg
44  sensor_params_.cameraPose =
45  mrpt::poses::CPose3D(0, 0, 0.5, 90.0_deg, 0, 90.0_deg);
46 
47  // Default values:
48  {
49  auto& c = sensor_params_.cameraParams;
50  c.ncols = 640;
51  c.nrows = 480;
52  c.cx(c.ncols / 2);
53  c.cy(c.nrows / 2);
54  c.fx(500);
55  c.fy(500);
56  }
57 
58  // Other scalar params:
59  TParameterDefinitions params;
60  params["pose_3d"] = TParamEntry("%pose3d", &sensor_params_.cameraPose);
61 
62  auto& rgbCam = sensor_params_.cameraParams;
63  params["cx"] = TParamEntry("%lf", &rgbCam.intrinsicParams(0, 2));
64  params["cy"] = TParamEntry("%lf", &rgbCam.intrinsicParams(1, 2));
65  params["fx"] = TParamEntry("%lf", &rgbCam.intrinsicParams(0, 0));
66  params["fy"] = TParamEntry("%lf", &rgbCam.intrinsicParams(1, 1));
67 
68  unsigned int rgb_ncols = rgbCam.ncols, rgb_nrows = rgbCam.nrows;
69  params["ncols"] = TParamEntry("%u", &rgb_ncols);
70  params["nrows"] = TParamEntry("%u", &rgb_nrows);
71 
72  params["clip_min"] = TParamEntry("%f", &rgbClipMin_);
73  params["clip_max"] = TParamEntry("%f", &rgbClipMax_);
74 
75  // Parse XML params:
77 
78  rgbCam.ncols = rgb_ncols;
79  rgbCam.nrows = rgb_nrows;
80 
81  // save sensor label here too:
82  sensor_params_.sensorLabel = name_;
83 }
84 
86  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
87  [[maybe_unused]] const mrpt::optional_ref<mrpt::opengl::COpenGLScene>&
88  physical,
89  [[maybe_unused]] bool childrenOnly)
90 {
91  if (!gl_sensor_origin_ && viz)
92  {
93  gl_sensor_origin_ = mrpt::opengl::CSetOfObjects::Create();
94 #if MRPT_VERSION >= 0x270
95  gl_sensor_origin_->castShadows(false);
96 #endif
98  mrpt::opengl::stock_objects::CornerXYZSimple(0.15f);
99 
101 
102  gl_sensor_origin_->setVisibility(false);
103  viz->get().insert(gl_sensor_origin_);
105  }
106  if (!gl_sensor_fov_ && viz)
107  {
108  gl_sensor_fov_ = mrpt::opengl::CSetOfObjects::Create();
109  gl_sensor_fov_->setVisibility(false);
110  viz->get().insert(gl_sensor_fov_);
112  }
113 
114  if (!gui_uptodate_)
115  {
116  {
117  std::lock_guard<std::mutex> csl(last_obs_cs_);
118  if (last_obs2gui_)
119  {
120  gl_sensor_origin_corner_->setPose(last_obs2gui_->sensorPose());
121 
122  if (!gl_sensor_frustum_)
123  {
124  gl_sensor_frustum_ = mrpt::opengl::CSetOfObjects::Create();
125 
126  const float frustumScale = 0.4e-3;
127  auto frustum = mrpt::opengl::CFrustum::Create(
128  last_obs2gui_->cameraParams, frustumScale);
129 
130  gl_sensor_frustum_->insert(frustum);
132  }
133 
134  using namespace mrpt; // _deg
135 
136  gl_sensor_frustum_->setPose(
137  last_obs2gui_->cameraPose +
138  (-mrpt::poses::CPose3D::FromYawPitchRoll(
139  -90.0_deg, 0.0_deg, -90.0_deg)));
140 
141  last_obs2gui_.reset();
142  }
143  }
144  gui_uptodate_ = true;
145  }
146 
147  // Move with vehicle:
148  const auto& p = vehicle_.getPose();
149 
150  gl_sensor_fov_->setPose(p);
151  gl_sensor_origin_->setPose(p);
152 
153  if (glCustomVisual_)
154  glCustomVisual_->setPose(p + sensor_params_.cameraPose.asTPose());
155 }
156 
158  [[maybe_unused]] const TSimulContext& context)
159 {
160 }
161 
162 void CameraSensor::simulateOn3DScene(mrpt::opengl::COpenGLScene& world3DScene)
163 {
164  using namespace mrpt; // _deg
165 
166  {
167  auto lckHasTo = mrpt::lockHelper(has_to_render_mtx_);
168  if (!has_to_render_.has_value()) return;
169  }
170 
171  auto tleWhole =
172  mrpt::system::CTimeLoggerEntry(world_->getTimeLogger(), "sensor.RGB");
173 
174  if (glCustomVisual_) glCustomVisual_->setVisibility(false);
175 
176  // Start making a copy of the pattern observation:
177  auto curObs = mrpt::obs::CObservationImage::Create(sensor_params_);
178 
179  // Set timestamp:
180  curObs->timestamp = world_->get_simul_timestamp();
181 
182  // Create FBO on first use, now that we are here at the GUI / OpenGL thread.
183  if (!fbo_renderer_rgb_)
184  {
185  mrpt::opengl::CFBORender::Parameters p;
186  p.width = sensor_params_.cameraParams.ncols;
187  p.height = sensor_params_.cameraParams.nrows;
188  p.create_EGL_context = world()->sensor_has_to_create_egl_context();
189 
190  fbo_renderer_rgb_ = std::make_shared<mrpt::opengl::CFBORender>(p);
191  }
192 
193  auto viewport = world3DScene.getViewport();
194 
195  auto& cam = fbo_renderer_rgb_->getCamera(world3DScene);
196 
197  const auto fixedAxisConventionRot =
198  mrpt::poses::CPose3D(0, 0, 0, -90.0_deg, 0.0_deg, -90.0_deg);
199 
200  // ----------------------------------------------------------
201  // RGB with its camera intrinsics & clip distances
202  // ----------------------------------------------------------
203  cam.set6DOFMode(true);
204  cam.setProjectiveFromPinhole(curObs->cameraParams);
205 
206  // RGB camera pose:
207  // vehicle (+) relativePoseOnVehicle (+) relativePoseIntensityWRTDepth
208  //
209  // Note: relativePoseOnVehicle should be (y,p,r)=(-90deg,0,-90deg) to make
210  // the camera to look forward:
211 
212  const auto vehiclePose = mrpt::poses::CPose3D(vehicle_.getPose());
213  const auto rgbSensorPose = vehiclePose + curObs->cameraPose;
214 
215  cam.setPose(rgbSensorPose);
216 
217  ASSERT_(fbo_renderer_rgb_);
218 
219  auto tle2 = mrpt::system::CTimeLoggerEntry(
220  world_->getTimeLogger(), "sensor.RGB.render");
221 
222  // viewport->setCustomBackgroundColor({0.3f, 0.3f, 0.3f, 1.0f});
223  viewport->setViewportClipDistances(rgbClipMin_, rgbClipMax_);
224 
225  fbo_renderer_rgb_->render_RGB(world3DScene, curObs->image);
226 
227  tle2.stop();
228 
229  // Store generated obs:
230  {
231  std::lock_guard<std::mutex> csl(last_obs_cs_);
232  last_obs_ = std::move(curObs);
234  }
235 
236  {
237  auto lckHasTo = mrpt::lockHelper(has_to_render_mtx_);
239 
240  if (glCustomVisual_) glCustomVisual_->setVisibility(true);
241 
242  gui_uptodate_ = false;
243  has_to_render_.reset();
244  }
245 }
246 
247 // Simulate sensor AFTER timestep, with the updated vehicle dynamical state:
249 {
252  {
253  has_to_render_ = context;
255  }
256 }
257 
bool sensor_has_to_create_egl_context()
Definition: World.cpp:397
World * world()
Definition: SensorBase.h:76
mrpt::obs::CObservationImage sensor_params_
Definition: CameraSensor.h:48
std::map< std::string, TParamEntry > TParameterDefinitions
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions &params, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
Definition: xml_utils.cpp:224
f
mrpt::math::TPose3D getPose() const
Definition: Simulable.cpp:438
static void RegisterSensorFOVViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
Definition: SensorBase.cpp:71
std::shared_ptr< mrpt::opengl::CFBORender > fbo_renderer_rgb_
Definition: CameraSensor.h:55
bool should_simulate_sensor(const TSimulContext &context)
Definition: SensorBase.cpp:283
mrpt::obs::CObservationImage::Ptr last_obs_
Definition: CameraSensor.h:52
std::map< std::string, std::string > varValues_
Filled in by SensorBase::loadConfigFrom()
Definition: SensorBase.h:92
mrpt::Clock::time_point get_simul_timestamp() const
Definition: World.h:118
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_origin_corner_
Definition: CameraSensor.h:66
static void RegisterSensorOriginViz(const std::shared_ptr< mrpt::opengl::CSetOfObjects > &o)
Definition: SensorBase.cpp:76
std::shared_ptr< mrpt::opengl::CSetOfObjects > glCustomVisual_
Definition: VisualObject.h:75
std::optional< TSimulContext > has_to_render_
Definition: CameraSensor.h:61
Simulable & vehicle_
The vehicle this sensor is attached to.
Definition: SensorBase.h:74
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
virtual void simul_post_timestep(const TSimulContext &context) override
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_fov_
Definition: CameraSensor.h:68
virtual void simul_pre_timestep(const TSimulContext &context) override
void simulateOn3DScene(mrpt::opengl::COpenGLScene &gl_scene) override
void reportNewObservation(const std::shared_ptr< mrpt::obs::CObservation > &obs, const TSimulContext &context)
Definition: SensorBase.cpp:160
std::mutex last_obs_cs_
Definition: CameraSensor.h:50
std::string name_
Definition: Simulable.h:120
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:59
mrpt::obs::CObservationImage::Ptr last_obs2gui_
Definition: CameraSensor.h:53
CameraSensor(Simulable &parent, const rapidxml::xml_node< char > *root)
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root)
Definition: SensorBase.cpp:249
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_origin_
Definition: CameraSensor.h:66
mrpt::system::CTimeLogger & getTimeLogger()
Definition: World.h:320
virtual void loadConfigFrom(const rapidxml::xml_node< char > *root) override
void freeOpenGLResources() override
void mark_as_pending_running_sensors_on_3D_scene()
Definition: World.h:213
std::mutex has_to_render_mtx_
Definition: CameraSensor.h:62
void make_sure_we_have_a_name(const std::string &prefix)
Assign a sensible default name/sensor label if none is provided:
Definition: SensorBase.cpp:271
mrpt::opengl::CSetOfObjects::Ptr gl_sensor_frustum_
Definition: CameraSensor.h:68


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