PX4-Autopilot/docs/en/dronecan/ark_x20_rtk_gps.md
Jacob Dahl 89855926ef
feat(sensors/gps): move GPS antenna offsets to per-receiver parameters (#26634)
* sensors: move GPS antenna offsets to per-receiver parameters

Move antenna position configuration from the single EKF2_GPS_POS_X/Y/Z
parameter set into per-receiver SENS_GPS{0,1}_OFF{X,Y,Z} parameters in
the sensors module. Each offset slot is matched to a physical receiver
by device ID (SENS_GPS{0,1}_ID), falling back to uORB instance index
when no IDs are configured.

The antenna offset is now carried through the SensorGps uORB message
and blended alongside other GPS states when multi-receiver blending is
active, so EKF2 receives the correct lever arm for whichever receiver
(or weighted combination) is selected.

- Add antenna_offset_{x,y,z} fields to SensorGps.msg
- Remove EKF2_GPS_POS_X/Y/Z params; EKF2 reads offset from gnssSample
- Add SENS_GPS{0,1}_ID and SENS_GPS{0,1}_OFF{X,Y,Z} params (module.yaml)
- Blend antenna offsets in GpsBlending (weighted average)
- Add unit tests for single, blended, and failover antenna offset cases
- Migrate params.c to module.yaml for the vehicle_gps_position module

* sensors: gps_blending: add asymmetric weight and fallthrough offset tests

Add two additional antenna offset test cases:

- dualReceiverAsymmetricWeightAntennaOffset: verify that unequal eph
  values produce correctly skewed blend weights (0.8/0.2) and that the
  output antenna offset reflects the weighted average
- blendingFallthroughAntennaOffset: verify that when blending is enabled
  but can_do_blending evaluates false (eph=0), the non-blending path
  correctly assigns the selected receiver's antenna offset

* feat(param_translation): translate EKF2_GPS_POS_ to SENS_GPS0_OFF_

* fix(msgs): proper formatting

* chore(msg): 0 if invalid/unknown

* fix(ROMFS): migrate EKF2_GPS_POS_ params

* fix(docs): migrate EKF2_GPS_POS_ params

* fix(blending): unsigned param

* Update msg/SensorGps.msg

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(sensors/gps): remove 'values:' tag in  module.yaml

* fix(sensors/gps): unsigned instance index

* fix(blending): restore const on gps_blend_states()

Move antenna offset blending into blend_gps_data() where the
weights are computed, keeping gps_blend_states() const.

* fix(sensors/gps): fix msg annotation and restore SENS_GPS_PRIME values

Remove incorrect @invalid NaN annotation from antenna offset fields
(0.0 default is correct, not a sentinel). Restore values tag for
SENS_GPS_PRIME so QGC shows a dropdown.

* fix(gps_blending): fix pre-existing bug to clear _gps_updated flags

The loop iterates over i but always clears gps_select_index. The intent is to clear
all updated flags, but only the selected one gets cleared (N times)

* test(gps_blending): add stale update flag regression test
2026-03-17 17:33:41 -08:00

7.5 KiB

ARK X20 RTK GPS

ARK X20 RTK GPS is an open source DroneCAN RTK GPS, u-blox ZED-X20P all-band high precision GNSS module, magnetometer, barometer, IMU, buzzer, and safety switch module.

ARK X20 RTK GPS

Where to Buy

Order this module from:

Hardware Specifications

  • Open Source Schematic and BOM
  • Sensors
    • Ublox ZED-X20P
      • All-band all constellation GNSS receiver
      • Best position accuracy and availability in different environments
      • RTK, PPP-RTK and PPP algorithms expanding the limits of performance
      • Highest quality GNSS raw data
      • u-blox end-to-end hardened security
      • 25Hz update rate
    • ST IIS2MDC Magnetometer
    • Bosch BMP390 Barometer
    • Invensense ICM-42688-P 6-Axis IMU
  • STM32F412VGH6 MCU
  • Safety Button
  • Buzzer
  • Two Pixhawk Standard CAN Connectors (4 Pin JST GH)
  • X20 “UART 2” Connector
    • 4 Pin JST GH
    • TX, RX, PPS, GND
  • I2C Expansion Connector
    • 4 Pin JST-GH
    • 5.0V, SCL, SDA, GND
  • Pixhawk Standard Debug Connector (6 Pin JST SH)
  • LED Indicators
    • Safety LED
    • GPS Fix
    • RTK Status
    • RGB system status
  • USA Built
  • Power Requirements
    • 5V
    • 144mA Average
    • 157mA Max

Hardware Setup

Wiring

The ARK X20 RTK GPS is connected to the CAN bus using a Pixhawk standard 4 pin JST GH cable. For more information, refer to the CAN Wiring instructions.

Mounting

The recommended mounting orientation is with the connectors on the board pointing towards the back of vehicle.

The sensor can be mounted anywhere on the frame, but you will need to specify its position, relative to vehicle centre of gravity, during PX4 configuration.

Firmware Setup

ARK X20 RTK GPS runs the PX4 cannode firmware. As such, it supports firmware update over the CAN bus and dynamic node allocation.

ARK X20 RTK GPS boards ship with recent firmware pre-installed, but if you want to build and flash the latest firmware yourself, refer to the cannode firmware build instructions.

Firmware target: ark_can-rtk-gps_default Bootloader target: ark_can-rtk-gps_canbootloader

Flight Controller Setup

Enabling DroneCAN

In order to use the ARK X20 RTK GPS, connect it to the Pixhawk CAN bus and enable the DroneCAN driver by setting parameter UAVCAN_ENABLE to 2 for dynamic node allocation (or 3 if using DroneCAN ESCs).

The steps are:

Once enabled, the module will be detected on boot. GPS data should arrive at 10Hz.

PX4 Configuration

You need to set necessary DroneCAN parameters and define offsets if the sensor is not centred within the vehicle:

ARK X20 RTK GPS Configuration

You may need to configure the following parameters on the ARK X20 RTK GPS itself:

Parameter Description
CANNODE_NODE_ID CAN node ID (0 for dynamic allocation). If set to 0 (default), dynamic node allocation is used. Set to 1-127 to use a static node ID.
CANNODE_TERM CAN built-in bus termination. Set to 1 if this is the last node on the CAN bus.

Setting Up Rover and Fixed Base

Position of the rover is established using RTCM messages from the RTK base module (the base module is connected to QGC, which sends the RTCM information to PX4 via MAVLink).

PX4 DroneCAN parameters:

Rover module parameters (also set using QGC):

::: info Use UAVCAN_PUB_MBD and CANNODE_SUB_MBD instead if you want to implement moving base (see below) at the same time. :::

For more information see Rover and Fixed Base in the DroneCAN guide.

LED Meanings

  • The GPS status lights are located to the right of the connectors

    • Blinking green is GPS fix
    • Blinking blue is received corrections and RTK Float
    • Solid blue is RTK Fixed
  • The CAN status lights are located top the left of the connectors

    • Slow blinking green is waiting for CAN connection
    • Fast blinking green is normal operation
    • Slow blinking green and blue is CAN enumeration
    • Fast blinking blue and red is firmware update in progress
    • Blinking red is error
      • If you see a red LED there is an error and you should check the following
        • Make sure the flight controller has an SD card installed
        • Make sure the ARK X20 RTK GPS has ark_can-rtk-gps_canbootloader installed prior to flashing ark_can-rtk-gps_default
        • Remove binaries from the root and ufw directories of the SD card and try to build and flash again

See Also