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) |
#define IMPLEMENTS_GENERIC_SENSOR(class_name, NameSpace)
This must be inserted in all CGenericSensor classes implementation files:
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
#define MRPT_LOG_ERROR_FMT(_FMT_STRING,...)
A definition of a CStream actually representing a USB connection to a FTDI chip.
void ResetDevice()
Reset the USB device.
bool isOpen()
Checks whether the chip has been successfully open.
void SetTimeouts(unsigned long dwReadTimeout_ms, unsigned long dwWriteTimeout_ms)
Change read & write timeouts, in milliseconds.
void Close()
Close the USB device.
void SetLatencyTimer(unsigned char latency_ms)
Change the latency timer (in milliseconds) implemented on the FTDI chip: for a few ms,...
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 OpenBySerialNumber(const std::string &serialNumber)
Open by device serial number.
void processPreview(const mrpt::obs::CObservation2DRangeScan &obs)
Must be called inside the capture method to allow optional GUI preview of scans.
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).
void filterByExclusionAngles(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those ranges in a set of forbiden angle ranges.
void filterByExclusionAreas(mrpt::obs::CObservation2DRangeScan &obs) const
Mark as invalid those points which (x,y) coordinates fall within the exclusion polygons.
std::string m_sensorLabel
See CGenericSensor.
This "software driver" implements the communication protocol for interfacing a SICK LMS2XX laser scan...
std::string m_serialNumber
bool turnOff()
Disables the scanning mode (in this class this has no effect).
bool checkControllerIsConnected()
poses::CPose3D m_sensorPose
The sensor 6D pose:
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,...
bool turnOn()
Enables the scanning mode (in this class this has no effect).
bool waitContinuousSampleFrame(std::vector< float > &ranges, unsigned char &LMS_status, uint32_t &out_board_timestamp, bool &is_mm_mode)
mrpt::comms::CInterfaceFTDI * m_usbConnection
virtual ~CSickLaserUSB()
Destructor.
uint32_t m_timeStartUI
Time of the first data packet, for synchronization purposes.
mrpt::system::TTimeStamp m_timeStartTT
void loadConfig_sensorSpecific(const mrpt::utils::CConfigFileBase &configSource, const std::string &iniSection)
See the class documentation at the top for expected parameters.
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
float maxRange
The maximum range allowed by the device, in meters (e.g.
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees).
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.
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)
float stdError
The "sigma" error of the device in meters, used while inserting the scan in an occupancy grid.
void setScanRange(const size_t i, const float val)
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
This class allows loading and storing values and vectors of different types from a configuration text...
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
float read_float(const std::string §ion, const std::string &name, float defaultValue, bool failIfNotFound=false) const
GLsizei const GLchar ** string
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.
mrpt::system::TTimeStamp secondsToTimestamp(const double nSeconds)
Transform a time interval (in seconds) into TTimeStamp (e.g.
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
Serial and networking devices and utilities.
Contains classes for various device interfaces.
This namespace contains representation of robot actions and observations.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
unsigned __int16 uint16_t
unsigned __int32 uint32_t