From 8cf3ab61b1a2e183bc8e9c593da158959ccaa417 Mon Sep 17 00:00:00 2001 From: Livox-SDK Date: Thu, 19 Dec 2019 15:19:27 +0800 Subject: [PATCH] update:update sdk communication protocol --- Livox-SDK-Communication-Protocol.md | 641 +++++++++++++++++++++++++--- images/RS485_sequence_digram.png | Bin 19919 -> 9523 bytes images/sequence_diagram_Hub.png | Bin 0 -> 21249 bytes images/sequence_diagram_Lidar.png | Bin 0 -> 16439 bytes 4 files changed, 581 insertions(+), 60 deletions(-) create mode 100644 images/sequence_diagram_Hub.png create mode 100644 images/sequence_diagram_Lidar.png diff --git a/Livox-SDK-Communication-Protocol.md b/Livox-SDK-Communication-Protocol.md index 3f02cd9..1a4cf4f 100644 --- a/Livox-SDK-Communication-Protocol.md +++ b/Livox-SDK-Communication-Protocol.md @@ -3,7 +3,9 @@ | **Document Release History** | | | | ---------------------------- | ----------- | ------------------------------------------------------------ | | **Date** | **Release** | **Change Description** | -| 2019/7/08 | v1.0.6 | 1. Fix crc32 bits error
2. Add system status code description | +| 2019/10/22 | v1.1.1 | 1. Update status code, add time synchronization status (Horizon: v06.05.00.00+, Mid-40/Mid-100: v03.07.00.00+)
2. Change IMU data push frequency | +| 2019/9/25 | v1.1.0 | 1. Add Tele-15 / Horizon LiDAR's support | +| 2019/7/08 | v1.0.6 | 1. Fix crc32 bits error
2. Add system status code description | | 2019/5/17 | v1.0.5 | Fix partial description errors | | 2019/4/18 | v1.0.4 | 1. Update motor status code (v03.05.00.00+)
2. Add query Hub slot power status command (v08.05.00.00+) | | 2019/4/17 | v1.0.3 | Update Hub read LiDAR extrinsic parameters description | @@ -22,7 +24,7 @@ and differences are as follows: > - **Control Command Data**: Configuration and query of LiDAR parameters and status information; -> - **Point Cloud Data**: Point cloud coordinate data generated by LiDAR units; +> - **Sample Data**: Sample data generated by LiDAR units including point cloud data and IMU data(Not supported by MID40/100); At present, both protocols are encapsulated in the data segment of the UDP package, and the data format in protocol is stored in little-endian form. @@ -99,10 +101,18 @@ There are three kinds of CMD sets: | | 0x07 | Push Abnormal Status Information | | | 0x08 | Configure Static/Dynamic IP | | | 0x09 | Get Device IP Information | +| | 0x0A | Reboot device | | 0x01 LiDAR Command Set | 0x00 | Set Mode | | | 0x01 | Write LiDAR Extrinsic Parameters | | | 0x02 | Read LiDAR Extrinsic Parameters | | | 0x03 | Turn On/Off Rain/Fog Suppression | +| | 0x04 | Set Turn On/Off Fan | +| | 0x05 | Get Turn On/Off Fan State | +| | 0x06 | Set LiDAR Return Mode | +| | 0x07 | Get LiDAR Return Mode | +| | 0x08 | Set IMU Data Push Frequency | +| | 0x09 | Get IMU Data Push Frequency | +| | 0x0A | Update UTC synchronization time | | 0x02 Hub Command Set | 0x00 | Query Connected LiDAR Device | | | 0x01 | Set LiDAR Mode | | | 0x02 | Turn On/Off Designated Slot Power | @@ -112,7 +122,12 @@ There are three kinds of CMD sets: | | 0x06 | Turn On/Off Hub Calculation of Extrinsic Parameters | | | 0x07 | Turn On/Off LiDAR Rain/Fog Suppression | | | 0x08 | Query Hub Slot Power Status | - +| | 0x09 | Set LiDAR Turn On/Off Fan | +| | 0x0A | Get LiDAR Turn On/Off Fan State | +| | 0x0B | Set LiDAR Return Mode | +| | 0x0C | Get LiDAR Return Mode | +| | 0x0D | Set LiDAR IMU Data Push Frequency | +| | 0x0E | Get LiDAR IMU Data Push Frequency | ## 2.3 SDK Connection In the process of communication, LiDAR or Hub are defined as slave, and the @@ -134,7 +149,7 @@ Flow Chart: ![connection_flow_chart](images/connection_flow_chart.png) -# 3 Point Cloud Data +# 3 Sample Data Package ## 3.1 Package Format @@ -147,18 +162,20 @@ Point cloud data format output by LiDAR: | LiDAR_id | 2 | 1 | LiDAR ID:
1: Mid-100 Left / Mid-40 / Tele-15 / Horizon
2: Mid-100 Middle
3: Mid-100 Right
![connection_flow_chart](images/Livox-Mid100.png) | | reserved | 3 | 1 | | | status_code | 4 | 4 | LiDAR Status Indicator Information, For details, see 3.4 | -| timestamp_type | 8 | 1 | Timestamp Type, For details, see 3.2 | -| data_type | 9 | 1 | Point Cloud Coordinate Format:
0: Cartesian Coordinate
1: Spherical Coordinate | +| timestamp_type | 8 | 1 | Timestamp Type, For details, see [3.2](#timestamp) | +| data_type | 9 | 1 | Data Type, For details, see [3.3](#data_type) | | timestamp | 10 | 8 | Nanosecond or UTC Format Timestamp, For details, see 3.2 | -| data | 18 | -- | 100 Point cloud data samples | +| data | 18 | -- | Data information, For details, see [3.3](#data_type) | -## 3.2 Time Stamp +## 3.2 Time Stamp {#timestamp} LiDAR system supports three synchronization modes: -- IEEE 1588v2.0 PTP network protocol synchronization -- pulse synchronization (only supported by LiDAR) -- GPS time synchronization (PPS + GPRMC, only supported by Hub). +- PTP: IEEE 1588v2.0 PTP network protocol synchronization. +- GPS: In order to synchronize with GPS, LiDAR/Hub have to receive PPS and UTC timestamps. For Horizon and Tele-15, LiDAR unit can receive UTC timestamps in control command over Ethernet. Livox Hub unit can receive UTC timestamps in $GPRMC message over RS485 serial port. +- PPS: Pulse synchronization (only supported by LiDAR). -Each packet contains a timestamp indicating the time of the first point in the packet the time interval of each point in the packet is equal. +**Synchronization Priority:** PTP > GPS > PPS, when there are multiple synchronization sources in the system, the synchronization mode with the highest priority will be selected. If the highest priority synchronization source is offline, the timestamp type will continue to be maintained and will not fall back to the lower priority, and `time_sync_status` in [Status Code](# 3.5.1 LiDAR Status Code) will be set to 4(the highest priority synchronization signal is abnormal). + +Each packet contains a timestamp indicating the time of the first point in the packet.The time interval of each point in the packet is equal. Taking Mid-40 as an example, the sampling frequency is 100 KHz , and the interval of each point is 10 us. @@ -173,12 +190,12 @@ Taking Mid-40 as an example, the sampling frequency is 100 KHz , and the interva Timestamp Type: | Timestamp Type | Source | Data Type | Description | -|----------------|----------------|-----------|-----------------------------------| +| -------------- | -------------- | --------- | --------------------------------- | | 0 | No sync source | uint64_t | Unit: ns | | 1 | PTP | uint64_t | Unit: ns | | 2 | Reserved | | | -| 3 | GPS | UTC | UTC, only supported by Hub | -| 4 | PPS | uint64_t | Unit: ns, only supported by LiDAR | +| 3 | GPS | UTC | UTC | +| 4 | PPS | int64_t | Unit: ns, only supported by LiDAR | **Timestamp Type 0** @@ -192,8 +209,14 @@ mode has the highest priority. **Timestamp Type 3** -GPS synchronization source, using the RS485 level. The sequence diagram is as follows: -![sequence_diagram](images/sequence_diagram.png) +A timestamp of 3 indicates LIDAR/Hub unit is sync with GPS. For LiDAR unit, PPS in RS485 level and UTC timestamp through SDK control command (refer to [**Update UTC synchronization time**](#_0xA_Update_UTC) for details) are needed. The sequence diagram is as follows: +![sequence_diagram](images/sequence_diagram_Lidar.png) + +For Livox Hub unit, PPS and $GPRMC message in RS485 level are needed. The sequence +diagram is as follows: + +![sequence_diagram](images/sequence_diagram_Hub.png) + An example $GPRMC message is shown below: $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A @@ -219,16 +242,27 @@ The timestamp in cloud point data package UTC time format: **Timestamp Type 4** -PPS synchronization source, using the RS485 level. The sequence diagram is as -follows. Timestamp indicates the time from the last rising edge. +PPS synchronization source, using the RS485 level. The sequence diagram is as follows. The rising edge of PPS will reset the timestamp to zero. So the timestamp of point cloud data indicates the offset between the point cloud sampling and the PPS rising edge. In the case of IMU packets, the time offset may be negative due to the compensation delay. ![RS485_sequence_digram](images/RS485_sequence_digram.png) -## 3.3 Point Cloud -There are 100 point cloud samples in each point data package. The sample data -can have either one of the following formats depends on the coordinate system -chosen by the user. +## 3.3 Point Cloud/IMU Data {#data_type} +There are N samples in each data package. N depends on the user's configuration. The sample data can be one of the following formats. -Cartesian coordinate format: +Data Type: + +| Data Type |Sample Type |Return Mode | Coordinate Format |N| Data Frequency | Supported Devices | +|----------------|-------------------|-------------------|--------------------|------------------|-------------------|-------------------| +| 0 |Point Cloud Data |Single Return Mode |Cartesian Coordinate | 100 | 100,000 points/s |Mid-40 | +| 1 |Point Cloud Data |Single Return Mode |Spherical Coordinate |100 | 100,000 points/s |Mid-40 | +| 2 |Point Cloud Data |Single Return Mode |Cartesian Coordinate |96 | 240,000 points/s |Horizon
Tele-15 | +| 3 |Point Cloud Data |Single Return Mode |Spherical Coordinate |96 | 240,000 points/s |Horizon
Tele-15 | +| 4 |Point Cloud Data |Dual Return Mode |Cartesian Coordinate |48 | 480,000 points/s |Horizon
Tele-15 | +| 5 |Point Cloud Data |Dual Return Mode |Spherical Coordinate |48 | 480,000 points/s |Horizon
Tele-15 | +| 6 |IMU Data |--- |--- |1 | see [IMU Data Push Frequency](#imu_freq) |Horizon
Tele-15 | + +**Data Type 0** + +Single return cartesian coordinate data format: | Field | Offset (byte) | Data Type | Description | |--------------|---------------|-----------|------------------| @@ -237,7 +271,9 @@ Cartesian coordinate format: | z | 8 | int32_t | Z axis, Unit: mm | | reflectivity | 12 | uin8_t | Reflectivity | -Spherical coordinate format: +**Data Type 1** + +Single return spherical coordinate data format: | Field | Offset (byte) | Data Type | Description | |--------------|---------------|-----------|-------------------------------------------| @@ -246,36 +282,121 @@ Spherical coordinate format: | phi | 6 | uin16_t | Azimuth[0, 36000], Unit: 0.01 degree | | reflectivity | 8 | uin8_t | Reflectivity | -## 3.4 Status Code -### 3.4.1 LiDAR Status Code +**Data Type 2** + +Single return cartesian coordinate data format: + +| Field | Offset (byte) | Data Type | Description | +|--------------|---------------|-----------|------------------| +| x | 0 | int32_t | X axis, Unit: mm | +| y | 4 | int32_t | Y axis, Unit: mm | +| z | 8 | int32_t | Z axis, Unit: mm | +| reflectivity | 12 | uin8_t | Reflectivity | +| tag | 13 | uint8_t | For details, see [tag information](#tag_info)| + +**Data Type 3** + +Single return spherical coordinate data format: + +| Field | Offset (byte) | Data Type | Description | +|--------------|---------------|-----------|-------------------------------------------| +| depth | 0 | uint32_t | Depth, Unit: mm | +| theta | 4 | uint16_t | Zenith angle[0, 18000], Unit: 0.01 degree | +| phi | 6 | uin16_t | Azimuth[0, 36000], Unit: 0.01 degree | +| reflectivity | 8 | uin8_t | Reflectivity | +| tag | 9 | uint8_t | For details, see [tag information](#tag_info)| + +**Data Type 4** + +Dual return Cartesian coordinate data format: + +| Field | Offset (byte) | Data Type | Description | +|--------------|---------------|-----------|------------------| +| x1 | 0 | int32_t | X axis, Unit: mm | +| y1 | 4 | int32_t | Y axis, Unit: mm | +| z1 | 8 | int32_t | Z axis, Unit: mm | +| reflectivity1 | 12 | uin8_t | Reflectivity | +| tag1 | 13 | uint8_t | For details, see [tag information](#tag_info)| +| x2 | 14 | int32_t | X axis, Unit: mm | +| y2 | 18 | int32_t | Y axis, Unit: mm | +| z2 | 22 | int32_t | Z axis, Unit: mm | +| reflectivity2 | 26 | uin8_t | Reflectivity | +| tag2 | 27 | uint8_t | For details, see [tag information](#tag_info)| + +**Data Type 5** + +Dual return spherical coordinate data format: + +| Field | Offset (byte) | Data Type | Description | +|--------------|---------------|-----------|-------------------------------------------| +| theta | 0 | uint16_t | Zenith angle[0, 18000], Unit: 0.01 degree | +| phi | 2 | uin16_t | Azimuth[0, 36000], Unit: 0.01 degree | +| depth1 | 4 | uint32_t | Depth, Unit: mm | +| reflectivity1| 8 | uin8_t | Reflectivity | +| tag1 | 9 | uint8_t | For details, see [tag information](#tag_info)| +| depth2 | 10 | uint32_t | Depth, Unit: mm | +| reflectivity2| 14 | uin8_t | Reflectivity | +| tag2 | 15 | uint8_t | For details, see [tag information](#tag_info)| + +**Data Type 6** + +IMU data format: + +| Field | Offset (byte) | Data Type | Description | +|--------------|---------------|-----------|-------------------------------------------| +| gyro_x | 0 | float | Unit: rad/s | +| gyro_y | 4 | float | Unit: rad/s | +| gyro_z | 8 | float | Unit: rad/s | +| acc_x | 12 | float | Unit: g | +| acc_y | 16 | float | Unit: g | +| acc_z | 20 | float | Unit: g | + +## 3.4 Tag Information {#tag_info} + +| Bit | Description | +| ---- | ------------------------------------------------------------ | +| 7:6 | Reserved | +| 5:4 | Return Number:
00: Return 0
01: Return 1
02: Return 2
03: Return 4 | +| 3:2 | Point property based on return intensity:
00: Normal
01: High confidence level of the noise
02: Moderate confidence level of the noise
03: Reserved | +| 1:0 | Point property based on spatial position:
0: Normal
1: High confidence level of the noise
2: Moderate confidence level of the noise
3: Low confidence level of the noise | + +> For details, see Livox Horizon/Tele-15 user manual. + +## 3.5 Status Code + +### 3.5.1 LiDAR Status Code LiDAR status_code consists of 32 bits, which has the following meanings: -| Bits | Data | Description | -|----------|-----------------|----------------------------------------------------------| -| Bit0:1 | temp_status | 0: Temperature in Normal State
1: High or Low
2: Extremely High or Extremely Low | -| Bit2:3 | volt_status | Voltage Status of Internal Module
0: Voltage in Normal State
1: High
2: Extremely High | -| Bit4:5 | motor_status | 0: Motor in Normal State
1: Motor in Warning State
2: Motor in Error State, Unable to Work | -| Bit6:7 | dirty_warn | 0: Not Dirty or Blocked
1: Dirty or Blocked | -| Bit8 | firmware_status | 0: Firmware is OK
1: Firmware is Abnormal, Need to be Upgraded | -| Bit9 | pps_status | 0: No PPS Signal
1: PPS Signal is OK | -| Bit10 | device_status | 0: Normal
1: Warning for Approaching the End of Service Life | -| Bit11:29 | RSVD | | -| Bit30:31 | system_status | 0: Normal
1: Warning
Any of the following situations will trigger warning:
1.1 'temp_status' is 1;
1.2 'volt_status' is 1;
1.3 'motor_status' is 1;
1.4 'dirty_warn' is 1;
1.5 'device_status' is 1;
2: Error
Causes the LiDAR to Shut Down and Enter the Error State.
Any of the following situations will trigger error:
2.1 'temp_status' is 2;
2.2 'volt_status' is 2;
2.3 'motor_status' is 2;
2.4 'firmware_status' is 1; | +| Bits | Data | Description | +| -------- | ---------------- | ------------------------------------------------------------ | +| Bit0:1 | temp_status | 0: Temperature in Normal State
1: High or Low
2: Extremely High or Extremely Low | +| Bit2:3 | volt_status | Voltage Status of Internal Module
0: Voltage in Normal State
1: High
2: Extremely High | +| Bit4:5 | motor_status | 0: Motor in Normal State
1: Motor in Warning State
2: Motor in Error State, Unable to Work | +| Bit6:7 | dirty_warn | 0: Not Dirty or Blocked
1: Dirty or Blocked | +| Bit8 | firmware_status | 0: Firmware is OK
1: Firmware is Abnormal, Need to be Upgraded | +| Bit9 | pps_status | 0: No PPS Signal
1: PPS Signal is OK | +| Bit10 | device_status | 0: Normal
1: Warning for Approaching the End of Service Life | +| Bit11 | fan_status | 0: Fan in Normal State
1: Fan in Warning State
**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+ | +| Bit12 | self_heating | 0: Low Temperature Self Heating On
1: Low Temperature Self Heating Off
**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+ | +| Bit13 | ptp_status | 0: No 1588 Signal
1: 1588 Signal is OK | +| Bit14:16 | time_sync_status | 0: System dose not start time synchronization
1: Using PTP 1588 synchronization
2: Using GPS synchronization
3: Using PPS synchronization
4: System time synchronization is abnormal (The highest priority synchronization signal is abnormal) | +| Bit17:29 | RSVD | | +| Bit30:31 | system_status | 0: Normal
1: Warning
Any of the following situations will trigger warning:
1.1 `temp_status` is 1;
1.2 `volt_status` is 1;
1.3 `motor_status` is 1;
1.4 `dirty_warn` is 1;
1.5 `device_status` is 1;
1.6 `fan_status` is 1;
2: Error
Causes the LiDAR to Shut Down and Enter the Error State.
Any of the following situations will trigger error:
2.1 `temp_status` is 2;
2.2 `volt_status` is 2;
2.3 `motor_status` is 2;
2.4 `firmware_status` is 1; | -### 3.4.2 Hub Status Code +### 3.5.2 Hub Status Code Hub Status Code consists of 32 bits, which has the following meanings: -| Bits | Data | Description | -|----------|-------------------|---------------------------------- | -| Bit0:1 | sync_status | 0: No synchronization signal
1: 1588 synchronization
2: GPS synchronization | -| Bit2:3 | temp_status | 0: Temperature in Normal State
1: High or Low
2: Extremely High or Extremely Low | -| Bit4 | LiDAR_status | 0: LiDAR State is Normal
1: LiDAR State is Abnormal | -| Bit5 | LiDAR_link_status | 0: LiDAR Connection is Normal
1: LiDAR Connection is Abnormal | -| Bit6 | firmware_status | 0: LiDAR Firmware is OK
1: LiDAR Firmware is Abnormal, Need to be Upgraded | -| Bit7:29 | RSVD | | -| Bit30:31 | system_status | 0: Normal
1: Warning
Any of the following situations will trigger warning:
1.1 'temp_status' is 1;
2: Error
Any of the following situations will trigger error:
2.1 'temp_status' is 2;
2.2 'LiDAR_status' is 1;
2.3 'firmware_status' is 1; | +| Bits | Data | Description | +| -------- | ----------------- | ------------------------------------------------------------ | +| Bit0:1 | sync_status | 0: No synchronization signal
1: 1588 synchronization
2: GPS synchronization
3: System time synchronization is abnormal (The highest priority synchronization signal is abnormal) | +| Bit2:3 | temp_status | 0: Temperature in Normal State
1: High or Low
2: Extremely High or Extremely Low | +| Bit4 | LiDAR_status | 0: LiDAR State is Normal
1: LiDAR State is Abnormal | +| Bit5 | LiDAR_link_status | 0: LiDAR Connection is Normal
1: LiDAR Connection is Abnormal | +| Bit6 | firmware_status | 0: LiDAR Firmware is OK
1: LiDAR Firmware is Abnormal, Need to be Upgraded | +| Bit7:29 | RSVD | | +| Bit30:31 | system_status | 0: Normal
1: Warning
Any of the following situations will trigger warning:
1.1 `temp_status` is 1;
2: Error
Any of the following situations will trigger error:
2.1 `temp_status` is 2;
2.2 `LiDAR_status` is 1;
2.3 `firmware_status` is 1; | # 4 Control Command Detail ## 4.1 General CMD Set @@ -287,7 +408,7 @@ message |------|------------------|---------------|-------------|-----------------------| | data | cmd_set | 0 | uint8_t | General Command: 0x00 | | | cmd_id | 1 | uint8_t | Command ID: 0x00 | -| | broadcast_code | 2 | uint8_t[16] | Device Broadcast Code, C-Style string end with ‘\0’
The Broadcast Code of Each Device is UNIQUE. | +| | broadcast_code | 2 | uint8_t[16] | Device Broadcast Code, C-Style string end with '\\0'
The Broadcast Code of Each Device is UNIQUE. | | | dev_type | 18 | uint8_t | Device Type:
0: Livox Hub
1: Mid-40
2: Tele-15
3: Horizon | | | reserved | 19 | uint16_t | Reserved | @@ -295,13 +416,14 @@ message request -| CMD | Name | Offset (byte) | Data Type | Description | -|------|-----------|---------------|------------|----------------------------------------| -| data | cmd_set | 0 | uint8_t | General Command: 0x00 | -| | cmd_id | 1 | uint8_t | Command ID: 0x01 | +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | --------- | ------------- | ---------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | General Command: 0x00 | +| | cmd_id | 1 | uint8_t | Command ID: 0x01 | | | user_ip | 2 | uint8_t[4] | Host IP Address
Example: AA.BB.CC.DD
user_ip[0] = AA
user_ip[1] = BB
user_ip[2] = CC
user_ip[3] = DD | -| | data_port | 6 | uint16_t | Host Point Cloud Data UDP Destination Port | -| | cmd_port | 8 | uint16_t | Host Control Command UDP Destination Port | +| | data_port | 6 | uint16_t | Host Point Cloud Data UDP Destination Port | +| | cmd_port | 8 | uint16_t | Host Control Command UDP Destination Port | +| | imu_port | 10 | uint16_t | Host Control IMU UDP Destination Port,
**Supported Devices: **
Horizon/06.04.0000+
Tele-15/07.03.0000+ | response @@ -388,6 +510,8 @@ response | | cmd_id | 1 | uint8_t | Command ID: 0x05 | | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +**NOTE:** *This cmd only takes effect in RAM, the coordinate system will reset to Cartesian after reboot .* + ### 0x06 Disconnect request @@ -427,7 +551,15 @@ request | data | cmd_set | 0 | uint8_t | General Command: 0x00 | | | cmd_id | 1 | uint8_t | Command ID: 0x08 | | | ip_mode | 2 | uint8_t | 0x00: Dynamic IP
0x01: Static IP | -| | ip_addr | 3 | uint8_t[4] | IPV4 Address
IP address is valid when ‘ip_mode’ is 0x01
(Static IP)
ip_addr[0]: 192
ip_addr[1]: 168
ip_addr[2]: 1
ip_addr[3]: Range is as follows
Last bit of broadcast code:
1: 11 ~ 80
2: 81 ~ 150
3: 151 ~ 220 | +| | ip_addr | 3 | uint8_t[4] | For details, see: **IP Address Information** | +| | net_mask| 7 | uint8_t[4] | IPV4 netmask
IP netmask is valid when ‘ip_mode’ is 0x01(Static IP)
Example: AA.BB.CC.DD
net_mask[0]: AA
net_mask[1]: BB
net_mask[2]: CC
net_mask[3]: DD

**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+ | +| |gw_addr | 11 | uint8_t[4] |IPV4 gateway
IP gateway is valid when ‘ip_mode’ is 0x01(Static IP)
Example: AA.BB.CC.DD
gw_addr[0]: AA
gw_addr[1]: BB
gw_addr[2]: CC
gw_addr[3]: DD

**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+ | + +IP Address Information: +| Device Type/Firmware version | | IP Address Information| +|-------------|----------------------|----------------------| +| Livox Hub
Mid-40
| | IPV4 Address
IP address is valid when ‘ip_mode’ is 0x01(Static IP)
ip_addr[0]: 192
ip_addr[1]: 168
ip_addr[2]: 1
ip_addr[3]: Range is as follows
Last bit of broadcast code:
1: 11 ~ 80
2: 81 ~ 150
3: 151 ~ 220 | +|Horizon/06.04.0000+
Tele-15/07.03.0000+
| | IPV4 Address
IP address is valid when ‘ip_mode’ is 0x01(Static IP)
ip_addr[0]: 1~126 && 127~223
ip_addr[1]: 0~255
ip_addr[2]: 0~255
ip_addr[3]: 0~255| response @@ -437,6 +569,8 @@ response | | cmd_id | 1 | uint8_t | Command ID: 0x08 | | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +**NOTE:** *For IP details, see:[IP_address](https://en.wikipedia.org/wiki/IP_address).* + ### 0x09 Get Device IP Information request @@ -455,6 +589,28 @@ response | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | | | ip_mode | 3 | uint8_t | 0x00: Dynamic IP
0x01: Static IP | | | ip_addr | 4 | uint8_t[4] | Device IPV4 Address
Example: AA.BB.CC.DD
user_ip[0] = AA
user_ip[1] = BB
user_ip[2] = CC
user_ip[3] = DD | +| | net_mask | 8 | uint8_t[4] | Device IPV4 netmask
Example: AA.BB.CC.DD
user_netmask[0] = AA
user_netmask[1] = BB
user_netmask[2] = CC
user_netmask[3] = DD
**Supported devices:**
Livox Hub/08.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+ | +| |gw | 12 | uint8_t[4] | Device IPV4 gateway
Example: AA.BB.CC.DD
user_gw[0] = AA
user_gw[1] = BB
user_gw[2] = CC
user_gw[3] = DD
**Supported devices:**
Livox Hub/08.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+ | + +### 0x0A Reboot Device +**Supported devices/firmware version:**
Livox Hub/08.07.0000+
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|---------|---------------|-----------|-----------------------| +| data | cmd_set | 0 | uint8_t | General Command: 0x00 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | timeout | 2 | uint16_t | Reboot device delay time | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|----------|---------------|------------|---------------------| +| data | cmd_set | 0 | uint8_t | General Command: 0x00 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | + ## 4.2 LiDAR CMD Set @@ -521,6 +677,8 @@ response | | z | 23 | int32_t | Z Translation, Unit: mm | ### 0x03 Turn On/Off Rain/Fog Suppression +**Supported devices:**
Mid-40 + request | CMD | Name | Offset (byte) | Data Type | Description | @@ -537,6 +695,142 @@ response | | cmd_id | 1 | uint8_t | Command ID: 0x03 | | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +### 0x04 Set Turn On/Off Fan +**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x04 | +| | state | 2 | uint8_t | Turn On/Off Fan:
0x00: Turn Off
0x01: Turn On | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +| ---- | -------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x04 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail
This configuration is saved in Flash | + +### 0x05 Get Turn On/Off Fan State +**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x05 | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|-------|----------|---------------|-----------|---------------------------------------| +| data  | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x05 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | state | 3 | uint8_t | Turn On/Off Fan State:
0x00: Turn Off
0x01: Turn On | + +### 0x06 Set LiDAR Return Mode +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x06 | +| | mode | 2 | uint8_t | Return Mode:
0x00: Single Return First
0x01: Single Return Strongest
0x02: Dual Return| + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +| ---- | -------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x06 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail
This configuration is saved in Flash | + +### 0x07 Get LiDAR Return Mode +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x07 | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|-------|----------|---------------|-----------|---------------------------------------| +| data  | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x07 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | mode | 3 | uint8_t | Return Mode:
0x00: Single Return First
0x01: Single Return Strongest
0x02: Dual Return| + +### 0x08 Set IMU Data Push Frequency {#imu_freq} +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x08 | +| | frequency | 2 | uint8_t | IMU Data Push Frequency:
0x00: 0Hz(Close IMU push)
0x01: 200Hz | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +| ---- | -------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x08 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail
This configuration is saved in Flash. | + +### 0x09 Get IMU Data Push Frequency +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x09 | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|-------|----------|---------------|-----------|---------------------------------------| +| data  | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x09 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | frequency | 3 | uint8_t | IMU Data Push Frequency:
0x00: 0Hz(Close IMU Data Push)
0x01: 200Hz | + +### 0x0A Update UTC synchronize time {#utc_cmd} +**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | year | 2 | uint8_t | UTC Year:
0 is 2000 year
255 is 2555 year | +| | month | 3 | uint8_t | UTC Month: Range is 1-12 | +| | day | 4 | uint8_t | UTC Day: Range is 1-31 | +| | hour | 5 | uint8_t | UTC Hour: Range is 0-23| +| | microsecond | 6 | uint32_t | 1 Hour Microsecond Offset | +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|-------|----------|---------------|-----------|---------------------------------------| +| data  | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | + ## 4.3 Hub CMD SET ### 0x00 Query Connected LiDAR Device request @@ -744,6 +1038,8 @@ response ### 0x07 Turn On/Off LiDAR Rain/Fog Suppression +**Supported devices:**
Mid-40 + request | CMD | Name | Offset (byte) | Data Type | Description | @@ -753,8 +1049,7 @@ request | | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | | | config_list | 3 | -- | LiDAR Feature Configuration List | -In ‘config_list’, each LiDAR feature configuration information has the following -format: +In ‘config_list’, each LiDAR feature configuration information has the following format: | Field | Offset (byte) | Data Type | Description | |----------------|---------------|-------------|------------------------| @@ -775,9 +1070,10 @@ In ‘return_list’, each return information has the following format: | Field | Offset (byte) | Data Type | Description | |----------------|---------------|-------------|---------------------------------------------| -| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail | +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | | broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | + ### 0x08 Query Hub Slot Power Status request @@ -794,4 +1090,229 @@ response | data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | | | cmd_id | 1 | uint8_t | Command ID: 0x08 | | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | -| | slot_power_state | 3 | uint16_t | Slot Power Status:
0x00: Turn Off
0x01: Turn On
bit0: First Slot
bit1: Second Slot
...
bit8: Ninth Slot | \ No newline at end of file +| | slot_power_state | 3 | uint16_t | Slot Power Status:
0x00: Turn Off
0x01: Turn On
bit0: First Slot
bit1: Second Slot
...
bit8: Ninth Slot | + +### 0x09 Set LiDAR Turn On/Off Fan + +**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x09 | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR Fan Configuration List | + +In ‘config_list’, each LiDAR fan configuration information has the following +format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | +| state | 1 | uint8_t | Turn On/Off Fan:
0: Turn Off
1: Turn On | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x09 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|---------------------------------------------| +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | + +**NOTE:** *This cmd data is saved to LiDAR's flash, and power down is not lost.* + +### 0x0A Get LiDAR Turn On/Off Fan State + +**Supported devices:**
Mid-40/03.07.0000+
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR Fan Configuration List | + +In ‘config_list’, each LiDAR fan configuration information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0A | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|---------------------------------------------| +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | +| state | 17 | uint8_t | Turn On/Off Fan State:
0: Turn Off
1: Turn On | + +### 0x0B Set LiDAR Return Mode + +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0B | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR Return Mode Configuration List | + +In ‘config_list’, each LiDAR return mode configuration information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | +| mode | 1 | uint8_t | Return Mode:
0x00: Single Return First
0x01: Single Return Strongest
0x02: Dual Return| + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0B | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +| -------------- | ------------- | ----------- | ------------------------------------------------------------ | +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code
This configuration is saved in Flash | + +### 0x0C Get LiDAR Return Mode + +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0C | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR Return Mode Configuration List | + +In ‘config_list’, each LiDAR return mode configuration information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0C | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|---------------------------------------------| +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | +| mode | 17 | uint8_t | Return Mode:
0x00: Single Return First
0x01: Single Return Strongest
0x02: Dual Return | + +### 0x0D Set LiDAR IMU Data Push Frequency + +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0D | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR IMU Frequency Configuration List | + +In ‘config_list’, each LiDAR IMU Frequency configuration information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | +| frequency | 1 | uint8_t | IMU Data Push Frequency:
0x00: 0Hz(Close IMU Data Push)
0x01: 200Hz | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0D | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +| -------------- | ------------- | ----------- | ------------------------------------------------------------ | +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code
This configuration is saved in Flash | + +### 0x0E Get LiDAR IMU Data Push Frequency + +**Supported devices:**
Horizon/06.04.0000+
Tele-15/07.03.0000+
+ +request + +| CMD | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x0C | +| | count | 2 | uint8_t | Number of LiDAR to Configure Range: 1 ~ 27 | +| | config_list | 3 | -- | LiDAR IMU Frequency Configuration List | + +In ‘config_list’, each LiDAR IMU frequency configuration information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|------------------------| +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +|------|-------------|---------------|-----------|---------------------------------------| +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x07 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Set Range: 1 ~ 27 | +| | return_list | 4 | -- | Return Information List | + +In ‘return_list’, each return information has the following format: + +| Field | Offset (byte) | Data Type | Description | +|----------------|---------------|-------------|---------------------------------------------| +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail
0x02: Device not support | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | +| frequency | 17 | uint8_t | IMU Data Push Frequency:
0x00: 0Hz(Close IMU Data Push)
0x01: 200Hz | \ No newline at end of file diff --git a/images/RS485_sequence_digram.png b/images/RS485_sequence_digram.png index 6602a6ae12ee1a6b9d9ed56bd18adcf5d0bf7eda..3c7066957a73dd0964aba2221330f75cdaeb5bf6 100644 GIT binary patch literal 9523 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%0DZ; z7e6{%s;3;{I2Ov7O7`xqIEx0>Ed|8`;WKb05W3J$Dlj&KkwqW7$e|9h0AlR)r&dsb zaRV^IT4p=;y1NX}YvVRhdnxI@o6P$w`}UucP?7STcqDxf>Y){&^vpf+pvLg7n4g|H z?(RS~R)|^xXtc9sBNC)y4w)Kh<83VGr|46;cR~dSDo*l&b3M9l#0X&I@4UTEA)ACN zdHdO+C+KQ($p8^;kZewaap@=}bI-CaMIJ?WR>v4=flU(23N67VD6K({eayWBNOt^) zv(ZTnC*CVNK&t_FKB;Tby}U9x^^*PQZ$UO}B{O$c{z7pwQV*`JHL`!&6KE$aMj9@) z0zBE4I!C4XNjnwN&N`FpEDxr*->f&o^B8729oL4vKJZGQWcX%lGA~`HfHLv3W1;@% z;GXMv^}?vI-;XXZ zV0UZ)j}PdZYHxUK;jpDzaj?ajGjNcDB!+TpkIU$dJOquPyE~AiEDrK}VabVSPaFZm zuT1BtkNm%aCS9!L<6dTkpqz=~NA%5I&hb{&mlgk=u*3NWMa z^5ceO-3pUunMxMFEfOp~ioiN}6yDRh=9(!yd_g**ewEbTV8T9?!ts zEwv-_;Jp*>h@O=(;g%yZ04?YZ{ntOl;-&%H$ z-}0oAHCd+@--@NEK@Axo7oOekwWv-2zxn%vCpD$H2-UC6p!*ev($<=*4#gs;$@bf{ zAjo;6bVux5cV`{EbiX&+--i30stV*Y2J+nGr%&gX&ra{`Ql~7w8rwr~heOcib<%g& z)EmI7(tQ};<+^X#*P;KlhWdZ0S@=KGQ86uH6GQJO<6RquN{b7ZtjC$NDV~ zTJhV76DL;f8|%omn<=$8Ii~Dxy4T~qIeSu2T#RsHZ~ nPv>n8~l+HFj(AB#S=hK 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 H26z82x0F=_ diff --git a/images/sequence_diagram_Hub.png b/images/sequence_diagram_Hub.png new file mode 100644 index 0000000000000000000000000000000000000000..977e9d90f489985015f646ef3cf47a6c833254cf GIT binary patch literal 21249 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 A>;M1& literal 0 HcmV?d00001 diff --git a/images/sequence_diagram_Lidar.png b/images/sequence_diagram_Lidar.png new file mode 100644 index 0000000000000000000000000000000000000000..937158699b181f6d29e2dfdb268c6c1655504cfa GIT binary patch literal 16439 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 NeCo{aMf#T_{s(~IWxxOc literal 0 HcmV?d00001