sl_lidar_driver_impl.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 #include "sl_lidar_driver.h"
34 
35 namespace sl {
37  {
38  public:
39  enum {
41  };
42 
43  enum
44  {
47  };
48 
49  enum {
52  };
53  public:
55  :_channel(NULL)
56  , _isConnected(false)
57  , _isScanning(false)
63  {}
64 
65  sl_result connect(IChannel* channel);
66  void disconnect();
67  bool isConnected();
68  sl_result reset(sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
69  sl_result getAllSupportedScanModes(std::vector<LidarScanMode>& outModes, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
70  sl_result getTypicalScanMode(sl_u16& outMode, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
71  sl_result startScan(bool force, bool useTypicalScan, sl_u32 options = 0, LidarScanMode* outUsedScanMode = nullptr);
72  sl_result startScanNormal(bool force, sl_u32 timeout = DEFAULT_TIMEOUT);
73  sl_result startScanExpress(bool force, sl_u16 scanMode, sl_u32 options = 0, LidarScanMode* outUsedScanMode = nullptr, sl_u32 timeout = DEFAULT_TIMEOUT);
74  sl_result stop(sl_u32 timeout = DEFAULT_TIMEOUT);
75  DEPRECATED(sl_result grabScanData(sl_lidar_response_measurement_node_t * nodebuffer, size_t& count, sl_u32 timeout = DEFAULT_TIMEOUT));
76  sl_result grabScanDataHq(sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t& count, sl_u32 timeout = DEFAULT_TIMEOUT);
77  sl_result getDeviceInfo(sl_lidar_response_device_info_t& info, sl_u32 timeout = DEFAULT_TIMEOUT);
79  sl_result getFrequency(const LidarScanMode& scanMode, const sl_lidar_response_measurement_node_hq_t* nodes, size_t count, float& frequency);
80  sl_result setLidarIpConf(const sl_lidar_ip_conf_t& conf, sl_u32 timeout);
81  sl_result getLidarIpConf(sl_lidar_ip_conf_t& conf, sl_u32 timeout);
82  sl_result getHealth(sl_lidar_response_device_health_t& health, sl_u32 timeout = DEFAULT_TIMEOUT);
83  sl_result getDeviceMacAddr(sl_u8* macAddrArray, sl_u32 timeoutInMs);
84  sl_result ascendScanData(sl_lidar_response_measurement_node_t * nodebuffer, size_t count);
87  sl_result setMotorSpeed(sl_u16 speed = DEFAULT_MOTOR_PWM);//
88  sl_result negotiateSerialBaudRate(sl_u32 requiredBaudRate, sl_u32* baudRateDetected = NULL);
89 
90  protected:
92  sl_result checkSupportConfigCommands(bool& outSupport, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
93  sl_result getScanModeCount(sl_u16& modeCount, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
94  sl_result setLidarConf(sl_u32 type, const void* payload, size_t payloadSize, sl_u32 timeout);
95  sl_result getLidarConf(sl_u32 type, std::vector<sl_u8> &outputBuf, const std::vector<sl_u8> &reserve = std::vector<sl_u8>(), sl_u32 timeout = DEFAULT_TIMEOUT);
96  sl_result getLidarSampleDuration(float& sampleDurationRes, sl_u16 scanModeID, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
97  sl_result getMaxDistance(float &maxDistance, sl_u16 scanModeID, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
98  sl_result getScanModeAnsType(sl_u8 &ansType, sl_u16 scanModeID, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
99  sl_result getScanModeName(char* modeName, sl_u16 scanModeID, sl_u32 timeoutInMs = DEFAULT_TIMEOUT);
100  //DEPRECATED(sl_result getSampleDuration_uS(sl_lidar_response_sample_rate_t & rateInfo, sl_u32 timeout = DEFAULT_TIMEOUT));
101  //DEPRECATED (sl_result checkExpressScanSupported(bool & support, sl_u32 timeout = DEFAULT_TIMEOUT));
102  //DEPRECATED(sl_result getFrequency(bool inExpressMode, size_t count, float & frequency, bool & is4kmode));
103  private:
104  sl_result _sendCommand(sl_u16 cmd, const void * payload = NULL, size_t payloadsize = 0 );
106  template <typename T>
107  sl_result _waitResponse(T &payload ,sl_u8 ansType, sl_u32 timeout = DEFAULT_TIMEOUT);
108  void _disableDataGrabbing();
109  sl_result _waitNode(sl_lidar_response_measurement_node_t * node, sl_u32 timeout = DEFAULT_TIMEOUT);
110  sl_result _waitScanData(sl_lidar_response_measurement_node_t * nodebuffer, size_t & count, sl_u32 timeout = DEFAULT_TIMEOUT);
112  void _ultraCapsuleToNormal(const sl_lidar_response_ultra_capsule_measurement_nodes_t & capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount);
113  sl_result _waitCapsuledNode(sl_lidar_response_capsule_measurement_nodes_t & node, sl_u32 timeout = DEFAULT_TIMEOUT);
114  void _capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t & capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount);
115  void _dense_capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t & capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount);
117 
118  void _ultra_dense_capsuleToNormal(const sl_lidar_response_ultra_dense_capsule_measurement_nodes_t& capslue, sl_lidar_response_measurement_node_hq_t* nodebuffer, size_t& nodeCount);
119  sl_result _waitUltraDenseCapsuledNode(sl_lidar_response_ultra_dense_capsule_measurement_nodes_t& node, sl_u32 timeout = DEFAULT_TIMEOUT);
121 
122 
123  sl_result _waitHqNode(sl_lidar_response_hq_capsule_measurement_nodes_t & node, sl_u32 timeout = DEFAULT_TIMEOUT);
124  void _HqToNormal(const sl_lidar_response_hq_capsule_measurement_nodes_t & node_hq, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount);
126  sl_result _waitUltraCapsuledNode(sl_lidar_response_ultra_capsule_measurement_nodes_t & node, sl_u32 timeout = DEFAULT_TIMEOUT);
129 
130  private:
135 
141 
145 
148 
149  sl_lidar_response_capsule_measurement_nodes_t _cached_previous_capsuledata;
150  sl_lidar_response_dense_capsule_measurement_nodes_t _cached_previous_dense_capsuledata;
151  sl_lidar_response_ultra_capsule_measurement_nodes_t _cached_previous_ultracapsuledata;
152  sl_lidar_response_hq_capsule_measurement_nodes_t _cached_previous_Hqdata;
155  };
156 
157 }
sl::SL_LidarDriver::getDeviceMacAddr
sl_result getDeviceMacAddr(sl_u8 *macAddrArray, sl_u32 timeoutInMs)
sl::SL_LidarDriver::A2A3_LIDAR_MINUM_MAJOR_ID
@ A2A3_LIDAR_MINUM_MAJOR_ID
Definition: sl_lidar_driver_impl.h:50
sl::SL_LidarDriver::_cached_scan_node_hq_buf_for_interval_retrieve
sl_lidar_response_measurement_node_hq_t _cached_scan_node_hq_buf_for_interval_retrieve[8192]
Definition: sl_lidar_driver_impl.h:146
sl::SL_LidarDriver::getLidarIpConf
sl_result getLidarIpConf(sl_lidar_ip_conf_t &conf, sl_u32 timeout)
sl::SL_LidarDriver::_cached_sampleduration_express
sl_u16 _cached_sampleduration_express
Definition: sl_lidar_driver_impl.h:140
sl_lidar_response_measurement_node_hq_t
Definition: sl_lidar_cmd.h:272
sl::SL_LidarDriver::isConnected
bool isConnected()
sl::SL_LidarDriver::_cacheUltraDenseCapsuledScanData
sl_result _cacheUltraDenseCapsuledScanData()
sl::IChannel
Definition: sl_lidar_driver.h:171
type
sl_u32 type
Definition: sl_lidar_cmd.h:2
sl::SL_LidarDriver::ascendScanData
sl_result ascendScanData(sl_lidar_response_measurement_node_t *nodebuffer, size_t count)
sl::SL_LidarDriver::_cachethread
rp::hal::Thread _cachethread
Definition: sl_lidar_driver_impl.h:138
sl::SL_LidarDriver::grabScanDataHq
sl_result grabScanDataHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_HqToNormal
void _HqToNormal(const sl_lidar_response_hq_capsule_measurement_nodes_t &node_hq, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl::SL_LidarDriver::getFrequency
sl_result getFrequency(const LidarScanMode &scanMode, const sl_lidar_response_measurement_node_hq_t *nodes, size_t count, float &frequency)
sl::SL_LidarDriver::negotiateSerialBaudRate
sl_result negotiateSerialBaudRate(sl_u32 requiredBaudRate, sl_u32 *baudRateDetected=NULL)
sl::ILidarDriver
Definition: sl_lidar_driver.h:306
sl::SL_LidarDriver::TOF_LIDAR_MINUM_MAJOR_ID
@ TOF_LIDAR_MINUM_MAJOR_ID
Definition: sl_lidar_driver_impl.h:51
sl::SL_LidarDriver::getAllSupportedScanModes
sl_result getAllSupportedScanModes(std::vector< LidarScanMode > &outModes, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
Get all scan modes that supported by lidar.
sl::SL_LidarDriver::LEGACY_SAMPLE_DURATION
@ LEGACY_SAMPLE_DURATION
Definition: sl_lidar_driver_impl.h:40
sl::SL_LidarDriver::_lock
rp::hal::Locker _lock
Definition: sl_lidar_driver_impl.h:136
sl::SL_LidarDriver::_clearRxDataCache
sl_result _clearRxDataCache()
sl::SL_LidarDriver::_cacheCapsuledScanData
sl_result _cacheCapsuledScanData()
sl::SL_LidarDriver::getScanDataWithIntervalHq
sl_result getScanDataWithIntervalHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count)
sl::SL_LidarDriver::getLidarConf
sl_result getLidarConf(sl_u32 type, std::vector< sl_u8 > &outputBuf, const std::vector< sl_u8 > &reserve=std::vector< sl_u8 >(), sl_u32 timeout=DEFAULT_TIMEOUT)
sl::LidarScanMode
Definition: sl_lidar_driver.h:73
sl::SL_LidarDriver::getScanModeAnsType
sl_result getScanModeAnsType(sl_u8 &ansType, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_cached_scan_node_hq_count_for_interval_retrieve
size_t _cached_scan_node_hq_count_for_interval_retrieve
Definition: sl_lidar_driver_impl.h:147
sl::SL_LidarDriver::connect
sl_result connect(IChannel *channel)
sl::SL_LidarDriver::setLidarConf
sl_result setLidarConf(sl_u32 type, const void *payload, size_t payloadSize, sl_u32 timeout)
sl::SL_LidarDriver::_waitUltraDenseCapsuledNode
sl_result _waitUltraDenseCapsuledNode(sl_lidar_response_ultra_dense_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::MotorCtrlSupport
MotorCtrlSupport
Definition: sl_lidar_driver.h:276
sl::SL_LidarDriver::getHealth
sl_result getHealth(sl_lidar_response_device_health_t &health, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_cached_scan_node_hq_count
size_t _cached_scan_node_hq_count
Definition: sl_lidar_driver_impl.h:143
node_hq
sl_lidar_response_measurement_node_hq_t node_hq[96]
Definition: sl_lidar_cmd.h:4
sl::SL_LidarDriver::_cached_scan_node_hq_buf
sl_lidar_response_measurement_node_hq_t _cached_scan_node_hq_buf[8192]
Definition: sl_lidar_driver_impl.h:142
sl::SL_LidarDriver::_disableDataGrabbing
void _disableDataGrabbing()
sl::SL_LidarDriver
Definition: sl_lidar_driver_impl.h:36
sl::SL_LidarDriver::startScanExpress
sl_result startScanExpress(bool force, sl_u16 scanMode, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_cacheScanData
sl_result _cacheScanData()
sl::SL_LidarDriver::checkMotorCtrlSupport
sl_result checkMotorCtrlSupport(MotorCtrlSupport &support, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::DEPRECATED
DEPRECATED(sl_result grabScanData(sl_lidar_response_measurement_node_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT))
sl::SL_LidarDriver::_waitUltraCapsuledNode
sl_result _waitUltraCapsuledNode(sl_lidar_response_ultra_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
rp::hal::Event
Definition: event.h:38
payload
sl_u8 payload[0]
Definition: sl_lidar_cmd.h:3
sl::SL_LidarDriver::_isSupportingMotorCtrl
MotorCtrlSupport _isSupportingMotorCtrl
Definition: sl_lidar_driver_impl.h:134
rp::hal::Locker
Definition: locker.h:38
sl::SL_LidarDriver::_channel
IChannel * _channel
Definition: sl_lidar_driver_impl.h:131
sl::SL_LidarDriver::_cacheUltraCapsuledScanData
sl_result _cacheUltraCapsuledScanData()
sl::SL_LidarDriver::_cached_previous_dense_capsuledata
sl_lidar_response_dense_capsule_measurement_nodes_t _cached_previous_dense_capsuledata
Definition: sl_lidar_driver_impl.h:150
rp::hal::Thread
Definition: thread.h:43
sl::SL_LidarDriver::_waitScanData
sl_result _waitScanData(sl_lidar_response_measurement_node_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::getDeviceInfo
sl_result getDeviceInfo(sl_lidar_response_device_info_t &info, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::DENSE_CAPSULE
@ DENSE_CAPSULE
Definition: sl_lidar_driver_impl.h:46
sl::SL_LidarDriver::stop
sl_result stop(sl_u32 timeout=DEFAULT_TIMEOUT)
sl
Definition: sl_crc.h:38
sl::SL_LidarDriver::disconnect
void disconnect()
sl::SL_LidarDriver::checkSupportConfigCommands
sl_result checkSupportConfigCommands(bool &outSupport, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::NORMAL_CAPSULE
@ NORMAL_CAPSULE
Definition: sl_lidar_driver_impl.h:45
sl::SL_LidarDriver::_ultra_dense_capsuleToNormal
void _ultra_dense_capsuleToNormal(const sl_lidar_response_ultra_dense_capsule_measurement_nodes_t &capslue, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl::SL_LidarDriver::SL_LidarDriver
SL_LidarDriver()
Definition: sl_lidar_driver_impl.h:54
sl::SL_LidarDriver::getScanModeCount
sl_result getScanModeCount(sl_u16 &modeCount, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::MotorCtrlSupportNone
@ MotorCtrlSupportNone
Definition: sl_lidar_driver.h:278
sl::SL_LidarDriver::getMaxDistance
sl_result getMaxDistance(float &maxDistance, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_waitResponseHeader
sl_result _waitResponseHeader(sl_lidar_ans_header_t *header, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_cacheHqScanData
sl_result _cacheHqScanData()
sl::SL_LidarDriver::_waitHqNode
sl_result _waitHqNode(sl_lidar_response_hq_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_waitResponse
sl_result _waitResponse(T &payload, sl_u8 ansType, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::setMotorSpeed
sl_result setMotorSpeed(sl_u16 speed=DEFAULT_MOTOR_PWM)
sl::SL_LidarDriver::getScanModeName
sl_result getScanModeName(char *modeName, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_is_previous_HqdataRdy
bool _is_previous_HqdataRdy
Definition: sl_lidar_driver_impl.h:154
sl::SL_LidarDriver::_dataEvt
rp::hal::Event _dataEvt
Definition: sl_lidar_driver_impl.h:137
sl::SL_LidarDriver::_dense_capsuleToNormal
void _dense_capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl::SL_LidarDriver::_waitNode
sl_result _waitNode(sl_lidar_response_measurement_node_t *node, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::reset
sl_result reset(sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl::SL_LidarDriver::_cached_sampleduration_std
sl_u16 _cached_sampleduration_std
Definition: sl_lidar_driver_impl.h:139
sl::SL_LidarDriver::setLidarIpConf
sl_result setLidarIpConf(const sl_lidar_ip_conf_t &conf, sl_u32 timeout)
sl::SL_LidarDriver::_sendCommand
sl_result _sendCommand(sl_u16 cmd, const void *payload=NULL, size_t payloadsize=0)
sl::SL_LidarDriver::_is_previous_capsuledataRdy
bool _is_previous_capsuledataRdy
Definition: sl_lidar_driver_impl.h:153
sl::SL_LidarDriver::getLidarSampleDuration
sl_result getLidarSampleDuration(float &sampleDurationRes, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl_result
uint32_t sl_result
Definition: sl_types.h:69
sl::SL_LidarDriver::_isScanning
bool _isScanning
Definition: sl_lidar_driver_impl.h:133
sl::SL_LidarDriver::_cached_capsule_flag
sl_u8 _cached_capsule_flag
Definition: sl_lidar_driver_impl.h:144
sl::SL_LidarDriver::_cached_previous_Hqdata
sl_lidar_response_hq_capsule_measurement_nodes_t _cached_previous_Hqdata
Definition: sl_lidar_driver_impl.h:152
sl::SL_LidarDriver::_capsuleToNormal
void _capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl::SL_LidarDriver::_isConnected
bool _isConnected
Definition: sl_lidar_driver_impl.h:132
sl::SL_LidarDriver::startScan
sl_result startScan(bool force, bool useTypicalScan, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr)
sl::SL_LidarDriver::_cached_previous_capsuledata
sl_lidar_response_capsule_measurement_nodes_t _cached_previous_capsuledata
Definition: sl_lidar_driver_impl.h:149
sl::SL_LidarDriver::_waitCapsuledNode
sl_result _waitCapsuledNode(sl_lidar_response_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
sl::ILidarDriver::DEFAULT_TIMEOUT
@ DEFAULT_TIMEOUT
Definition: sl_lidar_driver.h:332
sl::SL_LidarDriver::startMotor
sl_result startMotor()
sl::SL_LidarDriver::_cached_previous_ultracapsuledata
sl_lidar_response_ultra_capsule_measurement_nodes_t _cached_previous_ultracapsuledata
Definition: sl_lidar_driver_impl.h:151
sl::SL_LidarDriver::_ultraCapsuleToNormal
void _ultraCapsuleToNormal(const sl_lidar_response_ultra_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl::SL_LidarDriver::startScanNormal
sl_result startScanNormal(bool force, sl_u32 timeout=DEFAULT_TIMEOUT)
sl_lidar_ans_header_t
Definition: sl_lidar_protocol.h:70
sl::SL_LidarDriver::getTypicalScanMode
sl_result getTypicalScanMode(sl_u16 &outMode, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
Get typical scan mode of lidar.
sl_lidar_driver.h


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