BeiDou PRN Reassignment (April 2026)¶
Between 2026-04-10 and 2026-04-21 BeiDou retired most BDS-2 satellites and moved BDS-3 satellites onto the PRNs they freed. Since then, PRN 1–18 is no longer a reliable marker of BDS-2: most of C01–C14 are now BDS-3, and two BDS-2 satellites are still in service on C09 and C10.
MRTKLIB (like MADOCALIB 2.2) cannot tell the generation of a satellite on PRN 1–18 from the data. You tell it with two configuration keys:
| Key | Section | Meaning | Default |
|---|---|---|---|
bds2_sats | [positioning] | Which of PRN 1–18 are BDS-2 | none (all BDS-3) |
bds3_igso_sats | [ambiguity_resolution] | Which PRNs are BDS-3 IGSO (PPP-AR only) | C06-C08 |
Set bds2_sats whenever BeiDou is enabled
With the default, every satellite on PRN 1–18 is treated as BDS-3, which is wrong for C09/C10 today and for every PRN 1–18 satellite in data taken before 2026-04-10. mrtk post and mrtk run print a warning when BeiDou is enabled and bds2_sats is absent from the configuration.
Which value to use¶
| Data taken | bds2_sats | bds3_igso_sats |
|---|---|---|
| Before 2026-04-10 | ["C01-C18"] | ["C38-C40"] |
| After 2026-04-21 (current) | ["C09", "C10"] | leave unset (C06-C08) |
| 2026-04-10 to 2026-04-21 | no single list is right, see below |
[positioning]
systems = ["GPS", "Galileo", "QZSS", "BeiDou"]
bds2_sats = ["C09", "C10"] # data after 2026-04-21
[ambiguity_resolution]
# bds3_igso_sats not set: C06-C08
[positioning]
systems = ["GPS", "Galileo", "QZSS", "BeiDou"]
bds2_sats = ["C01-C18"] # data before 2026-04-10
[ambiguity_resolution]
bds3_igso_sats = ["C38-C40"]
Entries are BeiDou satellite IDs ("C09") or ranges ("C01-C18"), in any mix.
bds2_satsonly accepts PRN 1–18. PRN 19 and above are always BDS-3.- An empty list
bds2_sats = []means "no BDS-2". It is the same as the default, but it counts as set, so it silences the warning. Use it only when you know the data has no BDS-2 satellite. - An empty or absent
bds3_igso_satsmeansC06-C08. - An invalid list falls back to the default. The run prints a warning.
Why the generation matters¶
MRTKLIB keeps BDS-2 and BDS-3 apart wherever they behave differently:
- Signals and frequencies. BDS-2 uses B1I / B3I / B2I. BDS-3 uses B1I / B3I plus B1C / B2a / B2b, and does not transmit B2I. The
[signals]bds2andbds3presets select the frequency slots per generation. - Receiver clock and biases. SPP and PPP estimate a separate BDS-2 clock offset / inter-system bias.
- RINEX reading. Observation codes are mapped to frequency slots per generation.
- PPP-AR. Ambiguities are differenced within each generation. IGSO and BDS-2 satellites are never taken as reference satellites, and are dropped first in partial AR.
- MADOCA-PPP (IS-QZSS-MDC-005). A BDS-3 satellite on PRN 1–18 may be sent in GNSS ID 3, and its signal mask is then read with the BDS-3 signal table. A wrong
bds2_satsgives its code and phase biases the wrong signal codes.
A satellite classified as the wrong generation either loses its observations (no matching frequency) or contaminates the filter with a wrong signal model.
What changed in April 2026¶
PRN assignments from the IGS satellite metadata (see also the IGSMAIL notices, e.g. IGSMAIL-8693):
Dates are the day the new satellite took the PRN; "was" gives its previous PRN.
| PRN | Before 2026-04-10 | Since | Now |
|---|---|---|---|
| C01 | BDS-2 GEO | 04-20 | BDS-3 GEO (was C59) |
| C02 | BDS-2 GEO | 04-17 | BDS-3 GEO (was C60) |
| C03 | BDS-2 GEO | 04-18 | BDS-3 GEO (was C61) |
| C04 | BDS-2 GEO | 04-21 | BDS-3 GEO (was C62) |
| C05 | BDS-2 GEO | 04-21 | unused |
| C06 | BDS-2 IGSO | 04-10 | BDS-3 IGSO (was C38) |
| C07 | BDS-2 IGSO | 04-17 | BDS-3 IGSO (was C39) |
| C08 | BDS-2 IGSO | 04-17 | BDS-3 IGSO (was C40) |
| C09 | BDS-2 IGSO | 04-18 | BDS-2 IGSO (IGSO-6, was C13) |
| C10 | BDS-2 IGSO | 04-18 | BDS-2 IGSO (IGSO-7, was C16) |
| C11 | BDS-2 MEO | 04-20 | BDS-3 MEO (was C47) |
| C12 | BDS-2 MEO | 04-21 | BDS-3 MEO (was C48) |
| C13 | BDS-2 IGSO | 04-19 | BDS-3 MEO (was C49) |
| C14 | BDS-2 MEO | 04-19 | BDS-3 MEO (was C50) |
| C16 | BDS-2 IGSO | 04-18 | unused (moved to C10) |
| C38 | BDS-3 IGSO | 04-20 | BDS-3 MEO (was C43) |
| C39 | BDS-3 IGSO | 04-19 | BDS-3 MEO (was C45) |
| C40 | BDS-3 IGSO | 04-21 | BDS-3 MEO (was C46) |
The IGSO change is why bds3_igso_sats exists. Before April the BDS-3 IGSO satellites were C38–C40; today they are C06–C08, and C38–C40 are MEO.
Checking your own data
B1C (C1P/C1D/C1X) and B2a (C5P/C5D/C5X) are BDS-3-only signals. A PRN 1–18 satellite tracked on them is BDS-3; one tracked only on B1I / B3I / B2I is BDS-2 (or a receiver that does not track the new signals).
Data from the transition window¶
Between 2026-04-10 and 2026-04-21 PRNs changed generation one by one, and some changed in the middle of a day. A single bds2_sats list cannot describe such a day. Two options:
- Process with the list that matches the end of your session. Then add the PRNs that changed during the session to
[positioning] excluded_sats. - Leave BeiDou out. Drop it from
systemsfor those days.
Bundled configurations¶
| File | Data | bds2_sats | bds3_igso_sats |
|---|---|---|---|
conf/madocalib/rnx2rtkp_pppar.toml, rnx2rtkp_pppar_iono.toml | MADOCALIB 2.0 sample (2025) | C01-C18 | C38-C40 |
conf/madocalib/rnx2rtkp_pppar_mdc005.toml | MADOCALIB 2.2 sample | C09, C10 | default |
conf/madocalib/rtkrcv_madoca_pppar_iono.toml | live (mrtk run) | C09, C10 | default |
conf/igs/rnx2rtkp_iflc_fallback.toml | IGS test data, 2026-05-01 | C09, C10 | default |
conf/benchmark/rtk.toml, single.toml | PPC / GSDC (2020–2023) | C01-C18 | — |
When you adapt a bundled configuration to your own data, check these two keys against the table above.
Legacy .conf files and MADOCALIB¶
The keys correspond to MADOCALIB 2.2's options:
| TOML | Legacy .conf |
|---|---|
[positioning] bds2_sats = ["C09", "C10"] | pos2-bds2prn = C09,C10 |
[ambiguity_resolution] bds3_igso_sats = ["C38-C40"] | pos2-bds3igso = C38-C40 |
The defaults are the same as MADOCALIB 2.2: no BDS-2 and IGSO C06-C08. MADOCALIB 2.1 and earlier classified PRN 1–18 as BDS-2 and C38–C40 as IGSO unconditionally. To reproduce them, use ["C01-C18"] / ["C38-C40"].
The setting is process-wide. mrtk post applies it before reading the input files; mrtk run applies it when the server starts.
mrtk bias reads no configuration file. Give the list on the command line with -bds2prn (--bds2-sats), e.g. -bds2prn C09,C10, the same option name as MADOCALIB 2.2's cssr2ssr. Without it, every PRN 1–18 satellite is BDS-3 and a warning is printed; -bds2prn "" states "no BDS-2".