基于C++的GNSS数据读取软件开发

C++是一种面向对象的程序设计语言,该项目旨在对某种型号的GNSS设备观测的二进制数据文件进行读取和显示

理解GNSS原理

  以GPS为例,GPS用户设备主要包括:GPS接收机及其天线、微处理器及其终端设备、处理软件以及电源等。其中接收机和天线是用户设备的核心,习惯上统称为GPS接收机。

其定位的具体方法是,接收机按一定卫星仰角要求捕获到待测卫星,并跟踪这些卫星的运行。接收机通过捕获到的卫星信号,测量出接收天线至卫星的距离和距离的变化率,解调出卫星轨道参数等数据。根据这些数据,接收机中的微处理计算机按定位解算方法进行计算,计算出用户所在位置的地理经纬度、高度、速度、时间等信息

GNSS接收机数据存储的形式

本文中之用的数据来自NovAtel OEM6 系列接收器

RINEX格式的数据文件采用8.3的命名方式,完整的文件名由用于表示文件归属的8字符长度的主文件名和用于宝石文件类型的3位字符长度的扩展名两部分组成,其具体形式如下:

SSSSDDDF.yyt

其中:

SSSS:4字符长度的测站代号。

DDD:文件中第一个记录所对应的年积日。

F:一天内文件时段号,取值从0-9,A-Z。

yy:年份。

t:文件类型:

O-观测值文件;

N-GPS导航电文文件;

M-气象数据文件;

G-GLONASS导航电文文件;

H-地球同步卫星GPS有效荷载导航电文文件;

G-钟文件。

GPS文件读写的基本概念和实现要素

For example:

public int Read_one_Message()
{
   while (true)//判断它是不是真的就是头
   {
       byte[] fh = br.ReadBytes(28); //读一块头的比特数组
       if (fh.Length < 28) return -1;
       if (fh[0] == 0xAA && fh[1] == 0x44 && fh[2] == 0x12) //取头中消息长度
       {
           Head hd1 = new Head(fh, 0);
           hd = fh;
           MessageData = br.ReadBytes(hd1.MessageLength);
           return hd1.MessageID;// 取头的ID,用相应的数据类型
        }
        else br.BaseStream.Seek(-27, SeekOrigin.Current);//继续读头,到1重复
    }
}

从gps读出的最后文件如下所示:

数据组织、显示和存储的基本方法;

生成CNO图像:

    public void Show()
    {
        string[,] picture = new string[27, obs];
        Range temp;
        for (int i = 0; i < (int)obs; i++)
        {
            for (int j = 0; j < (int)obs - 1; j++)
            {
                if (data[j].PRN > data[j + 1].PRN)
                {
                    temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < obs; i++)
        {
            for (int j = 0; j < data[i].CNo - 26; j++)
                picture[j, i] = "o";
            for (int j = 26; j > data[i].CNo - 26; j--)
                picture[j, i] = " ";
        }
        Console.SetCursorPosition(0, 0);
        for (int i = 26; i < 27 && i > 0; i--)
        {
            Console.Write((i + 26) + "    ");
            for (int j = 0; j < obs; j++)
                Console.Write("  " + picture[i, j]);
            Console.WriteLine();
        }
        for (int i = 0; i < 100; i++)
        {
            Console.Write("-");
        }
        Console.WriteLine();
        Console.Write("PRN   ");
        for (int i = 0; i < obs; i++)
            Console.Write("  " + data[i].PRN);
        Console.WriteLine();
        Console.Write("SYS   ");
        for (int i = 0; i < obs; i++)
            Console.Write("  " + data[i].Satellite_system());
        Console.WriteLine();
        Console.Write("ST    ");
        for (int i = 0; i < obs; i++)
            Console.Write("  " + data[i].Signal_type());
        Console.WriteLine();
        Console.WriteLine("ID:43" + "  Week:" + hd.Week + "  ms:" + hd.ms + "   " + "obs:" + obs);
    }