Skip to main content
GNSS HAT Library Documentation
Shop GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

RTK

The RTK HAT (NEO-F9P) supports centimeter-level positioning using RTCM3 corrections.

Note
HAT Compatibility — RTK is available only on the L1/L5 RTK HAT (NEO-F9P).

RtkConfig

FieldC++ TypeDescription
modeERtkModeBase or Rover
baseoptional<BaseConfig>Base station configuration. Required when mode = Base

RTK Modes

ValueC++PythonDescription
BaseERtkMode::Basegnsshat.RtkMode.BASEGenerate RTCM3 corrections
RoverERtkMode::Rovergnsshat.RtkMode.ROVERConsume RTCM3 corrections for cm-level fix

Base Configuration

The base station needs to know its precise position. Two modes:

Survey-In

The module auto-determines its position by observing satellites over a configurable period and accuracy threshold.

FieldTypeDescription
minimumObservationTime_suint32_tMinimum observation time in seconds
requiredPositionAccuracy_mdoubleRequired 3D position accuracy in meters

Fixed Position

Provide known coordinates directly, skipping the survey phase. Supports ECEF or LLA.

ECEF (Earth-Centered, Earth-Fixed):

FieldTypeDescription
x_mdoubleX coordinate in meters
y_mdoubleY coordinate in meters
z_mdoubleZ coordinate in meters
positionAccuracy_mdoublePosition accuracy in meters

LLA (Latitude, Longitude, Altitude):

FieldTypeDescription
latitude_degdoubleLatitude in degrees
longitude_degdoubleLongitude in degrees
height_mdoubleHeight above ellipsoid in meters
positionAccuracy_mdoublePosition accuracy in meters

Base Examples

config.rtk = RtkConfig {
    .mode = ERtkMode::Base,
    .base = BaseConfig {
        .mode = BaseConfig::SurveyIn {
            .minimumObservationTime_s = 60,
            .requiredPositionAccuracy_m = 2.0
        }
    }
};
config['rtk'] = {
    'mode': gnsshat.RtkMode.BASE,
    'base': {
        'base_mode': gnsshat.BaseMode.SURVEY_IN,
        'survey_in': {
            'minimum_observation_time_s': 60,
            'required_position_accuracy_m': 2.0
        }
    }
}
config.rtk = RtkConfig {
    .mode = ERtkMode::Base,
    .base = BaseConfig {
        .mode = BaseConfig::FixedPosition {
            .position = BaseConfig::FixedPosition::Lla {
                .latitude_deg = 52.2297,
                .longitude_deg = 21.0122,
                .height_m = 120.0
            },
            .positionAccuracy_m = 0.01
        }
    }
};
jp_gnss_gnss_config_t config;
jp_gnss_gnss_config_init(&config);
config.rtk.mode = JP_GNSS_RTK_MODE_BASE;
config.rtk.base.base_mode = JP_GNSS_BASE_MODE_FIXED_POSITION;
config.rtk.base.fixed_position.type = JP_GNSS_FIXED_POSITION_LLA;
config.rtk.base.fixed_position.lla.latitude_deg = 52.2297;
config.rtk.base.fixed_position.lla.longitude_deg = 21.0122;
config.rtk.base.fixed_position.lla.height_m = 120.0;
config.rtk.base.fixed_position.position_accuracy_m = 0.01;
jp_gnss_hat_start(hat, &config);
config['rtk'] = {
    'mode': gnsshat.RtkMode.BASE,
    'base': {
        'base_mode': gnsshat.BaseMode.FIXED_POSITION,
        'fixed_position': {
            'lla': {
                'latitude_deg': 52.2297,
                'longitude_deg': 21.0122,
                'height_m': 120.0
            },
            'position_accuracy_m': 0.01
        }
    }
}

Rover Examples

config.rtk = RtkConfig {
    .mode = ERtkMode::Rover
};
jp_gnss_gnss_config_t config;
jp_gnss_gnss_config_init(&config);
config.rtk.mode = JP_GNSS_RTK_MODE_ROVER;
jp_gnss_hat_start(hat, &config);
config['rtk'] = {
    'mode': gnsshat.RtkMode.ROVER
}

See RTK Feature for runtime correction flow and NTRIP usage.