From 0cc67d5dce69ef6ce928badd4a799359ab7ea9e0 Mon Sep 17 00:00:00 2001 From: Livox-SDK Date: Fri, 26 Jul 2019 16:04:19 +0800 Subject: [PATCH] feature:add timestamp sync doc --- Livox-SDK-Communication-Protocol.md | 138 ++++++++++++---------- Timestamp-Synchronization.md | 171 ++++++++++++++++++++++++++++ images/gps_485.png | Bin 0 -> 8041 bytes images/gps_485_1.png | Bin 0 -> 8453 bytes images/gps_ttl.png | Bin 0 -> 9895 bytes images/gps_ttl_1.png | Bin 0 -> 4633 bytes 6 files changed, 251 insertions(+), 58 deletions(-) create mode 100644 Timestamp-Synchronization.md create mode 100644 images/gps_485.png create mode 100644 images/gps_485_1.png create mode 100644 images/gps_ttl.png create mode 100644 images/gps_ttl_1.png diff --git a/Livox-SDK-Communication-Protocol.md b/Livox-SDK-Communication-Protocol.md index 3667c88..3f02cd9 100644 --- a/Livox-SDK-Communication-Protocol.md +++ b/Livox-SDK-Communication-Protocol.md @@ -1,12 +1,15 @@ -**Livox SDK Communication Protocol** +**Livox SDK Communication Protocol** -| **Document Release History** | | | -| ---------------------------- | ----------- | --------------------------------- | -| **Date** | **Release** | **Change Description** | -| 2019/4/17 | v1.0.3 | Update Hub read LiDAR extrinsic parameters description | -| 2019/3/25 | v1.0.2 | Update 3.2 Time Stamp description | -| 2019/2/25 | v1.0.1 | Update 3.2 Time Stamp description | -| 2019/1/16 | v1.0.0 | Initial release | +| **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/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 | +| 2019/3/25 | v1.0.2 | Update 3.2 Time Stamp description | +| 2019/2/25 | v1.0.1 | Update 3.2 Time Stamp description | +| 2019/1/16 | v1.0.0 | Initial release | # 1 Summary @@ -50,7 +53,7 @@ follows: | seq_num | 5 | 2 | Frame Sequence Number | | crc_16 | 7 | 2 | Frame Header Checksum | | data | 9 | n | Payload Data | -| crc_32 | 9+n | 2 | Whole Frame Checksum | +| crc_32 | 9+n | 4 | Whole Frame Checksum | Command type description: > - **CMD (request)**: Actively send data request - need to return a corresponding ACK; @@ -85,7 +88,7 @@ There are three kinds of CMD sets: > - **Hub Command Set**: Only Livox Hub supports Hub Command Set. | CMD Set | CMD ID | Function | -|--------------------------|--------|-----------------------------------------------------| +| ------------------------ | ------ | --------------------------------------------------- | | 0x00 General Command Set | 0x00 | Broadcast Message | | | 0x01 | Handshake | | | 0x02 | Query Device Information | @@ -108,6 +111,7 @@ There are three kinds of CMD sets: | | 0x05 | Query LiDAR Device Status | | | 0x06 | Turn On/Off Hub Calculation of Extrinsic Parameters | | | 0x07 | Turn On/Off LiDAR Rain/Fog Suppression | +| | 0x08 | Query Hub Slot Power Status | ## 2.3 SDK Connection @@ -243,7 +247,7 @@ Spherical coordinate format: | reflectivity | 8 | uin8_t | Reflectivity | ## 3.4 Status Code -### 3.4.1 LiDARStatus Code +### 3.4.1 LiDAR Status Code LiDAR status_code consists of 32 bits, which has the following meanings: @@ -251,13 +255,13 @@ LiDAR status_code consists of 32 bits, which has the following meanings: |----------|-----------------|----------------------------------------------------------| | 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 Abnormal State, Unable to Work | +| 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:
Temperature becomes High or Low;
Voltage becomes High;
Optical system is Dirty or Blocked;
2: Error
Causes the LiDAR to Shut Down and Enter the Error State
Any of the following situations will trigger error:
Temperature becomes Extremely High or Extremely Low;
Voltage becomes Extremely High;
Motor is Abnormal;
Firmware is Abnormal; | +| 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; | ### 3.4.2 Hub Status Code @@ -271,7 +275,7 @@ Hub Status Code consists of 32 bits, which has the following meanings: | 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:
Temperature becomes High or Low;
2: Error
Any of the following situations will trigger error:
Temperature becomes Extremely High or Extremely Low;
LiDAR State is Abnormal;
Firmware is Abnormal; | +| 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 @@ -345,18 +349,18 @@ response | | cmd_id | 1 | uint8_t | Command ID: 0x03 | | | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | | | work_state | 3 | uint8_t | LiDAR State:
0x00: Initializing
0x01: Normal
0x02: Power-Saving
0x03: Standby
0x04: Error
Hub State:
0x00: Initializing
0x01: Normal
0x04: Error | -| | feature_msg | 4 | uint8_t | LiDAR Feature Message:
Bit0: Rain/Fog Suppression Switch
0x00: Turn Off 0x01: Turn On
Bit1 ~ Bit7: Reserved
**Hub is Reserved** | +| | feature_msg | 4 | uint8_t | LiDAR Feature Message:
Bit0: Rain/Fog Suppression Switch
0x00: Turn Off
0x01: Turn On
Bit1 ~ Bit7: Reserved
**Hub is Reserved** | | | ack_msg | 5 | uint32_t | ACK Message:
Related to ‘work_state’:
work_state is 0x00: Initialization Progress
work_state is other: Status Code | ### 0x04 Start/Stop Sampling request -| CMD | Name | Offset (byte) | Data Type | Description | -|------|-------------|---------------|-----------|------------------------------------------| -| data | cmd_set | 0 | uint8_t | General Command: 0x00 | -| | cmd_id | 1 | uint8_t | Command ID: 0x04 | -| | sample_ctrl | 2 | uint8_t | 0x00: Start Sampling
0x01: Stop Sampling | +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ----------- | ------------- | --------- | -------------------------------------------- | +| data | cmd_set | 0 | uint8_t | General Command: 0x00 | +| | cmd_id | 1 | uint8_t | Command ID: 0x04 | +| | sample_ctrl | 2 | uint8_t | 0x00: Stop Sampling
0x01: Start Sampling | response @@ -450,7 +454,7 @@ response | | cmd_id | 1 | uint8_t | Command ID: 0x09 | | | 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 | +| | 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 | ## 4.2 LiDAR CMD Set @@ -458,11 +462,11 @@ response request -| CMD | Name | Offset (byte) | Data Type | Description | -|------|------------|---------------|-----------|---------------------| -| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | -| | cmd_id | 1 | uint8_t | Command ID: 0x00 | -| | LiDAR_mode | 2 | uint8_t | LiDAR Mode:
User can configure as follow:
0x01: Normal Mode
0x02: Power-Saving Mode
0x03: Standby Mode | +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ---------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x00 | +| | LiDAR_mode | 2 | uint8_t | LiDAR Mode:
User can configure as follow:
0x01: Normal Mode
0x02: Power-Saving Mode
0x03: Standby Mode | response @@ -519,11 +523,11 @@ response ### 0x03 Turn On/Off Rain/Fog Suppression request -| CMD | Name | Offset (byte) | Data Type | Description | -|------|---------|---------------|-----------|----------------------------------------------------------------| -| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | -| | cmd_id | 1 | uint8_t | Command ID: 0x03 | -| | state | 2 | uint8_t | Turn On/Off Rain/Fog Suppression:
0x00: Turn Off
0x01: Turn On | +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ------------------------------------------------------------ | +| data | cmd_set | 0 | uint8_t | LiDAR Command: 0x01 | +| | cmd_id | 1 | uint8_t | Command ID: 0x03 | +| | state | 2 | uint8_t | Turn On/Off Rain/Fog Suppression:
0x00: Turn Off
0x01: Turn On | response @@ -554,13 +558,13 @@ response In ‘info_list’, each LiDAR device information has the following format: -| Field | Offset (byte) | Data Type | Description | -|----------------|---------------|-------------|-----------------------------------------------------| -| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | -| dev_type | 16 | uint8_t | Device Type:
1: Mid-40
2: Tele-15
3: Horizon | +| Field | Offset (byte) | Data Type | Description | +| -------------- | ------------- | ----------- | ------------------------------------------------------------ | +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | +| dev_type | 16 | uint8_t | Device Type:
1: Mid-40
2: Tele-15
3: Horizon | | version | 17 | uint8_t[4] | LiDAR Firmware Version
Example: AA.BB.CC.DD
version[0] = AA
version[1] = BB
version[2] = CC
version[3] = DD | -| slot_id | 21 | uin8_t | Slot Used to Install LiDAR | -| LiDAR_id | 22 | uint8_t | LiDAR ID:
1: Mid-100 Left / Mid-40 / Tele-15 / Horizon
2: Mid-100 Middle
3: Mid-100 Right | +| slot_id | 21 | uin8_t | Slot Used to Install LiDAR | +| LiDAR_id | 22 | uint8_t | LiDAR ID:
1: Mid-100 Left / Mid-40 / Tele-15 / Horizon
2: Mid-100 Middle
3: Mid-100 Right | ### 0x01 Set LiDAR Mode @@ -575,10 +579,10 @@ request In ‘config_list’, each LiDAR mode configuration has the following format: -| Field | Offset (byte) | Data Type | Description | -|----------------|---------------|-------------|------------------------------------| -| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | -| LiDAR_mode | 16 | uint8_t | LiDAR Mode:
User can configure as follows:
0x01: Normal Mode
0x02: Power-Saving Mode
0x03: Standby Mode | +| Field | Offset (byte) | Data Type | Description | +| -------------- | ------------- | ----------- | ------------------------------------------------------------ | +| broadcast_code | 0 | uint8_t[16] | LiDAR Broadcast Code | +| LiDAR_mode | 16 | uint8_t | LiDAR Mode:
User can configure as follows:
0x01: Normal Mode
0x02: Power-Saving Mode
0x03: Standby Mode | response @@ -601,12 +605,12 @@ In ‘return_list’, each return information has the following format: request -| CMD | Name | Offset (byte) | Data Type | Description | -|------|------------|---------------|-----------|-----------------------------------------------------------| -| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | -| | cmd_id | 1 | uint8_t | Command ID: 0x02 | -| | slot_id | 2 | uint8_t | Slot id of Hub Range: 1 ~ 9 | -| | power_ctrl | 3 | uint8_t | Power Control (Default 0x00)
0x00: Turn Off
0x01: Turn On | +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ---------- | ------------- | --------- | --------------------------------------------------- | +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x02 | +| | slot_id | 2 | uint8_t | Slot id of Hub Range: 1 ~ 9 | +| | power_ctrl | 3 | uint8_t | Power Control:
0x00: Turn Off
0x01: Turn On | response @@ -641,20 +645,20 @@ In ‘param_list’, each LiDAR parameter configuration has the following format response -| ACK | Name | Offset (byte) | Data Type | Description | -|------|-------------|---------------|-----------|-----------------------------------------| -| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | -| | cmd_id | 1 | uint8_t | Command ID: 0x03 | -| | ret_code | 2 | uint8_t | Return Code: 0x00: Success 0x01: Fail | -| | count | 3 | uint8_t | Number of LiDAR to Write Range: 1 ~ 27 | -| | return_list | 4 | -- | Return Information List | +| ACK | Name | Offset (byte) | Data Type | Description | +| ---- | ----------- | ------------- | --------- | --------------------------------------------- | +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x03 | +| | ret_code | 2 | uint8_t | Return Code:
0x00: Success
0x01: Fail | +| | count | 3 | uint8_t | Number of LiDAR to Write 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 | -| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | +| Field | Offset (byte) | Data Type | Description | +| -------------- | ------------- | ----------- | -------------------------------------------------- | +| ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail | +| broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | ### 0x04 Read LiDAR Extrinsic Parameters @@ -773,3 +777,21 @@ In ‘return_list’, each return information has the following format: |----------------|---------------|-------------|---------------------------------------------| | ret_code | 0 | uint8_t | LiDAR Return Code:
0x00: Success
0x01: Fail | | broadcast_code | 1 | uint8_t[16] | LiDAR Broadcast Code | + +### 0x08 Query Hub Slot Power Status + +request + +| CMD | Name | Offset (byte) | Data Type | Description | +| ---- | ------- | ------------- | --------- | ----------------- | +| data | cmd_set | 0 | uint8_t | Hub Command: 0x02 | +| | cmd_id | 1 | uint8_t | Command ID: 0x08 | + +response + +| ACK | Name | Offset (byte) | Data Type | Description | +| ---- | ---------------- | ------------- | --------- | ------------------------------------------------------------ | +| 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 diff --git a/Timestamp-Synchronization.md b/Timestamp-Synchronization.md new file mode 100644 index 0000000..7437356 --- /dev/null +++ b/Timestamp-Synchronization.md @@ -0,0 +1,171 @@ + + +**Livox LiDAR Timestamp Synchronization** + +| **Document Release History** | | | +| ------------------------------ | ----------- | ---------------------- | +| **Date** | **Release** | **Change Description** | +| 2019/6/19 | v1.0.0 | Initial release | +| | | | + + +# 1 Summary + +| **Device** | **Supported Time Synchronization Method** | +| ----------- | ------------------------------------------- | +| Livox LiDAR | 1. PTP v2
2. Pulse Per Second (PPS) | +| Livox Hub | 1. PTP v2
2. GPS | + +## 1.1 Application Scenarios + +### PTP v2: + +In the absence of GPS and PPS signals, PTP v2 can be used to synchronize time between Livox LiDAR/Hub and other devices. This method requires minimal external hardware environment and only requires a master clock supporting device in the whole network. + +### PPS: + +Livox LiDAR supports PPS time synchronization. PPS signal usually comes from GPS receiver. PPS signal generated by other devices such as MCU is also suitable. + +### GPS: + +Livox Hub supports GPS time synchronization, which is recommended when integrating multiple LiDAR units via Livox Hub. Livox Hub needs the PPS and the time signal in GPRMC format from GPS receiver. + +# 2 Usage + +## 2.1 PTP v2 + +When Livox LiDAR or Livox Hub is connected to a network with master clock, the clock of each LiDAR point cloud is automatically synchronized to the master clock. When PTP, PPS or GPS are available at the same time, PTP network synchronization is preferred. + +### Connection: + +Connect Livox LiDAR/Hub normally without additional wiring. + +### Attention: + +Network environments with multiple master clocks are not supported. For the construction of master clock, please refer to Appendix [3.1 Set Up PTP Master Clock](#3.1). + +### Accuracy: + +Hundreds of nanoseconds + +## 2.2 PPS + +Every time the LiDAR receives the rising edge of a pulse, the timestamp of point cloud will be reset to 0, and then the time will increase until the rising edge of the next pulse is received. We can use this feature to update the timestamp in each point cloud packet to the external GPS time. + +Here is the pseudocode to achieve this synchronization: + +```c +// GPS Time Synchronization +static uint64_t LiDAR_time_last; +static uint64_t LiDAR_time_real; + +// 1. Read total second of the UTC time, Unit is second. +uint32_t gps_time_s = get_gps_utc_second(); +// 2. Read LiDAR point time, Unit is nanosecond. +uint64_t LiDAR_time = get_LiDAR_pack_time(); +// 3. Update real time. +if (LiDAR_time < LiDAR_time_last) +{ + //LiDAR time jump indicates the generation of GPS pulse. + LiDAR_time_real = gps_time_s*(1e9) + LiDAR_time%(1000000000); +} +else +{ + LiDAR_time_real += LiDAR_time - LiDAR_time_last; +} +//Update history +LiDAR_time_last = LiDAR_time; +``` + +### Connection: + +GPS uses 485 level: + +![](images/gps_485.png) + +GPS uses TTL level: + +![](images/gps_ttl.png) + +### Attention: + +When the GPS signal is weak or missing, the GPS module will not be able to generate TTL pulses. When this happens, it cannot correct the timestamp of point cloud. + +### Accuracy: + +1 microsecond + +## 2.3 GPS + +Connect the PPS signal and timestamp signal from GPS receiver to the Livox Hub's synchronization interface. + +### Connection: + +GPS uses 485 level: + +![](images/gps_485_1.png) + +GPS uses TTL level: + +![](images/gps_ttl_1.png) + +### Attention: + +Make sure that the "Time signal" in the above figure is GPRMC message. + +### Accuracy: + +1 microsecond + +# 3 Appendix + +## 3.1 Set Up PTP Master Clock + +Address: [https://github.com/ptpd/ptpd](https://github.com/ptpd/ptpd) + +Download, compile and install: + +```bash +git clone https://github.com/ptpd/ptpd.git +autoreconf -vi +./configure +make +make install +``` + +Modify the configuration file client-e2e-socket.conf in the test folder according to your needs. You can use the following configuration: + +Add a network interface name, such as eth0: + +``` +; Network interface to use (required) +ptpengine:interface = eth0 +``` + +Set the master clock function and set the parameters to masteronly: + +``` +; Options: none slaveonly masteronly masterslave +ptpengine:preset = masteronly +``` + +Set clock_class to a value lower than 128: + +``` +; Clock class - announced in master state. Always 255 for slave-only mode. +; Minimum, maximum and default values are controlled by presets. +; If set to 13 (application specific time source), announced +; time scale is always set to ARB. This setting controls the +; states a PTP port can be in. If below 128, port will only +; be in MASTER or PASSIVE states (master only). If above 127, +; port will be in MASTER or SLAVE states. +ptpengine:clock_class = 126 +``` + +Then run the following command: + +```bash +ptpd2 -c test/client-e2e-socket.conf +``` + +When a sync packet appears on the network, it indicates that the master clock of ptpd is successfully turned on. \ No newline at end of file diff --git a/images/gps_485.png b/images/gps_485.png new file mode 100644 index 0000000000000000000000000000000000000000..71adf1dfb2a61665596bdac5db0602e69ece051b GIT binary patch literal 8041 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 literal 0 HcmV?d00001 diff --git a/images/gps_ttl_1.png b/images/gps_ttl_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7469c8f4fa44724dc07e94b120e3c1eb77858703 GIT binary patch literal 4633 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