20 #include <mrpt/3rdparty/do_opencv_includes.h> 40 : m_sensorPoseOnRobot(),
42 m_relativePoseIntensityWRTDepth(0, 0, 0, -90.0_deg, 0.0_deg, -90.0_deg)
46 m_sensorLabel =
"OPENNI2";
50 m_cameraParamsRGB.ncols = 0;
51 m_cameraParamsRGB.nrows = 0;
53 m_cameraParamsRGB.cx(-1);
54 m_cameraParamsRGB.cy(-1);
55 m_cameraParamsRGB.fx(-1);
56 m_cameraParamsRGB.fy(-1);
58 m_cameraParamsRGB.dist.fill(0);
61 m_cameraParamsDepth.ncols = 0;
62 m_cameraParamsDepth.nrows = 0;
64 m_cameraParamsDepth.cx(-1);
65 m_cameraParamsDepth.cy(-1);
66 m_cameraParamsDepth.fx(-1);
67 m_cameraParamsDepth.fy(-1);
69 m_cameraParamsDepth.dist.fill(0);
78 close(m_user_device_number);
79 #endif // MRPT_HAS_OPENNI2 92 if (getConnectedDevices() <= 0)
98 if (m_serial_number != 0)
100 openDeviceBySerial(m_serial_number);
101 if (getDeviceIDFromSerialNum(
102 m_serial_number, m_user_device_number) ==
false)
105 "Failed to find sensor_id from serial number(%d).",
110 open(m_user_device_number);
112 if (isOpen(m_user_device_number) ==
false)
115 "Failed to open OpenNI2 device(%d).", m_user_device_number));
121 if (getDepthSensorParam(
122 m_cameraParamsDepth, m_user_device_number) ==
false)
129 if (getColorSensorParam(m_cameraParamsRGB, m_user_device_number) ==
136 catch (std::logic_error& e)
142 #endif // MRPT_HAS_OPENNI2 154 bool thereIs, hwError;
157 std::make_shared<CObservation3DRangeScan>();
159 assert(getNumDevices() > 0);
160 getNextObservation(*newObs, thereIs, hwError);
172 std::vector<mrpt::serialization::CSerializable::Ptr> objs;
173 if (m_grab_image || m_grab_depth || m_grab_3D_points)
174 objs.push_back(newObs);
176 appendObservations(objs);
180 #endif // MRPT_HAS_OPENNI2 191 const std::string& iniSection)
193 cout <<
"COpenNI2Sensor::loadConfig_sensorSpecific...\n";
195 m_sensorPoseOnRobot.setFromValues(
196 configSource.
read_float(iniSection,
"pose_x", 0),
197 configSource.
read_float(iniSection,
"pose_y", 0),
198 configSource.
read_float(iniSection,
"pose_z", 0),
204 configSource.
read_bool(iniSection,
"preview_window", m_preview_window);
206 m_width = configSource.
read_int(iniSection,
"width", 0);
207 m_height = configSource.
read_int(iniSection,
"height", 0);
208 m_fps = configSource.
read_float(iniSection,
"fps", 0);
209 std::cout <<
"width " << m_width <<
" height " << m_height <<
" fps " 212 bool hasRightCameraSection =
214 bool hasLeftCameraSection =
216 bool hasLeft2RightPose =
217 configSource.
sectionExists(iniSection +
string(
"_LEFT2RIGHT_POSE"));
225 catch (
const std::exception& e)
227 std::cout <<
"[COpenNI2Sensor::loadConfig_sensorSpecific] Warning: " 228 "Ignoring error loading calibration parameters:\n" 231 if (hasRightCameraSection)
235 if (hasLeftCameraSection)
239 if (hasLeft2RightPose)
242 0, 0, 0, -90.0_deg, 0.0_deg, -90.0_deg);
243 m_relativePoseIntensityWRTDepth =
249 m_user_device_number = configSource.
read_int(
250 iniSection,
"device_number", m_user_device_number);
253 configSource.
read_int(iniSection,
"serial_number", m_serial_number);
256 configSource.
read_bool(iniSection,
"grab_image", m_grab_image);
258 configSource.
read_bool(iniSection,
"grab_depth", m_grab_depth);
260 configSource.
read_bool(iniSection,
"grab_3D_points", m_grab_3D_points);
264 iniSection,
"relativePoseIntensityWRTDepth",
"");
265 if (!s.empty()) m_relativePoseIntensityWRTDepth.fromString(s);
279 bool& hardware_error)
286 out_obs, there_is_obs, hardware_error, m_user_device_number);
310 if (m_preview_window)
314 if (++m_preview_decim_counter_range > m_preview_window_decimation)
316 m_preview_decim_counter_range = 0;
321 m_win_range->setPos(5, 5);
329 if (++m_preview_decim_counter_rgb > m_preview_window_decimation)
331 m_preview_decim_counter_rgb = 0;
336 m_win_int->setPos(300, 5);
344 if (m_win_range) m_win_range.reset();
345 if (m_win_int) m_win_int.reset();
354 #endif // MRPT_HAS_OPENNI2
mrpt::img::TCamera cameraParams
Projection parameters of the depth camera.
void unprojectInto(POINTMAP &dest_pointcloud, const T3DPointsProjectionParams &projectParams=T3DPointsProjectionParams(), const TRangeImageFilterParams &filterParams=TRangeImageFilterParams())
Unprojects the RGB+D image pair into a 3D point cloud (with color if the target map supports it) and ...
void resize(size_t row, size_t col)
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
#define THROW_EXCEPTION(msg)
std::string std::string format(std::string_view fmt, ARGS &&... args)
bool isValidParameter(const mrpt::img::TCamera ¶m)
void getNextObservation(mrpt::obs::CObservation3DRangeScan &out_obs, bool &there_is_obs, bool &hardware_error)
The main data retrieving function, to be called after calling loadConfig() and initialize().
A range or depth 3D scan measurement, as from a time-of-flight range camera or a structured-light dep...
Contains classes for various device interfaces.
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
A class for grabing "range images", intensity images (either RGB or IR) and other information from an...
int read_int(const std::string §ion, const std::string &name, int defaultValue, bool failIfNotFound=false) const
This class allows loading and storing values and vectors of different types from a configuration text...
This base provides a set of functions for maths stuff.
mrpt::poses::CPose3D relativePoseIntensityWRTDepth
Relative pose of the intensity camera wrt the depth camera (which is the coordinates origin for this ...
constexpr double DEG2RAD(const double x)
Degrees to radians.
mrpt::img::CImage intensityImage
If hasIntensityImage=true, a color or gray-level intensity image of the same size than "rangeImage"...
This namespace contains representation of robot actions and observations.
bool hasRangeImage
true means the field rangeImage contains valid data
Parameters for the Brown-Conrady camera lens distortion model.
mrpt::math::CMatrix_u16 rangeImage
If hasRangeImage=true, a matrix of floats with the range data as captured by the camera (in meters)...
bool sectionExists(const std::string §ion_name) const
Checks if a given section exists (name is case insensitive)
void loadFromConfigFile(const std::string §ion, const mrpt::config::CConfigFileBase &cfg)
Load all the params from a config source, in the same format that used in saveToConfigFile().
A class used to store a 3D pose as a translation (x,y,z) and a quaternion (qr,qx,qy,qz).
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
void setPathForExternalImages(const std::string &directory) override
Set the path where to save off-rawlog image files (this class DOES take into account this path)...
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot.
void doProcess() override
To be called at a high rate (>XX Hz), this method populates the internal buffer of received observati...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
bool hasIntensityImage
true means the field intensityImage contains valid data
TCamera leftCamera
Intrinsic and distortion parameters of the left and right cameras.
mrpt::img::CImage rangeImage_getAsImage(const std::optional< mrpt::img::TColormap > color=std::nullopt, const std::optional< float > normMinRange=std::nullopt, const std::optional< float > normMaxRange=std::nullopt, const std::optional< std::string > additionalLayerName=std::nullopt) const
Builds a visualization from the rangeImage.
mrpt::math::TPose3DQuat rightCameraPose
Pose of the right camera with respect to the coordinate origin of the left camera.
~COpenNI2Sensor() override
Default ctor.
void initialize() override
Initializes the 3D camera - should be invoked after calling loadConfig() or setting the different par...
uint32_t twist(const uint32_t m, const uint32_t s0, const uint32_t s1)
void loadConfig_sensorSpecific(const mrpt::config::CConfigFileBase &configSource, const std::string §ion) override
Loads specific configuration for the device from a given source of configuration parameters, for example, an ".ini" file, loading from the section "[iniSection]" (see config::CConfigFileBase and derived classes)
static CDisplayWindow::Ptr Create(const std::string &windowCaption, unsigned int initWidth=400, unsigned int initHeight=400)
Class factory returning a smart pointer.
mrpt::img::TCamera cameraParamsIntensity
Projection parameters of the intensity (graylevel or RGB) camera.
uint32_t ncols
Camera resolution.
Structure to hold the parameters of a pinhole stereo camera model.
#define MRPT_UNUSED_PARAM(a)
Determines whether this is an X86 or AMD64 platform.