HTTP API Reference Guide

This reference guide documents the interface for HTTP API and is accessible via /api/v1 on the sensor hosted HTTP server.

The sensor can be queried and configured using an HTTP GET requests. This can be done using several different tools such as HTTPie, cURL, Advanced REST Client, etc.

Here is an example using curl command:

$ curl --request GET --url http://192.0.2.123/api/v1/sensor/metadata/lidar_intrinsics

 {
   "lidar_to_sensor_transform": [-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 38.195, 0, 0, 0, 1]
 }

Sensor Metadata

GET /api/v1/sensor/metadata/sensor_info

To GET the sensor information.

http

GET /api/v1/sensor/metadata/sensor_info HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/sensor_info

httpie

http http://192.0.2.123/api/v1/sensor/metadata/sensor_info

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/sensor_info')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 285
Content-Type: application/json

{
    "build_date": "2023-1-15T15:56:07Z",
    "build_rev": "v3.0.0",
    "image_rev": "ousteros-image-prod-bootes-v3.0.0+0123456789",
    "initialization_id": 390072,
    "prod_line": "OS-1-128",
    "prod_pn": "860-105010-07",
    "prod_sn": "992244000006",
    "status": "RUNNING"
}

statuscode: 200 No error

Description: Returns JSON-formatted response that includes serial number, product number, FW image revision and sensor status along with other parameters as shown is provided.

GET /api/v1/sensor/metadata/lidar_data_format

To GET the sensor lidar data format.

http

GET /api/v1/sensor/metadata/lidar_data_format HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/lidar_data_format

httpie

http http://192.0.2.123/api/v1/sensor/metadata/lidar_data_format

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/lidar_data_format')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 724
Content-Type: application/json
Date: Thu, 28 Apr 2022 19:00:38 GMT
Server: nginx

{
 "column_window": [0, 1023],
 "columns_per_frame": 1024,
 "columns_per_packet": 16,
 "pixel_shift_by_row": [
   12, 4, -4, -12, 12, 4, -4,
  -12, 12, 4, -4, -12, 12, 4,
  -4, -12, 12, 4, -4, -12, 12,
   4, -4, -12, 12, 4, -4, -12,
   12, 4, -4, -12, 12, 4, -4,
  -12, 12, 4, -4, -12, 12, 4,
  -4, -12, 12, 4, -4, -12, 12,
   4, -4, -12, 12, 4, -4, -12,
   12, 4, -4, -12, 12, 4, -4,
  -12, 12, 4, -4, -12, 12, 4,
  -4, -12, 12, 4, -4, -12, 12,
   4, -4, -12, 12, 4, -4, -12,
   12, 4, -4, -12, 12, 4, -4,
  -12, 12, 4, -4, -12, 12, 4,
   4, -12, 12, 4, -4, -12, 12,
   4, -4, -12, 12, 4, -4, -12,
   12, 4, -4, -12, 12, 4, -4,
  -12, 12, 4, -4, -12, 12, 4,
  -4, -12],
 "pixels_per_column": 128,
 "udp_profile_imu": "LEGACY",
 "udp_profile_lidar": "RNG19_RFL8_SIG16_NIR16_DUAL"
}

statuscode: 200 No error

Description: Returns JSON-formatted response that describes the structure of a lidar packet.

  • columns_per_frame: Number of measurement columns per frame. This can be 512, 1024, or 2048, depending upon the set lidar mode.

  • columns_per_packet: Number of measurement blocks contained in a single lidar packet. Currently in v2.2.0 and earlier, this is 16. Note: This is not user configurable.

  • pixel_shift_by_row: Offset in terms of pixel count. Can be used to destagger image. Varies by lidar mode. Length of this array is equal to the number of channels of the sensor.

  • pixels_per_column: Number of channels of the sensor.

  • column_window: Index of measurement blocks that are active. Default is [0, lidar_mode-1], e.g. [0,1023]. If there is an azimuth window set, this parameter will reflect which measurement blocks of data are within the region of interest.

  • udp_profile_lidar: Lidar data profile format. Default single return profile (RNG19_RFL8_SIG16_NIR16).

  • udp_profile_imu: IMU data profile format. Default LEGACY.

Note

This command only works when the sensor is in RUNNING status.

GET /api/v1/sensor/metadata/beam_intrinsics

To GET the sensor beam intrinsics.

http

GET /api/v1/sensor/metadata/beam_intrinsics HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/beam_intrinsics

httpie

http http://192.0.2.123/api/v1/sensor/metadata/beam_intrinsics

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/beam_intrinsics')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 1895
Content-Type: application/json

{
    "beam_altitude_angles": [
        20.38, 20.12, 19.79, 19.45, 19.14, 18.85, 18.55, 18.2, 17.86, 17.58, 17.27, 16.93,
        16.58, 16.29, 15.98, 15.61, 15.27, 14.97, 14.66, 14.3, 13.96, 13.65, 13.33, 12.97,
        12.62, 12.31, 11.98, 11.63, 11.27, 10.96, 10.63, 10.26, 9.91, 9.59, 9.26, 8.89,
        8.54, 8.21, 7.87, 7.52, 7.15, 6.82, 6.47, 6.11, 5.76, 5.42, 5.08, 4.73, 4.36, 4.03,
        3.66, 3.31, 2.96, 2.62, 2.27, 1.91, 1.55, 1.22, 0.85, 0.51, 0.16, -0.2, -0.55, -0.91,
        -1.26, -1.62, -1.96, -2.3, -2.66, -3.02, -3.36, -3.72, -4.07, -4.42, -4.77, -5.11,
        -5.46, -5.82, -6.16, -6.49, -6.85, -7.21, -7.55, -7.88, -8.23, -8.59, -8.93, -9.25,
        -9.6, -9.96, -10.31, -10.63, -10.96, -11.32, -11.67, -11.97, -12.31, -12.68, -13,
        -13.32, -13.64, -14, -14.33, -14.63, -14.96, -15.31, -15.64, -15.94, -16.26,
        -16.62, -16.93, -17.22, -17.54, -17.9,  -18.22, -18.49, -18.8, -19.16, -19.47,
        -19.73, -20.04, -20.39, -20.7, -20.94, -21.25, -21.6, -21.9, -22.14
    ],
    "beam_azimuth_angles": [
        4.24, 1.41, -1.42, -4.23, 4.23, 1.41, -1.41, -4.23, 4.23, 1.41, -1.41, -4.21, 4.23,
        1.42, -1.4, -4.23, 4.24, 1.41, -1.4, -4.23, 4.24, 1.42, -1.4, -4.22, 4.23, 1.41,
        -1.41, -4.22, 4.23, 1.42, -1.4, -4.22, 4.24, 1.41, -1.4, -4.23, 4.23, 1.41, -1.41,
        -4.22, 4.23, 1.41, -1.41, -4.23, 4.23, 1.4, -1.42, -4.23, 4.23, 1.41, -1.42, -4.23,
        4.23, 1.4, -1.42, -4.24, 4.22, 1.41, -1.43, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22,
        1.4, -1.42, -4.23, 4.22, 1.4, -1.4, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22, 1.41,
        -1.41, -4.22, 4.22, 1.39, -1.42, -4.23, 4.22, 1.41, -1.41, -4.22, 4.23, 1.41,
        -1.41, -4.23, 4.23, 1.41, -1.41, -4.22, 4.23, 1.41, -1.41, -4.22, 4.22, 1.41,
        -1.41, -4.22, 4.23, 1.41, -1.4, -4.23, 4.22, 1.41, -1.41, -4.23, 4.22, 1.4, -1.41,
        -4.23, 4.22, 1.4, -1.41, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22, 1.4, -1.42, -4.23
    ],
    "beam_to_lidar_transform": [ 1, 0, 0, 15.805999755859375, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ],
    "lidar_origin_to_beam_origin_mm": 15.8059998
}

status code: 200 No error

Description: Returns JSON-formatted beam altitude and azimuth offsets, in degrees. Length of arrays is equal to the number of channels in the sensor. Also returns distance between lidar origin and beam origin in mm, to be used for point cloud calculations.

GET /api/v1/sensor/metadata/imu_intrinsics

To GET the sensor imu intrinsics

http

GET /api/v1/sensor/metadata/imu_intrinsics HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/imu_intrinsics

httpie

http http://192.0.2.123/api/v1/sensor/metadata/imu_intrinsics

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/imu_intrinsics')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 91
Content-Type: application/json

{
  "imu_to_sensor_transform": [1, 0, 0, 6.253, 0, 1, 0, -11.775, 0, 0, 1, 7.645, 0, 0, 0, 1]
}

status code: 200 No error

Description: Returns JSON-formatted IMU transformation matrix needed to transform to the Sensor Coordinate Frame.

GET /api/v1/sensor/metadata/lidar_intrinsics

To GET the sensor lidar intrinsics

http

GET /api/v1/sensor/metadata/lidar_intrinsics HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/lidar_intrinsics

httpie

http http://192.0.2.123/api/v1/sensor/metadata/lidar_intrinsics

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/lidar_intrinsics')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 86
Content-Type: application/json

{
  "lidar_to_sensor_transform": [-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 38.195, 0, 0, 0, 1]
}

status code: 200 No error

Description: Returns JSON-formatted lidar transformation matrix needed to transform to the Sensor Coordinate Frame.

GET /api/v1/sensor/metadata/calibration_status

To GET the sensor calibration status.

http

GET /api/v1/sensor/metadata/calibration_status HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata/calibration_status

httpie

http http://192.0.2.123/api/v1/sensor/metadata/calibration_status

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata/calibration_status')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 69
Content-Type: application/json

{
"reflectivity":
  {
    "timestamp": "2022-11-18T20:31:06",
    "valid": true
  }
}

status code: 200 No error

Description: Returns JSON formatted calibration status of the sensor reflectivity. valid: true/false depending on calibration status. timestamp: if valid is true; time at which the calibration was completed.

GET /api/v1/sensor/config

To GET sensor configuration parameter.

http

GET /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/config

httpie

http http://192.0.2.123/api/v1/sensor/config

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/config')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 715
Content-Type: application/json

{
    "azimuth_window": [
        0,
        360000
    ],
    "columns_per_packet": 16,
    "lidar_mode": "1024x10",
    "multipurpose_io_mode": "OFF",
    "nmea_baud_rate": "BAUD_9600",
    "nmea_ignore_valid_char": 0,
    "nmea_in_polarity": "ACTIVE_HIGH",
    "nmea_leap_seconds": 0,
    "operating_mode": "NORMAL",
    "phase_lock_enable": false,
    "phase_lock_offset": 0,
    "signal_multiplier": 1,
    "sync_pulse_in_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_angle": 360,
    "sync_pulse_out_frequency": 1,
    "sync_pulse_out_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_pulse_width": 10,
    "timestamp_mode": "TIME_FROM_INTERNAL_OSC",
    "udp_dest": "169.254.225.4",
    "udp_port_imu": 7503,
    "udp_port_lidar": 7502,
    "udp_profile_imu": "LEGACY",
    "udp_profile_lidar": "RNG19_RFL8_SIG16_NIR16_DUAL"
}

status code: 200 No error

Description: Please refer to Description- Configurable Parameters section for detailed description on sensor configurable parameters.

POST /api/v1/sensor/config

POST operation is atomic when specifying multiple configuration parameters. All of the specified sensor configuration parameters must be set successfully for the POST request to succeed, otherwise none of the specified sensor configuration parameters will be configured, and an error will be returned. Please refer to POST /api/v1/sensor/config – Multiple configuration parameters for examples.

Note

After POST api/v1/sensor/config request is received successfully, the sensor will reinitialize automatically to make the new configuration active and the config settings are persisted across power cycles.

Description

  • Currently the lidar_mode=1024x10, to change the lidar mode to “512X10”, use the command:

http POST 192.0.2.123/api/v1/sensor/config "parameter=value".

Note

To identify all parameters that can be changed using this command please refer to get_config_param.

Example CURL command:

curl -i -X POST 192.0.2.123/api/v1/sensor/config -H 'content-type: application/json' --data '{"lidar_mode": "512x10"}'

Example HTTP command:

http POST 192.0.2.123/api/v1/sensor/config "lidar_mode=512x10"

Example 1: Valid sensor configuration to change lidar_mode shown below:

http

POST /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123
Accept: application/json
Content-Type: application/json

"lidar_mode=512x10"

curl

curl -i -X POST http://192.0.2.123/api/v1/sensor/config -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '"lidar_mode=512x10"'

httpie

echo '"lidar_mode=512x10"' | http POST http://192.0.2.123/api/v1/sensor/config Accept:application/json Content-Type:application/json

python-requests

requests.post('http://192.0.2.123/api/v1/sensor/config', headers={
    'Accept': 'application/json',
    'Content-Type': 'application/json',
}, json='lidar_mode=512x10')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 00:37:41 GMT
Server: nginx

To verify, the user can run GET /api/v1/sensor/config after POST command:

{
    "azimuth_window": [
        0,
        360000
    ],
    "columns_per_packet": 16,
    "lidar_mode": "512x10",
    "multipurpose_io_mode": "OFF",
    "nmea_baud_rate": "BAUD_9600",
    "nmea_ignore_valid_char": 0,
    "nmea_in_polarity": "ACTIVE_HIGH",
    "nmea_leap_seconds": 0,
    "operating_mode": "NORMAL",
    "phase_lock_enable": false,
    "phase_lock_offset": 0,
    "signal_multiplier": 1,
    "sync_pulse_in_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_angle": 360,
    "sync_pulse_out_frequency": 1,
    "sync_pulse_out_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_pulse_width": 10,
    "timestamp_mode": "TIME_FROM_INTERNAL_OSC",
    "udp_dest": "169.254.225.4",
    "udp_port_imu": 7503,
    "udp_port_lidar": 7502,
    "udp_profile_imu": "LEGACY",
    "udp_profile_lidar": "RNG19_RFL8_SIG16_NIR16_DUAL"
}

status code: 204 server has successfully fulfilled the request.

Example 2: Invalid sensor configuration to change lidar_mode shown below:

  • Note: An incorrect value for a valid key i.e.., “lidar_mode” is given to show the error message that would be prompted. In this case Lidar_mode is set to 511x10.

http

POST /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123
Accept: application/json
Content-Type: application/json

"lidar_mode=511x10"

curl

curl -i -X POST http://192.0.2.123/api/v1/sensor/config -H 'Accept: application/json' -H 'Content-Type: application/json' --data-raw '"lidar_mode=511x10"'

httpie

echo '"lidar_mode=511x10"' | http POST http://192.0.2.123/api/v1/sensor/config Accept:application/json Content-Type:application/json

python-requests

requests.post('http://192.0.2.123/api/v1/sensor/config', headers={
    'Accept': 'application/json',
    'Content-Type': 'application/json',
}, json='lidar_mode=511x10')

response

HTTP/1.1 400 Bad Request
Connection: keep-alive
Content-Length: 102
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:51:07 GMT
Server: nginx

{
  "error": {
      "title": "While processing key 'lidar_mode' encountered error: '511x10' is not supported"
  }
}

status code: 400 Server cannot or will not process the request due to something that is perceived to be a client error.

POST /api/v1/sensor/config – Multiple configuration parameters

Example 1 (Valid)- Using HTTP

http

POST /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123

"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR8"

curl

curl -i -X POST http://192.0.2.123/api/v1/sensor/config --data-raw '"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR8"'

httpie

echo '"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR8"' | http POST http://192.0.2.123/api/v1/sensor/config

python-requests

requests.post('http://192.0.2.123/api/v1/sensor/config', data='"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR8"')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 00:37:41 GMT
Server: nginx

To verify, the user can run GET /api/v1/sensor/config after POST command:

{
    "azimuth_window": [
        0,
        360000
    ],
    "columns_per_packet": 16,
    "lidar_mode": "1024x10",
    "multipurpose_io_mode": "OFF",
    "nmea_baud_rate": "BAUD_9600",
    "nmea_ignore_valid_char": 0,
    "nmea_in_polarity": "ACTIVE_HIGH",
    "nmea_leap_seconds": 0,
    "operating_mode": "NORMAL",
    "phase_lock_enable": false,
    "phase_lock_offset": 0,
    "signal_multiplier": 1,
    "sync_pulse_in_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_angle": 360,
    "sync_pulse_out_frequency": 1,
    "sync_pulse_out_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_pulse_width": 10,
    "timestamp_mode": "TIME_FROM_INTERNAL_OSC",
    "udp_dest": "169.254.255.255",
    "udp_port_imu": 7503,
    "udp_port_lidar": 7502,
    "udp_profile_imu": "LEGACY",
    "udp_profile_lidar": "RNG15_RFL8_NIR8"
}

Example 2 (Invalid)- Using HTTP

  • Changing NIR Value from 8 bits to 10 bits i.e., invalid. Correct value is 8 bits.

http

POST /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123

"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR10"

curl

curl -i -X POST http://192.0.2.123/api/v1/sensor/config --data-raw '"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR10"'

httpie

echo '"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR10"' | http POST http://192.0.2.123/api/v1/sensor/config

python-requests

requests.post('http://192.0.2.123/api/v1/sensor/config', data='"lidar_mode=1024x10" "udp_profile_lidar=RNG15_RFL8_NIR10"')

response

HTTP/1.1 400 Bad Request
Connection: keep-alive
Content-Length: 119
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:56:40 GMT
Server: nginx

{
    "error": {
    "title": "While processing key 'udp_profile_lidar' encountered error: 'RNG15_RFL8_NIR10' is not
    supported"
    }
}

DELETE /api/v1/sensor/config

Example HTTP command:

http DELETE 192.0.2.123/api/v1/sensor/config

Example curl command:

curl -i -X DELETE http://192.0.2.123/api/v1/sensor/config -H 'Content-Type: application/json'

http

DELETE /api/v1/sensor/config HTTP/1.1
Host: 192.0.2.123

curl

curl -i -X DELETE http://192.0.2.123/api/v1/sensor/config

httpie

http DELETE http://192.0.2.123/api/v1/sensor/config

python-requests

requests.delete('http://192.0.2.123/api/v1/sensor/config')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Mon, 10 Jul 2023 17:12:47 GMT
Server: nginx

statuscode: 204 No Content

GET /api/v1/sensor/metadata

To GET the sensor metadata information.

http

GET /api/v1/sensor/metadata HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/metadata

httpie

http http://192.0.2.123/api/v1/sensor/metadata

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/metadata')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 4009
Content-Type: application/json

{
    "beam_intrinsics": {
        "beam_altitude_angles": [
            20.38, 20.12, 19.79, 19.45, 19.14, 18.85, 18.55, 18.2, 17.86, 17.58, 17.27, 16.93,
            16.58, 16.29, 15.98, 15.61, 15.27, 14.97, 14.66, 14.3, 13.96, 13.65, 13.33, 12.97,
            12.62, 12.31, 11.98, 11.63, 11.27, 10.96, 10.63, 10.26, 9.91, 9.59, 9.26, 8.89,
            8.54, 8.21, 7.87, 7.52, 7.15, 6.82, 6.47, 6.11, 5.76, 5.42, 5.08, 4.73, 4.36, 4.03,
            3.66, 3.31, 2.96, 2.62, 2.27, 1.91, 1.55, 1.22, 0.85, 0.51, 0.16, -0.2, -0.55, -0.91,
            -1.26, -1.62, -1.96, -2.3, -2.66, -3.02, -3.36, -3.72, -4.07, -4.42, -4.77, -5.11,
            -5.46, -5.82, -6.16, -6.49, -6.85, -7.21, -7.55, -7.88, -8.23, -8.59, -8.93, -9.25,
            -9.6, -9.96, -10.31, -10.63, -10.96, -11.32, -11.67, -11.97, -12.31, -12.68, -13,
            -13.32, -13.64, -14, -14.33, -14.63, -14.96, -15.31, -15.64, -15.94, -16.26,
            -16.62, -16.93, -17.22, -17.54, -17.9,  -18.22, -18.49, -18.8, -19.16, -19.47,
            -19.73, -20.04, -20.39, -20.7, -20.94, -21.25, -21.6, -21.9, -22.14
        ],
        "beam_azimuth_angles": [
            4.24, 1.41, -1.42, -4.23, 4.23, 1.41, -1.41, -4.23, 4.23, 1.41, -1.41, -4.21, 4.23,
            1.42, -1.4, -4.23, 4.24, 1.41, -1.4, -4.23, 4.24, 1.42, -1.4, -4.22, 4.23, 1.41,
            -1.41, -4.22, 4.23, 1.42, -1.4, -4.22, 4.24, 1.41, -1.4, -4.23, 4.23, 1.41, -1.41,
            -4.22, 4.23, 1.41, -1.41, -4.23, 4.23, 1.4, -1.42, -4.23, 4.23, 1.41, -1.42, -4.23,
            4.23, 1.4, -1.42, -4.24, 4.22, 1.41, -1.43, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22,
            1.4, -1.42, -4.23, 4.22, 1.4, -1.4, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22, 1.41,
            -1.41, -4.22, 4.22, 1.39, -1.42, -4.23, 4.22, 1.41, -1.41, -4.22, 4.23, 1.41,
            -1.41, -4.23, 4.23, 1.41, -1.41, -4.22, 4.23, 1.41, -1.41, -4.22, 4.22, 1.41,
            -1.41, -4.22, 4.23, 1.41, -1.4, -4.23, 4.22, 1.41, -1.41, -4.23, 4.22, 1.4, -1.41,
            -4.23, 4.22, 1.4, -1.41, -4.24, 4.22, 1.4, -1.42, -4.24, 4.22, 1.4, -1.42, -4.23
        ],
        "beam_to_lidar_transform": [ 1, 0, 0, 15.805999755859375, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ],
        "lidar_origin_to_beam_origin_mm": 15.8059998
    }
    "calibration_status": {
        "reflectivity": {
            "timestamp": "2022-11-18T20:31:06",
            "valid": true
        }
    },
    "config_params": {
    "azimuth_window": [
        0,
        360000
    ],
    "columns_per_packet": 16,
    "lidar_mode": "1024x10",
    "multipurpose_io_mode": "OFF",
    "nmea_baud_rate": "BAUD_9600",
    "nmea_ignore_valid_char": 0,
    "nmea_in_polarity": "ACTIVE_HIGH",
    "nmea_leap_seconds": 0,
    "operating_mode": "NORMAL",
    "phase_lock_enable": false,
    "phase_lock_offset": 0,
    "signal_multiplier": 1,
    "sync_pulse_in_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_angle": 360,
    "sync_pulse_out_frequency": 1,
    "sync_pulse_out_polarity": "ACTIVE_HIGH",
    "sync_pulse_out_pulse_width": 10,
    "timestamp_mode": "TIME_FROM_INTERNAL_OSC",
    "udp_dest": "169.254.225.4",
    "udp_port_imu": 7503,
    "udp_port_lidar": 7502,
    "udp_profile_imu": "LEGACY",
    "udp_profile_lidar": "RNG19_RFL8_SIG16_NIR16_DUAL"
},
    "imu_intrinsics": {
        "imu_to_sensor_transform": [
            1, 0, 0, 6.253, 0, 1, 0, -11.775, 0, 0, 1, 7.645, 0, 0, 0, 1
        ]
    },
    "lidar_data_format": {
        "column_window": [
            0,
            1023
        ],
        "columns_per_frame": 1024,
        "columns_per_packet": 16,
        "pixel_shift_by_row": [12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12, 12, 4, -4, -12, 12, 4, -4,
            -12, 12, 4, -4, -12, 12, 4, -4, -12, 12,
            4, -4, -12
        ],
        "pixels_per_column": 128,
        "udp_profile_imu": "LEGACY",
        "udp_profile_lidar": "RNG19_RFL8_SIG16_NIR16_DUAL"
    },

    "lidar_intrinsics": {
        "lidar_to_sensor_transform": [
            -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 38.195, 0, 0, 0, 1
        ]
    },
    "sensor_info": {
        "build_date": "2023-1-15T15:56:07Z",
        "build_rev": "v3.0.0",
        "image_rev": "ousteros-image-prod-bootes-v3.0.0+0123456789",
        "initialization_id": 390079,
        "prod_line": "OS-1-128",
        "prod_pn": "860-105010-07",
        "prod_sn": "992244000006",
        "status": "RUNNING"
    }
}

status code: 200 No error

User Editable Data

A user configurable data field is made available in firmware v2.5 and later.

This field can be used for a number of purposes such as storing specific information about the sensor, qualifying a sensor, calibration data, or any other information.

The User Editable Data comes with the ability to keep or delete it’s respective data based on the action of deleting the sensor config. That can be done by setting the value of the User Editable Data policy to either keep_on_config_delete or clear_on_config_delete (which is default), where if the keep_on_config_delete policy is set then the User Editable Data data will not be deleted when the sensor config is deleted, and if the clear_on_config_delete policy is set then the User Editable Data data will be deleted when the sensor config is deleted. The User Editable Data data and User Editable Data policy must be set in the same HTTP PUT request. If the User Editable Data value is set without the policy, then the policy will automatically be reset to clear_on_config_delete. The User Editable Data data value (I.E. text) is persisted across sensor config resets, config reboots, firmware upgrades, and sensor power cycles.

When querying the User Editable Data, the include_metadata field can be specified to control the verbosity of the returned data. If set to ‘true’ then the value of the User Editable Data field will be returned in addition to the value of the policy. If set to ‘false’ (which is default) then only the value of the User Editable Data field will be returned.

Note

The user editable data field will be made available as part of the HTTP endpoint. No TCP endpoint will be made available. This User Editable Data is always enabled and can always be set regardless of any other configuration settings. Please note TCP API will be completely removed and be unavailable for use in Q3, 2023.``

GET /api/v1/user/data

Retrieve the current value of ‘user-data-field’, "" is returned by default.

Example using curl command:

curl -H GET 192.0.2.123/api/v1/user/data

Example using HTTP command:

http GET 192.0.2.123/api/v1/user/data

Command Response:

http

GET /api/v1/user/data HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/user/data

httpie

http http://192.0.2.123/api/v1/user/data

python-requests

requests.get('http://192.0.2.123/api/v1/user/data')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 15
Content-Type: application/json
Date: Thu, 01 Jan 1970 01:40:23 GMT
Server: nginx

""

statuscode: 200 Ok

PUT /api/v1/user/data

Puts a “content” in the user data field. In the example shown below we will use “Ouster sensor” as the content to be put in the user data field.

Note

Default data policy for PUT request on user editable data is clear_on_config_delete. If you would like to persist the value in the data field please PUT /api/v1/user/data?policy=keep_on_config_delete.

Example using curl command:

curl -X PUT 192.0.2.123/api/v1/user/data -H 'Content-Type: application/json' -d '"Ouster sensor"'

Example using HTTP command:

http --json PUT 192.0.2.123/api/v1/user/data <<< '"Ouster sensor"'

Command Response:

http

PUT /api/v1/user/data HTTP/1.1
Host: 192.0.2.123

"Ouster sensor"

curl

curl -i -X PUT http://192.0.2.123/api/v1/user/data --data-raw '"Ouster sensor"'

httpie

echo '"Ouster sensor"' | http PUT http://192.0.2.123/api/v1/user/data

python-requests

requests.put('http://192.0.2.123/api/v1/user/data', data='"Ouster sensor"')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 01:39:16 GMT
Server: nginx

statuscode: 204 No Content

To verify: Run GET /api/v1/user/data

http

GET /api/v1/user/data HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/user/data

httpie

http http://192.0.2.123/api/v1/user/data

python-requests

requests.get('http://192.0.2.123/api/v1/user/data')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 15
Content-Type: application/json
Date: Thu, 01 Jan 1970 01:05:14 GMT
Server: nginx

"Ouster sensor"

statuscode: 200 OK

Note

Additional Information:

  • Valid values for UED: empty string or string containing non-binary ASCII and/or Unicode characters

  • Size limit for UED string: 128KB with 1KB = 1024bytes (Total = 131,072 bytes)

DELETE /api/v1/user/data

Deletes the current value (“content”) in the ‘user-data-field’.

Example using curl command:

curl -X DELETE 192.0.2.123/api/v1/user/data

Example using HTTP command:

http Delete 192.0.2.123/api/v1/user/data

Command Response:

http

DELETE /api/v1/user/data HTTP/1.1
Host: 192.0.2.123

curl

curl -i -X DELETE http://192.0.2.123/api/v1/user/data

httpie

http DELETE http://192.0.2.123/api/v1/user/data

python-requests

requests.delete('http://192.0.2.123/api/v1/user/data')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 01:05:32 GMT
Server: nginx

statuscode: 204 No Content

To verify: Run GET /api/v1/user/data

http

GET /api/v1/user/data HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/user/data

httpie

http http://192.0.2.123/api/v1/user/data

python-requests

requests.get('http://192.0.2.123/api/v1/user/data')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 2
Content-Type: application/json
Date: Thu, 01 Jan 1970 01:05:14 GMT
Server: nginx

""

statuscode: 200 OK

Optional Parameters - data policy

The policy key maps to the active policy as applied with PUT api/v1/user/data?policy=<policy_str>.

<policy_str> have the following options available:

  • clear_on_config_delete by default

  • keep_on_config_delete

Note

Data policy has no effect on the User Editable Data field.

PUT /api/v1/user/data?policy=clear_on_config_delete

Example HTTP command for clear_on_config_delete:

http --json PUT 192.0.2.123/api/v1/user/data?policy=clear_on_config_delete <<< '"set some value"

Note

User can choose to specify clear_on_config_delete when setting the user editable data, as if this is not specified then the default is set to clear_on_config_delete.

Command Response:

http

PUT /api/v1/user/data?policy=clear_on_config_delete HTTP/1.1
Host: 192.0.2.123

"Ouster sensor"

curl

curl -i -X PUT 'http://192.0.2.123/api/v1/user/data?policy=clear_on_config_delete' --data-raw '"Ouster sensor"'

httpie

echo '"Ouster sensor"' | http PUT 'http://192.0.2.123/api/v1/user/data?policy=clear_on_config_delete'

python-requests

requests.put('http://192.0.2.123/api/v1/user/data?policy=clear_on_config_delete', data='"Ouster sensor"')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 00:43:08 GMT
Server: nginx

statuscode: 204 No Content

To verify: Run GET /api/v1/user/data?include_metadata=true

http

GET /api/v1/user/data?include_metadata=true HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=true')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 62
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:16:39 GMT
Server: nginx

{
    "policy": "clear_on_config_delete",
    "value": "Ouster Sensor"
}

PUT /api/v1/user/data?policy=keep_on_config_delete

When keep_on_config_delete has been applied, the data in the user editable data field is persistent regardless of any sensor configuration resets or shutdown. If the user needs to reset this field then please run DELETE /api/v1/user/data.

Example HTTP command for keep_on_config_delete:

http --json PUT 192.0.2.123/api/v1/user/data?policy=keep_on_config_delete <<< '"Ouster Sensor"'

Command Response:

http

PUT /api/v1/user/data?policy=keep_on_config_delete HTTP/1.1
Host: 192.0.2.123

"Ouster Sensor"

curl

curl -i -X PUT 'http://192.0.2.123/api/v1/user/data?policy=keep_on_config_delete' --data-raw '"Ouster Sensor"'

httpie

echo '"Ouster Sensor"' | http PUT 'http://192.0.2.123/api/v1/user/data?policy=keep_on_config_delete'

python-requests

requests.put('http://192.0.2.123/api/v1/user/data?policy=keep_on_config_delete', data='"Ouster Sensor"')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 00:43:08 GMT
Server: nginx

statuscode: 204 No Content

To verify: Run GET /api/v1/user/data?include_metadata=true

Command Response:

http

GET /api/v1/user/data?include_metadata=true HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=true')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 61
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:19:30 GMT
Server: nginx

{
   "policy": "keep_on_config_delete",
   "value": "Ouster sensor"
}

Optional Parameters - include_metadata

Same as nominal GET but returns a JSON dictionary of the form { "value": str, "policy": str } where the value key maps to the nominal value returned by GET with no arguments.

Note

include_metadata has no effect on the User Editable Data field.

This feature lets user to query the user editable data field to get policy and value when include_metadata is set to true/1 and only the value when include_matadata is set to false/0

GET /api/v1/user/data?include_metadata=true

Returns a JSON dictionary of the form { “value”: str, “policy”: str }.

Example using curl command:

curl -X  GET 192.0.2.123/api/v1/user/data?include_metadata=true

Example using HTTP command:

http GET 192.0.2.123/api/v1/user/data?include_metadata=true

Command Response:

http

GET /api/v1/user/data?include_metadata=true HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=true'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=true')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 61
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:20:48 GMT
Server: nginx

{
    "policy": "keep_on_config_delete",
    "value": "ouster sensor"
}

GET /api/v1/user/data?include_metadata=false

Example curl command:

curl -X  GET 192.0.2.123/api/v1/user/data?include_metadata=false

Example HTTP command:

http GET 192.0.2.123/api/v1/user/data?include_metadata=false

Command Response:

http

GET /api/v1/user/data?include_metadata=false HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=false'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=false'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=false')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 15
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:21:41 GMT
Server: nginx

"Ouster sensor"

GET /api/v1/user/data?include_metadata=1

Example curl command:

curl -X  GET 192.0.2.123/api/v1/user/data?include_metadata=1

Example HTTP command:

http GET 192.0.2.123/api/v1/user/data?include_metadata=1

Command Response:

http

GET /api/v1/user/data?include_metadata=1 HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=1'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=1'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=1')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 61
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:22:18 GMT
Server: nginx

{
 "policy": "clear_on_config_delete",
 "value": "Ouster sensor"
}

GET /api/v1/user/data?include_metadata=0

Same as nominal GET but returns a JSON dictionary of the form { “value”: str, “policy”: str } where the value key maps to the nominal value returned by GET with no arguments.

Example curl command:

curl -X  GET 192.0.2.123/api/v1/user/data?include_metadata=0

Example HTTP command:

http GET 192.0.2.123/api/v1/user/data?include_metadata=0

Command Response:

http

GET /api/v1/user/data?include_metadata=0 HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/user/data?include_metadata=0'

httpie

http 'http://192.0.2.123/api/v1/user/data?include_metadata=0'

python-requests

requests.get('http://192.0.2.123/api/v1/user/data?include_metadata=0')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 15
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:23:06 GMT
Server: nginx

"Ouster sensor"

System

GET /api/v1/system/firmware

To GET the firmware version of the sensor.

http

GET /api/v1/system/firmware HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/system/firmware

httpie

http http://192.0.2.123/api/v1/system/firmware

python-requests

requests.get('http://192.0.2.123/api/v1/system/firmware')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 82
Content-Type: application/json
Date: Thu, 01 Jan 1970 00:27:54 GMT
Server: nginx

{
    "commit_pending": false,
    "fw": "ousteros-image-prod-aries-v2.5.2+20230714195410"
}

>json string fw Running firmware image name and version.

statuscode: 200 No error

UPDATE Sensor Firmware

User can update sensor firmware with a simple curl command, please refer below for an example:

curl -vH 'content-type: application/octet-stream' --data-binary @"file-path.staging.img http://$hostname/api/v1/system/firmware

Example:

curl -vH 'content-type: application/octet-stream' --data-binary @../../Downloads/ousteros-image-prod-aries-v2.5.x+20230607131746.staging.img http://192.0.2.123/api/v1/system/firmware

Response:

*   Trying 192.0.2.123:80...
* TCP_NODELAY set
* Connected to 192.0.2.123 (192.0.2.123) port 80 (#0)
> POST /api/v1/system/firmware HTTP/1.1
> Host: 192.0.2.123
> User-Agent: curl/7.68.0
> Accept: */*
> content-type: application/octet-stream
> Content-Length: 42755180
> Expect: 100-continue
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 204 No Content
< Server: nginx
< Date: Wed, 14 Jun 2023 23:38:08 GMT
< Connection: keep-alive
<
* Connection #0 to host 192.0.2.123 left intact

GET /api/v1/system/network

To GET the system network configuration.

http

GET /api/v1/system/network HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/system/network

httpie

http http://192.0.2.123/api/v1/system/network

python-requests

requests.get('http://192.0.2.123/api/v1/system/network')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 256
Content-Type: application/json

{
    "carrier": true,
    "duplex": "full",
    "ethaddr": "bc:0f:a7:00:84:17",
    "hostname": "192.0.2.123",
    "ipv4": {
        "link_local": "192.0.2.123/16",
        "override": null
    },
    "ipv6": {
        "link_local": "fe80::be0f:a7ff:fe00:8417/64"
    },
    "speed": 1000,
    "speed_override": null
}
  • >json boolean carrier: State of Ethernet link, true when physical layer is connected.

  • >json string duplex: Duplex mode of Ethernet link, half or full.

  • >json string ethaddr: Ethernet hardware (MAC) address.

  • >json string hostname: Hostname of the sensor, also used when requesting DHCP address and registering mDNS hostname.

  • >json object ipv4: See ipv4 object

  • >json string ipv6.link_local: Link-local IPv6 address.

  • >json integer speed: Ethernet physical layer speed in Mbps, should be 1000 Mbps.

  • statuscode: 200 No error

GET /api/v1/system/network/ipv4

To GET the IPv4 network configuration.

http

GET /api/v1/system/network/ipv4 HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/system/network/ipv4

httpie

http http://192.0.2.123/api/v1/system/network/ipv4

python-requests

requests.get('http://192.0.2.123/api/v1/system/network/ipv4')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 53
Content-Type: application/json


{
    "link_local": "192.0.2.123/16",
    "override": null
}
  • >json string addr: Current global or private IPv4 address.

  • >json string link_local: Link-local IPv4 address.

  • >json string override: Static IP override value, this should match addr. This value will be null when unset and operating in DHCP or link-local modes.

statuscode: 200 No error

GET /api/v1/system/network/ipv4/override

To GET the current IPv4 static IP address override.

Example using HTTP:

http GET 192.0.2.123/api/v1/system/network/ipv4/override

Example using CURL:

curl -X GET 192.0.2.123/api/v1/system/network/ipv4/override

http

GET /api/v1/system/network/ipv4/override HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/system/network/ipv4/override

httpie

http http://192.0.2.123/api/v1/system/network/ipv4/override

python-requests

requests.get('http://192.0.2.123/api/v1/system/network/ipv4/override')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 4
Content-Type: application/json

null
  • >json string Static IP override value, this should match addr. This value will be null when unset and operating in DHCP mode.

statuscode: 200 No error

PUT /api/v1/system/network/ipv4/override

To override the default dynamic behavior and set a static IP address. Only a valid Unicast IPv4 address can be specified when using PUT command.

Example using HTTP:

echo '"192.0.2.231"' | http --json PUT 192.0.2.123/api/v1/system/network/ipv4/override

Example using CURL:

curl -X PUT -H "Content-Type: application/json" -d '"192.0.2.231"' 192.0.2.123/api/v1/system/network/ipv4/override

Note

The sensor will reset the network configuration after a short sub second delay (to allow for the HTTP response to be sent). After this delay the sensor will only be reachable on the newly set IPv4 address.

The sensor needs to be reachable either by link-local or dynamic DHCP configuration or by an existing static IP override from the host reconfiguring the sensor. The sensor may be reset back to using DHCP by resetting the sensor configuration.

Warning

If an unreachable network address is set, the sensor will become unreachable. Tools such as avahi-browse, dns-sd, or mDNS browser can help with finding a sensor on a network. Static IP override should only be used in special use cases. The link-local configuration is recommended where possible.

http

PUT /api/v1/system/network/ipv4/override HTTP/1.1
Host: 192.0.2.123

"192.0.2.231"

curl

curl -i -X PUT http://192.0.2.123/api/v1/system/network/ipv4/override --data-raw '"192.0.2.231"'

httpie

echo '"192.0.2.231"' | http PUT http://192.0.2.123/api/v1/system/network/ipv4/override

python-requests

requests.put('http://192.0.2.123/api/v1/system/network/ipv4/override', data='"192.0.2.231"')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 17
Content-Type: application/json
Date: Thu, 30 Mar 2023 04:30:30 GMT
Server: nginx

"192.0.2.231"
  • <json string: Static IP override value with subnet mask

  • >json string: Static IP override value that system will set after a short delay.

statuscode: 200 No error

Note

Sensor can be accessed on the sensor’s self-assigned link-local IPv4 or IPv6 addresses, in case the sensor becomes unreachable on the configured network due to a misconfiguration. To discover the self-assigned link-local IPv4 or IPv6 addresses for a sensor is to user a network sniffer (such as wireshark) on the same network segment as the sensor.

DELETE /api/v1/system/network/ipv4/override

To delete the static IP override value and return to dynamic configuration (DHCP) or reset the sensor configuration.

Note

The sensor will reset the network configuration after a short sub second delay (to allow for the HTTP response to be sent). After this delay the sensor will only be reachable on the newly set IPv4 address.

The sensor may be unreachable for several seconds while a link-local lease is obtained from the network or client machine.

http

DELETE /api/v1/system/network/ipv4/override HTTP/1.1
Host: 192.0.2.123

curl

curl -i -X DELETE http://192.0.2.123/api/v1/system/network/ipv4/override

httpie

http DELETE http://192.0.2.123/api/v1/system/network/ipv4/override

python-requests

requests.delete('http://192.0.2.123/api/v1/system/network/ipv4/override')

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Thu, 01 Jan 1970 19:12:15 GMT
Server: nginx

statuscode: 204 No error, no content

GET /api/v1/system/network/speed_override

Two options null (default) and 100.

Note

Only valid for sensors with automotive ethernet (T1).

Example

http

GET /api/v1/system/network/speed_override HTTP/1.1
Content-Type: application/json
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/system/network/speed_override -H 'Content-Type: application/json'

httpie

http http://192.0.2.123/api/v1/system/network/speed_override Content-Type:application/json

python-requests

requests.get('http://192.0.2.123/api/v1/system/network/speed_override', headers={
    'Content-Type': 'application/json',
})

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 4
Content-Type: application/json
Date: Thu, 28 Apr 2022 17:48:51 GMT
Server: nginx

null

PUT /api/v1/system/network/speed_override

Note

Only valid for sensors with automotive ethernet (T1).

Warning

Only run this command if you have the ability to configure your networking hardware between 1000BASE-T1 and 100BASE-T1. If you do not have the configuration option available, you will no longer be able to communicate to the sensor. Please refer to an Example 100Base-T1 Connector.

Two options 1000 (default) and 100. However, user can only use PUT command to set speed-override to 100. In order to revert back to 1000 (default), please run the DELETE /api/v1/system/network/speed_override.

Example

http

PUT /api/v1/system/network/speed_override HTTP/1.1
Content-Type: application/json
Host: 192.0.2.123

"100"

curl

curl -i -X PUT http://192.0.2.123/api/v1/system/network/speed_override -H 'Content-Type: application/json' --data-raw '"100"'

httpie

echo '"100"' | http PUT http://192.0.2.123/api/v1/system/network/speed_override Content-Type:application/json

python-requests

requests.put('http://192.0.2.123/api/v1/system/network/speed_override', headers={
    'Content-Type': 'application/json',
}, json='100')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 3
Content-Type: application/json
Date: Tue, 18 Jul 2023 19:34:27 GMT
Server: nginx

100

DELETE /api/v1/system/network/speed_override

Note

Only valid for sensors with automotive ethernet (T1).

To reset it back to default i.e.., 1000

http

DELETE /api/v1/system/network/speed_override HTTP/1.1
Content-Type: application/json
Host: 192.0.2.123

curl

curl -i -X DELETE http://192.0.2.123/api/v1/system/network/speed_override -H 'Content-Type: application/json'

httpie

http DELETE http://192.0.2.123/api/v1/system/network/speed_override Content-Type:application/json

python-requests

requests.delete('http://192.0.2.123/api/v1/system/network/speed_override', headers={
    'Content-Type': 'application/json',
})

response

HTTP/1.1 204 No Content
Connection: keep-alive
Date: Tue, 18 Jul 2023 19:37:52 GMT
Server: nginx

Time

GET /api/v1/time

To GET the system time configuration for all timing components of the sensor.

http

GET /api/v1/time HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/time

httpie

http http://192.0.2.123/api/v1/time

python-requests

requests.get('http://192.0.2.123/api/v1/time')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 2484
Content-Type: application/json

{
    "ptp": {
        "current_data_set": {
            "mean_path_delay": 0.0,
            "offset_from_master": 0.0,
            "steps_removed": 0
        },
        "parent_data_set": {
            "gm_clock_accuracy": 254,
            "gm_clock_class": 255,
            "gm_offset_scaled_log_variance": 65535,
            "grandmaster_identity": "bc0fa7.fffe.008417",
            "grandmaster_priority1": 128,
            "grandmaster_priority2": 128,
            "observed_parent_clock_phase_change_rate": 2147483647,
            "observed_parent_offset_scaled_log_variance": 65535,
            "parent_port_identity": "bc0fa7.fffe.008417-0",
            "parent_stats": 0
        },
        "port_data_set": {
            "announce_receipt_timeout": 3,
            "delay_mechanism": 1,
            "log_announce_interval": 1,
            "log_min_delay_req_interval": 0,
            "log_min_pdelay_req_interval": 0,
            "log_sync_interval": 0,
            "peer_mean_path_delay": 0,
            "port_identity": "bc0fa7.fffe.008417-1",
            "port_state": "LISTENING",
            "version_number": 2
        },
        "profile": "default",
        "time_properties_data_set": {
            "current_utc_offset": 37,
            "current_utc_offset_valid": 0,
            "frequency_traceable": 0,
            "leap59": 0,
            "leap61": 0,
            "ptp_timescale": 1,
            "time_source": 160,
            "time_traceable": 0
        },
        "time_status_np": {
            "cumulative_scaled_rate_offset": 0.0,
            "gm_identity": "bc0fa7.fffe.008417",
            "gm_present": false,
            "gm_time_base_indicator": 0,
            "ingress_time": 0,
            "last_gm_phase_change": "0x0000'0000000000000000.0000",
            "master_offset": 0,
            "scaled_last_gm_phase_change": 0
        }
    },
    "sensor": {
        "multipurpose_io": {
            "mode": "OFF",
            "nmea": {
                "baud_rate": "BAUD_9600",
                "diagnostics": {
                    "decoding": {
                        "date_decoded_count": 0,
                        "last_read_message": "",
                        "not_valid_count": 0,
                        "utc_decoded_count": 0
                    },
                    "io_checks": {
                        "bit_count": 1,
                        "bit_count_unfiltered": 0,
                        "char_count": 0,
                        "start_char_count": 0
                    }
                },
                "ignore_valid_char": 0,
                "leap_seconds": 0,
                "locked": 0,
                "polarity": "ACTIVE_HIGH"
            },
            "sync_pulse_out": {
                "angle_deg": 360,
                "frequency_hz": 1,
                "polarity": "ACTIVE_HIGH",
                "pulse_width_ms": 10
            }
        },
        "sync_pulse_in": {
            "diagnostics": {
                "count": 1,
                "count_unfiltered": 0,
                "last_period_nsec": 0
            },
            "locked": 0,
            "polarity": "ACTIVE_HIGH"
        },
        "timestamp": {
            "mode": "TIME_FROM_INTERNAL_OSC",
            "time": 297.397987312,
            "time_options": {
                "internal_osc": 297,
                "ptp_1588": 1651197874,
                "sync_pulse_in": 1
            }
        }
    },
    "system": {
        "monotonic": 30131.822811617,
        "realtime": 1651197874.3271277,
        "tracking": {
            "frequency": -9.558,
            "last_offset": 0.0,
            "leap_status": "not synchronised",
            "ref_time_utc": 0.0,
            "reference_id": "00000000",
            "remote_host": "",
            "residual_frequency": 0.0,
            "rms_offset": 0.0,
            "root_delay": 1.0,
            "root_dispersion": 1.0,
            "skew": 0.0,
            "stratum": 0,
            "system_time_offset": 1e-09,
            "update_interval": 0.0
        }
    }
}
  • >json string: See sub objects for details.

statuscode: 200 No error

GET /api/v1/time/sensor

To GET the sensor time information.

http

GET /api/v1/time/sensor HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/time/sensor

httpie

http http://192.0.2.123/api/v1/time/sensor

python-requests

requests.get('http://192.0.2.123/api/v1/time/sensor')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 775
Content-Type: application/json

{
    "multipurpose_io": {
        "mode": "OFF",
        "nmea": {
            "baud_rate": "BAUD_9600",
            "diagnostics": {
                "decoding": {
                    "date_decoded_count": 0,
                    "last_read_message": "",
                    "not_valid_count": 0,
                    "utc_decoded_count": 0
                },
                "io_checks": {
                    "bit_count": 1,
                    "bit_count_unfiltered": 0,
                    "char_count": 0,
                    "start_char_count": 0
                }
            },
            "ignore_valid_char": 0,
            "leap_seconds": 0,
            "locked": 0,
            "polarity": "ACTIVE_HIGH"
        },
        "sync_pulse_out": {
            "angle_deg": 360,
            "frequency_hz": 1,
            "polarity": "ACTIVE_HIGH",
            "pulse_width_ms": 10
        }
    },
    "sync_pulse_in": {
        "diagnostics": {
            "count": 1,
            "count_unfiltered": 0,
            "last_period_nsec": 0
        },
        "locked": 0,
        "polarity": "ACTIVE_HIGH"
    },
    "timestamp": {
        "mode": "TIME_FROM_INTERNAL_OSC",
        "time": 376.510445056,
        "time_options": {
            "internal_osc": 376,
            "ptp_1588": 1651197953,
            "sync_pulse_in": 1
        }
    }
}

status code: 200 No error

  • Description: Returns JSON-formatted sensor timing configuration and status of udp timestamp, sync_pulse_in, and multipurpose_io. For more information on these parameters refer to the get_time_info TCP command.

GET /api/v1/time/system

To GET the operating system time status. These values relate to the sensor operating system clocks, and not clocks related to hardware timestamp data from the lidar sensor.

http

GET /api/v1/time/system HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/time/system

httpie

http http://192.0.2.123/api/v1/time/system

python-requests

requests.get('http://192.0.2.123/api/v1/time/system')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 389
Content-Type: application/json

{
    "monotonic": 30348.898799855,
    "realtime": 1651198091.4031146,
    "tracking": {
        "frequency": -9.558,
        "last_offset": 0.0,
        "leap_status": "not synchronised",
        "ref_time_utc": 0.0,
        "reference_id": "00000000",
        "remote_host": "",
        "residual_frequency": 0.0,
        "rms_offset": 0.0,
        "root_delay": 1.0,
        "root_dispersion": 1.0,
        "skew": 0.0,
        "stratum": 0,
        "system_time_offset": 3e-09,
        "update_interval": 0.0
    }
}
  • >json float monotonic: Monotonic time of operating system. This timestamp never counts backwards and is the time since boot in seconds.

  • >json float realtime: Time in seconds since the Unix epoch, should match wall time if synchronized with external time source.

  • >json object tracking: Operating system time synchronization tracking status. See chronyc tracking documentation for more information.

  • statuscode: 200 No error

  • System ``tracking`` fields of interest:

  • rms_offset: Long-term average of the offset value.

  • system_time_offset: Time delta (in seconds) between the estimate of the operating system time and the current true time.

  • last_offset: Estimated local offset on the last clock update.

  • ref_time_utc: UTC Time at which the last measurement from the reference source was processed.

  • remote_host: This is either ptp if the system is synchronizing to a PTP time source or the address of a remote NTP server the system has selected if the sensor is connected to the Internet.

GET /api/v1/time/ptp

To GET the status of the PTP time synchronization daemon.

Note

See the IEEE 1588-2008 standard for more details on the standard management messages.

http

GET /api/v1/time/ptp HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/time/ptp

httpie

http http://192.0.2.123/api/v1/time/ptp

python-requests

requests.get('http://192.0.2.123/api/v1/time/ptp')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 1287
Content-Type: application/json

{
    "current_data_set": {
        "mean_path_delay": 0.0,
        "offset_from_master": 0.0,
        "steps_removed": 0
    },
    "parent_data_set": {
        "gm_clock_accuracy": 254,
        "gm_clock_class": 255,
        "gm_offset_scaled_log_variance": 65535,
        "grandmaster_identity": "bc0fa7.fffe.008417",
        "grandmaster_priority1": 128,
        "grandmaster_priority2": 128,
        "observed_parent_clock_phase_change_rate": 2147483647,
        "observed_parent_offset_scaled_log_variance": 65535,
        "parent_port_identity": "bc0fa7.fffe.008417-0",
        "parent_stats": 0
    },
    "port_data_set": {
        "announce_receipt_timeout": 3,
        "delay_mechanism": 1,
        "log_announce_interval": 1,
        "log_min_delay_req_interval": 0,
        "log_min_pdelay_req_interval": 0,
        "log_sync_interval": 0,
        "peer_mean_path_delay": 0,
        "port_identity": "bc0fa7.fffe.008417-1",
        "port_state": "LISTENING",
        "version_number": 2
    },
    "profile": "default",
    "time_properties_data_set": {
        "current_utc_offset": 37,
        "current_utc_offset_valid": 0,
        "frequency_traceable": 0,
        "leap59": 0,
        "leap61": 0,
        "ptp_timescale": 1,
        "time_source": 160,
        "time_traceable": 0
    },
    "time_status_np": {
        "cumulative_scaled_rate_offset": 0.0,
        "gm_identity": "bc0fa7.fffe.008417",
        "gm_present": false,
        "gm_time_base_indicator": 0,
        "ingress_time": 0,
        "last_gm_phase_change": "0x0000'0000000000000000.0000",
        "master_offset": 0,
        "scaled_last_gm_phase_change": 0
    }
}
  • >json object current_data_set: Result of the PMC GET CURRENT_DATA_SET command.

  • >json object parent_data_set: Result of the PMC GET PARENT_DATA_SET command.

  • >json object port_data_set: Result of the PMC GET PORT_DATA_SET command.

  • >json object time_properties_data_set: Result of the PMC GET TIME_PROPERTIES_DATA_SET command.

  • >json object time_status_np: Result of the PMC GET TIME_STATUS_NP command. This is a linuxptp non-portable command.

statuscode: 200 No error

Fields of interest:

  • current_data_set.offset_from_master: Offset from master time source in nanoseconds as calculated during the last update from master.

  • parent_data_set.grandmaster_identity: This should match the local grandmaster clock. If this displays the sensor’s clock identity (derived from Ethernet hardware address) then this indicates the sensor is not properly synchronized to a grandmaster.

  • parent_data_set: Various information about the selected master clock.

  • port_data_set.port_state: This value will be SLAVE when a remote master clock is selected. See parent_data_set for selected master clock.

  • port_data_set: Local sensor PTP configuration values. Grandmaster clock needs to match these for proper time synchronization.

  • time_properties_data_set: PTP properties as given by master clock.

  • time_status_np.gm_identity: Selected grandmaster clock identity.

  • time_status_np.gm_present: True when grandmaster has been detected. This may stay true even if grandmaster goes off-line. Use port_data_set.port_state to determine up-to-date synchronization status. When this is false then the local clock is selected.

  • time_status_np.ingress_time: Indicates when the last PTP message was received. Units are in nanoseconds.

  • time_status_np: Linux PTP specific diagnostic values. The Red Hat manual provides some more information on these fields

GET /api/v1/time/ptp/profile

To GET the active PTP profile of the Ouster sensor.

http

GET /api/v1/time/ptp/profile HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/time/ptp/profile

httpie

http http://192.0.2.123/api/v1/time/ptp/profile

python-requests

requests.get('http://192.0.2.123/api/v1/time/ptp/profile')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 9
Content-Type: application/json

"default"
  • >json string: Active PTP profile.

statuscode: 200 No error

PUT /api/v1/time/ptp/profile

To change the PTP profile of the Ouster sensor.

http

PUT /api/v1/time/ptp/profile HTTP/1.1
Content-Type: application/json
Host: 192.0.2.123

"gptp"

curl

curl -i -X PUT http://192.0.2.123/api/v1/time/ptp/profile -H 'Content-Type: application/json' --data-raw '"gptp"'

httpie

echo '"gptp"' | http PUT http://192.0.2.123/api/v1/time/ptp/profile Content-Type:application/json

python-requests

requests.put('http://192.0.2.123/api/v1/time/ptp/profile', headers={
    'Content-Type': 'application/json',
}, json='gptp')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 6
Content-Type: application/json
Date: Thu, 28 Apr 2022 18:11:36 GMT
Server: nginx

"gptp"

<json string: PTP profile to be activated, valid options are "", "default", "gptp", and "automotive-slave"

Note

"" and "default" are the same.

>json string: Active PTP profile.

statuscode: 200 No error

Alerts, Diagnostics and Telemetry

GET /api/v1/sensor/alerts

To GET the sensor lidar intrinsics.

http

GET /api/v1/sensor/alerts HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/alerts

httpie

http http://192.0.2.123/api/v1/sensor/alerts

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/alerts')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 1983
Content-Type: application/json

{
    "active": [
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 1,
            "id": "0x01000015",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided lidar data port;
                    check that udp_dest and udp_port_lidar configured on the sensor matches
                    client IP and port. This Alert may occur on sensor startup if the
                    client is not listening at that time.",
            "msg_verbose": "Failed to send lidar UDP data to destination host 169.254.225.4:7502",
            "realtime": "1651197616274601728"
        },
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 0,
            "id": "0x01000018",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided IMU data port;
                    check that udp_dest and udp_port_imu configured on the sensor matches
                    client IP and port. This Alert may occur on sensor startup if the
                    client is not listening at that time.",
            "msg_verbose": "Failed to send imu UDP data to destination host 169.254.225.4:7503",
            "realtime": "1651197615284695040"
        }
    ],
    "log": [
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 0,
            "id": "0x01000018",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided IMU data port;
                    check that udp_dest and udp_port_imu configured on the sensor matches
                    client IP and port. This Alert may occur on sensor startup if the
                    client is not listening at that time.",
            "msg_verbose": "Failed to send imu UDP data to destination host 169.254.225.4:7503",
            "realtime": "1651197615284695040"
        },
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 1,
            "id": "0x01000015",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided lidar data port;
                    check that udp_dest and udp_port_lidar configured on the sensor matches
                    client IP and port. This Alert may occur on sensor startup if the
                    client is not listening at that time.",
            "msg_verbose": "Failed to send lidar UDP data to destination host 169.254.225.4:7502",
            "realtime": "1651197616274601728"
        }
    ],
    "next_cursor": 2
}

status code: 200 No error

Description: Returns JSON-formatted sensor diagnostic information.

Two lists will be returned, an active list and a log list. The active list contains alert-trigger alerts for currently active events. An alert-trigger event always has its active attribute set to true. The number of events in the active event list is unlimited. All currently active alert-trigger events will be displayed in the active event list.

The log list will contain all trigger and clear alert events. An alert-clear event has the same attributes and values as its corresponding trigger event, apart from the realtime and cursor attributes which will have increased, since an alert-clear event will always be received after an alert-trigger event. The log list has a length limit of 32 events in the form of a FIFO (First in First Out) queue. When the log list length limit is reached and a new event is added the oldest event is deleted.

In addition to the active and log lists, get_alerts also returns a next_cursor field. Every alert event has a cursor attribute, which increments for every alert event logged. This can be used to track the alert activity that has been viewed and reduce message bandwidth. To do this, users are recommended to save the next_cursor field when calling get_alerts and then use that value as the cursor argument on the next get_alerts call to fetch only new log entries.

A valid value for mode is either summary or default.

Additional Information:

The cursor will wrap at 2^32 entries. It is important to understand the behavior during the wrap case, since this may lead to some unexpected consequences:

  • If cursor < (next_cursor - 32) % 2^32 then some entries may be filtered. For instance if cursor =0 and next_cursor =0 no entries will be reported immediately after cursor wrap, even though the log contains 32 entries, where submitting cursor =4294967264 (next_cursor - 32) % 2^32 will return all logged values.

  • If cursor > next_cursor all 32 entries will be reported.

The recommended approach to using the interface is to always base queries on the previous value of next_cursor.

Note

Valid uses of get_alerts:

  • Example: Calling get_alerts with cursor =1

    get_alerts 1

  • Example: Calling get_alerts with cursor =2 and mode =summary

    get_alerts 2 summary

Invalid uses of get_alerts:

  • Example: Calling get_alerts with cursor =summary and mode =2

    get_alerts summary 2

Note

The order in which the cursor and mode arguments are specified for the get_alerts TCP command must be followed when providing both arguments, with cursor preceding the mode. The arguments can be specified in any order when calling the equivalent /api/v1/sensor/alerts HTTP endpoint.

Example using cursor and mode

Using curl command, the user can run the following:

Example:

curl '192.0.2.123/api/v1/sensor/alerts?cursor=1&mode=summary'

http

GET /api/v1/sensor/alerts?cursor=1&mode=summary HTTP/1.1
Host: 192.0.2.123

curl

curl -i 'http://192.0.2.123/api/v1/sensor/alerts?cursor=1&mode=summary'

httpie

http 'http://192.0.2.123/api/v1/sensor/alerts?cursor=1&mode=summary'

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/alerts?cursor=1&mode=summary')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 1503
Content-Type: application/json
Date: Thu, 28 Apr 2022 18:20:45 GMT
Server: nginx

{
    "active": [
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 1,
            "id": "0x01000015",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided lidar data port; check that udp_dest and udp_port_lidar configured on the sensor matches client IP and port. This Alert may occur on sensor startup if the client is not listening at that time.",
            "msg_verbose": "Failed to send lidar UDP data to destination host 169.254.58.111:7502",
            "realtime": "1651168139756699136"
        },
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 0,
            "id": "0x01000018",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided IMU data port; check that udp_dest and udp_port_imu configured on the sensor matches client IP and port. This Alert may occur on sensor startup if the client is not listening at that time.",
            "msg_verbose": "Failed to send imu UDP data to destination host 169.254.58.111:7503",
            "realtime": "1651168138765470720"
        }
    ],
    "log": [
        {
            "active": true,
            "category": "UDP_TRANSMISSION",
            "cursor": 1,
            "id": "0x01000015",
            "level": "WARNING",
            "msg": "Client machine announced it is not reachable on the provided lidar data port; check that udp_dest and udp_port_lidar configured on the sensor matches client IP and port. This Alert may occur on sensor startup if the client is not listening at that time.",
            "msg_verbose": "Failed to send lidar UDP data to destination host 169.254.58.111:7502",
            "realtime": "1651168139756699136"
        }
    ],
    "next_cursor": 2
}

GET /api/v1/diagnostics/dump

To GET the diagnostics files of the sensor.

http

GET /api/v1/diagnostics/dump HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/diagnostics/dump

httpie

http http://192.0.2.123/api/v1/diagnostics/dump

python-requests

requests.get('http://192.0.2.123/api/v1/diagnostics/dump')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/octet-stream
Transfer-Encoding: chunked
content-disposition: attachment; filename="192.0.2.123_diagnostics-dump_b7d348c2
                                           -c763-11ec-accf-bc0fa7008417.bin"


+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+

statuscode: 200 No error

GET /api/v1/sensor/telemetry

To GET the sensor telemetry information.

http

GET /api/v1/sensor/telemetry HTTP/1.1
Host: 192.0.2.123

curl

curl -i http://192.0.2.123/api/v1/sensor/telemetry

httpie

http http://192.0.2.123/api/v1/sensor/telemetry

python-requests

requests.get('http://192.0.2.123/api/v1/sensor/telemetry')

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 150
Content-Type: application/json

{
    "input_current_ma": 644,
    "input_voltage_mv": 23624,
    "internal_temperature_deg_c": 48,
    "phase_lock_status": "DISABLED",
    "timestamp_ns": 2093396806056
}

status code: 200 No error

Description: Returns JSON-formatted response that provides sensor system state information. This includes the FPGA Timestamp in ns (Nanoseconds) at which the information was collected from the FPGA, Lidar Input Voltage in mv (Millivolt), Lidar Input Current in ma (Milliamp), Internal Temperature of the sensor in ºC (Degree Celsius) and Phase Lock status namely LOCKED, LOST, DISABLED..

Internal temperature can only be measured with Rev 06 and above sensors. Phase lock output will not indicate loss of lock if the PTP source is lost.