一、整体思路:
车辆自动踩点需要获取千寻差分数据,差分数据有两种格式:分别是GPGGA和GRHDT,GPGGA内存在车辆经纬度定位信息,GRHDT内存在转向角信息,分别进行关键数据提取,然后将提取的数据存放在创建的gps_road.txt中
1.main.c中
int main(int argc, char *argv[])
{
p = fopen("gps_load.txt", "w");
pthread_t RecvFromIMU_tid;
pthread_t AnalysisIMU_tid;
int ret;
ret = pthread_create(&RecvFromIMU_tid, NULL, RecvFromIMU_pthread, NULL);
if (ret != 0)
{
printf("Create thread RecvFromIMU_pthread failed\n");
}
ret = pthread_create(&AnalysisIMU_tid, NULL, AnalysisIMU_pthread, NULL);
if (ret != 0)
{
printf("Create thread AnalysisIMU_pthread failed\n");
}
pthread_join(RecvFromIMU_tid, NULL);
pthread_join(AnalysisIMU_tid, NULL);
return 0;
}
2.创建IMU数据接收线程RecvFromIMU_pthread
void *RecvFromIMU_pthread(void *args)
{
memset(g_RecvDataFromRTK,0,sizeof(g_RecvDataFromRTK));
if(IsInit==false)
{
if(initialize()<0)
{
printf("MC: 打开串口配置参数失败\n");
return 0;
}
IsInit=true;
printf("MC: 打开串口配置参数成功\n");
}
int nBytes_0 = 0;
int nBytes_1 = 0;
while(1)
{
usleep(100000);
memset(&g_RecvDataFromRTK_1, 0, sizeof(g_RecvDataFromRTK_1));
nBytes_1 = read(g_fd, g_RecvDataFromRTK_1, 200);
if (g_RecvDataFromRTK_1[0] == '$')
{
char *ret;
int i;
int gps_num = 0;
for(i = 0;i < 200;i++)
{
if(g_RecvDataFromRTK_1[i]=='*')
{
gps_num++;
}
if(gps_num==2)
{
break;
}
}
if(i!=200)
{
process_len = i;
for(int j=0;j<i;j++)
{
g_DataCombine[j] = g_RecvDataFromRTK_1[j];
}
pthread_mutex_lock(&gMutex_SC_data);
memcpy(g_ProcDataFromSCBuf, g_DataCombine, DATALEN);
pthread_cond_signal(&gCond_SC_data);
pthread_mutex_unlock(&gMutex_SC_data);
}
}
}
return 0;
}
3.差分数据解析线程AnalysisIMU_pthread
void *AnalysisIMU_pthread(void *args)
{
char localproc_SCData[200] = {0};
int localproc_len=0;
int num_gga=0;
int num_dht=0;
while(1)
{
pthread_mutex_lock(&gMutex_SC_data);
pthread_cond_wait(&gCond_SC_data,&gMutex_SC_data);
memcpy(localproc_SCData,g_ProcDataFromSCBuf,process_len) ;
localproc_len=process_len;
num_gga=0;
num_dht=0;
pthread_mutex_unlock(&gMutex_SC_data);
double g_Lattitude_tmp =0;
double g_Longitude_tmp =0;
double g_Heading_tmp=0;
int rtk_num = 0;
char *p_gpgga = strstr(localproc_SCData,"GPGGA");
char *p_gpdht = strstr(localproc_SCData,"GNHDT");
int gpgga_len = 60;
int gpdht_len = 20;
for(int i=0;i<gpgga_len;i++)
{
if(p_gpgga[i]==0x2c)
{
num_gga++;
if(num_gga == 2)
{
for(int j=i+1;;j++)
{
if(p_gpgga[j]==0x2c)
{
break;
}
else if(p_gpgga[j]!=0x2e)
{
g_Lattitude_tmp*=10;
g_Lattitude_tmp+=(p_gpgga[j]-48);
}
}
}
else if(num_gga == 4)
{
for(int j=i+1;;j++)
{
if(p_gpgga[j]==0x2c)
{
break;
}
else if(p_gpgga[j]!=0x2e)
{
g_Longitude_tmp*=10;
g_Longitude_tmp+=(p_gpgga[j]-48);
}
}
}
else if(num_gga == 6)
{
rtk_num = (p_gpgga[i+1]-48);
break;
}
}
}
for(int i=0;i<gpdht_len;i++)
{
if(p_gpdht[i]==0x2c)
{
num_dht++;
if(num_dht == 1)
{
for(int j=i+1;;j++)
{
if(p_gpdht[j]==0x2c)
{
break;
}
else if(p_gpdht[j]!=0x2e)
{
g_Heading_tmp*=10;
g_Heading_tmp+=(p_gpdht[j]-48);
}
}
break;
}
}
}
g_Lattitude_tmp/=10000000000;
g_Longitude_tmp/=10000000000;
g_Heading_tmp/=10000;
double lat_int,lat_fraction;
double lon_int,lon_fraction;
lat_fraction = modf(g_Lattitude_tmp,&lat_int)*100;
lon_fraction = modf(g_Longitude_tmp,&lon_int)*100;
g_Lattitude = lat_int+lat_fraction/60;
g_Longitude = lon_int+lon_fraction/60;
g_Heading = g_Heading_tmp;
if(file_point_num == 0)
{
last_g_Lattitude = g_Lattitude;
last_g_Longitude = g_Longitude;
last_g_Heading = g_Heading;
file_point_num++;
}
else
{
double distance = ntzx_GPS_length(last_g_Longitude,last_g_Lattitude,
g_Longitude,g_Lattitude);
if(distance >= 0.8)
{
fprintf(p,"$GPFPD,2196,439607.060,%lf,0.522,0.414,%lf,%lf,16.56,-0.156,-0.004,0.002,5.136,12,27,%d5*4F\n",
g_Heading,g_Lattitude,g_Longitude,rtk_num);
fflush(p);
last_g_Lattitude = g_Lattitude;
last_g_Longitude = g_Longitude;
last_g_Heading = g_Heading;
file_point_num++;
printf("hit!\n");
}
}
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)