Moving Baseline Configuration
Moving Baseline is a dual-antenna technique that derives accurate heading (yaw) directly from two GPS modules mounted on the same vehicle — no magnetometer required. The Orbit Neo Plus supports this natively via its u-blox ZED-F9P chipset and DroneCAN interface.
How It Works
Two Orbit Neo Plus units are mounted on the vehicle. One is designated the Master (Base) and the other the Slave (Rover). The Master sends RTCM correction data to the Slave over the CAN bus. By computing the precise vector between the two antennas, the system derives a highly accurate heading.
Before You Begin
What You Need
- 2× Orbit Neo Plus units
- A CAN bus splitter
- Flight controller running ArduPilot 4.1.5+ or PX4 1.12.3+
- Mission Planner (ArduPilot) or QGroundControl (PX4)
Antenna Placement Rules
Getting the physical mounting right is the most important step. Follow these rules before touching any parameters:
- Minimum separation: 30 cm between the two antennas — more separation means better heading accuracy
- Same height — both antennas must be at the same vertical level on the vehicle
- Same orientation — both units should face the same direction
- Front-to-back alignment — ideally mount Master at the front and Slave at the rear, along the vehicle’s forward (0° yaw) axis
- Same CAN bus — both units must connect to the same CAN bus; use a CAN splitter
Step 1 — Physical Connections
- Connect both Orbit Neo Plus units to the CAN bus using a CAN splitter
- Connect the splitter output to CAN1 (or CAN2) on your flight controller
- Power on the flight controller
Step 2 — Measure and Record Your Offsets
Before configuring parameters, physically measure and write down two sets of offsets. You will need these in later steps.
A. Master–Slave Antenna Offset
This is the position of the Master antenna relative to the Slave antenna.

Measure the distance between the two antennas in each axis:
| Axis | Positive Direction | Parameter |
|---|---|---|
| X | Master is in front of Slave | GPS1_MB_OFS_X |
| Y | Master is to the right of Slave | GPS1_MB_OFS_Y |
| Z | Master is below Slave | GPS1_MB_OFS_Z |
Example: If your Master is mounted 40 cm directly to the right side of the Slave at the same height:
GPS1_MB_OFS_X=0.00GPS1_MB_OFS_Y=0.40GPS1_MB_OFS_Z=0.00
B. Master Antenna Offset from Vehicle CG
This is the position of the Master antenna relative to the vehicle’s Center of Gravity (CG). This step is optional but recommended for centimeter-level accuracy.

| Axis | Positive Direction | Parameter |
|---|---|---|
| X | Master is in front of CG | GPS1_POS_X |
| Y | Master is to the right of CG | GPS1_POS_Y |
| Z | Master is below CG | GPS1_POS_Z |
Keep these values handy — you will enter them into the parameter list in the next steps.
Step 3 — Configure Parameters
Choose your firmware below and follow the corresponding steps.
ArduPilot Setup
Open Mission Planner → Config → Full Parameter List.
3a. Enable DroneCAN
| Parameter | Value | Description |
|---|---|---|
CAN_D1_PROTOCOL | 1 | Enable DroneCAN on CAN1 |
CAN_P1_DRIVER | 1 | Enable CAN1 driver |
3b. Set GPS Types
| Parameter | Value | Description |
|---|---|---|
GPS1_TYPE | 22 | DroneCAN Moving Baseline Master (Base) |
GPS2_TYPE | 23 | DroneCAN Moving Baseline Slave (Rover) |
GPS_AUTO_CONFIG | 2 | Auto-configure DroneCAN GPS for Moving Baseline |
GPS_DRV_OPTIONS | 8 | Route RTCM correction data between units via CAN |
3c. Configure EKF for GPS Yaw
| Parameter | Value | Description |
|---|---|---|
AHRS_EKF_TYPE | 3 | Use EKF3 |
EK2_ENABLE | 0 | Disable EKF2 |
EK3_ENABLE | 1 | Enable EKF3 |
EK3_SRC1_YAW | 2 | GPS yaw source — use 3 to allow compass as fallback |
Warning: Do not set
GPS_AUTO_SWITCH = 2(Blend) — it is incompatible with Moving Baseline.
3d. Set Master–Slave Antenna Offsets
These are the values you measured in Step 2A.
| Parameter | Value | Description |
|---|---|---|
GPS1_MB_TYPE | 1 | Enable Master–Slave offset entry for GPS1 |
GPS1_MB_OFS_X | (your measurement) | Master offset from Slave — X axis (m) |
GPS1_MB_OFS_Y | (your measurement) | Master offset from Slave — Y axis (m) |
GPS1_MB_OFS_Z | (your measurement) | Master offset from Slave — Z axis (m) |
3e. Set Master Antenna Offset from CG (optional)
These are the values you measured in Step 2B.
| Parameter | Value | Description |
|---|---|---|
GPS1_POS_X | (your measurement) | Master antenna offset from CG — X axis (m) |
GPS1_POS_Y | (your measurement) | Master antenna offset from CG — Y axis (m) |
GPS1_POS_Z | (your measurement) | Master antenna offset from CG — Z axis (m) |
Note:
GPS1_CAN_NODEIDandGPS2_CAN_NODEIDshow the auto-assigned node IDs after boot. If the wrong unit is being assigned as Master or Slave, useGPS1_CAN_OVRIDEandGPS2_CAN_OVRIDEto swap them.
3f. Write and Reboot
- Click Write Params
- Reboot the flight controller
PX4 Setup
Open QGroundControl → Vehicle Setup → Parameters.
3a. Enable DroneCAN
| Parameter | Value | Description |
|---|---|---|
UAVCAN_ENABLE | 2 | Enable DroneCAN with dynamic node allocation |
Reboot the flight controller so both nodes are detected.
3b. Configure Each Node
In QGroundControl, go to Parameters → DroneCAN and locate the two ZED-F9P nodes by their component IDs.
On the Master (Base) node:
| Parameter | Value | Description |
|---|---|---|
GPS_TYPE | 17 | Moving Baseline Base |
GPS_AUTO_CONFIG | 1 | Enable auto-configuration |
GPS_POS_X | (your measurement) | Antenna offset from autopilot — X (m) |
GPS_POS_Y | (your measurement) | Antenna offset from autopilot — Y (m) |
GPS_POS_Z | (your measurement) | Antenna offset from autopilot — Z (m) |
On the Slave (Rover) node:
| Parameter | Value | Description |
|---|---|---|
GPS_TYPE | 18 | Moving Baseline Rover |
GPS_AUTO_CONFIG | 1 | Enable auto-configuration |
GPS_POS_X | (your measurement) | Antenna offset from autopilot — X (m) |
GPS_POS_Y | (your measurement) | Antenna offset from autopilot — Y (m) |
GPS_POS_Z | (your measurement) | Antenna offset from autopilot — Z (m) |
3c. Set Autopilot Parameters
| Parameter | Value | Description |
|---|---|---|
UAVCAN_SUB_GPS_R | 1 | Subscribe to GNSS relative data from Rover |
EKF2_GPS_CTRL | 15 | Enable dual antenna heading fusion |
EKF2_GPS_YAW_OFF | (see table below) | Angle from Base to Rover orientation |
For EKF2_GPS_YAW_OFF, use the value that matches your mounting:
| Rover position relative to Base | Value |
|---|---|
| Rover in front of Base | 0 |
| Rover to the right of Base | 90 |
| Rover behind Base | 180 |
| Rover to the left of Base | 270 |
3d. Write and Reboot
- Save all parameters
- Reboot the flight controller
Step 4 — Verify
Once the flight controller has rebooted and both units have a GNSS fix, run these checks:
Indicator Check
- The RTK Status LED on both Orbit Neo Plus units should be off, indicating a Fixed RTK lock
Heading Check
- Take the vehicle outside to an open area with a clear sky view
- Point the vehicle at a known distant landmark
- Confirm the heading shown in Mission Planner / QGroundControl matches the physical direction
- Slowly rotate the vehicle 360° and verify the heading updates correctly throughout
If the heading appears reversed, your
GPS1_MB_OFSorGPS_POSvalues are likely swapped — recheck which unit is Master and which is Slave.
ArduPilot RTK Validation
ArduPilot performs additional checks before accepting the Moving Baseline heading. It verifies that:
- The Slave GPS is in Fix Type 6 (Fixed RTK)
- The measured distance between the two modules matches your configured offset within 20%
- The height difference between the two modules is consistent with the vehicle’s attitude within 20% of the antenna separation distance
It can take a few minutes after obtaining a GNSS fix for all three conditions to be met. This is normal.
RTK Correction (Optional)
ArduPilot automatically forwards RTCM correction data received from a ground station or telemetry radio to both GPS units. This allows simultaneous use of a fixed RTK base station alongside Moving Baseline for both centimeter-level position and heading accuracy — no additional configuration is required.