获取经纬度、转向角和速度,生成gps_road.txt

1.获取四个关键数据,生成gps_road.txt
功能:需要从星网宇达的GPFPD数据格式中提取经纬度、转向角以及从车辆底盘中提取速度信息(can总线中传输数据)。

#include "generate_route.h"
#include "ntzx_qianxun_inv.h"
#include "ntzx_mc.h"
#include "ntzx_timer_drv.h"
#include "ntzx_file_drv.h"
#include "ntzx_conf_app.h"
#include<string.h>
#include<stdio.h>
#include<pthread.h>
#include<math.h>
#include<unistd.h>
#define ROUTEFILE "gps_load.txt"
static FILE *g_route = NULL;
int main(int argc, char *argv[])
{ 
    int rt;  
    str_inv_to_pl nav_info = {0};
    str_inv_to_pl nav_info_last = {0};
    str_inv_to_pl nav_info_llast = {0};
    struct_mc_sta mc_sta = {0};
    ntzx_systimer route;
    Timer_Set(&route, 100000);

    /* 初始化配置信息 */
    rt = ntzx_conf_app_init();
    if (rt < 0) {
        printf("初始化配置信息failed\n");
        return -1;
    }
    /* 初始化千寻惯导 */
    rt = ntzx_qianxun_init();
    if (rt < 0) {
        printf("qianxun 初始化失败\n");
        printf("%d\n",rt);
        return -1;
    }  
    /* 初始化MC底层 */
    rt = ntzx_mc_usart_init();
    if (rt < 0) {
        printf("MC底层初始话失败");
        return -1;
    }
    /* 初始化文件 */
    rt = ntzx_file_init(ROUTEFILE, &g_route, "w");
    if (g_route == NULL) {
        printf("打开创建文件失败\n");
    }
    pthread_t thread_mc; // 底层数据处理线程
    pthread_t thread_inertial_nv; // 导航(或惯导信息)处理线程
    pthread_create(&thread_inertial_nv, NULL, ntzx_qianxun_inv_main, NULL);
    pthread_create(&thread_mc, NULL, ntzx_mc_main, NULL);
    
    int i = 0;
    /* 采集数据 */
    char tmp[1000000];      //临时保存
    memset(tmp,0,sizeof(tmp));
    char *p = tmp;
    int start_to_break = 0;//当收到静止数据时退出保存
    while (1) {
        if (Timer_GetReached(&route)==0) 
        {
            Timer_Set(&route, 100000);  //采样频率,车速1m/s.
            if (NTZX_QIANXUN_SUCCESS == ntzx_get_inv_to_pl(&nav_info)) 
            {
                i++;
            }else{
                printf("等待千寻正确数据。\n");
                sleep(1);
                continue;
            }
            ntzx_get_mc_state(&mc_sta);//获取车辆底盘状态
            //将路径点信息先保存到数据里面
            sprintf(p + strlen(tmp), "%.8f\n", nav_info.lat);
            sprintf(p + strlen(tmp), "%.8f\n", nav_info.lon);
            sprintf(p + strlen(tmp), "%f\n", nav_info.courseAngle);
            sprintf(p + strlen(tmp), "%d\n", mc_sta.speed_mm / 10);
            //信息点打印查看
            printf("nav_info.Latitude_degree:%.10f\t\n", nav_info.lat);
            printf("nav_info.Longitude_degree:%.10f\t\n", nav_info.lon);
            printf("nav_info.courseAngle:%f\t\n", nav_info.courseAngle);
            printf("mc_sta.speed_cm:%d\t\n", mc_sta.speed_mm / 10);
	    
            //第一种情况:当车子静止时,准备计数并退出。
            if( (fabs(nav_info.lat-nav_info_llast.lat)<=0.0000002)  && (fabs(nav_info.lon-nav_info_llast.lon)<=0.0000002) )
            {   
                start_to_break++;
                printf("开始停止计数:%d\t\n",start_to_break);
                if (start_to_break == 1200){
                printf("确认停止,结束记录路径点!\n");
                break;  
                }         
            }else{
                start_to_break = 0;//清零
            }
            nav_info_llast = nav_info_last;
            nav_info_last=nav_info;//保存当前数据到历史数据           

        //第二种情况:当车子采集满点,退出。
             if (i ==24999)
            {
                printf("已经保存4999组数据,退出!\n");
                break;
            }
         }
    }
    printf("准备写入txt文档\n");
    fprintf(g_route, "%s",  tmp);
    fflush(g_route);
    printf("写入txt文档结束,按Ctrl +C退出!\n");
    pthread_join(thread_inertial_nv, NULL);
    pthread_join(thread_mc, NULL);
}


核心问题(1):分开粘在一起的字符串,打印出一串完整的GPFPD数据,然后存到数组里进行解析。
在这里插入图片描述
strchr()的作用是返回在recv_buf接收的数据中,首次出现‘ ’ 字 符 的 地 址 。 遍 历 数 组 后 到 下 一 个 ′ ’字符的地址。遍历数组后到下一个' '字符结束,一个完整的GPFPD字符串就存放在g_qianxun_recv_buf[]中。

核心问题(2):解析GPFPD字符串

static int ntzx_gpfpd_proc(void)
{
    char *p_GPFPD = NULL;
    char *q_GPFPD = NULL;
    int GPSWeek = 0;
    int GPSTime = 0;
    double Heading = 0;
    double Pitch = 0;
    double Roll = 0;
    double lat = 0;
    double lon = 0;
    double alt = 0;
    double ve =0;
    double vn =0;
    double vu =0;
    double Baseline =0;
    unsigned int NSV1 =0;
    unsigned int NSV2 = 0;
    unsigned int Status = 0;
    unsigned char cs = 0;
    int i = 0, j = 0;
    for(i=0; i<strlen(g_qianxun_recv_data); i++)
    {
        if(g_qianxun_recv_data[i] == QIANXUN_SEPARATOR )
        {
            j++;
        }
    }
    printf("zifuchuanzongchangdu wei:%d\n",j);
    if(j!=15)
    {
        printf("j!= 15 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n");
        return NTZX_QIANXUN_ANALYSIS_ERR;
    }
    p_GPFPD = strchr(g_qianxun_recv_data, '*');
    if(p_GPFPD == NULL)
    {
        return NTZX_QIANXUN_ANALYSIS_ERR;
    }
    p_GPFPD = strchr(g_qianxun_recv_data, QIANXUN_SEPARATOR);
    if(p_GPFPD == NULL)
    {
        return NTZX_QIANXUN_ANALYSIS_ERR;
    }
    /*HUOQU XINGQISHU*/
    p_GPFPD++;
    q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    *q_GPFPD = 0;
    GPSWeek = (int)(atof(p_GPFPD));
 printf("ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:%d\n",GPSWeek);
    /*HUOQU GELINGNIZHI SHIJIAN*/
    q_GPFPD++;
    p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // if (p_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *p_GPFPD = 0;
    GPSTime = atof(q_GPFPD);
printf("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS%.3lf\n",GPSTime);
    p_GPFPD++;
    q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // if (q_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *q_GPFPD = 0;
    Heading = atof(p_GPFPD);
printf("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD:%.3lf\n",Heading);
    q_GPFPD++;
p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // if (q_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *p_GPFPD = 0;
    Pitch = atof(q_GPFPD);
    p_GPFPD++;
    q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // if (q_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *q_GPFPD = 0;
    Roll = atoi(p_GPFPD);
    q_GPFPD++;
    p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // if (p_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *p_GPFPD = 0;
    lat = atof(q_GPFPD);
printf("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww:%.8lf\n",lat);
    p_GPFPD++;
    q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // if (q_GPFPD == NULL) {
    //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // }
    *q_GPFPD = 0;
    lon = atoi(p_GPFPD);
printf("jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj:%.8lf\n",lon);
    // q_GPFPD++;
    // p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // // if (p_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *p_GPFPD = 0;
    // alt = atof(q_GPFPD);
    // p_GPFPD++;
    // q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // // if (q_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *q_GPFPD = 0;
    // ve = atoi(p_GPFPD);
    // q_GPFPD++;
    // p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // // if (p_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *p_GPFPD = 0;
    // vn = atof(q_GPFPD);
    // p_GPFPD++;
    // q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // // if (q_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *q_GPFPD = 0;
    // vu = atoi(p_GPFPD);
    // q_GPFPD++;
    // p_GPFPD = strchr(q_GPFPD, QIANXUN_SEPARATOR);
    // // if (p_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *p_GPFPD = 0;
    // Baseline = atof(q_GPFPD);
    // p_GPFPD++;
    // q_GPFPD = strchr(p_GPFPD, QIANXUN_SEPARATOR);
    // // if (q_GPFPD == NULL) {
    // //     return NTZX_QIANXUN_ANALYSIS_ERR;
    // // }
    // *q_GPFPD = 0;
    // NSV1 = (unsigned int)atoi(p_GPFPD);
    // q_GPFPD++;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值