Go to the documentation of this file.
33 CSickLaserUSB::CSickLaserUSB()
34 : m_usbConnection(nullptr), m_serialNumber(
"LASER001"), m_timeStartUI(0)
55 bool& outThereIsObservation,
58 outThereIsObservation =
false;
59 hardwareError =
false;
68 unsigned char LMS_stat;
76 ranges, LMS_stat, board_timestamp, is_mm_mode))
107 outObservation.
maxRange = is_mm_mode ? 32.7 : 81.0;
113 for (
size_t i = 0; i < ranges.size(); i++)
117 i, (ranges[i] <= outObservation.
maxRange));
126 outThereIsObservation =
true;
139 configSource.
read_float(iniSection,
"pose_x", 0),
140 configSource.
read_float(iniSection,
"pose_y", 0),
141 configSource.
read_float(iniSection,
"pose_z", 0),
170 std::this_thread::sleep_for(10ms);
172 std::this_thread::sleep_for(10ms);
174 std::this_thread::sleep_for(10ms);
177 "[CSickLaserUSB] USB DEVICE S/N:'%s' OPEN SUCCESSFULLY!!!\n",
181 catch (std::exception& e)
184 "[CSickLaserUSB] ERROR TRYING TO OPEN USB DEVICE S/N:'%s'\n%s",
194 vector<float>& out_ranges_meters,
unsigned char& LMS_status,
195 uint32_t& out_board_timestamp,
bool& is_mm_mode)
197 size_t nRead, nBytesToRead;
198 size_t nFrameBytes = 0;
200 unsigned char buf[2000];
203 while (nFrameBytes < (lenghtField = (6 + (buf[2] | (buf[3] << 8)))) +
206 if (lenghtField > 800)
224 catch (std::exception& e)
228 "[CSickLaserUSB::waitContinuousSampleFrame] Disconnecting due "
229 "to comms error: %s\n",
236 if (nRead == 0 && nFrameBytes == 0)
return false;
242 if (nFrameBytes > 1 || (!nFrameBytes && buf[0] == 0x02) ||
243 (nFrameBytes == 1 && buf[1] == 0x80))
244 nFrameBytes += nRead;
261 if (buf[4] != 0xB0)
return false;
264 int info = buf[5] | (buf[6] << 8);
265 int n_points = info & 0x01FF;
266 is_mm_mode = 0 != ((info & 0xC000) >> 14);
268 out_ranges_meters.resize(n_points);
271 short mask = is_mm_mode ? 0x7FFF : 0x1FFF;
272 float meters_scale = is_mm_mode ? 0.001f : 0.01f;
274 for (
int i = 0; i < n_points; i++)
275 out_ranges_meters[i] =
276 ((buf[7 + i * 2] | (buf[8 + i * 2] << 8)) &
mask) * meters_scale;
279 LMS_status = buf[lenghtField - 3];
282 if (buf[nFrameBytes - 1] != 0x55)
288 "[CSickLaserUSB::waitContinuousSampleFrame] bad end flag\n");
296 buf[lenghtField - 2] | (buf[lenghtField - 1] << 8);
297 if (CRC_packet != CRC)
300 "[CSickLaserUSB::waitContinuousSampleFrame] bad CRC len=%u "
301 "nptns=%u: %i != %i\n",
302 unsigned(lenghtField),
unsigned(n_points), CRC_packet, CRC);
305 OutputDebugStringA(
s.c_str());
311 out_board_timestamp = (
uint32_t(buf[nFrameBytes - 5]) << 24) |
312 (
uint32_t(buf[nFrameBytes - 4]) << 16) |
313 (
uint32_t(buf[nFrameBytes - 3]) << 8) |
bool turnOn()
Enables the scanning mode (in this class this has no effect).
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
void setScanRange(const size_t i, const float val)
mrpt::system::TTimeStamp secondsToTimestamp(const double nSeconds)
Transform a time interval (in seconds) into TTimeStamp (e.g.
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
uint32_t m_timeStartUI
Time of the first data packet, for synchronization purposes.
float maxRange
The maximum range allowed by the device, in meters (e.g.
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.
mrpt::system::TTimeStamp m_timeStartTT
bool turnOff()
Disables the scanning mode (in this class this has no effect).
unsigned __int16 uint16_t
uint16_t compute_CRC16(const std::vector< uint8_t > &data, const uint16_t gen_pol=0x8005)
Computes the CRC16 checksum of a block of data.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
bool checkControllerIsConnected()
This "software driver" implements the communication protocol for interfacing a SICK LMS2XX laser scan...
bool isOpen()
Checks whether the chip has been successfully open.
void filterByExclusionAngles(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those ranges in a set of forbiden angle ranges.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
Contains classes for various device interfaces.
void loadConfig_sensorSpecific(const mrpt::config::CConfigFileBase &configSource, const std::string &iniSection)
See the class documentation at the top for expected parameters.
Serial and networking devices and utilities.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
void setScanRangeValidity(const size_t i, const bool val)
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
This namespace contains representation of robot actions and observations.
void ResetDevice()
Reset the USB device.
virtual ~CSickLaserUSB()
Destructor.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees).
This class allows loading and storing values and vectors of different types from a configuration text...
A definition of a CStream actually representing a USB connection to a FTDI chip.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
void loadCommonParams(const mrpt::config::CConfigFileBase &configSource, const std::string &iniSection)
Should be call by derived classes at "loadConfig" (loads exclusion areas AND exclusion angles).
#define MRPT_LOG_ERROR_FMT(_FMT_STRING,...)
poses::CPose3D m_sensorPose
The sensor 6D pose:
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void Close()
Close the USB device.
bool waitContinuousSampleFrame(std::vector< float > &ranges, unsigned char &LMS_status, uint32_t &out_board_timestamp, bool &is_mm_mode)
std::string m_sensorLabel
See CGenericSensor.
float stdError
The "sigma" error of the device in meters, used while inserting the scan in an occupancy grid.
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
void processPreview(const mrpt::obs::CObservation2DRangeScan &obs)
Must be called inside the capture method to allow optional GUI preview of scans.
size_t ReadSync(void *Buffer, size_t Count)
Tries to read, raising no exception if not all the bytes are available, but raising one if there is s...
mrpt::comms::CInterfaceFTDI * m_usbConnection
void doProcessSimple(bool &outThereIsObservation, mrpt::obs::CObservation2DRangeScan &outObservation, bool &hardwareError)
Specific laser scanner "software drivers" must process here new data from the I/O stream,...
std::string m_serialNumber
GLsizei const GLchar ** string
void OpenBySerialNumber(const std::string &serialNumber)
Open by device serial number.
void SetLatencyTimer(unsigned char latency_ms)
Change the latency timer (in milliseconds) implemented on the FTDI chip: for a few ms,...
void SetTimeouts(unsigned long dwReadTimeout_ms, unsigned long dwWriteTimeout_ms)
Change read & write timeouts, in milliseconds.
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
void filterByExclusionAreas(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those points which (x,y) coordinates fall within the exclusion polygons.
unsigned __int32 uint32_t
double DEG2RAD(const double x)
Degrees to radians.
Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at miƩ 12 jul 2023 10:03:34 CEST | |