RTCM3.3电文信号数据的筛选和重新播发

本文尽可能详细的介绍下RTCM电文信号数据的筛选和重新播发,以消息类型GPS MSM4为例(初学者,如有错误欢迎批评与指正)。

参考的相关文档与文章如下:

GitHub - MichaelBeechan/RTCM3.3: RTCM3.3

AN018_RTCM3.2格式说明_北云科技.pdf (bynav.com)

RTCM3.3电文信号,消息类型GPS MSM4的解码_rtcm3.3协议-CSDN博客

参考的源代码如下:

RTKLIB: An Open Source Program Package for GNSS Positioning

1.RTCM电文信号构成

(1)电文结构解析

例:

D3 00 8A 43 20 00 40 7F 79 82 00 20 00 22 80 65 80 00 00 00 20 20 00 00 7F FF A7 22 26 26 22 A6 A2 A3 20 FD DC 05 9F 5B 1B C6 36 1C 86 77 0E 32 33 7C 61 97 B4 0F 5E 7F E6 BF DF F8 73 F1 3A 5F 88 BD 49 6B 82 BC A6 C4 CD 85 86 FD F4 1A C0 FF B8 38 01 77 CC 78 42 7D EC C5 40 18 A1 81 7B EC 86 04 76 0F EE 28 53 6E E0 84 36 09 22 26 0C 72 80 D3 4C C2 8E 7A 7F FF FF FF FF FF FF FF 80 00 57 4E 18 59 3D 75 E5 8D D3 E7 86 58 80 71 CE 42

将电文信号转为2进制为:

110100110000000010001010010000110010000000000000010000000111111101111001100000100000000000100000000000000010001010000000011001011000000000000000000000000000000000100000001000000000000000000000011111111111111110100111001000100010011000100110001000101010011010100010101000110010000011111101110111000000010110011111010110110001101111000110001101100001110010000110011101110000111000110010001100110111110001100001100101111011010000001111010111100111111111100110101111111101111111111000011100111111000100111010010111111000100010111101010010010110101110000010101111001010011011000100110011011000010110000110111111011111010000011010110000001111111110111000001110000000000101110111110011000111100001000010011111011110110011000101010000000001100010100001100000010111101111101100100001100000010001110110000011111110111000101000010100110110111011100000100001000011011000001001001000100010011000001100011100101000000011010011010011001100001010001110011110100111111111111111111111111111111111111111111111111111111111111111100000000000000001010111010011100001100001011001001111010111010111100101100011011101001111100111100001100101100010000000011100011100111001000010

以下为官方文档对MSM4的数据分析:

电文结构:

此处数据举例为GPS MSM4:

数据区各个Data Field的含义和所占长度:

以下为自己整理的数据分析结果:

结构数据内容比特数/bits备注示例
引导字同步码811010011
保留字保留60000000
消息长度信息长度10见注110001010
可变长度信息信息类型12见注210000110010
基准站 ID120000000000000
GNSS 历元时间30010000000111111101111001100000
MSM 多信息标志11
IODS3000
预留70000000
锁定引导标志201
扩展锁定标志200
GNSS 平滑类型标志10
GNSS 平滑区间3000
GNSS 卫星掩码64见注30000000001000101000000001100101100000000000000000000000000000000
GNSS 信号掩码32见注401000000010000000000000000000000
GNSS Cell Maskx见注51111111111111111
GNSS 卫星粗略距离8

整毫秒

(见注6)

01001110
01000100
01001100
01001100
01000101
01001101
01000101
01000110
GNSS 卫星粗略距离10

毫秒内

(见注6)

0100000111
1110111011
1000000010
1100111110
1011011000
1101111000
1100011011
0000111001
GNSS 信号伪距15见注7000011001110111
000011100011001
000110011011111
000110000110010
111101101000000
111101011110011
111111110011010
111111110111111
111100001110011
111100010011101
001011111100010
001011110101001
001011010111000
001010111100101
001101100010011
001101100001011
GNSS 信号载波相位22见注70000110111111011111010
0000110101100000011111
1111011100000111000000
0000101110111110011000
1111000010000100111110
1111011001100010101000
0000001100010100001100
0000101111011111011001
0000110000001000111011
0000011111110111000101
0000101001101101110111
0000010000100001101100
0001001001000100010011
0000011000111001010000
0001101001101001100110
0001010001110011110100
GNSS 载波相位 锁定时间标志4见注71111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
1111
半周模糊度标志1见注70
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
GNSS 信号载噪比6见注7101011
101001
110000
110000
101100
100111
101011
101011
110010
110001
101110
100111
110011
110000
110010
110001
多余的7bits7见注80000000
冗余校验CRC24011100011100111001000010

注1:

消息长度为10001010,转10进制为138,即可变长度消息共有138对16进制数(例:43为一对),也就是138*2=276个16进制数,共有276*4=1104bits

注2:

信息类型为10000110010,转10进制为1074,通过查RTCM3消息类型可得,此处指“多信号消息”(MSM):1074 型,全 GPS 伪距和载波相位加信号强度(文章最后会附上RTCM3所有消息类型)

注3:

GNSS 卫星掩码分析:

0000000001000101000000001100101100000000000000000000000000000000
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

1代表观测到了该卫星,此处有10号,14号,16号,25号,26号,29号,31号,32号卫星,即卫星数Nsat=8

注4:

GNSS 信号掩码分析:

通过上表可得:

01000000010000000000000000000000
1234567891011121314151617181920212223242526272829303132
1C1P1W2C2P2W2S2L2X5I5Q5X1S1L1X

解码得信号为1C,2W,即信号数Nsig=2

注5:

此处GNSS Cell Mask的长度 x=Ncell=Nsat*Nsig=16

此处cell mask为:1111111111111111,则信号位图表为:

1014162526293132
1C11111111
2W11111111

信号位图表确定了不同类型观测值的排列顺序,即:

10号卫星1C频率的观测值10号卫星2W频率的观测值14号卫星1C频率的观测值...31号卫星2W频率的观测值32号卫星1C频率的观测值32号卫星2W频率的观测值

注6:

GNSS 卫星粗略距离一个是整毫秒的数据,一个是毫秒内的数据,共有Nsat个卫星数据,按上述解码的卫星顺序排列,即10,14,16,25,26,29,31,32

注7:

这5个数据字段的值分别按注5的观测顺序排列,因此每个数据字段共有Ncell个值

注8:

信息长度138*8与169+10*(18+49*2)相比多出7bits,具体原因我也不太清楚

(2)通过Java实现数据过滤

主函数:

public static void main(String[] args) {
        String oldRtcm = "D3 00 8A 43 20 00 40 7F 79 82 00 20 00 22 80 65 80 00 00 00 20 20 00 \n" +
                "00 7F FF A7 22 26 26 22 A6 A2 A3 20 FD DC 05 9F 5B 1B C6 36 1C 86 77 0E \n" +
                "32 33 7C 61 97 B4 0F 5E 7F E6 BF DF F8 73 F1 3A 5F 88 BD 49 6B 82 BC A6 \n" +
                "C4 CD 85 86 FD F4 1A C0 FF B8 38 01 77 CC 78 42 7D EC C5 40 18 A1 81 7B \n" +
                "EC 86 04 76 0F EE 28 53 6E E0 84 36 09 22 26 0C 72 80 D3 4C C2 8E 7A 7F FF \n" +
                "FF FF FF FF FF FF 80 00 57 4E 18 59 3D 75 E5 8D D3 E7 86 58 80 71 CE 42";
        oldRtcm = oldRtcm.replaceAll("\\s+", "");
        System.out.println("原RTCM数据:" + oldRtcm);

        String oldData = oldRtcm;

        byte[] oldRtcmTo2 = parseHexStr2Byte(oldRtcm);//转2进制
        Obs_T obsT = new Obs_T();
        obsT.init();//初始化Obs_T对象
        Rtcm_T rtcm = new Rtcm_T();
        rtcm.obs.data = obsT.data;
        for (int i = 0; i < oldRtcmTo2.length; i++) {
            String newRtcm = RtcmDecode.input_rtcm3(rtcm, oldRtcmTo2[i], oldData);
            if (!"0".equals(newRtcm)) {
                System.out.println("新RTCM数据:" + newRtcm);
            }
        }
    }

一般数据都是多包发过来的,这个方法可以将多包数据解析成单条数据进行解码:

public static String input_rtcm3(Rtcm_T rtcm, byte data, String oldData) {
        if (rtcm.nbyte == 0) {
            if (data != -45) {
                return "0";
            }
            rtcm.buff[rtcm.nbyte++] = data;
            return "0";
        }
        rtcm.buff[rtcm.nbyte++] = data;
        if (rtcm.nbyte == 3) {
            rtcm.len = RtcmUtils.getbitu(rtcm.buff, 14, 10) + 3;
        }
        if (rtcm.nbyte < 3 || rtcm.nbyte < rtcm.len + 3) {
            return "0";
        }
        rtcm.nbyte = 0;
        if (RtcmUtils.rtk_crc24q(rtcm.buff, rtcm.len) != RtcmUtils.getbitu(rtcm.buff, rtcm.len * 8, 24)) {
            return "0";
        }
        return decode_rtcm3(rtcm, oldData);
    }

单条数据解码:

private static String decode_rtcm3(Rtcm_T rtcm, String oldData) {
        double tow;
        String ret = null;
        int type = RtcmUtils.getbitu(rtcm.buff, 24, 12);//获取信号类型
        Integer[] week = {0};
        String optStr = new String(rtcm.opt);
        if (RtcmUtils.strStr(optStr, "-RT_INP") != 0) {
            tow = RtcmUtils.time2gpst(RtcmUtils.utc2gpst(RtcmUtils.timeget()), week);
            rtcm.time = RtcmUtils.gpst2time(week[0], Math.floor(tow));
        }
        //判断是哪个信号类型
        switch (type) {
            case 1074:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_GPS, oldData);
                break;
            case 1084:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_GLO, oldData);
                break;
            case 1094:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_GAL, oldData);
                break;
            case 1104:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_SBS, oldData);
                break;
            case 1114:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_QZS, oldData);
                break;
            case 1124:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_CMP, oldData);
                break;
            case 1134:
                ret = decode_msm4(rtcm, RtcmCommon.SYS_IRN, oldData);
                break;
        }
//        if (ret >= 0) {
//            if (1001 <= type && type <= 1299) {
//                rtcm.nmsg3[type - 1000]++;
//            } else if (4070 <= type && type <= 4099) {
//                rtcm.nmsg3[type - 3770]++;
//            } else {
//                rtcm.nmsg3[0]++;
//            }
//        }
        return ret;
    }

此处测试数据为GPS MSM4,解码过程中将需要的信号类型数据取出进行重新编码并返回新的RTCM电文信号,主要思路就是将原RTCM数据各部分分别存起来,在解析数据的时候把需要的信号和对应的数据存起来,其他不需要的信号和数据剔除,重新计算messageLength和crc后将各个部分重新拼接在一起重新播发出去,目的是过滤掉不想看到的信号数据:

private static String decode_msm4(Rtcm_T rtcm, int sys, String oldData) {
        String dataTo2 = Rtcm.hex2bin(oldData);//转2进制


        Msm_H_T h = new Msm_H_T();
        double[] r = new double[64];
        double[] pr = new double[64];
        double[] cp = new double[64];
        double[] cnr = new double[64];
        Integer[] sync = {0};
        Integer[] iod = {0};
        Integer[] i = {0};
        int j, ncell, rng, rng_m, prv, cpv;
        int[] lock = new int[64];
        int[] half = new int[64];
        ncell = decode_msm_head(rtcm, sys, sync, iod, h, i);
        if (ncell < 0) {
            return "-1";
        }
        if (i[0] + h.nsat * 18 + ncell * 48 > rtcm.len * 8) {
            return "-1";
        }
        for (j = 0; j < h.nsat; j++) {
            r[j] = 0.0;
        }
        for (j = 0; j < ncell; j++) {
            pr[j] = cp[j] = -1E16;
        }
        for (j = 0; j < h.nsat; j++) {
            rng = RtcmUtils.getbitu(rtcm.buff, i[0], 8);//GNSS 卫星粗略距离(整毫秒)
            i[0] += 8;
            if (rng != 255) {
                r[j] = rng * RtcmCommon.RANGE_MS;
            }
        }
        for (j = 0; j < h.nsat; j++) {
            rng_m = RtcmUtils.getbitu(rtcm.buff, i[0], 10);//GNSS 卫星粗略距离(毫秒内)
            i[0] += 10;
            if (r[j] != 0.0) {
                r[j] += rng_m * RtcmCommon.P2_10 * RtcmCommon.RANGE_MS;
            }
        }


        //将数据缓存至RtcmData中
        List<int[]> result = new ArrayList<>();
        for (int a = 0; a < h.nsat; a++) {
            for (int b = 0; b < h.nsig; b++) {
                int[] combination = new int[2];
                combination[0] = h.sats[a];
                combination[1] = h.sigs[b];
                result.add(combination);
            }
        }
        RtcmData rtcmData = new RtcmData();
        rtcmData.initData(ncell);
        String cellMask = dataTo2.substring(24 + 169, 24 + 169 + ncell);//cellMask
        String[] cellMaskArr = cellMask.split("");
        for (j = 0; j < result.size(); j++) {
            rtcmData.data[j].nsat = result.get(j)[0];
            rtcmData.data[j].nsig = result.get(j)[1];
            rtcmData.data[j].cellMask = cellMaskArr[j];
        }


        for (j = 0; j < ncell; j++) {
            prv = RtcmUtils.getbits(rtcm.buff, i[0], 15);//GNSS 信号伪距
            rtcmData.data[j].data[0] = prv;
            rtcmData.data[j].rtcm[0] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * (j + 1));
            i[0] += 15;
            if (prv != -16384) {
                pr[j] = prv * RtcmCommon.P2_24 * RtcmCommon.RANGE_MS;
            }
        }
        for (j = 0; j < ncell; j++) {
            cpv = RtcmUtils.getbits(rtcm.buff, i[0], 22);//GNSS 信号载波相位
            rtcmData.data[j].data[1] = cpv;
            rtcmData.data[j].rtcm[1] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * (j + 1));
            i[0] += 22;
            if (cpv != -2097152) {
                cp[j] = cpv * RtcmCommon.P2_29 * RtcmCommon.RANGE_MS;
            }
        }
        for (j = 0; j < ncell; j++) {
            lock[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 4);//GNSS 载波相位 锁定时间标志
            rtcmData.data[j].data[2] = lock[j];
            rtcmData.data[j].rtcm[2] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * (j + 1));
            i[0] += 4;
        }
        for (j = 0; j < ncell; j++) {
            half[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 1);//半周模糊度标志
            rtcmData.data[j].data[3] = half[j];
            rtcmData.data[j].rtcm[3] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * (j + 1));
            i[0] += 1;
        }
        for (j = 0; j < ncell; j++) {
            cnr[j] = RtcmUtils.getbitu(rtcm.buff, i[0], 6) * 1.0;//GNSS 信号载噪比
            rtcmData.data[j].data[4] = cnr[j];
            rtcmData.data[j].rtcm[4] = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * ncell + 6 * j, 24 + 169 + ncell + 18 * h.nsat + 15 * ncell + 22 * ncell + 4 * ncell + 1 * ncell + 6 * (j + 1));
            i[0] += 6;
        }


        //筛选去除不符合的数据
        String[] types = {"2"};//去除除2(此处指除L2C以外的信号)

        int length = 0;
        for (j = 0; j < rtcmData.data.length; j++) {
            if (Arrays.asList(types).contains(String.valueOf(rtcmData.data[j].nsig))) {
                length++;
            }
        }
        rtcmData.initNewData(length);
        int count = 0;
        for (j = 0; j < rtcmData.data.length; j++) {
            if (Arrays.asList(types).contains(String.valueOf(rtcmData.data[j].nsig))) {
                rtcmData.newData[count] = rtcmData.data[j];
                count++;
            }
        }
        //重新组装RTCM电文信号
        String ydz = dataTo2.substring(0, 8);//引导字
        String blz = dataTo2.substring(8, 8 + 6);//保留字
        String messageLength = dataTo2.substring(8 + 6, 8 + 6 + 10);//消息长度
        System.out.println("head:" + ydz + "-" + blz + "-" + messageLength);
        //信息类型 + 基准站ID + 历元时间 + 多信息标志 + IODS + 预留 + 锁定引导标志 + 扩展锁定标志 + 平滑类型标志 + 平滑区间
        String dataPart1 = dataTo2.substring(24, 24 + 12 + 12 + 30 + 1 + 3 + 7 + 2 + 2 + 1 + 3);
        System.out.println("part1:" + dataPart1);
        String wxym = dataTo2.substring(24 + 73, 24 + 73 + 64);//卫星掩码
        String xhym = dataTo2.substring(24 + 73 + 64, 24 + 73 + 64 + 32);//信号掩码//cell mask
        System.out.println("part2:" + wxym + "-" + xhym + "-" + cellMask);
        String wxcljl1 = dataTo2.substring(24 + 169 + ncell, 24 + 169 + ncell + 8 * h.nsat);//卫星粗略距离(整毫秒)
        String wxcljl2 = dataTo2.substring(24 + 169 + ncell + 8 * h.nsat, 24 + 169 + ncell + 8 * h.nsat + 10 * h.nsat);//卫星粗略距离(毫秒内)
        System.out.println("part3:" + wxcljl1 + "-" + wxcljl2);
        //信号伪距 + 信号载波相位 + 载波相位锁定时间标志 + 半周模糊度标志 + 信号载噪比
        String dataPart4 = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell);
        System.out.println("part4: " + dataPart4);
        String redundance = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 48 * ncell, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7);//多余的7bits
        String crc = dataTo2.substring(24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7, 24 + 169 + ncell + 18 * h.nsat + 48 * ncell + 7 + 24);//crc冗余校验
        System.out.println("tail:" + redundance + "-" + crc);
        String newCellMask = "";
        for (j = 0; j < rtcmData.newData.length; j++) {
            newCellMask = newCellMask + rtcmData.newData[j].cellMask;
        }
        System.out.println("newCellMask:" + newCellMask);
        String newDataPart4 = "";
        for (j = 0; j < rtcmData.newData.length; j++) {
            newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[0];
        }
        for (j = 0; j < rtcmData.newData.length; j++) {
            newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[1];
        }
        for (j = 0; j < rtcmData.newData.length; j++) {
            newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[2];
        }
        for (j = 0; j < rtcmData.newData.length; j++) {
            newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[3];
        }
        for (j = 0; j < rtcmData.newData.length; j++) {
            newDataPart4 = newDataPart4 + rtcmData.newData[j].rtcm[4];
        }
        System.out.println("newDataPart4:" + newDataPart4);
        String dataArea = dataPart1 + wxym + xhym + newCellMask + wxcljl1 + wxcljl2 + newDataPart4 + redundance;
        int mLength = dataArea.length() / 8;
        String newMessageLength = Rtcm.decimalToBinary(mLength, 10);
        System.out.println("newMessageLength:" + newMessageLength);
        String newRtcm = ydz + blz + newMessageLength + dataArea + crc;
        newRtcm = Rtcm.bin2hex(newRtcm);
        byte[] newRtcmTo2 = Rtcm.parseHexStr2Byte(newRtcm);
        String newCrc = Integer.toHexString(RtcmUtils.rtk_crc24q(newRtcmTo2, mLength + 3)).toUpperCase();
        newRtcm = newRtcm.substring(0, newRtcm.length() - 6) + newCrc;
        return newRtcm;
//        save_msm_obs(rtcm, sys, h, r, pr, cp, null, null, cnr, lock, null, half);
//        if (sync[0] != 0) {
//            rtcm.obsflag = 0;
//        } else {
//            rtcm.obsflag = 1;
//        }
//        return sync[0] != 0 ? 0 : 1;
    }

以上就是RTCM3.3电文信号的解码与重组,对协议理解的可能还不够深刻,代码写的比较简单,应该有不少优化空间,欢迎大家批评与指正。

以下为RTCM的信号类型:

RTCM 版本 3 消息类型:

1001 型,GPS L1 码和相位。

1002 型,GPS L1 码,相位和模糊度以及载波噪声比。

1003 型,GPS L1 和 L2 代码和相位。

1004 型,GPS L1 和 L2 码,相位和模糊度以及载波噪声比。

1005 型,天线参考点的站坐标 XYZ。

1006 型,天线参考点和天线高度的站坐标 XYZ。

1007 型,天线描述符和 ID。

1008 型,天线序列号。

1009 型,GLONASS L1 代码和相位。

1010 型,GLONASS L1 码,相位和模糊度以及载波噪声比。

1011 型,GLONASS L1 和 L2 代码和相位。

1012 型,GLONASS L1 和 L2 码,相位和模糊度以及载波噪声比。

1013 类型,修改的儒略日期,闰秒,配置的消息类型和间隔。

1014 和 1017 型,网络 RTK(MAK)消息。

1019 型,GPS 星历。

1020 型,格洛纳斯星历。

1045 型,伽利略星历。

4088 和 4095 型,专有信息。

 “状态空间表示”(SSR)消息:

1057 型,广播星历的 GPS 轨道改正

1058 型,广播星历的 GPS 时钟校正

1059 型,GPS 码偏差

1060 型,GPS 广播星历的组合轨道和时钟校正

1061 型,GPS 用户测距精度(URA)

1062 型,广播星历的高速 GPS 时钟校正

1063 型,GLONASS 轨道修正广播星历

1064 型,广播星历的 GLONASS 时钟校正

1065 型,格洛纳斯码偏差

1066 型,GLONASS 广播星历的轨道和时钟联合校正

1067 型,GLONASS 用户测距精度(URA)

1068 型,广播星历的高速 GLONASS 时钟校正

 “多信号消息”(MSM):

 1071 型,紧凑型.GPS 伪距

1072 型,紧凑型 GPS 载波相位

1073 型,紧凑型 GPS 伪距和载波相位

1074 型,全 GPS 伪距和载波相位加信号强度 

1075 型,全 GPS 伪距,载波相位,多普勒和信号强度

1076 型,全 GPS 伪距和载波相位加信号强度(高分辨率)

1077 型,全 GPS 伪距、载波相位、多普勒和信号强度(高分辨率)

1081 型,紧凑型 GLONASS 伪距

1082 型,紧凑型 GLONASS 载波相位

1083 型,紧凑型 GLONASS 伪距和载波相位

1084 型,全 GLONASS 伪距和载波相位加信号强度

1085 型,全 GLONASS 伪距,载波相位,多普勒和信号强度

1086 型,全 GLONASS 伪距和载波相位加信号强度(高分辨率)

1087 型,全 GLONASS 伪距,载波相位,多普勒和信号强度(高分辨率)

1091 型,紧凑伽利略伪距

1092 型,紧凑型伽利略载波相位

1093 型,紧凑伽利略伪距和载波相位

1094 型,全伽利略伪距和载波相位加信号强度

1095 型,全伽利略伪距,载波相位,多普勒和信号强度

1096 型,全伽利略伪距和载波相位加信号强度(高分辨率)

1097 型,全伽利略伪距,载波相位,多普勒和信号强度(高分辨率)

1121 型,紧凑型北斗伪距

1122 型,紧凑型北斗载波相位

1123 型,紧凑型北斗伪距和载波相位

1124 型,全北斗伪距和载波相位加信号强度

1125 型,全北斗伪距,载波相位,多普勒和信号强度

1126 型,全北斗伪距和载波相位加信号强度(高分辨率)

1127 型,全北斗伪距,载波相位,多普勒和信号强度(高分辨率)

1101 型,紧凑型 SBAS 伪距

1102 型,紧凑型 SBAS 载波相位

1103 型,紧凑型 SBAS 伪距和载波相位

1104 型,全 SBAS 伪距和载波相位加信号强度

1105 型,全 SBAS 伪距,载波相位,多普勒和信号强度

1106 型,全 SBAS 伪距和载波相位加信号强度(高分辨率)

1107 型,全 SBAS 伪距,载波相位,多普勒和信号强度(高分辨率)

1111 型,紧凑型 QZSS 伪距

1112 型,紧凑型 QZSS 载波相位

1113 型,紧凑型 QZSS 伪距和载波相位

1114 型,全 QZSS 伪距和载波相位加信号强度

1115 型,全 QZSS 伪距,载波相位,多普勒和信号强度

1116 型,全 QZSS 伪距和载波相位加信号强度(高分辨率)

1117 型,全 QZSS 伪距,载波相位,多普勒和信号强度(高分辨率)

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RTCM 3.3是实时差分数据的标准电文格式。RTCM是Real-Time Control and Monitoring的缩写,3.3代表标准的版本号。差分数据电文是用于GPS或GNSS测量的实时差分校正数据的传输格式。 RTCM 3.3差分数据电文包含了卫星测量和校正信息。具体而言,它包括了接收器接收到的卫星观测量数据,比如伪距和载波相位观测值。同时,它也包含了基准站所测量到的卫星观测量数据,这些数据经过了精确的校正。 差分数据电文的目的是提供精确的位置修正信息,以提高GPS或GNSS测量的精度。接收器通过接收基准站发送的电文,使用其中的校正数据对接收到的卫星观测数据进行计算和修正。通过使用差分数据电文进行差分校正,可以将GPS或GNSS测量的定位精度提高到厘米级甚至更高的精度。 RTCM 3.3差分数据电文具有扩展性和灵活性,可以根据不同的需求进行定制。它可以包括不同类型的卫星信号观测量数据和校正数据,如L1/L2或L5频段的伪距和载波相位观测量数据。此外,差分数据电文中还可以包含其他附加信息,如接收器状态、天线高度和信噪比等。 总之,RTCM 3.3差分数据电文是用于GPS或GNSS测量的实时差分校正数据的传输格式,提供了卫星观测量数据和校正数据,用于提高定位精度。它的扩展性和灵活性使得可以根据需求进行定制,并且可以包含其他附加信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值