17 #include <mrpt/otherlibs/do_opencv_includes.h>
25 #if !defined(MRPT_OS_WINDOWS)
39 std::vector<std::shared_ptr<COpenNI2Generic::CDevice>>
41 std::vector<std::shared_ptr<COpenNI2Generic::CDevice>>();
45 bool setONI2StreamMode(
46 openni::VideoStream& stream,
int w,
int h,
int fps,
47 openni::PixelFormat
format);
48 std::string oni2DevInfoStr(
const openni::DeviceInfo& info,
int tab = 0);
49 bool cmpONI2Device(
const openni::DeviceInfo& i1,
const openni::DeviceInfo& i2);
61 m_rgb_format(openni::PIXEL_FORMAT_RGB888),
62 m_depth_format(openni::PIXEL_FORMAT_DEPTH_1_MM),
67 m_grab_3D_points(true)
69 const char* sVerbose = getenv(
"MRPT_HWDRIVERS_VERBOSE");
70 m_verbose = (sVerbose !=
nullptr) && atoi(sVerbose) != 0;
77 "After initialization:\n %s\n",
78 openni::OpenNI::getExtendedError()))
84 int width,
int height,
float fps,
bool open_streams_now)
89 m_rgb_format(openni::PIXEL_FORMAT_RGB888),
90 m_depth_format(openni::PIXEL_FORMAT_DEPTH_1_MM),
95 m_grab_3D_points(true)
97 const char* sVerbose = getenv(
"MRPT_HWDRIVERS_VERBOSE");
98 m_verbose = (sVerbose !=
nullptr) && atoi(sVerbose) != 0;
100 if (open_streams_now)
107 "After initialization:\n %s\n",
108 openni::OpenNI::getExtendedError()))
119 if (openni::OpenNI::initialize() != openni::STATUS_OK)
125 std::cerr <<
"[" << __FUNCTION__ <<
"]" << std::endl
126 <<
" Initialized OpenNI2." << std::endl;
157 std::cerr << message;
168 openni::Array<openni::DeviceInfo> oni2InfoArray;
169 openni::OpenNI::enumerateDevices(&oni2InfoArray);
171 const size_t numDevices = oni2InfoArray.getSize();
175 " Get device list. %d devices connected.\n", (
int)numDevices));
178 std::set<int> newDevices;
179 for (
unsigned i = 0; i < numDevices; i++)
181 const openni::DeviceInfo& info = oni2InfoArray[i];
183 showLog(oni2DevInfoStr(info, 3) +
"\n");
185 bool isExist =
false;
186 for (
unsigned int j = 0, j_end =
vDevices.size();
187 j < j_end && isExist ==
false; ++j)
189 if (cmpONI2Device(info,
vDevices[j]->getInfo()))
194 if (isExist ==
false)
196 newDevices.insert(i);
201 it_end = newDevices.end();
204 const openni::DeviceInfo& info = oni2InfoArray[*it];
211 if (device->getSerialNumber(sn))
214 mrpt::format(
"Device[%d]: serial number: `%u`\n", *it, sn));
221 showLog(
" No devices connected -> EXIT\n");
237 openni::OpenNI::shutdown();
250 return vDevices[sensor_id]->isOpen();
268 "Sensor index is higher than the number of connected devices.")
276 mrpt::format(
" The sensor [%d] is already opened\n", sensor_id));
281 "[COpenNI2Generic] DBG: [%s] about to call vDevices[%d]->open()\n",
282 __FUNCTION__, sensor_id);
288 showLog(
" open successfully.\n");
294 std::this_thread::sleep_for(1000ms);
302 const std::set<unsigned>& serial_required)
306 unsigned num_open_dev = 0;
307 for (
unsigned sensor_id = 0; sensor_id <
vDevices.size(); sensor_id++)
309 unsigned int serialNum;
310 if (
vDevices[sensor_id]->getSerialNumber(serialNum) ==
false)
317 "[COpenNI2Generic::openDevicesBySerialNum] checking device "
318 "with serial '%d'\n",
321 if (serial_required.find(serialNum) == serial_required.end())
335 "[COpenNI2Generic] DBG: [%s] about to call "
336 "vDevices[%d]->open(%d,%d,%d)\n",
346 "[COpenNI2Generic] DBG: [%s] now has %d devices open\n",
347 __FUNCTION__, num_open_dev);
357 const unsigned int SerialRequired)
359 std::set<unsigned> serial_required;
360 serial_required.insert(SerialRequired);
365 const unsigned int SerialRequired,
int& sensor_id)
const
368 for (
size_t i = 0, i_end =
vDevices.size(); i < i_end; ++i)
371 if (
vDevices[i]->getSerialNumber(sn) ==
false)
375 if (sn == SerialRequired)
400 "Sensor index is higher than the number of connected devices.")
420 bool& hardware_error,
unsigned sensor_id)
431 "Sensor index is higher than the number of connected devices.")
434 rgb_img, timestamp, there_is_obs, hardware_error) ==
false)
462 bool& hardware_error,
unsigned sensor_id)
473 "Sensor index is higher than the number of connected devices.")
476 depth_img, timestamp, there_is_obs, hardware_error) ==
false)
502 bool& hardware_error,
unsigned sensor_id)
513 "Sensor index is higher than the number of connected devices.")
516 out_obs, there_is_obs, hardware_error) ==
false)
535 if (
isOpen(sensor_id) ==
false)
551 if (
isOpen(sensor_id) ==
false)
573 bool setONI2StreamMode(
574 openni::VideoStream& stream,
int w,
int h,
int fps,
575 openni::PixelFormat
format)
580 const openni::Array<openni::VideoMode>& modes =
581 stream.getSensorInfo().getSupportedVideoModes();
582 for (
int i = 0, i_end = modes.getSize(); i < i_end; ++i)
588 if (modes[i].getResolutionX() !=
w)
592 if (modes[i].getResolutionY() != h)
596 if (modes[i].getFps() != fps)
600 if (modes[i].getPixelFormat() !=
format)
605 if (rc != openni::STATUS_OK)
614 std::string oni2DevInfoStr(
const openni::DeviceInfo& info,
int tab)
616 std::stringstream sst;
618 for (
int i = 0; i < tab; ++i)
622 sst << space <<
"name=" << info.getName() << std::endl;
623 sst << space <<
"uri=" << info.getUri() << std::endl;
624 sst << space <<
"vendor=" << info.getVendor() << std::endl;
625 sst << space <<
"product=" << info.getUsbProductId();
629 bool cmpONI2Device(
const openni::DeviceInfo& i1,
const openni::DeviceInfo& i2)
631 return (strcmp(i1.getUri(), i2.getUri()) == 0);
634 COpenNI2Generic::CDevice::CDevice(
635 const openni::DeviceInfo& info, openni::PixelFormat rgb,
636 openni::PixelFormat
depth,
bool verbose)
637 : m_info(info), m_mirror(true), m_verbose(verbose)
639 m_streams[COLOR_STREAM] =
640 CStream::create(m_device, openni::SENSOR_COLOR, rgb, m_log,
m_verbose);
641 m_streams[IR_STREAM] =
642 CStream::create(m_device, openni::SENSOR_IR, rgb, m_log,
m_verbose);
643 m_streams[DEPTH_STREAM] = CStream::create(
647 COpenNI2Generic::CDevice::~CDevice() {
close(); }
648 bool COpenNI2Generic::CDevice::synchMirrorMode()
652 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
654 if (!m_streams[i])
continue;
658 mirror_support = m_streams[i]->isMirrorSupported();
660 catch (std::logic_error& e)
664 if (mirror_support ==
false)
666 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl;
667 m_log <<
" openni::STREAM_PROPERTY_MIRRORING is not supported on "
668 << m_streams[i]->getName() <<
"." << std::endl;
669 m_log <<
" We assume this is MS Kinect and taken images are "
670 "inverted to right and left."
679 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
681 if (!m_streams[i])
continue;
682 if (m_streams[i]->isMirrorSupported() ==
false)
686 if (m_streams[i]->setMirror(m_mirror) ==
false)
694 bool COpenNI2Generic::CDevice::startStreams()
698 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
700 if (!m_streams[i])
continue;
702 printf(
" [%s] calling m_streams[%d]->start()\n", __FUNCTION__, i);
703 if (m_streams[i]->
start() ==
false)
707 " [%s] m_streams[%d]->start() returned FALSE!\n",
716 " [%s] m_streams[%d]->start() returned TRUE\n", __FUNCTION__,
721 " [COpenNI2Generic::CDevice::startStreams()] %d streams were "
728 bool COpenNI2Generic::CDevice::isOpen()
const
730 return (m_streams[COLOR_STREAM] && m_streams[COLOR_STREAM]->isValid()) ||
731 (m_streams[DEPTH_STREAM] && m_streams[DEPTH_STREAM]->isValid());
734 void COpenNI2Generic::CDevice::close()
736 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
738 if (!m_streams[i])
continue;
739 m_streams[i]->destroy();
744 bool COpenNI2Generic::CDevice::open(
int w,
int h,
int fps)
749 " [COpenNI2Generic::CDevice::open()] Called with w=%i h=%i "
755 if (rc != openni::STATUS_OK)
757 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
758 <<
" Failed to open device " << getInfo().getUri() <<
" "
759 << openni::OpenNI::getExtendedError() << std::endl;
762 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
764 if (!m_streams[i])
continue;
766 printf(
" [%s] calling m_streams[%d]->open()\n", __FUNCTION__, i);
768 if (m_streams[i]->
open(
w, h, fps) ==
false)
772 " [%s] m_streams[%d]->open() returned FALSE\n",
778 " [%s] m_streams[%d]->open() returned OK\n", __FUNCTION__, i);
781 if (synchMirrorMode() ==
false)
787 if (m_streams[DEPTH_STREAM])
790 m_streams[DEPTH_STREAM]->setCloseRange(CloseRange);
791 m_log <<
" Close range: " << (CloseRange ?
"On" :
"Off") << std::endl;
795 printf(
" DBG: checking if imageRegistrationMode is supported\n");
796 if (m_device.isImageRegistrationModeSupported(
797 openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR) &&
798 m_streams[DEPTH_STREAM] && m_streams[DEPTH_STREAM]->isValid() &&
799 m_streams[COLOR_STREAM] && m_streams[COLOR_STREAM]->isValid())
804 if (m_device.setImageRegistrationMode(
805 openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR) != openni::STATUS_OK)
807 m_log <<
" setImageRegistrationMode() Failed:"
808 << openni::OpenNI::getExtendedError() << endl;
812 m_log <<
" setImageRegistrationMode() Success" << endl;
817 m_log <<
" Device doesn't do image registration!" << endl;
822 m_streams[COLOR_STREAM]->disableAutoExposure();
823 printf(
"DBG: returned from disableAutoExposure()\n");
826 if (startStreams() ==
false)
835 bool COpenNI2Generic::CDevice::getNextFrameRGB(
837 bool& hardware_error)
844 openni::VideoFrameRef frame;
845 if (m_streams[COLOR_STREAM]->getFrame(
846 frame, timestamp, there_is_obs, hardware_error) ==
false)
850 copyFrame<openni::RGB888Pixel, mrpt::utils::CImage>(frame,
img);
856 bool COpenNI2Generic::CDevice::getNextFrameD(
858 bool& hardware_error)
865 openni::VideoFrameRef frame;
866 if (m_streams[DEPTH_STREAM]->getFrame(
867 frame, timestamp, there_is_obs, hardware_error) ==
false)
871 copyFrame<openni::DepthPixel, mrpt::math::CMatrix>(frame,
img);
877 bool COpenNI2Generic::CDevice::getNextFrameRGBD(
879 bool& hardware_error)
883 there_is_obs =
false;
884 hardware_error =
false;
896 openni::VideoFrameRef frame[STREAM_TYPE_SIZE];
897 for (
int i = 0; i < STREAM_TYPE_SIZE; ++i)
899 if (!m_streams[i] || !m_streams[i]->isValid())
continue;
900 if (m_streams[i]->getFrame(
901 frame[i], tm, there_is_obs, hardware_error) ==
false)
905 if (there_is_obs ==
false || hardware_error ==
true)
911 const int width = frame[COLOR_STREAM].getWidth();
912 const int height = frame[COLOR_STREAM].getHeight();
913 if ((frame[DEPTH_STREAM].getWidth() !=
width) ||
916 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
917 <<
" Both frames don't have the same size." << std::endl;
929 const char*
data[STREAM_TYPE_SIZE] = {
930 (
const char*)frame[COLOR_STREAM].getData(),
931 (
const char*)frame[DEPTH_STREAM].getData()};
932 const int step[STREAM_TYPE_SIZE] = {frame[COLOR_STREAM].getStrideInBytes(),
933 frame[DEPTH_STREAM].getStrideInBytes()};
935 for (
int yc = 0; yc <
height; ++yc)
937 const openni::RGB888Pixel* pRgb =
938 (
const openni::RGB888Pixel*)
data[COLOR_STREAM];
939 const openni::DepthPixel* pDepth =
940 (
const openni::DepthPixel*)
data[DEPTH_STREAM];
941 for (
int xc = 0; xc <
width; ++xc, ++pDepth, ++pRgb)
951 data[COLOR_STREAM] += step[COLOR_STREAM];
952 data[DEPTH_STREAM] += step[DEPTH_STREAM];
960 const openni::DeviceInfo& info, openni::PixelFormat rgb,
961 openni::PixelFormat
depth,
bool verbose)
963 return Ptr(
new CDevice(info, rgb,
depth, verbose));
966 bool COpenNI2Generic::CDevice::getSerialNumber(
std::string& sn)
971 if (isOpened ==
false)
973 rc = m_device.open(getInfo().getUri());
974 if (rc != openni::STATUS_OK)
976 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
977 <<
" Failed to open device " << getInfo().getUri() <<
" "
978 << openni::OpenNI::getExtendedError() << std::endl;
982 char serialNumber[16];
983 rc = m_device.getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER, &serialNumber);
984 if (rc != openni::STATUS_OK)
986 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
987 <<
" Failed to getProperty(ONI_DEVICE_PROPERTY_SERIAL_NUMBER) "
988 << getInfo().getUri() <<
" " << openni::OpenNI::getExtendedError()
993 if (isOpened ==
false)
1000 bool COpenNI2Generic::CDevice::getSerialNumber(
unsigned int& sn)
1003 if (getSerialNumber(str) ==
false)
1007 std::stringstream sst;
1013 COpenNI2Generic::CDevice::CStream::CStream(
1015 std::ostream& log,
bool verbose)
1018 m_strName(
"Unknown"),
1023 if (m_type == openni::SENSOR_COLOR)
1025 m_strName =
"openni::SENSOR_COLOR";
1027 else if (m_type == openni::SENSOR_DEPTH)
1029 m_strName =
"openni::SENSOR_DEPTH";
1031 else if (m_type == openni::SENSOR_IR)
1033 m_strName =
"openni::SENSOR_IR";
1037 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1038 <<
" Unknown SensorType -> " << m_type << std::endl;
1042 COpenNI2Generic::CDevice::CStream::~CStream() { destroy(); }
1043 bool COpenNI2Generic::CDevice::CStream::isMirrorSupported()
const
1045 if (isValid() ==
false)
1049 return m_stream.isPropertySupported(openni::STREAM_PROPERTY_MIRRORING);
1052 bool COpenNI2Generic::CDevice::CStream::setMirror(
bool flag)
1054 if (isValid() ==
false)
1056 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1057 <<
" " << getName() <<
" is not opened." << std::endl;
1060 if (m_stream.isPropertySupported(openni::STREAM_PROPERTY_MIRRORING) ==
1065 if (m_stream.setMirroringEnabled(flag) != openni::STATUS_OK)
1067 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1068 <<
" setMirroringEnabled() failed: "
1069 << openni::OpenNI::getExtendedError() << std::endl;
1075 bool COpenNI2Generic::CDevice::CStream::isValid()
const
1077 return m_stream.isValid();
1080 void COpenNI2Generic::CDevice::CStream::destroy() { m_stream.destroy(); }
1081 void COpenNI2Generic::CDevice::CStream::setCloseRange(
int&
value)
1085 " [CDevice::CStream::setCloseRange] entry with value=%d\n",
1087 m_stream.setProperty(XN_STREAM_PROPERTY_CLOSE_RANGE,
value);
1090 " [CDevice::CStream::setCloseRange] returned from "
1091 "mstream.setProperty()\n");
1092 m_stream.getProperty(XN_STREAM_PROPERTY_CLOSE_RANGE, &
value);
1095 " [CDevice::CStream::setCloseRange] returned from "
1096 "mstream.getProperty() ... value %d\n",
1100 bool COpenNI2Generic::CDevice::CStream::open(
int w,
int h,
int fps)
1103 if (m_type != openni::SENSOR_COLOR && m_type != openni::SENSOR_DEPTH &&
1104 m_type != openni::SENSOR_IR)
1106 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1107 <<
" Unknown SensorType -> " << m_type << std::endl;
1112 " [COpenNI2Generic::CDevice::CStream::open] opening sensor "
1113 "stream with m_type == %d\n",
1122 rc = m_stream.create(m_device, m_type);
1123 if (rc != openni::STATUS_OK)
1125 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1126 <<
" Couldn't find sensor " << m_strName <<
":"
1127 << openni::OpenNI::getExtendedError() << std::endl;
1128 if (m_type == openni::SENSOR_COLOR)
1130 m_type = openni::SENSOR_IR;
1131 m_strName =
"openni::SENSOR_IR";
1133 printf(
"DBG: changing type to SENSOR_IR (%d)\n", (
int)m_type);
1134 rc = m_stream.create(m_device, m_type);
1139 if (m_verbose) printf(
"returned OK from stream.create()\n");
1140 openni::VideoMode options = m_stream.getVideoMode();
1141 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl;
1142 m_log <<
" " << m_strName << std::endl;
1144 "Initial resolution (%d, %d) FPS %d Format %d",
1145 options.getResolutionX(), options.getResolutionY(),
1146 options.getFps(), options.getPixelFormat())
1148 if (m_verbose) printf(
"DBG: calling setONI2StreamMode()\n");
1149 if (setONI2StreamMode(m_stream,
w, h, fps, m_format) ==
false)
1151 m_log <<
" Can't find desired mode in the " << getName() << std::endl;
1155 if (m_verbose) printf(
"DBG: returned OK from setONI2StreamMode()\n");
1156 if (m_verbose) printf(
"DBG: calling stream.getVideoMode()\n");
1157 options = m_stream.getVideoMode();
1159 "-> (%d, %d) FPS %d Format %d",
1160 options.getResolutionX(), options.getResolutionY(),
1161 options.getFps(), options.getPixelFormat())
1165 " [COpenNI2Generic::CDevice::CStream::open] returning TRUE\n");
1171 if (isValid() ==
false)
1173 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1174 <<
" " << getName() <<
" is not opened." << std::endl;
1177 if (m_stream.start() != openni::STATUS_OK)
1179 m_log <<
"[" << __FUNCTION__ <<
"]" << std::endl
1180 <<
" Couldn't start " << getName()
1181 <<
" stream:" << openni::OpenNI::getExtendedError() << std::endl;
1188 COpenNI2Generic::CDevice::CStream::Ptr
1189 COpenNI2Generic::CDevice::CStream::create(
1191 openni::PixelFormat
format, std::ostream& log,
bool verbose)
1193 return Ptr(
new CStream(device,
type,
format, log, verbose));
1196 bool COpenNI2Generic::CDevice::CStream::getFrame(
1197 openni::VideoFrameRef& frame,
uint64_t& timestamp,
bool& there_is_obs,
1198 bool& hardware_error)
1200 there_is_obs =
false;
1201 hardware_error =
false;
1202 if (isValid() ==
false)
1207 if (rc != openni::STATUS_OK)
1209 hardware_error =
true;
1211 mrpt::format(
"Failed to grab frame from %s", getName().c_str());
1214 there_is_obs =
true;
double getHeight(const TPolygon3D &p, const TPoint3D &c)
std::shared_ptr< CDevice > Ptr
bool isOpen(const unsigned sensor_id) const
Whether there is a working connection to the sensor.
void showLog(const std::string &message) const
void close(unsigned sensor_id=0)
Close the connection to the sensor (no need to call it manually unless desired for some reason,...
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.
bool getColorSensorParam(mrpt::utils::TCamera ¶m, unsigned sensor_id=0) const
static std::vector< std::shared_ptr< CDevice > > vDevices
COpenNI2Generic()
Default ctor (width=640, height=480, fps=30)
unsigned int openDevicesBySerialNum(const std::set< unsigned > &vSerialRequired)
Open a set of RGBD devices specified by their serial number.
void getNextFrameD(mrpt::math::CMatrix &depth_img, uint64_t ×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().
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().
bool start()
Open all sensor streams (normally called automatically at constructor, no need to call it manually).
void kill()
Kill the OpenNI2 driver.
void getNextFrameRGB(mrpt::utils::CImage &rgb_img, uint64_t ×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().
~COpenNI2Generic()
Default ctor.
void setVerbose(bool verbose)
int m_width
The same options (width, height and fps) are set for all the sensors.
int getNumDevices() const
The number of available devices at initialization.
void open(unsigned sensor_id=0)
Try to open the camera (all the parameters [resolution,fps,...] must be set before calling this) - us...
unsigned int openDeviceBySerial(const unsigned int SerialRequired)
Open a RGBD device specified by its serial number.
bool getDepthSensorParam(mrpt::utils::TCamera ¶m, unsigned sensor_id=0) const
This class is a "CSerializable" wrapper for "CMatrixFloat".
Declares a class derived from "CObservation" that encapsules a 3D range scan measurement,...
bool hasConfidenceImage
true means the field confidenceImage contains valid data
bool hasIntensityImage
true means the field intensityImage contains valid data
bool hasPoints3D
true means the field points3D contains valid data.
bool hasRangeImage
true means the field rangeImage contains valid data
mrpt::math::CMatrix rangeImage
If hasRangeImage=true, a matrix of floats with the range data as captured by the camera (in meters)
mrpt::utils::CImage intensityImage
If hasIntensityImage=true, a color or gray-level intensity image of the same size than "rangeImage".
bool range_is_depth
true: Kinect-like ranges: entries of rangeImage are distances along the +X axis; false: Ranges in ran...
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
A class for storing images as grayscale or RGB bitmaps.
Structure to hold the parameters of a pinhole camera model.
const Scalar * const_iterator
GLint GLint GLsizei GLsizei GLsizei depth
GLubyte GLubyte GLubyte GLubyte w
GLsizei GLsizei GLenum GLenum const GLvoid * data
GLuint GLuint GLsizei GLenum type
GLenum GLsizei GLsizei height
GLenum GLsizei GLenum format
GLsizei const GLfloat * value
GLsizei const GLchar ** string
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
mrpt::system::TTimeStamp getCurrentTime()
Returns the current (UTC) system time.
#define THROW_EXCEPTION(msg)
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
Contains classes for various device interfaces.
This namespace contains representation of robot actions and observations.
This namespace provides a OS-independent interface to many useful functions: filenames manipulation,...
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
unsigned __int64 uint64_t