sl_lidar_driver.h
Go to the documentation of this file.
1 /*
2  * Slamtec LIDAR SDK
3  *
4  * Copyright (c) 2020 Shanghai Slamtec Co., Ltd.
5  * http://www.slamtec.com
6  */
7  /*
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice,
12  * this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  */
31 
32 #pragma once
33 
34 #ifndef __cplusplus
35 #error "The Slamtec LIDAR SDK requires a C++ compiler to be built"
36 #endif
37 
38 #include <vector>
39 #include <map>
40 #include <string>
41 
42 #ifndef DEPRECATED
43  #ifdef __GNUC__
44  #define DEPRECATED(func) func __attribute__ ((deprecated))
45  #elif defined(_MSC_VER)
46  #define DEPRECATED(func) __declspec(deprecated) func
47  #else
48  #pragma message("WARNING: You need to implement DEPRECATED for this compiler")
49  #define DEPRECATED(func) func
50  #endif
51 #endif
52 
53 
54 #include "sl_lidar_cmd.h"
55 
56 #include <string>
57 
58 namespace sl {
59 
60 #ifdef DEPRECATED
61 #define DEPRECATED_WARN(fn, replacement) do { \
62  static bool __shown__ = false; \
63  if (!__shown__) { \
64  printDeprecationWarn(fn, replacement); \
65  __shown__ = true; \
66  } \
67  } while (0)
68 #endif
69 
74  {
75  // Mode id
76  sl_u16 id;
77 
78  // Time cost for one measurement (in microseconds)
80 
81  // Max distance in this scan mode (in meters)
82  float max_distance;
83 
84  // The answer command code for this scan mode
85  sl_u8 ans_type;
86 
87  // The name of scan mode (padding with 0 if less than 64 characters)
88  char scan_mode[64];
89  };
90 
91  template <typename T>
92  struct Result
93  {
95  T value;
96  Result(const T& value)
97  : err(SL_RESULT_OK)
98  , value(value)
99  {
100  }
101 
103  : err(err)
104  , value()
105  {
106  }
107 
108  operator sl_result() const
109  {
110  return err;
111  }
112 
113  operator bool() const
114  {
115  return SL_IS_OK(err);
116  }
117 
119  {
120  return value;
121  }
122 
124  {
125  return &value;
126  }
127  };
128 
135  };
136 
144  };
145 
151 
152 
154  };
155 
157 
160 
162 
164 
166  };
167 
171  class IChannel
172  {
173  public:
174  virtual ~IChannel() {}
175 
176  public:
180  virtual bool open() = 0;
181 
185  virtual void close() = 0;
186 
190  virtual void flush() = 0;
191 
199  virtual bool waitForData(size_t size, sl_u32 timeoutInMs = -1, size_t* actualReady = nullptr) = 0;
200 
201 
210  virtual sl_result waitForDataExt(size_t& size_hint, sl_u32 timeoutInMs = 1000) = 0;
211 
212 
219  virtual int write(const void* data, size_t size) = 0;
220 
227  virtual int read(void* buffer, size_t size) = 0;
228 
232  virtual void clearReadCache() = 0;
233 
234  virtual int getChannelType() = 0;
235 
236  private:
237 
238  };
239 
244  {
245  public:
246  virtual ~ISerialPortChannel() {}
247 
248  public:
249  virtual void setDTR(bool dtr) = 0;
250  };
251 
260  Result<IChannel*> createSerialPortChannel(const std::string& device, int baudrate);
261 
267  Result<IChannel*> createTcpChannel(const std::string& ip, int port);
268 
274  Result<IChannel*> createUdpChannel(const std::string& ip, int port);
275 
277  {
281  };
282 
287  };
288 
293  {
295 
296  // Desire speed
298 
299  // Max speed
300  sl_u16 max_speed;
301 
302  // Min speed
303  sl_u16 min_speed;
304  };
305 
307  {
308  public:
309  virtual ~ILidarDriver() {}
310 
311  public:
317  virtual sl_result connect(IChannel* channel) = 0;
318 
322  virtual void disconnect() = 0;
323 
327  virtual bool isConnected() = 0;
328 
329  public:
330  enum
331  {
333  };
334 
335  public:
340  virtual sl_result reset(sl_u32 timeoutInMs = DEFAULT_TIMEOUT) = 0;
341 
343  virtual sl_result getAllSupportedScanModes(std::vector<LidarScanMode>& outModes, sl_u32 timeoutInMs = DEFAULT_TIMEOUT) = 0;
344 
346  virtual sl_result getTypicalScanMode(sl_u16& outMode, sl_u32 timeoutInMs = DEFAULT_TIMEOUT) = 0;
347 
354  virtual sl_result startScan(bool force, bool useTypicalScan, sl_u32 options = 0, LidarScanMode* outUsedScanMode = nullptr) = 0;
355 
362  virtual sl_result startScanExpress(bool force, sl_u16 scanMode, sl_u32 options = 0, LidarScanMode* outUsedScanMode = nullptr, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
363 
370  virtual sl_result getHealth(sl_lidar_response_device_health_t& health, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
371 
376  virtual sl_result getDeviceInfo(sl_lidar_response_device_info_t& info, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
377 
383  virtual sl_result checkMotorCtrlSupport(MotorCtrlSupport& motorCtrlSupport, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
384 
392  virtual sl_result getFrequency(const LidarScanMode& scanMode, const sl_lidar_response_measurement_node_hq_t* nodes, size_t count, float& frequency) = 0;
393 
398  virtual sl_result setLidarIpConf(const sl_lidar_ip_conf_t& conf, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
399 
404  virtual sl_result getLidarIpConf( sl_lidar_ip_conf_t& conf, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
405  //
411  virtual sl_result getDeviceMacAddr(sl_u8* macAddrArray, sl_u32 timeoutInMs = DEFAULT_TIMEOUT) = 0;
412 
416  virtual sl_result stop(sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
417 
435  virtual sl_result grabScanDataHq(sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t& count, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
436 
437 
438 
467  virtual sl_result grabScanDataHqWithTimeStamp(sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t& count, sl_u64 & timestamp_uS, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
468 
469 
477  virtual sl_result ascendScanData(sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t count) = 0;
478 
486  virtual sl_result getScanDataWithIntervalHq(sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t& count) = 0;
493  virtual sl_result setMotorSpeed(sl_u16 speed = DEFAULT_MOTOR_SPEED) = 0;
494 
498  virtual sl_result getMotorInfo(LidarMotorInfo &motorInfo, sl_u32 timeoutInMs = DEFAULT_TIMEOUT) = 0;
499 
500 
508  virtual sl_result negotiateSerialBaudRate(sl_u32 requiredBaudRate, sl_u32* baudRateDetected = NULL) = 0;
509 
510 
511 
517  virtual LIDARTechnologyType getLIDARTechnologyType(const sl_lidar_response_device_info_t* devInfo = nullptr) = 0;
518 
519 
525  virtual LIDARMajorType getLIDARMajorType(const sl_lidar_response_device_info_t* devInfo = nullptr) = 0;
526 
527 
537  virtual sl_result getModelNameDescriptionString(std::string& out_description, bool fetchAliasName = true, const sl_lidar_response_device_info_t* devInfo = nullptr, sl_u32 timeout = DEFAULT_TIMEOUT) = 0;
538 
539 };
540 
568  Result<ILidarDriver*> createLidarDriver();
569 }
sl::LIDARInterfaceType
LIDARInterfaceType
Definition: sl_lidar_driver.h:146
sl::IChannel::waitForData
virtual bool waitForData(size_t size, sl_u32 timeoutInMs=-1, size_t *actualReady=nullptr)=0
sl::MotorCtrlSupportPwm
@ MotorCtrlSupportPwm
Definition: sl_lidar_driver.h:279
sl_lidar_response_measurement_node_hq_t
Definition: sl_lidar_cmd.h:272
sl::IChannel::close
virtual void close()=0
sl::LidarMotorInfo::min_speed
sl_u16 min_speed
Definition: sl_lidar_driver.h:303
sl::LidarScanMode::us_per_sample
float us_per_sample
Definition: sl_lidar_driver.h:79
sl::Result::err
sl_result err
Definition: sl_lidar_driver.h:94
sl_lidar_cmd.h
sl::IChannel
Definition: sl_lidar_driver.h:171
sl::ILidarDriver::getLIDARMajorType
virtual LIDARMajorType getLIDARMajorType(const sl_lidar_response_device_info_t *devInfo=nullptr)=0
sl::LidarMotorInfo
Definition: sl_lidar_driver.h:292
sl::ILidarDriver::stop
virtual sl_result stop(sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::LIDAR_MAJOR_TYPE_S_SERIES
@ LIDAR_MAJOR_TYPE_S_SERIES
Definition: sl_lidar_driver.h:140
sl::Result::operator->
T * operator->()
Definition: sl_lidar_driver.h:123
sl::Result::Result
Result(sl_result err)
Definition: sl_lidar_driver.h:102
sl::LidarScanMode::scan_mode
char scan_mode[64]
Definition: sl_lidar_driver.h:88
sl::ILidarDriver::~ILidarDriver
virtual ~ILidarDriver()
Definition: sl_lidar_driver.h:309
sl::LIDAR_MAJOR_TYPE_A_SERIES
@ LIDAR_MAJOR_TYPE_A_SERIES
Definition: sl_lidar_driver.h:139
sl::ILidarDriver::setMotorSpeed
virtual sl_result setMotorSpeed(sl_u16 speed=DEFAULT_MOTOR_SPEED)=0
sl::ILidarDriver
Definition: sl_lidar_driver.h:306
sl::Result::operator*
T & operator*()
Definition: sl_lidar_driver.h:118
sl::ILidarDriver::getScanDataWithIntervalHq
virtual sl_result getScanDataWithIntervalHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count)=0
sl::LIDAR_MAJOR_TYPE_T_SERIES
@ LIDAR_MAJOR_TYPE_T_SERIES
Definition: sl_lidar_driver.h:141
sl::CHANNEL_TYPE_UDP
@ CHANNEL_TYPE_UDP
Definition: sl_lidar_driver.h:286
SL_RESULT_OK
#define SL_RESULT_OK
Definition: sl_types.h:71
sl::LidarScanMode::id
sl_u16 id
Definition: sl_lidar_driver.h:76
sl::SlamtecLidarTimingDesc::native_interface_type
LIDARInterfaceType native_interface_type
Definition: sl_lidar_driver.h:163
sl::LIDAR_TECHNOLOGY_DTOF
@ LIDAR_TECHNOLOGY_DTOF
Definition: sl_lidar_driver.h:132
sl::LidarScanMode
Definition: sl_lidar_driver.h:73
sl::Result::value
T value
Definition: sl_lidar_driver.h:95
sl::ILidarDriver::getDeviceMacAddr
virtual sl_result getDeviceMacAddr(sl_u8 *macAddrArray, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)=0
sl::LIDARMajorType
LIDARMajorType
Definition: sl_lidar_driver.h:137
sl::LIDAR_TECHNOLOGY_ETOF
@ LIDAR_TECHNOLOGY_ETOF
Definition: sl_lidar_driver.h:133
sl::LidarMotorInfo::motorCtrlSupport
MotorCtrlSupport motorCtrlSupport
Definition: sl_lidar_driver.h:294
sl::MotorCtrlSupport
MotorCtrlSupport
Definition: sl_lidar_driver.h:276
sl::ILidarDriver::getTypicalScanMode
virtual sl_result getTypicalScanMode(sl_u16 &outMode, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)=0
Get typical scan mode of lidar.
sl::ChannelType
ChannelType
Definition: sl_lidar_driver.h:283
sl::ILidarDriver::connect
virtual sl_result connect(IChannel *channel)=0
sl::LidarScanMode::max_distance
float max_distance
Definition: sl_lidar_driver.h:82
sl::LIDARTechnologyType
LIDARTechnologyType
Definition: sl_lidar_driver.h:129
size
sl_u8 size
Definition: sl_lidar_protocol.h:4
sl::ILidarDriver::ascendScanData
virtual sl_result ascendScanData(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t count)=0
sl::IChannel::~IChannel
virtual ~IChannel()
Definition: sl_lidar_driver.h:174
sl::IChannel::flush
virtual void flush()=0
sl::LidarMotorInfo::desired_speed
sl_u16 desired_speed
Definition: sl_lidar_driver.h:297
sl::ILidarDriver::grabScanDataHq
virtual sl_result grabScanDataHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::LIDAR_INTERFACE_CANBUS
@ LIDAR_INTERFACE_CANBUS
Definition: sl_lidar_driver.h:150
sl::MotorCtrlSupportRpm
@ MotorCtrlSupportRpm
Definition: sl_lidar_driver.h:280
sl::SlamtecLidarTimingDesc::native_baudrate
sl_u32 native_baudrate
Definition: sl_lidar_driver.h:159
sl::LidarMotorInfo::max_speed
sl_u16 max_speed
Definition: sl_lidar_driver.h:300
sl::ISerialPortChannel::~ISerialPortChannel
virtual ~ISerialPortChannel()
Definition: sl_lidar_driver.h:246
sl::ILidarDriver::negotiateSerialBaudRate
virtual sl_result negotiateSerialBaudRate(sl_u32 requiredBaudRate, sl_u32 *baudRateDetected=NULL)=0
sl::createSerialPortChannel
Result< IChannel * > createSerialPortChannel(const std::string &device, int baudrate)
Definition: sl_serial_channel.cpp:141
sl::ILidarDriver::disconnect
virtual void disconnect()=0
SL_IS_OK
#define SL_IS_OK(x)
Definition: sl_types.h:82
sl::LIDAR_INTERFACE_ETHERNET
@ LIDAR_INTERFACE_ETHERNET
Definition: sl_lidar_driver.h:148
sl::IChannel::waitForDataExt
virtual sl_result waitForDataExt(size_t &size_hint, sl_u32 timeoutInMs=1000)=0
sl
Definition: sl_crc.h:38
sl::createTcpChannel
Result< IChannel * > createTcpChannel(const std::string &ip, int port)
Definition: sl_tcp_channel.cpp:120
sl::LIDAR_INTERFACE_UNKNOWN
@ LIDAR_INTERFACE_UNKNOWN
Definition: sl_lidar_driver.h:153
sl::ILidarDriver::getAllSupportedScanModes
virtual sl_result getAllSupportedScanModes(std::vector< LidarScanMode > &outModes, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)=0
Get all scan modes that supported by lidar.
sl::SlamtecLidarTimingDesc
Definition: sl_lidar_driver.h:156
sl::ILidarDriver::getHealth
virtual sl_result getHealth(sl_lidar_response_device_health_t &health, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::MotorCtrlSupportNone
@ MotorCtrlSupportNone
Definition: sl_lidar_driver.h:278
sl::SlamtecLidarTimingDesc::linkage_delay_uS
sl_u32 linkage_delay_uS
Definition: sl_lidar_driver.h:161
sl::ILidarDriver::grabScanDataHqWithTimeStamp
virtual sl_result grabScanDataHqWithTimeStamp(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count, sl_u64 &timestamp_uS, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::ILidarDriver::getFrequency
virtual sl_result getFrequency(const LidarScanMode &scanMode, const sl_lidar_response_measurement_node_hq_t *nodes, size_t count, float &frequency)=0
sl::CHANNEL_TYPE_SERIALPORT
@ CHANNEL_TYPE_SERIALPORT
Definition: sl_lidar_driver.h:284
sl::ILidarDriver::isConnected
virtual bool isConnected()=0
sl::IChannel::read
virtual int read(void *buffer, size_t size)=0
sl::LIDAR_MAJOR_TYPE_M_SERIES
@ LIDAR_MAJOR_TYPE_M_SERIES
Definition: sl_lidar_driver.h:142
sl::Result::Result
Result(const T &value)
Definition: sl_lidar_driver.h:96
sl::LidarScanMode::ans_type
sl_u8 ans_type
Definition: sl_lidar_driver.h:85
sl::ILidarDriver::getMotorInfo
virtual sl_result getMotorInfo(LidarMotorInfo &motorInfo, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)=0
sl::ILidarDriver::getLIDARTechnologyType
virtual LIDARTechnologyType getLIDARTechnologyType(const sl_lidar_response_device_info_t *devInfo=nullptr)=0
sl::ILidarDriver::startScanExpress
virtual sl_result startScanExpress(bool force, sl_u16 scanMode, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::CHANNEL_TYPE_TCP
@ CHANNEL_TYPE_TCP
Definition: sl_lidar_driver.h:285
sl::LIDAR_INTERFACE_USB
@ LIDAR_INTERFACE_USB
Definition: sl_lidar_driver.h:149
sl::createUdpChannel
Result< IChannel * > createUdpChannel(const std::string &ip, int port)
Definition: sl_udp_channel.cpp:125
sl::LIDAR_MAJOR_TYPE_UNKNOWN
@ LIDAR_MAJOR_TYPE_UNKNOWN
Definition: sl_lidar_driver.h:138
sl::ILidarDriver::checkMotorCtrlSupport
virtual sl_result checkMotorCtrlSupport(MotorCtrlSupport &motorCtrlSupport, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::ILidarDriver::startScan
virtual sl_result startScan(bool force, bool useTypicalScan, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr)=0
sl::ISerialPortChannel
Definition: sl_lidar_driver.h:243
sl::IChannel::open
virtual bool open()=0
sl::IChannel::write
virtual int write(const void *data, size_t size)=0
sl::LIDAR_TECHNOLOGY_TRIANGULATION
@ LIDAR_TECHNOLOGY_TRIANGULATION
Definition: sl_lidar_driver.h:131
sl_result
uint32_t sl_result
Definition: sl_types.h:69
sl::LIDAR_TECHNOLOGY_FMCW
@ LIDAR_TECHNOLOGY_FMCW
Definition: sl_lidar_driver.h:134
sl::ILidarDriver::getModelNameDescriptionString
virtual sl_result getModelNameDescriptionString(std::string &out_description, bool fetchAliasName=true, const sl_lidar_response_device_info_t *devInfo=nullptr, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::ILidarDriver::setLidarIpConf
virtual sl_result setLidarIpConf(const sl_lidar_ip_conf_t &conf, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::Result
Definition: sl_lidar_driver.h:92
sl::IChannel::getChannelType
virtual int getChannelType()=0
sl::LIDAR_INTERFACE_UART
@ LIDAR_INTERFACE_UART
Definition: sl_lidar_driver.h:147
data
sl_u8 data[0]
Definition: sl_lidar_protocol.h:5
sl::createLidarDriver
Result< ILidarDriver * > createLidarDriver()
Definition: sl_lidar_driver.cpp:1698
sl::ILidarDriver::getDeviceInfo
virtual sl_result getDeviceInfo(sl_lidar_response_device_info_t &info, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::SlamtecLidarTimingDesc::sample_duration_uS
sl_u32 sample_duration_uS
Definition: sl_lidar_driver.h:158
sl::IChannel::clearReadCache
virtual void clearReadCache()=0
sl::LIDAR_TECHNOLOGY_UNKNOWN
@ LIDAR_TECHNOLOGY_UNKNOWN
Definition: sl_lidar_driver.h:130
sl::ILidarDriver::DEFAULT_TIMEOUT
@ DEFAULT_TIMEOUT
Definition: sl_lidar_driver.h:332
sl::ILidarDriver::reset
virtual sl_result reset(sl_u32 timeoutInMs=DEFAULT_TIMEOUT)=0
sl::ISerialPortChannel::setDTR
virtual void setDTR(bool dtr)=0
sl::SlamtecLidarTimingDesc::native_timestamp_support
bool native_timestamp_support
Definition: sl_lidar_driver.h:165
DEFAULT_MOTOR_SPEED
#define DEFAULT_MOTOR_SPEED
Definition: sl_lidar_cmd.h:116
sl::ILidarDriver::getLidarIpConf
virtual sl_result getLidarIpConf(sl_lidar_ip_conf_t &conf, sl_u32 timeout=DEFAULT_TIMEOUT)=0
sl::LIDAR_MAJOR_TYPE_C_SERIES
@ LIDAR_MAJOR_TYPE_C_SERIES
Definition: sl_lidar_driver.h:143


rplidar_ros
Author(s):
autogenerated on Fri Aug 2 2024 08:42:14