17 #include <mrpt/3rdparty/do_opencv_includes.h>    41 std::vector<std::shared_ptr<COpenNI2Generic::CDevice>> 
vDevices;
    46 bool setONI2StreamMode(
    47     openni::VideoStream& stream, 
int w, 
int h, 
int fps,
    48     openni::PixelFormat 
format);
    49 std::string oni2DevInfoStr(
const openni::DeviceInfo& info, 
int tab = 0);
    50 bool cmpONI2Device(
const openni::DeviceInfo& i1, 
const openni::DeviceInfo& i2);
    51 #endif  // MRPT_HAS_OPENNI2    65     : m_rgb_format(openni::PIXEL_FORMAT_RGB888),
    66       m_depth_format(openni::PIXEL_FORMAT_DEPTH_1_MM)
    69     const char* sVerbose = getenv(
"MRPT_HWDRIVERS_VERBOSE");
    70     m_verbose = (sVerbose != 
nullptr) && atoi(sVerbose) != 0;
    76             "After initialization:\n %s\n",
    77             openni::OpenNI::getExtendedError()));
    83     int width, 
int height, 
float fps, 
bool open_streams_now)
    88       m_rgb_format(openni::PIXEL_FORMAT_RGB888),
    89       m_depth_format(openni::PIXEL_FORMAT_DEPTH_1_MM),
    94       m_grab_3D_points(true)
    96     const char* sVerbose = getenv(
"MRPT_HWDRIVERS_VERBOSE");
    97     m_verbose = (sVerbose != 
nullptr) && atoi(sVerbose) != 0;
   105                 "After initialization:\n %s\n",
   106                 openni::OpenNI::getExtendedError()));
   123             std::cerr << 
"[" << __FUNCTION__ << 
"]" << std::endl
   124                       << 
" Initialized OpenNI2." << std::endl;
   131 #endif  // MRPT_HAS_OPENNI2   148     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   159     std::cerr << message;
   169     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   171     openni::Array<openni::DeviceInfo> oni2InfoArray;
   172     openni::OpenNI::enumerateDevices(&oni2InfoArray);
   174     const size_t numDevices = oni2InfoArray.getSize();
   177         " Get device list. %d devices connected.\n", (
int)numDevices));
   180     std::set<int> newDevices;
   181     for (
unsigned i = 0; i < numDevices; i++)
   183         const openni::DeviceInfo& info = oni2InfoArray[i];
   185         showLog(oni2DevInfoStr(info, 3) + 
"\n");
   187         bool isExist = 
false;
   188         for (
unsigned int j = 0, j_end = 
vDevices.size();
   189              j < j_end && isExist == 
false; ++j)
   191             if (cmpONI2Device(info, 
vDevices[j]->getInfo()))
   196         if (isExist == 
false)
   198             newDevices.insert(i);
   202     for (
int newDevice : newDevices)
   204         const openni::DeviceInfo& info = oni2InfoArray[newDevice];
   211             if (device->getSerialNumber(sn))
   214                     "Device[%d]: serial number: `%u`\n", newDevice, sn));
   221         showLog(
" No devices connected -> EXIT\n");
   230 #endif  // MRPT_HAS_OPENNI2   235     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   238     openni::OpenNI::shutdown();
   241 #endif  // MRPT_HAS_OPENNI2   247     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   252     return vDevices[sensor_id]->isOpen();
   255 #endif  // MRPT_HAS_OPENNI2   261     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   270             "Sensor index is higher than the number of connected devices.");
   278             mrpt::format(
" The sensor [%d] is already opened\n", sensor_id));
   283             "[COpenNI2Generic] DBG: [%s] about to call vDevices[%d]->open()\n",
   284             __FUNCTION__, sensor_id);
   290         showLog(
" open successfully.\n");
   296     std::this_thread::sleep_for(1000ms);  
   299 #endif  // MRPT_HAS_OPENNI2   303     [maybe_unused]] 
const std::set<unsigned>& serial_required)
   306     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   308     unsigned num_open_dev = 0;
   309     for (
unsigned sensor_id = 0; sensor_id < 
vDevices.size(); sensor_id++)
   311         unsigned int serialNum;
   312         if (
vDevices[sensor_id]->getSerialNumber(serialNum) == 
false)
   319                 "[COpenNI2Generic::openDevicesBySerialNum] checking device "   320                 "with serial '%d'\n",
   323         if (serial_required.find(serialNum) == serial_required.end())
   337                 "[COpenNI2Generic] DBG: [%s] about to call "   338                 "vDevices[%d]->open(%d,%d,%d)\n",
   339                 __FUNCTION__, sensor_id, width, height, (
int)
m_fps);
   348                 "[COpenNI2Generic] DBG: [%s] now has %d devices open\n",
   349                 __FUNCTION__, num_open_dev);
   354 #endif  // MRPT_HAS_OPENNI2   358     const unsigned int SerialRequired)
   360     std::set<unsigned> serial_required;
   361     serial_required.insert(SerialRequired);
   366     [[maybe_unused]] 
const unsigned int SerialRequired,
   367     [[maybe_unused]] 
int& sensor_id)
 const   370     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   371     for (
size_t i = 0, i_end = 
vDevices.size(); i < i_end; ++i)
   374         if (
vDevices[i]->getSerialNumber(sn) == 
false)
   378         if (sn == SerialRequired)
   387 #endif  // MRPT_HAS_OPENNI2   393     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   402             "Sensor index is higher than the number of connected devices.");
   407 #endif  // MRPT_HAS_OPENNI2   422     [[maybe_unused]] 
bool& there_is_obs, [[maybe_unused]] 
bool& hardware_error,
   423     [[maybe_unused]] 
unsigned sensor_id)
   434             "Sensor index is higher than the number of connected devices.");
   437             rgb_img, timestamp, there_is_obs, hardware_error) == 
false)
   445 #endif  // MRPT_HAS_OPENNI2   451     [[maybe_unused]] 
bool& there_is_obs, [[maybe_unused]] 
bool& hardware_error,
   452     [[maybe_unused]] 
unsigned sensor_id)
   463             "Sensor index is higher than the number of connected devices.");
   466             depth_img_mm, timestamp, there_is_obs, hardware_error) == 
false)
   474 #endif  // MRPT_HAS_OPENNI2   487     [[maybe_unused]] 
bool& there_is_obs, [[maybe_unused]] 
bool& hardware_error,
   488     [[maybe_unused]] 
unsigned sensor_id)
   499             "Sensor index is higher than the number of connected devices.");
   502             out_obs, there_is_obs, hardware_error) == 
false)
   510 #endif  // MRPT_HAS_OPENNI2   515     [[maybe_unused]] 
unsigned sensor_id)
 const   518     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   519     if (
isOpen(sensor_id) == 
false)
   526 #endif  // MRPT_HAS_OPENNI2   531     [[maybe_unused]] 
unsigned sensor_id)
 const   534     std::lock_guard<std::recursive_mutex> lock(
vDevices_mx);
   535     if (
isOpen(sensor_id) == 
false)
   542 #endif  // MRPT_HAS_OPENNI2   555 bool setONI2StreamMode(
   556     openni::VideoStream& stream, 
int w, 
int h, 
int fps,
   557     openni::PixelFormat 
format)
   562     const openni::Array<openni::VideoMode>& modes =
   563         stream.getSensorInfo().getSupportedVideoModes();
   564     for (
int i = 0, i_end = modes.getSize(); i < i_end; ++i)
   570         if (modes[i].getResolutionX() != w)
   574         if (modes[i].getResolutionY() != h)
   578         if (modes[i].getFps() != fps)
   582         if (modes[i].getPixelFormat() != 
format)
   586         openni::Status rc = stream.setVideoMode(modes[i]);
   587         if (rc != openni::STATUS_OK)
   596 std::string oni2DevInfoStr(
const openni::DeviceInfo& info, 
int tab)
   598     std::stringstream sst;
   600     for (
int i = 0; i < tab; ++i)
   604     sst << space << 
"name=" << info.getName() << std::endl;
   605     sst << space << 
"uri=" << info.getUri() << std::endl;
   606     sst << space << 
"vendor=" << info.getVendor() << std::endl;
   607     sst << space << 
"product=" << info.getUsbProductId();
   611 bool cmpONI2Device(
const openni::DeviceInfo& i1, 
const openni::DeviceInfo& i2)
   613     return (strcmp(i1.getUri(), i2.getUri()) == 0);
   616 COpenNI2Generic::CDevice::CDevice(
   617     const openni::DeviceInfo& info, openni::PixelFormat rgb,
   618     openni::PixelFormat depth, 
bool verbose)
   619     : m_info(info), m_mirror(true), m_verbose(
verbose)
   621     m_streams[COLOR_STREAM] =
   622         CStream::create(m_device, openni::SENSOR_COLOR, rgb, m_log, 
m_verbose);
   623     m_streams[IR_STREAM] =
   624         CStream::create(m_device, openni::SENSOR_IR, rgb, m_log, 
m_verbose);
   625     m_streams[DEPTH_STREAM] = CStream::create(
   626         m_device, openni::SENSOR_DEPTH, depth, m_log, 
m_verbose);
   629 COpenNI2Generic::CDevice::~CDevice() { 
close(); }
   630 bool COpenNI2Generic::CDevice::synchMirrorMode()
   634     for (
auto& m_stream : m_streams)
   636         if (!m_stream) 
continue;
   640             mirror_support = m_stream->isMirrorSupported();
   642         catch (std::logic_error& e)
   646         if (mirror_support == 
false)
   648             m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl;
   649             m_log << 
" openni::STREAM_PROPERTY_MIRRORING is not supported on "   650                   << m_stream->getName() << 
"." << std::endl;
   651             m_log << 
" We assume this is MS Kinect and taken images are "   652                      "inverted to right and left."   661     for (
auto& m_stream : m_streams)
   663         if (!m_stream) 
continue;
   664         if (m_stream->isMirrorSupported() == 
false)
   668         if (m_stream->setMirror(m_mirror) == 
false)
   676 bool COpenNI2Generic::CDevice::startStreams()
   680     for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
   682         if (!m_streams[i]) 
continue;
   684             printf(
"  [%s] calling m_streams[%d]->start()\n", __FUNCTION__, i);
   685         if (m_streams[i]->
start() == 
false)
   689                     "  [%s] m_streams[%d]->start() returned FALSE!\n",
   698                 "  [%s] m_streams[%d]->start() returned TRUE\n", __FUNCTION__,
   703             "  [COpenNI2Generic::CDevice::startStreams()] %d streams were "   710 bool COpenNI2Generic::CDevice::isOpen()
 const   712     return (m_streams[COLOR_STREAM] && m_streams[COLOR_STREAM]->isValid()) ||
   713            (m_streams[DEPTH_STREAM] && m_streams[DEPTH_STREAM]->isValid());
   716 void COpenNI2Generic::CDevice::close()
   718     for (
auto& m_stream : m_streams)
   720         if (!m_stream) 
continue;
   726 bool COpenNI2Generic::CDevice::open(
int w, 
int h, 
int fps)
   731             "  [COpenNI2Generic::CDevice::open()] Called with w=%i h=%i "   736     openni::Status rc = m_device.open(getInfo().getUri());
   737     if (rc != openni::STATUS_OK)
   739         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
   740               << 
" Failed to open device " << getInfo().getUri() << 
" "   741               << openni::OpenNI::getExtendedError() << std::endl;
   744     for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
   746         if (!m_streams[i]) 
continue;
   748             printf(
"   [%s] calling m_streams[%d]->open()\n", __FUNCTION__, i);
   750         if (m_streams[i]->
open(w, h, fps) == 
false)
   754                     "   [%s] m_streams[%d]->open() returned FALSE\n",
   760                 "   [%s] m_streams[%d]->open() returned OK\n", __FUNCTION__, i);
   763     if (synchMirrorMode() == 
false)
   769     if (m_streams[DEPTH_STREAM])
   772         m_streams[DEPTH_STREAM]->setCloseRange(CloseRange);
   773         m_log << 
" Close range: " << (CloseRange ? 
"On" : 
"Off") << std::endl;
   777         printf(
"   DBG: checking if imageRegistrationMode is supported\n");
   778     if (m_device.isImageRegistrationModeSupported(
   779             openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR) &&
   780         m_streams[DEPTH_STREAM] && m_streams[DEPTH_STREAM]->isValid() &&
   781         m_streams[COLOR_STREAM] && m_streams[COLOR_STREAM]->isValid())
   786         if (m_device.setImageRegistrationMode(
   787                 openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR) != openni::STATUS_OK)
   789             m_log << 
" setImageRegistrationMode() Failed:"   790                   << openni::OpenNI::getExtendedError() << endl;
   794             m_log << 
" setImageRegistrationMode() Success" << endl;
   799         m_log << 
"  Device doesn't do image registration!" << endl;
   804         m_streams[COLOR_STREAM]->disableAutoExposure();
   805         printf(
"DBG: returned from disableAutoExposure()\n");
   808     if (startStreams() == 
false)
   817 bool COpenNI2Generic::CDevice::getNextFrameRGB(
   819     bool& there_is_obs, 
bool& hardware_error)
   826     openni::VideoFrameRef frame;
   827     if (m_streams[COLOR_STREAM]->getFrame(
   828             frame, timestamp, there_is_obs, hardware_error) == 
false)
   832     copyFrame<openni::RGB888Pixel, mrpt::img::CImage>(frame, img);
   838 bool COpenNI2Generic::CDevice::getNextFrameD(
   840     bool& there_is_obs, 
bool& hardware_error)
   847     openni::VideoFrameRef frame;
   848     if (m_streams[DEPTH_STREAM]->getFrame(
   849             frame, timestamp, there_is_obs, hardware_error) == 
false)
   853     copyFrame<openni::DepthPixel, mrpt::math::CMatrix_u16>(frame, depth_mm);
   859 bool COpenNI2Generic::CDevice::getNextFrameRGBD(
   861     bool& hardware_error)
   865     there_is_obs = 
false;
   866     hardware_error = 
false;
   878     openni::VideoFrameRef frame[STREAM_TYPE_SIZE];
   879     for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
   881         if (!m_streams[i] || !m_streams[i]->isValid()) 
continue;
   882         if (m_streams[i]->getFrame(
   883                 frame[i], tm, there_is_obs, hardware_error) == 
false)
   887         if (there_is_obs == 
false || hardware_error == 
true)
   893     const int width = frame[COLOR_STREAM].getWidth();
   894     const int height = frame[COLOR_STREAM].getHeight();
   895     if ((frame[DEPTH_STREAM].getWidth() != width) ||
   896         (frame[DEPTH_STREAM].
getHeight() != height))
   898         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
   899               << 
" Both frames don't have the same size." << std::endl;
   909     resize(obs, width, height);
   911     const char* 
data[STREAM_TYPE_SIZE] = {
   912         (
const char*)frame[COLOR_STREAM].getData(),
   913         (
const char*)frame[DEPTH_STREAM].getData()};
   914     const int step[STREAM_TYPE_SIZE] = {frame[COLOR_STREAM].getStrideInBytes(),
   915                                         frame[DEPTH_STREAM].getStrideInBytes()};
   917     for (
int yc = 0; yc < height; ++yc)
   919         const auto* pRgb = (
const openni::RGB888Pixel*)
data[COLOR_STREAM];
   920         const auto* pDepth = (
const openni::DepthPixel*)
data[DEPTH_STREAM];
   921         for (
int xc = 0; xc < width; ++xc, ++pDepth, ++pRgb)
   931         data[COLOR_STREAM] += step[COLOR_STREAM];
   932         data[DEPTH_STREAM] += step[DEPTH_STREAM];
   940     const openni::DeviceInfo& info, openni::PixelFormat rgb,
   941     openni::PixelFormat depth, 
bool verbose)
   943     return std::make_shared<CDevice>(info, rgb, depth, 
verbose);
   946 bool COpenNI2Generic::CDevice::getSerialNumber(std::string& sn)
   951     if (isOpened == 
false)
   953         rc = m_device.open(getInfo().getUri());
   954         if (rc != openni::STATUS_OK)
   956             m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
   957                   << 
" Failed to open device " << getInfo().getUri() << 
" "   958                   << openni::OpenNI::getExtendedError() << std::endl;
   962     char serialNumber[16];
   963     rc = m_device.getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER, &serialNumber);
   964     if (rc != openni::STATUS_OK)
   966         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
   967               << 
" Failed to getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER) "   968               << getInfo().getUri() << 
" " << openni::OpenNI::getExtendedError()
   972     sn = std::string(serialNumber);
   973     if (isOpened == 
false)
   980 bool COpenNI2Generic::CDevice::getSerialNumber(
unsigned int& sn)
   983     if (getSerialNumber(str) == 
false)
   987     std::stringstream sst;
   995     std::ostream& log, 
bool verbose)
   998       m_strName(
"Unknown"),
  1003     if (m_type == openni::SENSOR_COLOR)
  1005         m_strName = 
"openni::SENSOR_COLOR";
  1007     else if (m_type == openni::SENSOR_DEPTH)
  1009         m_strName = 
"openni::SENSOR_DEPTH";
  1011     else if (m_type == openni::SENSOR_IR)
  1013         m_strName = 
"openni::SENSOR_IR";
  1017         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1018               << 
" Unknown SensorType -> " << m_type << std::endl;
  1022 COpenNI2Generic::CDevice::CStream::~CStream() { destroy(); }
  1023 bool COpenNI2Generic::CDevice::CStream::isMirrorSupported()
 const  1025     if (isValid() == 
false)
  1029     return m_stream.isPropertySupported(openni::STREAM_PROPERTY_MIRRORING);
  1032 bool COpenNI2Generic::CDevice::CStream::setMirror(
bool flag)
  1034     if (isValid() == 
false)
  1036         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1037               << 
" " << getName() << 
" is not opened." << std::endl;
  1040     if (m_stream.isPropertySupported(openni::STREAM_PROPERTY_MIRRORING) ==
  1045     if (m_stream.setMirroringEnabled(flag) != openni::STATUS_OK)
  1047         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1048               << 
" setMirroringEnabled() failed: "  1049               << openni::OpenNI::getExtendedError() << std::endl;
  1055 bool COpenNI2Generic::CDevice::CStream::isValid()
 const  1057     return m_stream.isValid();
  1060 void COpenNI2Generic::CDevice::CStream::destroy() { m_stream.destroy(); }
  1061 void COpenNI2Generic::CDevice::CStream::setCloseRange(
int& value)
  1065             "      [CDevice::CStream::setCloseRange] entry with value=%d\n",
  1067     m_stream.setProperty(XN_STREAM_PROPERTY_CLOSE_RANGE, value);
  1070             "      [CDevice::CStream::setCloseRange] returned from "  1071             "mstream.setProperty()\n");
  1072     m_stream.getProperty(XN_STREAM_PROPERTY_CLOSE_RANGE, &value);
  1075             "      [CDevice::CStream::setCloseRange] returned from "  1076             "mstream.getProperty() ... value %d\n",
  1080 bool COpenNI2Generic::CDevice::CStream::open(
int w, 
int h, 
int fps)
  1083     if (m_type != openni::SENSOR_COLOR && m_type != openni::SENSOR_DEPTH &&
  1084         m_type != openni::SENSOR_IR)
  1086         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1087               << 
" Unknown SensorType -> " << m_type << std::endl;
  1092             "      [COpenNI2Generic::CDevice::CStream::open] opening sensor "  1093             "stream with m_type == %d\n",
  1095     openni::Status rc = openni::STATUS_OK;
  1102     rc = m_stream.create(m_device, m_type);
  1103     if (rc != openni::STATUS_OK)
  1105         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1106               << 
" Couldn't find sensor " << m_strName << 
":"  1107               << openni::OpenNI::getExtendedError() << std::endl;
  1108         if (m_type == openni::SENSOR_COLOR)
  1110             m_type = openni::SENSOR_IR;
  1111             m_strName = 
"openni::SENSOR_IR";  
  1113                 printf(
"DBG: changing type to SENSOR_IR (%d)\n", (
int)m_type);
  1114             rc = m_stream.create(m_device, m_type);
  1119     if (m_verbose) printf(
"returned OK from stream.create()\n");
  1120     openni::VideoMode options = m_stream.getVideoMode();
  1121     m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl;
  1122     m_log << 
" " << m_strName << std::endl;
  1125                  "Initial resolution (%d, %d) FPS %d Format %d",
  1126                  options.getResolutionX(), options.getResolutionY(),
  1127                  options.getFps(), options.getPixelFormat())
  1129     if (m_verbose) printf(
"DBG: calling setONI2StreamMode()\n");
  1130     if (setONI2StreamMode(m_stream, w, h, fps, m_format) == 
false)
  1132         m_log << 
" Can't find desired mode in the " << getName() << std::endl;
  1136     if (m_verbose) printf(
"DBG: returned OK from setONI2StreamMode()\n");
  1137     if (m_verbose) printf(
"DBG: calling stream.getVideoMode()\n");
  1138     options = m_stream.getVideoMode();
  1141                  "-> (%d, %d) FPS %d Format %d", options.getResolutionX(),
  1142                  options.getResolutionY(), options.getFps(),
  1143                  options.getPixelFormat())
  1147             "      [COpenNI2Generic::CDevice::CStream::open] returning TRUE\n");
  1151 bool COpenNI2Generic::CDevice::CStream::start()
  1153     if (isValid() == 
false)
  1155         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1156               << 
" " << getName() << 
" is not opened." << std::endl;
  1159     if (m_stream.start() != openni::STATUS_OK)
  1161         m_log << 
"[" << __FUNCTION__ << 
"]" << std::endl
  1162               << 
" Couldn't start " << getName()
  1163               << 
" stream:" << openni::OpenNI::getExtendedError() << std::endl;
  1170 COpenNI2Generic::CDevice::CStream::Ptr
  1171     COpenNI2Generic::CDevice::CStream::create(
  1173         openni::PixelFormat 
format, std::ostream& log, 
bool verbose)
  1175     return std::make_shared<CStream>(device, type, 
format, log, 
verbose);
  1178 bool COpenNI2Generic::CDevice::CStream::getFrame(
  1180     bool& there_is_obs, 
bool& hardware_error)
  1182     there_is_obs = 
false;
  1183     hardware_error = 
false;
  1184     if (isValid() == 
false)
  1188     openni::Status rc = m_stream.readFrame(&frame);
  1189     if (rc != openni::STATUS_OK)
  1191         hardware_error = 
true;
  1192         std::string message =
  1193             mrpt::format(
"Failed to grab frame from %s", getName().c_str());
  1196     there_is_obs = 
true;
  1201 #endif  // MRPT_HAS_OPENNI2 
void setVerbose(bool verbose)
 
int getNumDevices() const
The number of available devices at initialization. 
 
bool getDepthSensorParam(mrpt::img::TCamera ¶m, unsigned sensor_id=0) const
 
app initialize(argc, argv)
 
#define THROW_EXCEPTION(msg)
 
std::string std::string format(std::string_view fmt, ARGS &&... args)
 
mrpt::system::TTimeStamp getCurrentTime()
Returns the current (UTC) system time. 
 
void getNextFrameRGB(mrpt::img::CImage &rgb_img, mrpt::system::TTimeStamp ×tamp, bool &there_is_obs, bool &hardware_error, unsigned sensor_id=0)
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...
 
void getNextFrameRGBD(mrpt::obs::CObservation3DRangeScan &out_obs, bool &there_is_obs, bool &hardware_error, unsigned sensor_id=0)
The main data retrieving function, to be called after calling loadConfig() and initialize(). 
 
Contains classes for various device interfaces. 
 
COpenNI2Generic()
Default ctor (width=640, height=480, fps=30) 
 
mrpt::io::CStream CStream
 
int m_width
The same options (width, height and fps) are set for all the sensors. 
 
void kill()
Kill the OpenNI2 driver. 
 
std::vector< std::shared_ptr< COpenNI2Generic::CDevice > > vDevices
 
mrpt::Clock::time_point TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
 
unsigned int openDeviceBySerial(const unsigned int SerialRequired)
Open a RGBD device specified by its serial number. 
 
bool start()
Open all sensor streams (normally called automatically at constructor, no need to call it manually)...
 
void getNextFrameD(mrpt::math::CMatrix_u16 &depth_img_mm, mrpt::system::TTimeStamp ×tamp, bool &there_is_obs, bool &hardware_error, unsigned sensor_id=0)
The main data retrieving function, to be called after calling loadConfig() and initialize(). 
 
bool getColorSensorParam(mrpt::img::TCamera ¶m, unsigned sensor_id=0) const
 
bool isOpen(const unsigned sensor_id) const
Whether there is a working connection to the sensor. 
 
mrpt::img::CImage intensityImage
If hasIntensityImage=true, a color or gray-level intensity image of the same size than "rangeImage"...
 
static int getNumInstances()
Get the number of OpenNI2 cameras currently open via COpenNI2Generic. 
 
This namespace contains representation of robot actions and observations. 
 
bool hasRangeImage
true means the field rangeImage contains valid data 
 
void close(unsigned sensor_id=0)
Close the connection to the sensor (no need to call it manually unless desired for some reason...
 
Parameters for the Brown-Conrady camera lens distortion model. 
 
std::atomic< int > numInstances(0)
 
mrpt::math::CMatrix_u16 rangeImage
If hasRangeImage=true, a matrix of floats with the range data as captured by the camera (in meters)...
 
bool hasPoints3D
true means the field points3D contains valid data. 
 
unsigned int openDevicesBySerialNum(const std::set< unsigned > &vSerialRequired)
Open a set of RGBD devices specified by their serial number. 
 
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp. 
 
bool hasIntensityImage
true means the field intensityImage contains valid data 
 
std::recursive_mutex vDevices_mx
 
void open(unsigned sensor_id=0)
Try to open the camera (all the parameters [resolution,fps,...] must be set before calling this) - us...
 
bool getDeviceIDFromSerialNum(const unsigned int SerialRequired, int &sensor_id) const
Get the ID of the device corresponding to 'SerialRequired'. 
 
int getConnectedDevices()
Get a list of the connected OpenNI2 sensors. 
 
void showLog(const std::string &message) const
 
~COpenNI2Generic()
Default ctor. 
 
double getHeight(const TPolygon3D &p, const TPoint3D &c)
 
bool range_is_depth
true: Kinect-like ranges: entries of rangeImage are distances along the +X axis; false: Ranges in ran...
 
A class for storing images as grayscale or RGB bitmaps. 
 
bool hasConfidenceImage
true means the field confidenceImage contains valid data 
 
static struct FontData data