使用python实现自动化拉取压缩包并处理流程

使用python实现自动化拉取压缩包并处理流程

实现成果展示



使用说明

执行./run.sh

脚本中的内容主要功能是:

1、从远程服务器上下拉制定时间更新的数据

2、将数据中的zip拷贝到指定文件夹内

3、解压后删除所有除了lcm之外的文件

4、新建一个out文件夹执行解析lcm可执行文件,保存所有的解析后文件

5、新建一个analysis文件夹并执行analysis脚本,对out文件夹中的内容进行analysis,并把生成的5个图片以及三个文档保存到analysis中

6、生成的5个图片是:

gnss状态,gnss状态解释,中心线差值对比,gnssQC,车道线数据

bash 复制代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import sys
import numpy as np
import re
import math
import scipy.spatial as spt  # Scipy库空间算法,使用kd树查找最近点
import csv  # 调用数据保存文件
import pandas as pd
import cv2
import os
import time
import datetime
from datetime import datetime, timedelta
from collections import Counter
import statistics



def write_conclution(data_path, status, last_time_list):
    value_counts = Counter(status)

# 计算每个值所占的比例
    total_count = len(status)
    value_ratios = {value: count / total_count for value,
                    count in value_counts.items()}
    # last time mode num
    mode = statistics.mode(last_time_list)
    minutes = mode // 60000
    seconds = (mode // 1000) % 60
    milliseconds = mode % 1000
    mode = "{:02d}'{:02d}''{:03d}'''".format(
        minutes, seconds, milliseconds)
    # last time min num
    minimum = min(last_time_list)
    minutes = minimum // 60000
    seconds = (minimum // 1000) % 60
    milliseconds = minimum % 1000
    minimum = "{:02d}'{:02d}''{:03d}'''".format(
        minutes, seconds, milliseconds)
    # last time mean num
    mean_time = int(statistics.mean(last_time_list))
    minutes = mean_time // 60000
    seconds = (mean_time // 1000) % 60
    milliseconds = mean_time % 1000
    mean_time = "{:02d}'{:02d}''{:03d}'''".format(
        minutes, seconds, milliseconds)
    # last time max num
    maxmum = max(last_time_list)
    minutes = maxmum // 60000
    seconds = (maxmum // 1000) % 60
    milliseconds = maxmum % 1000
    #处理成文件形式
    maxmum = "{:02d}'{:02d}''{:03d}'''".format(
        minutes, seconds, milliseconds)
    with open(data_path + "conclution.csv", '+w') as loc_f:
        loc_f.write("1、概述" "\n"
                    "1.1、路线以及情况概述" "\n"
                    '\n'
                    "本路线是             共计      km;" "\n"
                    "全程定位状态较为正常,绝大部分时间为4(状态持续时间占全程的  % )" "\n"
                    "定位状态变化描述:车辆穿过高架桥时容易跳变为1, 在经过较短距离的横跨道路广告牌时出现定位状态变换为4->5->4" "\n"
                    "在短时间内(一般认为从上一个桥或其他的物体下出到进入下一个桥或者空中物体下的时间不超过5s)经过多次桥下,定位状态会出现多次4->5(2)->1->0->1->5(2)->4跳变,时间不超过6秒" "\n"
                    "定位状态在经过隧道(一般是指除入口和出口之外封闭的环境)时,状态会持续保持0""\n"
                    "\n"
                    "1.2 异常情况描述""\n"
                    '\n'
                    "localization_conclution""\n"
                    "\n"
                    "1.3、异常点汇总表格""\n"
                    '\n'
                    "附件为全程定位状态变化表格""\n"
                    '\n'
                    "gnss status 表示含义为:""\n"
                    "解状态是4,是最高精度的解状态,是通过地基增强方式达到的,精度最高;"  "\n"
                    "解状态是5或2,是精度稍低一点的解状态,也是通过地基地基增强方式达到,一般是可用卫星数少一点,差分龄期大一些,可能会有这样的现象,多在环境不是很理想的条件下,如林荫路、城市峡谷;" "\n"
                    "解状态是1,是达到卫星定位,不依赖地基增强就能达到的解状态,如果差分数据传输正常,那应该是搜星数特别少,少于10颗,或者差分龄期特别大,大于30S,会出现解状态是1的;"  "\n"
                    "解状态是0,是表示没有定位,搜星数不足以解算出位置。" "\n"
                    "\n"
                    "\n"
                    "1.4、该路段定位总结:" "\n"
                    '\n')
    with open(data_path + "conclution.csv", '+a') as loc_f:
        for value, ratio in value_ratios.items():
            loc_f.write("\t定位状态为" + f"{value}" +
                        "占全程的百分比为:" + f"{ratio:.2%}" + "\n")

    with open(data_path + "conclution.csv", '+a') as loc_f:
        loc_f.write("\t 1.4.2、定位状态为0或1时, 多数情况是因为经过(桥梁,广告牌,龙门架,隧道,大车跟随)" "\n"
                    "\t 1.4.3、定位状态跳变最长的时长为: " + str(maxmum) + "\n"
                    "\t 1.4.4、定位状态跳变时长最短为: " + str(minimum) + "\n"
                    "\t 1.4.5、定位状态跳变平均时长为:" +
                    str(mean_time) + '\t' + "众位数为:  " + str(mode) + "\n"
                    "该路线下的定位状态(gnss status)跳变时间较短,ins定位精度误差保持在(    ,    )范围(m)内,定位精度良好." "\n"
                    "\n"
                    "1.5、该路段下的感知识别车道线与联编程序结合四维高精地图输出的车道线对比情况:   " "\n"
                    '\n'
                    "\t 1.5.1 车道线与与联编程序结合四维高精地图输出的车道线基本拟合占比为:     \n"
                    "\t 1.5.2 车道线与与联编程序结合四维高精地图输出的车道线拟合较好占比为:     \n"
                    "\t 1.5.3 车道线与与联编程序结合四维高精地图输出的车道线拟合较差占比为:     \n"
                    "\t 1.5.4 车道线与与联编程序结合四维高精地图输出的车道线没有拟合占比为:     \n"
                    "\t 该路线下的感知稳定,可以安全使用NOA     \n"
                    "\t 该路线下的感知比较稳定,可以在晴天且车道线清晰场景下使用NOA     \n"
                    "\t 该路线下的感知稳定性较差,请酌情使用NOA     \n"
                    "\n"
                    "\n"
                    "2、定位异常点分析:\n"
                    "\t 2.1 异常点解释 \n"
                    '\n'
                    "\t 2.2 异常点图片\n")


def get_all_change_data(gnss_status):
    pairs = []

    for i in range(len(gnss_status)):
        if i == 0 or gnss_status[i] != gnss_status[i-1]:
            pairs.append((gnss_status[i], i))

    # print("Pairs:", pairs)

    index_ranges = []
    start_index = None
    pair0_sets = []
    pair1_sets = []

    for i in range(len(pairs)):
        if pairs[i][0] == 4:
            if start_index is not None:
                index_ranges.append((start_index, i))
                start_index = None
    else:
        if start_index is None:
            start_index = i
        if len(pair0_sets) < start_index + 1:
            pair0_sets.append(set())
            pair1_sets.append(set())
            pair0_sets[start_index].add(pairs[i][0])
            pair1_sets[start_index].add(pairs[i][1])

    # 处理最后一个区间
    if start_index is not None:
        index_ranges.append((start_index, len(pairs)))

    # print("索引区间:", index_ranges)
    # print("pair[i][0]集合:", pair0_sets)
    # print("pair[i][1]集合:", pair1_sets)


def get_all_file_name(data_path):
    img_list = os.listdir(data_path)
    # print(img_list)
    img_list = sorted(img_list)
    # print(img_list)
    return img_list


def check_number(lst, num):
    result = []
    for sub_lst in lst:
        if num in sub_lst:
            result.append(True)
        else:
            result.append(False)
    return result


def update_index_ranges(lst, result_check, index_ranges):
    result = []
    for sub_lst, check in zip(lst, result_check):
        if check:
            reversed_lst = sub_lst[::-1]
            last_index = len(sub_lst) - reversed_lst.index(4) - 1
            result.append(last_index)
        else:
            result.append(0)
    update_index_range = []
    for idx, sub_lst, res in zip(index_ranges, lst, result):
        if len(sub_lst) > res:
            change_pair = idx
            first_element = change_pair[0]
            result_change = first_element + res

            change_pair = (result_change, change_pair[1])
            idx = change_pair
        update_index_range.append(idx)
    # print(result, "\n", update_index_range)
    return result, update_index_range


def get_last_time(start_utc_time, end_time):
    dt1 = datetime.fromtimestamp(start_utc_time / 1000000)
    dt2 = datetime.fromtimestamp(end_time / 1000000)
    diff = dt2 - dt1
    # 提取小时、分钟和秒数
    year = dt1.year
    month = dt1.month
    day = dt1.day
    hour = dt1.hour
    minute = dt1.minute
    second = dt1.second

    # 打印时分秒
    # print(f"{year}年{month}月{day}日 {hour:02d}:{minute:02d}:{second:02d}")
    start_time = f"{year}年{month}月{day}日 {hour:02d}:{minute:02d}:{second:02d}"

    year = dt2.year
    month = dt2.month
    day = dt2.day
    hour = dt2.hour
    minute = dt2.minute
    second = dt2.second

    # 打印时分秒
    # print(f"{year}年{month}月{day}日 {hour:02d}:{minute:02d}:{second:02d}")
    end_time = f"{year}年{month}月{day}日 {hour:02d}:{minute:02d}:{second:02d}"

    last_time = int(diff.total_seconds()*10000)
    last_time_origin = last_time
    minutes = last_time // 60000
    seconds = (last_time // 1000) % 60
    milliseconds = last_time % 1000
    last_time = "{:02d}'{:02d}''{:03d}'''".format(
        minutes, seconds, milliseconds)

    return last_time, start_time, end_time, last_time_origin


def localization_error_time_filter(status, vp31_lon, vp31_lat, log_time, data_path, file_name):
    file_save_path = data_path+file_name
    status_4_x, status_4_y = [], []
    status_5_x, status_5_y = [], []
    status_1_x, status_1_y = [], []
    status_0_x, status_0_y = [], []
    status_e_x, status_e_y = [], []
    res_no4_time, res_5_time, res_1_time, res_0_time, res_e_time = [], [], [], [], []
    # 20230916 add analysis loclaization gnss status part from difference and save start&end time last time
    with open(file_save_path + "analysis_localization_origin.csv", '+w') as loc_f:
        loc_f.write(
            "error_start_time,error_end_time,error_status,last_time(ms)\n")
    with open(file_save_path + "analysis_localization_new.csv", '+w') as loc_f:
        loc_f.write(
            "序号,起始时间,终止时间,状态变化,持续时间(min'sec''ms'''),解释,图例\n")
    # 20230920 add analysis localization gnss status change
        # loc_f.close
    for i in range(0, len(status)):
        if status[i] == 4:
            status_4_x.append(vp31_lon[i])
            status_4_y.append(vp31_lat[i])
        elif status[i] == 5:
            status_5_x.append(vp31_lon[i])
            status_5_y.append(vp31_lat[i])
        elif status[i] == 1:
            status_1_x.append(vp31_lon[i])
            status_1_y.append(vp31_lat[i])
        elif status[i] == 0:
            status_0_x.append(vp31_lon[i])
            status_0_y.append(vp31_lat[i])
        else:
            status_e_x.append(vp31_lon[i])
            status_e_y.append(vp31_lat[i])

    # 20230920 add new part to analysis gnss status change
    split_indices = [i for i in range(
        1, len(status)) if status[i] == 4 and status[i-1] != 4]

    sublists = []
    start = 0
    for index in split_indices:
        sublists.append(status[start:index])
        start = index
    sublists.append(status[start:])

    # print("分割后的子列表:", sublists)
    index_ranges = [(start, start + len(sublist) - 1) for start,
                    sublist in zip([0] + [index + 1 for index in split_indices], sublists)]

    last_pair = index_ranges[-1]
    second_element = last_pair[1]
    result = second_element - 1

    updated_pair = (last_pair[0], result)
    index_ranges[-1] = updated_pair
    # print("每个子列表的索引区间集合::", index_ranges)

    unique_sublists = [[x for x, y in zip(
        sublist, sublist[1:]) if x != y] + [sublist[-1]] for sublist in sublists]

    # print("删除相邻重复字符后的子列表:", unique_sublists)
    last_time_list = []
    num = 4
    result_check = check_number(sublists, num)
    # print(result_check)
    index_status_change = 1
    four_result, updated_index_ranges = update_index_ranges(
        sublists, result_check, index_ranges)

    with open(file_save_path + "analysis_localization_new.csv", '+a') as loc_f:
        for idx_range, sublist in zip(updated_index_ranges, unique_sublists):
            if idx_range[1] < len(log_time) and idx_range[0] < len(log_time):
                last_time, start_time, end_time, last_time_origin = get_last_time(
                    log_time[idx_range[0]], log_time[idx_range[1]])
                loc_f.write(str(index_status_change)+","+str(start_time) + "," + str(end_time) + ","
                            + " ".join(map(str, sublist)) + "," + str(last_time) + "\n")
                last_time_list.append(last_time_origin)
            elif idx_range[0] >= len(log_time):
                continue
            else:
                last_time, start_time, end_time, last_time_origin = get_last_time(
                    log_time[idx_range[0]], log_time[len(log_time)-1])
                loc_f.write(str(index_status_change)+","+str(start_time) + "," + str(end_time) + ","
                            + " ".join(map(str, sublist)) + "," + str(last_time) + "\n")
                last_time_list.append(last_time_origin)
            index_status_change += 1
    # add last time list:
    write_conclution(file_save_path, status, last_time_list)
    # 20230916 add
    zero_indices = [i for i, x in enumerate(status) if x == 0]
    one_indices = [i for i, x in enumerate(status) if x == 1]
    four_indices = [i for i, x in enumerate(status) if x == 4]
    five_indices = [i for i, x in enumerate(status) if x == 5]
    other_indices = [i for i, x in enumerate(status) if x not in [0, 1, 4, 5]]

    zero_ranges = []
    one_ranges = []
    four_ranges = []
    five_ranges = []
    other_ranges = []

    if zero_indices:
        start = zero_indices[0]
        for i in range(1, len(zero_indices)):
            if zero_indices[i] != zero_indices[i-1] + 1:
                zero_ranges.append((start, zero_indices[i-1]))
                start = zero_indices[i]
        zero_ranges.append((start, zero_indices[-1]))
    for r in zero_ranges:
        last_time, start_time, end_time, last_time_origin = get_last_time(
            log_time[r[0]], log_time[r[1]])
        with open(file_save_path + "analysis_localization_origin.csv", '+a') as loc_f:
            loc_f.write(start_time + ',' + end_time +
                        ',' + '0' + ',' + str(last_time) + '\n')

    # print("0值的索引区间", zero_ranges)

    if one_indices:
        start = one_indices[0]
        for i in range(1, len(one_indices)):
            if one_indices[i] != one_indices[i-1] + 1:
                one_ranges.append((start, one_indices[i-1]))
                start = one_indices[i]
        one_ranges.append((start, one_indices[-1]))

    for r in one_ranges:
        last_time, start_time, end_time, last_time_origin = get_last_time(
            log_time[r[0]], log_time[r[1]])
        with open(file_save_path + "analysis_localization_origin.csv", '+a') as loc_f:
            loc_f.write(start_time + ',' + end_time +
                        ',' + '1' + ',' + str(last_time) + '\n')

    # print("1值的索引区间", one_ranges)

    if four_indices:
        start = four_indices[0]
        for i in range(1, len(four_indices)):
            if four_indices[i] != four_indices[i-1] + 1:
                four_ranges.append((start, four_indices[i-1]))
                start = four_indices[i]
        four_ranges.append((start, four_indices[-1]))

    for r in four_ranges:
        last_time, start_time, end_time, last_time_origin = get_last_time(
            log_time[r[0]], log_time[r[1]])
        with open(file_save_path + "analysis_localization_origin.csv", '+a') as loc_f:
            loc_f.write(start_time + ',' + end_time +
                        ',' + '4' + ',' + str(last_time) + '\n')

    # print("4值的索引区间", four_ranges)

    if five_indices:
        start = five_indices[0]
        for i in range(1, len(five_indices)):
            if five_indices[i] != five_indices[i-1] + 1:
                five_ranges.append((start, five_indices[i-1]))
                start = five_indices[i]
        five_ranges.append((start, five_indices[-1]))

    for r in five_ranges:
        last_time, start_time, end_time, last_time_origin = get_last_time(
            log_time[r[0]], log_time[r[1]])
        with open(file_save_path + "analysis_localization_origin.csv", '+a') as loc_f:
            loc_f.write(start_time + ',' + end_time +
                        ',' + '5' + ',' + str(last_time) + '\n')

    # print("5值的索引区间", five_ranges)

    if other_indices:
        start = other_indices[0]
        for i in range(1, len(other_indices)):
            if other_indices[i] != other_indices[i-1] + 1:
                other_ranges.append((start, other_indices[i-1]))
                start = other_indices[i]
        other_ranges.append((start, other_indices[-1]))

    for r in other_ranges:
        last_time, start_time, end_time, last_time_origin = get_last_time(
            log_time[r[0]], log_time[r[1]])
        with open(file_save_path + "analysis_localization_origin.csv", '+a') as loc_f:
            loc_f.write(start_time + ',' + end_time +
                        ',' + '2' + ',' + str(last_time) + '\n')

    # print("e值的索引区间", other_ranges)

    return res_no4_time, res_5_time, res_1_time, res_0_time, res_e_time


def show_status(status, vp31_lon, vp31_lat):
    status_4_x, status_4_y, status_4_idx = [], [], []
    status_5_x, status_5_y, status_5_idx = [], [], []
    status_1_x, status_1_y, status_1_idx = [], [], []
    status_0_x, status_0_y, status_0_idx = [], [], []
    status_e_x, status_e_y, status_e_idx = [], [], []
    for i in range(0, len(status)):
        if status[i] == 4:
            status_4_x.append(vp31_lon[i])
            status_4_y.append(vp31_lat[i])
            status_4_idx.append(i)
        elif status[i] == 5:
            status_5_x.append(vp31_lon[i])
            status_5_y.append(vp31_lat[i])
            status_5_idx.append(i)
        elif status[i] == 1:
            status_1_x.append(vp31_lon[i])
            status_1_y.append(vp31_lat[i])
            status_1_idx.append(i)
        elif status[i] == 0:
            status_0_x.append(vp31_lon[i])
            status_0_y.append(vp31_lat[i])
            status_0_idx.append(i)
        else:
            status_e_x.append(vp31_lon[i])
            status_e_y.append(vp31_lat[i])
            status_e_idx.append(i)
    plt.scatter(status_4_x, status_4_y, marker='o',
                color='green', label='status = 4')  # map heading
    plt.scatter(status_5_x, status_5_y, marker='o',
                color='blue', label='status = 5')  # ins_yaw
    plt.scatter(status_1_x, status_1_y, marker='o',
                color='red', label='status = 1')  # map heading
    plt.scatter(status_0_x, status_0_y, marker='o',
                color='black', label='status = 0')  # ins_yaw5
    plt.scatter(status_e_x, status_e_y, marker='o',
                color='yellow', label='status else')


def GPS_data_filter(x, y, z, x1, y1, z1):
    x_res, y_res, z_res = [], [], []
    x1_res, y1_res, z1_res = [], [], []
    for i in range(0, len(x)):
        if x1[i] != 0 and y1[i] != 0:
            x_res.append(x[i])
            y_res.append(y[i])
            z_res.append(z[i])
            x1_res.append(x1[i])
            y1_res.append(y1[i])
            z1_res.append(z1[i])
    return x_res, y_res, z_res, x1_res, y1_res, z1_res


def cma_data_filter(diff):
    diff_res = []
    for i in range(0, len(diff)):
        if diff[i] <= 5:
            diff_res.append(diff[i])
        else:
            diff_res.append(-1)
    return diff_res


def line_filter(l):
    l_res = []
    for i in range(0, len(l)):
        if l[i] >= 0:
            l_res.append(l[i])
        else:
            l_res.append(-1)
    return l_res


def cma_filter(str):
    if str == 'nan':
        return '-1'
    else:
        return str


def show_counter(lst, data_path):
    counter = Counter(lst)

    # 计算总数量
    total_count = sum(counter.values())

    # 计算每个数字的占比
    percentage = {num: count / total_count for num, count in counter.items()}

    # 打印结果
    with open(data_path + "conclution.csv", '+a') as loc_f:
        loc_f.write("3、定位QC结果查询:\n")
        for num, count in counter.items():
            loc_f.write("数字 {} 出现的次数:{},占比:{:.2%}".format(
                num, count, percentage[num]) + "\n")

    # 提取数字和对应的次数和占比
    numbers = list(counter.keys())
    counts = list(counter.values())
    percentages = [percentage[num] for num in numbers]

    plt.figure()
    # 绘制条形图
    plt.bar(numbers, counts)

    # 添加标题和标签
    plt.title('Number Counts')
    plt.xlabel('Numbers')
    plt.ylabel('Counts')
    plt.savefig(data_path + "localization_bar"+'.png', dpi=512)
    # 显示图形
    # plt.show()


def localization_QC(gnss_lon, gnss_lat, ins_lon,
                    ins_lat, gnss_status, ins_status, data_path):
    cnter_status = 1
    cnter_lonlat = 1
    res_cnter = []
    for gnss_lon, gnss_lat, ins_lon, ins_lat, gnss_status, ins_status in zip(gnss_lon, gnss_lat, ins_lon,
                                                                             ins_lat, gnss_status, ins_status):
        if gnss_status == 4 and ins_status == 1:
            cnter_status *= 1
        elif gnss_status == 5 and ins_status == 1:
            cnter_status *= 1.5
        elif gnss_status == 5 and ins_status == 0:
            cnter_status *= 2
        elif gnss_status == 4 and ins_status == 0:
            cnter_status *= 2.5
        else:
            cnter_status *= 0

        if abs(gnss_lon - ins_lon) < 2e-6 and abs(gnss_lat - ins_lat) < 2e-6:
            cnter_lonlat *= 1
        elif abs(gnss_lon - ins_lon) < 4e-6 and abs(gnss_lat - ins_lat) < 4e-6:
            cnter_lonlat *= 2
        else:
            cnter_lonlat *= -1
        res_cnter.append(cnter_status * cnter_lonlat)
        cnter_status = 1
        cnter_lonlat = 1
    show_counter(res_cnter, data_path)


def Ablines_QC(line1_length, line2_length, diff1, diff2, diff3):
    cnter_ab1, cnter_ab2 = 1, 1
    cnter_vp1, cnter_vp2, cnter_vp3 = 1, 1, 1
    res_cnt_ab1, res_cnt_ab2 = [], []
    res_cnt_vp = []
    for line1_length, line2_length, diff1, diff2, diff3 in zip(line1_length,
                                                               line2_length, diff1, diff2, diff3):
        if line1_length >= 100:
            cnter_ab1 *= 1
        elif line1_length >= 50:
            cnter_ab1 *= 1.5
        elif line1_length >= 20:
            cnter_ab1 *= 2
        else:
            cnter_ab1 *= -1

        if line2_length >= 100:
            cnter_ab2 *= 1
        elif line2_length >= 50:
            cnter_ab2 *= 1.5
        elif line2_length >= 20:
            cnter_ab2 *= 2
        else:
            cnter_ab2 *= 0

        res_cnt_ab1.append(cnter_ab1)
        res_cnt_ab2.append(cnter_ab2)

        if diff1 < 0.1:
            cnter_vp1 *= 1
        elif diff1 < 0.3:
            cnter_vp1 *= 1.5
        elif diff1 < 0.5:
            cnter_vp1 *= 2
        elif diff1 < 0.7:
            cnter_vp1 *= 2.5
        elif diff1 < 0.9:
            cnter_vp1 *= 3
        else:
            cnter_vp1 *= 0

        if diff2 < 0.1:
            cnter_vp2 *= 1
        elif diff2 < 0.3:
            cnter_vp2 *= 1.5
        elif diff2 < 0.5:
            cnter_vp2 *= 2
        elif diff2 < 0.7:
            cnter_vp2 *= 2.5
        elif diff2 < 0.9:
            cnter_vp2 *= 3
        else:
            cnter_vp2 *= -1

        if diff3 < 0.1:
            cnter_vp3 *= 1
        elif diff3 < 0.3:
            cnter_vp3 *= 1.5
        elif diff3 < 0.5:
            cnter_vp3 *= 2
        elif diff3 < 0.7:
            cnter_vp3 *= 2.5
        elif diff3 < 0.9:
            cnter_vp3 *= 3
        else:
            cnter_vp3 *= 0.000001

        cnter_vp = cnter_vp3*cnter_vp1*cnter_vp2
        res_cnt_vp.append(cnter_vp)
        cnter_ab1, cnter_ab2 = 1, 1
        cnter_vp1, cnter_vp2, cnter_vp3 = 1, 1, 1
    show_counter(res_cnt_ab1)
    show_counter(res_cnt_ab2)
    show_counter(res_cnt_vp)
    return res_cnt_ab1, res_cnt_ab2, res_cnt_vp


# def Ablines_QC(line1, line2, line3, line4, vp_center_line, ab_center_line):

def save_string_after_backslash(string):
    index = string.rfind('/')
    if index != -1:
        result = string[index+1:]
    else:
        result = string
    return result


def Prepare_data(file_name1, file_name2, data_path, analysis_data_path):
    file_name = save_string_after_backslash(file_name1)
    print("filename: ", file_name)
    # print_dis()
    file_name1 = str(data_path + file_name1)
    file_name2 = str(data_path + file_name2)
    data_line1 = [l.split('\n')[0].split(',')
                  for l in open(file_name1, "r").readlines()[1:]]

    data_line2 = [l.split('\n')[0].split(',')
                  for l in open(file_name2, "r").readlines()[1:]]
    gnss_timestamps = [int(l[0]) for l in data_line1]
    vp31_lon_ins = [float(l[2]) for l in data_line2]
    vp31_lat_ins = [float(l[3]) for l in data_line2]
    vp31_lon_gnss = [float(l[4]) for l in data_line2]
    vp31_lat_gnss = [float(l[5]) for l in data_line2]
    vp31_gnss_status = [int(l[8]) for l in data_line2]
    # print(vp31_gnss_status)
    vp31_ins_status = [int(l[9]) for l in data_line2]
    vp31_lon_gnss_f, vp31_lat_gnss_f, vp31_gnss_status_f, vp31_lon_ins_f, vp31_lat_ins_f, vp31_ins_status_f = GPS_data_filter(vp31_lon_gnss,
                                                                                                                              vp31_lat_gnss, vp31_gnss_status, vp31_lon_ins, vp31_lat_ins, vp31_ins_status)
    # vp31_lon_ins, vp31_lat_ins, vp31_ins_status = GPS_data_filter(
    #     vp31_lon_ins, vp31_lat_ins, vp31_ins_status)
    log_time = [int(l[12]) for l in data_line2]
    diff1 = [float(cma_filter(l[0]))
             for l in data_line1]
    diff1 = cma_data_filter(diff1)
    diff2 = cma_data_filter([float(cma_filter(l[1]))
                            for l in data_line1])
    diff3 = cma_data_filter([float(cma_filter(l[2]))
                            for l in data_line1])
    l2 = line_filter([float(l[4]) for l in data_line1])
    l3 = line_filter([float(l[5]) for l in data_line1])
    idx = np.array([i for i in range(0, len(diff1))])
    idx_ins = np.array([i for i in range(0, len(vp31_ins_status))])
    idx_gnss = np.array([i for i in range(0, len(vp31_gnss_status))])
    idx3 = np.array([i for i in range(0, len(l2))])
    file_name = file_name[:-7]
    print("update name : ", file_name)
    data_path = analysis_data_path+'analysis/'
    print("analysis data path is:", data_path)
    # 记录所有数据信息
    localization_error_time_filter(
        vp31_gnss_status, vp31_lon_ins, vp31_lat_ins, log_time, data_path, file_name)

    # GNSS status & gnss filter
    plt.figure(1)
    plt.subplot(1, 2, 1)
    show_status(vp31_gnss_status, vp31_lon_ins, vp31_lat_ins)
    plt.legend(loc="upper right")
    plt.title("gnss status origin")
    plt.xlabel("lon")  # 横轴名称
    plt.ylabel("lat")  # 纵轴名称
    plt.subplot(1, 2, 2)
    show_status(vp31_gnss_status_f, vp31_lon_ins_f, vp31_lat_ins_f)
    plt.legend(loc="upper right")
    plt.title("gnss status filer")
    plt.xlabel("lon")  # 横轴名称
    plt.ylabel("lat")  # 纵轴名称
    plt.savefig(os.path.join(data_path, file_name +
                "gnss_status"+'.png'), dpi=1024)
    # plt.subplot(2, 2, 2)

    plt.clf()
    plt.figure(2)
    plt.plot(idx, diff1, ls='-', lw=2, label='center_line_diff',
             color='black')  # map heading
    plt.plot(idx, diff1, ls='-', lw=2, label='left_line_diff',
             color='blue')  # map heading
    plt.plot(idx, diff3, ls='-', lw=2, label='right_line_diff',
             color='red')  # map heading

    plt.plot()
    plt.legend()
    plt.title("line_diff")
    plt.xlabel("idx")  # 横轴名称
    plt.ylabel("diff(m)")  # 纵轴名称
    plt.savefig(os.path.join(data_path, file_name + "diff"+'.png'), dpi=512)

    plt.clf()
    plt.figure(3)
    plt.plot(idx_ins, vp31_ins_status, ls='-', lw=2, label='ins_status',
             color='red')
    plt.plot(idx_gnss, vp31_gnss_status, ls='-', lw=2, label='gnss_status',
             color='blue')
    plt.legend()
    plt.title("ins_status")
    plt.xlabel("idx")  # 横轴名称
    plt.ylabel("ins_status")
    plt.savefig(os.path.join(data_path, file_name +
                "gnss_status_explian"+'.png'),
                dpi=512)
    # plt.subplot(2, 2, 4)
    plt.clf()
    plt.figure(4)
    plt.plot(idx3, l2, ls='-', lw=2, label='line2_length',
             color='blue')
    plt.plot(idx3, l3, ls='-', lw=2, label='line3_length',
             color='black')

    plt.savefig(os.path.join(data_path, file_name + '.png'), dpi=512)

    # plt.legend()
    # plt.show()
    data_save_path = data_path+file_name
    localization_QC(vp31_lon_gnss, vp31_lat_gnss, vp31_lon_ins,
                    vp31_lat_ins, vp31_gnss_status, vp31_ins_status, data_save_path)


if __name__ == "__main__":
    if len(sys.argv) < 1:
        print(" please add file name!! ")
        sys.exit(1)
    data_path = sys.argv[1]
    analysis_data_path = data_path[:-4]
    print("analysis file save path is : ", analysis_data_path, '\n')
    # Prepare_data(file_name1, file_name2)
    file_name_list = get_all_file_name(data_path)
    for i in range(1, len(file_name_list), 2):
        Prepare_data(
            file_name_list[i-1], file_name_list[i], data_path, analysis_data_path)
        time.sleep(1)

    # if len(sys.argv) < 2:
    #     print(" please add file name!! ")
    #     sys.exit(1)
    # file_name1, file_name2 = sys.argv[1], sys.argv[2]
    # data_path = "路径"
    # Prepare_data(file_name1, file_name2, data_path)
相关推荐
anqi274 分钟前
如何在 IntelliJ IDEA 中编写 Speak 程序
java·大数据·开发语言·spark·intellij-idea
XuX039 分钟前
MATLAB小试牛刀系列(1)
开发语言·matlab
大模型真好玩16 分钟前
初学者必看大模型微调指南:Unsloth官方微调技巧大公开!
人工智能·python
Suckerbin19 分钟前
第十四章-PHP与HTTP协议
开发语言·http·php
Best_Liu~25 分钟前
TransactionTemplate 与@Transactional 注解的使用
java·开发语言·spring boot·后端
谈不譚网安30 分钟前
初识Python
开发语言·python
慕雪华年43 分钟前
【Python】使用uv管理python虚拟环境
开发语言·python·ai·uv·mcp
狗蛋儿l1 小时前
qt 3d航迹图
开发语言·qt·3d
跳跳糖炒酸奶1 小时前
第二章、Isaaclab强化学习包装器(1)
人工智能·python·算法·ubuntu·机器人
学习机器不会机器学习2 小时前
深入浅出JavaScript常见设计模式:从原理到实战(2)
开发语言·javascript·设计模式