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>
22 using namespace mvsim;
44 sensor_params_.sensorPose = mrpt::poses::CPose3D(0, 0, 0.5, 90.0_deg, 0, 90.0_deg);
61 params[
"relativePoseIntensityWRTDepth"] =
68 params[
"depth_cx"] =
TParamEntry(
"%lf", &depthCam.intrinsicParams(0, 2));
69 params[
"depth_cy"] =
TParamEntry(
"%lf", &depthCam.intrinsicParams(1, 2));
70 params[
"depth_fx"] =
TParamEntry(
"%lf", &depthCam.intrinsicParams(0, 0));
71 params[
"depth_fy"] =
TParamEntry(
"%lf", &depthCam.intrinsicParams(1, 1));
73 unsigned int depth_ncols = depthCam.ncols, depth_nrows = depthCam.nrows;
74 params[
"depth_ncols"] =
TParamEntry(
"%u", &depth_ncols);
75 params[
"depth_nrows"] =
TParamEntry(
"%u", &depth_nrows);
78 params[
"rgb_cx"] =
TParamEntry(
"%lf", &rgbCam.intrinsicParams(0, 2));
79 params[
"rgb_cy"] =
TParamEntry(
"%lf", &rgbCam.intrinsicParams(1, 2));
80 params[
"rgb_fx"] =
TParamEntry(
"%lf", &rgbCam.intrinsicParams(0, 0));
81 params[
"rgb_fy"] =
TParamEntry(
"%lf", &rgbCam.intrinsicParams(1, 1));
83 unsigned int rgb_ncols = depthCam.ncols, rgb_nrows = depthCam.nrows;
84 params[
"rgb_ncols"] =
TParamEntry(
"%u", &rgb_ncols);
85 params[
"rgb_nrows"] =
TParamEntry(
"%u", &rgb_nrows);
99 depthCam.ncols = depth_ncols;
100 depthCam.nrows = depth_nrows;
102 rgbCam.ncols = rgb_ncols;
103 rgbCam.nrows = rgb_nrows;
113 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
114 [[maybe_unused]]
const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
115 [[maybe_unused]]
bool childrenOnly)
117 mrpt::opengl::CSetOfObjects::Ptr glVizSensors;
120 glVizSensors = std::dynamic_pointer_cast<mrpt::opengl::CSetOfObjects>(
121 viz->get().getByName(
"group_sensors_viz"));
122 if (!glVizSensors)
return;
128 gl_obs_ = mrpt::opengl::CPointCloudColoured::Create();
137 #if MRPT_VERSION >= 0x270
164 mrpt::obs::T3DPointsProjectionParams pp;
165 pp.takeIntoAccountSensorPoseOnRobot =
true;
176 const float frustumScale = 0.4e-3;
178 mrpt::opengl::CFrustum::Create(
last_obs2gui_->cameraParams, frustumScale);
208 using namespace mrpt;
217 auto tle1 = mrpt::system::CTimeLoggerEntry(
world_->
getTimeLogger(),
"sensor.RGBD.acqGuiMtx");
224 auto curObsPtr = mrpt::obs::CObservation3DRangeScan::Create(
sensor_params_);
225 auto& curObs = *curObsPtr;
236 mrpt::opengl::CFBORender::Parameters p;
249 mrpt::opengl::CFBORender::Parameters p;
257 auto viewport = world3DScene.getViewport();
262 const auto fixedAxisConventionRot =
263 mrpt::poses::CPose3D(0, 0, 0, -90.0_deg, 0.0_deg, -90.0_deg);
277 const auto depthSensorPose = vehiclePose + curObs.sensorPose + fixedAxisConventionRot;
279 const auto rgbSensorPose =
280 vehiclePose + curObs.sensorPose + curObs.relativePoseIntensityWRTDepth;
287 camRGB->set6DOFMode(
true);
288 camRGB->setProjectiveFromPinhole(curObs.cameraParamsIntensity);
289 camRGB->setPose(
world()->applyWorldRenderOffset(rgbSensorPose));
296 curObs.hasIntensityImage =
true;
300 curObs.hasIntensityImage =
false;
308 auto tle2 = mrpt::system::CTimeLoggerEntry(
world_->
getTimeLogger(),
"sensor.RGBD.renderD");
310 camDepth->setProjectiveFromPinhole(curObs.cameraParams);
315 camDepth->set6DOFMode(
true);
316 camDepth->setPose(
world()->applyWorldRenderOffset(depthSensorPose));
329 curObs.hasRangeImage =
true;
330 curObs.range_is_depth =
true;
338 (
depthImage_.asEigen().cwiseMin(curObs.maxRange) / curObs.rangeUnits).cast<uint16_t>();
346 thread_local mrpt::random::CRandomGenerator rng;
347 thread_local std::vector<int16_t> noiseSeq;
348 thread_local
size_t noiseIdx = 0;
349 constexpr
size_t noiseLen = 7823;
350 if (noiseSeq.empty())
352 noiseSeq.reserve(noiseLen);
353 for (
size_t i = 0; i < noiseLen; i++)
355 noiseSeq.push_back(
static_cast<int16_t
>(mrpt::round(
360 auto tle2noise = mrpt::system::CTimeLoggerEntry(
363 uint16_t*
d = curObs.rangeImage.data();
364 const size_t N = curObs.rangeImage.size();
366 const int16_t maxRangeInts =
static_cast<int16_t
>(curObs.maxRange / curObs.rangeUnits);
368 for (
size_t i = 0; i < N; i++)
370 if (
d[i] == 0)
continue;
372 const int16_t dNoisy =
static_cast<int16_t
>(
d[i]) + noiseSeq[noiseIdx++];
374 if (noiseIdx >= noiseLen) noiseIdx = 0;
376 if (dNoisy > maxRangeInts)
continue;
378 d[i] =
static_cast<uint16_t
>(dNoisy);
384 curObs.hasRangeImage =
false;
400 auto tlePub = mrpt::system::CTimeLoggerEntry(
world_->
getTimeLogger(),
"sensor.RGBD.report");
425 const auto globalSensorPose = p +
sensor_params_.sensorPose.asTPose();