基于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);
}