18 #ifdef MRPT_OS_WINDOWS 35 CSickLaserUSB::CSickLaserUSB()
36 : m_usbConnection(nullptr), m_serialNumber(
"LASER001"), m_timeStartUI(0)
57 bool& outThereIsObservation,
60 outThereIsObservation =
false;
61 hardwareError =
false;
70 unsigned char LMS_stat;
78 ranges, LMS_stat, board_timestamp, is_mm_mode))
109 outObservation.
maxRange = is_mm_mode ? 32.7 : 81.0;
115 for (
size_t i = 0; i < ranges.size(); i++)
119 i, (ranges[i] <= outObservation.
maxRange));
128 outThereIsObservation =
true;
141 configSource.
read_float(iniSection,
"pose_x", 0),
142 configSource.
read_float(iniSection,
"pose_y", 0),
143 configSource.
read_float(iniSection,
"pose_z", 0),
172 std::this_thread::sleep_for(10ms);
174 std::this_thread::sleep_for(10ms);
176 std::this_thread::sleep_for(10ms);
179 "[CSickLaserUSB] USB DEVICE S/N:'%s' OPEN SUCCESSFULLY!!!\n",
183 catch (std::exception& e)
186 "[CSickLaserUSB] ERROR TRYING TO OPEN USB DEVICE S/N:'%s'\n%s",
196 vector<float>& out_ranges_meters,
unsigned char& LMS_status,
197 uint32_t& out_board_timestamp,
bool& is_mm_mode)
199 size_t nRead, nBytesToRead;
200 size_t nFrameBytes = 0;
202 unsigned char buf[2000];
205 while (nFrameBytes < (lenghtField = (6 + (buf[2] | (buf[3] << 8)))) +
208 if (lenghtField > 800)
226 catch (std::exception& e)
230 "[CSickLaserUSB::waitContinuousSampleFrame] Disconnecting due " 231 "to comms error: %s\n",
238 if (nRead == 0 && nFrameBytes == 0)
return false;
244 if (nFrameBytes > 1 || (!nFrameBytes && buf[0] == 0x02) ||
245 (nFrameBytes == 1 && buf[1] == 0x80))
246 nFrameBytes += nRead;
263 if (buf[4] != 0xB0)
return false;
266 int info = buf[5] | (buf[6] << 8);
267 int n_points = info & 0x01FF;
268 is_mm_mode = 0 != ((info & 0xC000) >> 14);
270 out_ranges_meters.resize(n_points);
273 short mask = is_mm_mode ? 0x7FFF : 0x1FFF;
274 float meters_scale = is_mm_mode ? 0.001f : 0.01f;
276 for (
int i = 0; i < n_points; i++)
277 out_ranges_meters[i] =
278 ((buf[7 + i * 2] | (buf[8 + i * 2] << 8)) &
mask) * meters_scale;
281 LMS_status = buf[lenghtField - 3];
284 if (buf[nFrameBytes - 1] != 0x55)
288 #ifdef MRPT_OS_WINDOWS 290 "[CSickLaserUSB::waitContinuousSampleFrame] bad end flag\n");
298 buf[lenghtField - 2] | (buf[lenghtField - 1] << 8);
299 if (CRC_packet != CRC)
302 "[CSickLaserUSB::waitContinuousSampleFrame] bad CRC len=%u " 303 "nptns=%u: %i != %i\n",
304 unsigned(lenghtField),
unsigned(n_points), CRC_packet, CRC);
306 #ifdef MRPT_OS_WINDOWS 307 OutputDebugStringA(
s.c_str());
313 out_board_timestamp = (
uint32_t(buf[nFrameBytes - 5]) << 24) |
314 (
uint32_t(buf[nFrameBytes - 4]) << 16) |
315 (
uint32_t(buf[nFrameBytes - 3]) << 8) |
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
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...
virtual ~CSickLaserUSB()
Destructor.
bool isOpen()
Checks whether the chip has been successfully open.
uint32_t m_timeStartUI
Time of the first data packet, for synchronization purposes.
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
unsigned __int16 uint16_t
void ResetDevice()
Reset the USB device.
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
void setScanRange(const size_t i, const float val)
std::string m_sensorLabel
See CGenericSensor.
This "software driver" implements the communication protocol for interfacing a SICK LMS2XX laser scan...
void OpenBySerialNumber(const std::string &serialNumber)
Open by device serial number.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
Contains classes for various device interfaces.
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
void filterByExclusionAreas(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those points which (x,y) coordinates fall within the exclusion polygons.
float stdError
The "sigma" error of the device in meters, used while inserting the scan in an occupancy grid...
#define MRPT_LOG_ERROR_FMT(_FMT_STRING,...)
bool turnOn()
Enables the scanning mode (in this class this has no effect).
void filterByExclusionAngles(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those ranges in a set of forbiden angle ranges.
This class allows loading and storing values and vectors of different types from a configuration text...
float maxRange
The maximum range allowed by the device, in meters (e.g.
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...
void Close()
Close the USB device.
void SetTimeouts(unsigned long dwReadTimeout_ms, unsigned long dwWriteTimeout_ms)
Change read & write timeouts, in milliseconds.
bool checkControllerIsConnected()
mrpt::comms::CInterfaceFTDI * m_usbConnection
This namespace contains representation of robot actions and observations.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
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.
void loadCommonParams(const mrpt::utils::CConfigFileBase &configSource, const std::string &iniSection)
Should be call by derived classes at "loadConfig" (loads exclusion areas AND exclusion angles)...
GLsizei const GLchar ** string
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
A definition of a CStream actually representing a USB connection to a FTDI chip.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
void processPreview(const mrpt::obs::CObservation2DRangeScan &obs)
Must be called inside the capture method to allow optional GUI preview of scans.
bool turnOff()
Disables the scanning mode (in this class this has no effect).
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees)...
poses::CPose3D m_sensorPose
The sensor 6D pose:
mrpt::system::TTimeStamp secondsToTimestamp(const double nSeconds)
Transform a time interval (in seconds) into TTimeStamp (e.g.
Serial and networking devices and utilities.
void loadConfig_sensorSpecific(const mrpt::utils::CConfigFileBase &configSource, const std::string &iniSection)
See the class documentation at the top for expected parameters.
bool waitContinuousSampleFrame(std::vector< float > &ranges, unsigned char &LMS_status, uint32_t &out_board_timestamp, bool &is_mm_mode)
unsigned __int32 uint32_t
std::string m_serialNumber
void SetLatencyTimer(unsigned char latency_ms)
Change the latency timer (in milliseconds) implemented on the FTDI chip: for a few ms...
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
bool rightToLeft
The scanning direction: true=counterclockwise; false=clockwise.
mrpt::system::TTimeStamp m_timeStartTT
void setScanRangeValidity(const size_t i, const bool val)