# Interface u-center comptaible GPS devices with Ouster Sensors

**URL:** <https://community.ouster.com/t/interface-u-center-comptaible-gps-devices-with-ouster-sensors/272>\
**Category:** Hardware\
**Tags:** time-synchronization\
**Created:** [February 3, 2025, 9:20pm UTC](https://community.ouster.com/t/interface-u-center-comptaible-gps-devices-with-ouster-sensors/272 "2025-02-03T21:20:16Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![4wheeler](https://avatars.discourse-cdn.com/v4/letter/4/a88e57/32.png) [@4wheeler](https://community.ouster.com/u/4wheeler)\
**Post date:** [February 3, 2025, 9:20pm UTC](https://community.ouster.com/t/interface-u-center-comptaible-gps-devices-with-ouster-sensors/272/1 "2025-02-03T21:20:16Z")

</div>

# Required Items

## Hardware Needed

1. **Ouster Sensor:** [OSx-[32, 64, 128]](https://ouster.com/products/) with included [Interface Box](https://static.ouster.dev/sensor-docs/hw_user_manual/hw_common_sections_OS0/Accessories.html#interface-box) (IBOX)
2. **GPS Board** : u-center compatible GPS (below are the tested ones)
  - SparkFun GPS Breakout - [![](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/6f2ba40d94285a8f7b012c668aa02a21b54545f4.jpeg)SparkFun GPS Breakout - NEO-M9N, U.FL (Qwiic)](https://www.sparkfun.com/products/15712) (1) and applicable antenna
  - requires an antenna (sold separately). Be sure to pick a suitable antenna with U.FL connector for this exercise.
  - Goouuu Tech GT-U7 GPS Module and antenna

3. **PC:** Ensure the PC has 1000Base-T (Gigabit Ethernet) capability (via ethernet port on PC or separate USB-Ethernet converter).
4. **Miscellaneous:**
  - Required: Ethernet cable, USB-C cable, M3 torx screwdriver, jumper wires (male and female)
  - Optional: Breadboard (or plugblock), oscilloscope

* * *

# Sensor and GPS/GNSS Configuration

## Ouster Sensor Configuration via Web Interface

The Ouster sensor must be configured to accept externally generated, electrical signals as ‘inputs’ for both PPS and NMEA. There are many ways to configure the sensor (e.g. via [TCP/HTTP api](https://static.ouster.dev/sensor-docs/image_route1/image_route2/common_sections/API/http-api-v1.html)), however the Ouster Web Interface is probably the most simple and effective method.

See our documentation on [Web Interface](https://static.ouster.dev/sensor-docs/image_route1/image_route2/connecting/connecting-to-sensors.html#web-interface) for further details.

> 💡 **Tip:** to access the web interface, enter one of the following arguments into a web browser url bar.

1. `http://os-991234567890.local/`
2. where 991234567890 represents the unique serial number of your device.  
1. This can be found on the **sensor label** or [GET /api/v1/sensor/metadata/sensor\_info](https://static.ouster.dev/sensor-docs/image_route1/image_route2/common_sections/API/http-api-v1.html#get-api-v1-sensor-metadata-sensor-info)
3. `http://169.254.1.100/ `
4. where 169.254.1.100 represents the set IPv4 address of the sensor  
1. Sensor IPv4: [GET /api/v1/system/network/ipv4](https://static.ouster.dev/sensor-docs/image_route1/image_route2/common_sections/API/http-api-v1.html#get-api-v1-system-network-ipv4)

**From the Configuration tab** , ensure the following items are configured as described. All other fields can remain as the _default_ values.

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/8ae8034ce9c222a579bb431e40b9c5102762df73.png)

| | **Sensor configuration via Web UI** |
| --- | --- |
| 1 | Timestamp Mode: `TIME_FROM_SYNC_PULSE_IN` |
| 2 | Multipurpose IO Mode: `INPUT_NMEA_UART` |
| 3 | NMEA In Polarity: `ACTIVE_HIGH` |
| 4 | NMEA Baud Rate: `BAUD_9600` |
| 5 | NMEA Leap Seconds: `0` |
| 6 | Sync Pulse In Polarity: `ACTIVE_HIGH` |
| 7 | Click `Apply Config (reinit)` |
| 8 | Click `Persist Active Config` |

Open web\_ui\_config.png

![]()

> 💡 **Tip:** If `nmea_leap_seconds` is set to `0` then the reported time is Unix Epoch time.
> 
> If `nmea_leap_seconds` is `37 `then the reported time matches the TAI standard

* * *

## GPS Software

### u-center

- [u-center](https://www.u-blox.com/en/product/u-center) GNSS evaluation software for Windows only [freeware]

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/7e1ac4335dd4298858b4de53f561be0ab251d120.jpeg)

> ℹ The u-center version utilized for the creation of this article: u-center, v22.07

### NEO-M9N Configuration Settings for use with Ouster sensor

It is important to ensure you have configured the GPS/GNSS device to be compatible with the Ouster sensor. For details on initial installation of [![](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/8f6a34c24975b3773652bcd64d1298fb1c54814c.png)u-center](https://www.u-blox.com/en/product/u-center), connecting the GPS receiver, and other introductory features, please refer to the user guide by visiting the [manufacturer site](https://www.u-blox.com/en/product/u-center).

**Getting started:**

1. Open the `Configuration View` (Ctrl+F9)

After making a configuration change, write the change to the module by using the `Send` button at the bottom of the window.

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/7d95e81d23842197fc72cf2d972fb6a68d9e5e7d.png)

![]()

#### List of configuration topics to be changed:

1. Save (BBR/Flash)
2. NMEA Protocol
3. UART Out
4. PPS Out
5. NMEA Message Types

 ![CFG (Configuration)](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/84675cf63791b6847f16dc656c8ad9bacb0e4f75.png)

| | **1. Save (BBR/Flash)** |
| --- | --- |
| 1 | Highlight `CFG (Configuration)` |
| 2 | Select `Save current configuration` |
| 3 | Send the message to the receiver |

 ![NMEA (NMEA Protocol)](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/420457a586cb2c8012927f578eb43bf4f884168e.png)

| | **2. Configure NMEA Protocol** |
| --- | --- |
| 1 | Highlight `NMEA (NMEA Protocol)` |
| 2 | Select `CFG-NMEA-DATA2` |
| 3 | Number used for SV’s not supported by NMEA: `1-Extended (3 digit)` |
| 4 | Main Talker ID: `1-GP (GPS)` |
| 5 | Send the message to the receiver |

 ![PRT (Ports)](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/b5f5e79a5a0cc483815861290ada9b6209f47bc5.png)

| | **3. Configure UART Out** |
| --- | --- |
| 1 | Highlight `PRT (Ports)` |
| 2 | Target: `1-UART1` |
| 3 | Baudrate: `9600` |
| 4 | Send the message to the receiver |

 ![TP5 (Timepulse)](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/a7622c1e26c7ca251db781ea04a0019393d5455d.png)

| | 4. **Configure PPS Out** |
| --- | --- |
| 1 | Highlight `TP5 (Timepulse 5)` |
| 2 | Timepulse Settings: `0-TIMEPULSE` |
| 3 | Check the radio button: `Frequency` |
| 4 | Frequency: `1` [Hz] |
| 5 | Length: `10000` [us] |
| 6 | Length Locked: `10000` [us] |
| 7 | Select `0-UTC Time` |
| 8 | Send the message to the receiver |

 ![MSG (Messages)](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/97880291e26eed34ffe6c4e48f954faeab4a2c67.png)

| | 5. **Configure NMEA Message Types** |
| --- | --- |
| 1 | Highlight `MSG (Messages)` |
| 2 | Timepulse Settings: `0-TIMEPULSE` |
| 3 | For each message type below, uncheck the box **(OFF)** for UART1 only: `F0-00 NMEA GxGGA` `F0-01 NMEA GxGLL` `F0-02 NMEA GxGSA` `F0-03 NMEA GxGSV` `F0-05 NMEA GxVTG` |
| 4 | Ensure that UART1 checkbox is selected **(ON)** for the RMC message type: `F0-04 NMEA GxRMC ` |
| 5 | Send the message to the receiver after each step 3a, 3b, ….4a. |

* * *

### PyGPSClient

Compatible with MacOS, Linux, and Windows

[![](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/74332c10b514c9830e58723d6bb6ae17a89a70b1.png)GitHub - semuconsulting/PyGPSClient: Python Graphical GPS Client Application supporting NMEA, UBX, RTCM3, NTRIP & SPARTN Protocols](https://github.com/semuconsulting/PyGPSClient)

#### Installation Guide

1. Create Virtual Environment  
`python3 -m venv venv && source venv/bin/activate`
2. Install  
`pip install --upgrade pygpsclient`
3. Run (a GUI window should pop up if successful)  
`pygpsclient`

[Optional] Desktop Launcher Installation: [![](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/74332c10b514c9830e58723d6bb6ae17a89a70b1.png)GitHub - semuconsulting/PyGPSClient: Python Graphical GPS Client Application supporting NMEA, UBX, RTCM3, NTRIP & SPARTN Protocols](https://github.com/semuconsulting/PyGPSClient?tab=readme-ov-file#creating-a-desktop-application-launcher)

#### Installation Troubleshooting

```auto
$ pygpsclient --help
Traceback (most recent call last):
  File "/Users/dawheeler/ouster/venv/bin/pygpsclient", line 5, in <module>
    from pygpsclient. __main__ import main
  File "/Users/dawheeler/ouster/venv/lib/python3.13/site-packages/pygpsclient/ __main__.py", line 15, in <module>
    from tkinter import Tk
  File "/usr/local/Cellar/python@3.13/3.13.1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/tkinter/ __init__.py", line 38, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
    ^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named '_tkinter'

```

For MacOS, I installed Tk via brew to resolve it

`brew install python-tk`

## GPS/GNSS Configuration with PyGPS Client

Connect the device to your computer before launching the software

### Connecting to the GPS device:

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/7d1091d424d1d57fbddae5708a42a8e008d6d920.png)

### Configuring via the GUI

1. Click UBX config and a new window should appear

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/01a1cf37c47d2d9d616501edaeeac207268caab7.png)

1. Set `Solution Interval (ms)` (under CFG-RATE Navigation Solution Rate Configuration) to 1000 and click the green arrow to send it to the GPS device

 ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/41afbea42c5d1cacee52c62152877de1c2d05dff.png)

1. Configure PPS

| Attribute | Value |
| --- | --- |
| tpIdx | 0 |
| version | 1 |
| freqPeriod | 1 |
| freqPeriodLock | 1 |
| pulseLenRatio | 10000 |
| pulseLenLock | 10000 |
| active | 1 |
| lockGnssFreq | 1 |
| isFreq | 1 |
| isLength | 1 |
| alignToTow | 1 |
| polarity | 1 |
| gridUtcGnss | 0 |

```
* fill out the any fields not listed here with 0
* Click the green arrow to send it to the GPS device

```

Further resources:

> **[u-blox-F9-HPG-1.30\_InterfaceDescription\_UBX-21046737.pdf](https://content.u-blox.com/sites/default/files/u-blox-F9-HPG-1.30_InterfaceDescription_UBX-21046737.pdf?utm_content=UBX-21046737)**
>
> 3.55 MB

1. Turn off all NMEA messages
  - At the bottom right, find Preset UBX Configuration Command

  - Select the appropriate ports (e.g. USB, UART-1)

  - Select `CFG-MSG - Turn OFF all NMEA msgs`

  - Click the green arrow to send it to the GPS device

2. Enable RMC messages
  - 
    1. At the bottom left, find CFG-MSG Message Rate Configuration

    - ![image](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/42ea2707c7168d4e6b133267ab3acee315bceac6.png)

  - 
    1. Scroll to find `RMC`

  - 
    1. Set the appropriate ports (e.g. USB, UART-1) value to 1

  - 
    1. Click the green arrow to send it to the GPS device

> 💡 **Tip:** Besides configuring the PPS: for each green arrow click, you should see the device’s output changes in PyGPSClient’s main dialog

* * *

## Hardware Interface and Connections

### Component connections

1. Connect the Ouster sensor to the Interface Box (provided in the box with the sensor). The IBOX comes in a kit which includes the IBOX unit, sensor cable, Ethernet cable ,and a AC-to-DC power supply.

2. Plug the ethernet cable into the designated port on the IBOX. Connect the other end to your PC (or USB-Ethernet converter). Provide power to the IBOX via the DC jack.

3. Power the SparkFun NEO-M9N board with a USB-C cable as shown and connect the other end to your PC.

4. Attach the antenna with U.FL connector to the GPS board where indicated (not shown). Place the antenna module outdoors, or near a window for a sufficient view of the sky.

 ![Component connections](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/043552ebadb0984bd7984392c47f9bda5d2202be.jpeg)

### GPS Pins + IBOX connections

1. Remove the clear, plastic cover from the IBOX using the torx screwdriver.

2. Using jumper wires, connect the PPS, GND and TX/MISO pin on the GPS board to the designated pins on the IBOX as shown in the table/figure below.

| NEO-M9N GPS Board pin | Goouuu Tech GT-U7 GPS | IBOX Pin |
| --- | --- | --- |
| PPS | PPS | SYNC\_PULSE\_IN |
| TX/MISO | TXD | MULTIPURPOSE\_IO |
| GND | GND | GND |

> ℹ **Note:** The pins are labelled on the back for the GT-U7 GPS

> ℹ **Note:** The PPS and TX/MISO pins on the tested boards do not require additional pull-up resistors or a voltage increase adapter. Connect them directly to the IBOX pins as described.
> 
> This may not be the case with other GPS/GNSS modules on the market. Please review the Ouster Hardware Manual for further details.

 ![NEO-M9N + IBOX connections](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/2f8df4459845d948dfa260813d6e9ef3133effe2.jpeg)

* * *

# Verification of Success

Once all prior steps are complete, follow the instructions below to check if the sensor is synchronized properly and reporting the expected values.

> ✅ **Note:** Once you have configured your GPS, it is good practice to verify the signals using an oscilloscope. This will ensure you have the correct baud rate, polarity, voltage, and message type being output.

 ![PPS Signal](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/ae9900cc2b967941b6e45b02095dead9128e3193.png)  
 ![NMEA UART Signal](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/47d8008856102fa252a1865bd8e29d5819b27da1.png)

## Query the status via Ouster API

### HTTP: [GET /api/v1/time/sensor](https://static.ouster.dev/sensor-docs/image_route1/image_route2/common_sections/API/http-api-v1.html#get-api-v1-time-sensor)

The sensor can be queried and configured using HTTP GET requests. This can be done using several different tools such as HTTPie, cURL, Advanced REST Client, etc. You can execute these queries from a command line application (e.g. Windows CMD, macOS & Linux Terminal)

Here are two examples using a curl command:

1. `curl -i http://os-991234567890/api/v1/time/sensor`
  - where 991234567890 represents the unique serial number of your device. This can be found on the sensor label as a reference.

2. `curl -i http://169.254.1.100/api/v1/time/sensor`
  - where 169.254.1.100 represents the set IPv4 address of the sensor

## Response from API Query

**From the outputted response below:**

```auto
{
    "multipurpose_io": {
        "mode": "INPUT_NMEA_UART",
        "nmea": {
            "baud_rate": "BAUD_9600",
            "diagnostics": {
                "decoding": {
                    "date_decoded_count": 384,
                    "last_read_message": "GPRMC,164853.00,A,4102.23151,N,08141.59407,W,0.052,,080823,,,D,V*16",
                    "not_valid_count": 0,
                    "utc_decoded_count": 384
                },
                "io_checks": {
                    "bit_count": 80332,
                    "bit_count_unfiltered": 80331,
                    "char_count": 27478,
                    "start_char_count": 393
                }
            },
            "ignore_valid_char": 0,
            "leap_seconds": 0,
            "locked": 1,
            "polarity": "ACTIVE_HIGH"
        },
        "sync_pulse_out": {
            "angle_deg": 360,
            "frequency_hz": 1,
            "polarity": "ACTIVE_HIGH",
            "pulse_width_ms": 10
        }
    },
    "sync_pulse_in": {
        "diagnostics": {
            "count": 401,
            "count_unfiltered": 363,
            "last_period_nsec": 0
        },
        "locked": 1,
        "polarity": "ACTIVE_HIGH"
    },
    "timestamp": {
        "mode": "TIME_FROM_SYNC_PULSE_IN",
        "time": 1691513333.6113698,
        "time_options": {
            "internal_osc": 399,
            "ptp_1588": 1651168147,
            "sync_pulse_in": 1691513333
        }
    }
}

```

1. **The sensor is locked on to the PPS signal**
  1. `"sync_pulse_in"` (line 32)
  2. `"locked": 1` (line 38).

> ✅`sync_pulse_in` is “locked”: **1**

1. **The sensor is locked on the NMEA signal**
  1. `"nmea"` (line 4)
  2. `"locked": 1` (line 22)

> ✅ `nmea` is “locked”: **1**

1. **The last read message looks like a valid GPRMC sentence**
  1. `"last_read_message"` (line 9)
  2. `"GPRMC,164853.00,A,4102.23151,N,08141.59407,W,0.052,,080823,,,D,V*16"`

GPRMC sentence structure and description: [GPRMC](https://docs.novatel.com/OEM7/Content/Logs/GPRMC.htm)

1. **The timestamp time has updated to a reasonable GPS time**
  1. `“timestamp”` (line 41)
  2. `"time": 1691513333.6113698` (line 43)

> ✅ “timestamp\_mode” is “TIME\_FROM\_SYNC\_PULSE\_IN”
> 
> “time”: Unix Epoch time [# of seconds since 00:00:00 January 1, 1970]

> 💡 **Tip:** When Epoch time is converted to a human-readable time (using an[![](https://canada1.discourse-cdn.com/flex004/uploads/ouster/original/1X/8e1aba2c45e1ff8a0c62455ad263478b0fdee36f.png)Epoch Converter](https://www.epochconverter.com/#tools) tool), the output should match both the date and time fields in the GPRMC sentence.
> 
> `1691513333.6113698` = Tuesday, August 8, 2023 12:48:53 PM GMT-04:00 DST (16:48:53 GMT)
