Multi-Sensor Synchronization

Open in Claude

Phase Lock

Phase locking forces the sensor to cross a specific azimuth angle at a fixed fraction of each second—at the top (any mode), 1/10 s (1024x10 Hz), or 1/20 s (1024x20 Hz). The control loop runs at 1000 Hz. Phase locking synchronizes sensors with cameras, radar, and other lidars.

Before enabling phase lock, time-synchronize the sensor from an external source and set timestamp_mode to either TIME_FROM_PTP_1588 or TIME_FROM_SYNC_PULSE_IN.

Phase Locking Reference Frame

Phase lock offsets are specified in millidegrees in the Lidar Coordinate Frame. Angles increment counterclockwise when viewed from above:

  • 0° towards the external connector
  • 90° a quarter turn counterclockwise from the connector
  • 180° opposite the connector
  • 270° three quarter turns counterclockwise from the connector

Lidar coordinate frame Top-Down view

Phase Locking Commands

  • Enable or disable phase lock (default: false):
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_enable:=false"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  • Set the phase lock offset angle (default: 0; valid range: 0360000 millidegrees):
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=180000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx

Multi-sensor Example

This example phase-locks three sensors on a vehicle so all point forward simultaneously. Each sensor’s connector faces a different direction.

Van with 3 Sensors mounted

With all three sensors time-synchronized via an external source, use the following commands to align them forward simultaneously.

  • Set Sensor 1 to phase lock at 180°:
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=180000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  • Set Sensor 2 to phase lock at 90°:
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=90000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  • Set Sensor 3 to phase lock at 270°:
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=270000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx

Accuracy

Expected phase lock angular accuracy under normal operating conditions:

Product line10 Hz20 Hz
OS0 and OS1 (Gen 1 and Gen 2)0.5°0.5°
OS210°

Phase Locking Alerts

The following alerts indicate phase locking errors. For a complete list, see alerts-and-errors in the Appendix.

IDCategoryLevelDescription
0x01000050MOTOR_CONTROLWARNINGThe phase lock offset error has exceeded the threshold.
0x01000051MOTOR_CONTROLERRORThe phase lock control failed to achieve a lock multiple times; contact Ouster support.
0x01000024STARTUPERRORThe phase lock control failed to achieve a lock during startup.

Note: For information on how to mitigate crosstalk between different Ouster lidars in the same system refer to crosstalk-mitigation section of this manual.

Inter-sensor Interference Mitigation

Crosstalk occurs when two nearby sensors detect each other’s laser pulses as valid returns. Mitigate it with two steps:

  1. Phase lock the two sensors
  2. Set azimuth window on each sensor so that they don’t send data when they are pointing at each other

Two Sensor Example

This example mitigates crosstalk between two sensors mounted on a vehicle, both with connectors facing the rear.

Example: Inter-sensor crosstalk mitigation between 2 sensors

A physical barrier between sensors is the most effective crosstalk mitigation and should be the first option considered. Where a barrier is impractical, use phase locking to eliminate the problem. Crosstalk only occurs when one sensor’s laser enters another sensor’s window. Phase locking forces both sensors to face each other at the same time, so crosstalk coincides with a period when neither sensor is collecting useful data.

  1. Time-synchronize both sensors via an external source. See the Time Synchronization page for GPS or PTP options.

  2. Phase-lock both sensors so they face each other simultaneously. In this example, Sensor 1 locks at 90° while Sensor 2 locks at 270°.

Note: In the examples below, to distinguish between the command and expected response, a dash has been added before the expected response. The actual response will be without the dash.

Example: Set Sensor 1 to phase lock at 90°:

  • Step 1: Set “phase_lock_enable” to true
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_enable:=true"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  • Step 2: Set “phase_lock_offset” to 90000
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=90000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx

Example: Set Sensor 2 to phase lock at 270°:

  • Step 1: Set “phase_lock_enable” to true
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_enable:=true"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  • Step 2: Set “phase_lock_offset” to 270000
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4Content-Type: application/json
5
6"phase_lock_offset:=270000"
HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 04 Mar 2024 21:20:16 GMT
Server: nginx
  1. Configure the azimuth window for both sensors. The region of interest for Sensor 1 is θ1\theta_1 and for Sensor 2 is θ2\theta_2.

The calculation for θ1\theta_1 and θ2\theta_2 is:

θ1=θ2=360°2arctan ⁣(dl)\theta_1 = \theta_2 = 360° - 2 \cdot \arctan\!\left(\frac{d}{l}\right)

If the two sensors are placed 100 mm apart:

360°2arctan ⁣(81100)=360°78°=282°360° - 2 \cdot \arctan\!\left(\frac{81}{100}\right) = 360° - 78° = 282°

Set an azimuth window of 282° for each sensor to prevent data transmission in the 78° where they face each other. Sensor 1’s window is the 282° centered around 270°. Sensor 2’s window is the 282° centered around 90°.

Sensor 1’s azimuth window starts at 129° and follows the CCW direction to end at 51°:

Example cURL command:

$curl -i -X POST 192.0.2.123/api/v1/sensor/config -H 'content-type: application/json' --data '{"azimuth_window": [129000, 51000]}'

Example HTTP command:

$http POST 192.0.2.123/api/v1/sensor/config "azimuth_window:=[129000, 51000]"
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4
5"azimuth_window": [129000, 51000]
HTTP/1.1 204 No Content
Server: nginx
Date: Thu, 28 Apr 2022 18:09:49 GMT
Connection: keep-alive

Sensor 2’s azimuth window starts at 309° and follows the CCW direction to end at 231°:

Example cURL command:

$curl -i -X POST 192.0.2.123/api/v1/sensor/config -H 'content-type: application/json' --data '{"azimuth_window": [309000, 231000]}'

Example HTTP command:

$http POST 192.0.2.123/api/v1/sensor/config "azimuth_window:=[309000, 231000]"
1POST /api/v1/sensor/config HTTP/1.1
2Host: 192.0.2.123
3Accept: application/json
4
5"azimuth_window": [309000, 231000]
HTTP/1.1 204 No Content
Server: nginx
Date: Thu, 28 Apr 2022 18:09:49 GMT
Connection: keep-alive
Product LineAt WindowAt base including fins
OS0 and OS1 (Gen1 and Gen2)81 mm88 mm
OS2111 mm121 mm