使用python实现自动化拉取压缩包并处理流程
使用python实现自动化拉取压缩包并处理流程
- 实现成果展示
- 使用说明
实现成果展示
使用说明
执行./run.sh
脚本中的内容主要功能是:
1、从远程服务器上下拉制定时间更新的数据
2、将数据中的zip拷贝到指定文件夹内
3、解压后删除所有除了lcm之外的文件
4、新建一个out文件夹执行解析lcm可执行文件,保存所有的解析后文件
5、新建一个analysis文件夹并执行analysis脚本,对out文件夹中的内容进行analysis,并把生成的5个图片以及三个文档保存到analysis中
6、生成的5个图片是:
gnss状态,gnss状态解释,中心线差值对比,gnssQC,车道线数据
#!/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 statisticsdef 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 nummode = statistics.mode(last_time_list)minutes = mode // 60000seconds = (mode // 1000) % 60milliseconds = mode % 1000mode = "{:02d}'{:02d}''{:03d}'''".format(minutes, seconds, milliseconds)# last time min numminimum = min(last_time_list)minutes = minimum // 60000seconds = (minimum // 1000) % 60milliseconds = minimum % 1000minimum = "{:02d}'{:02d}''{:03d}'''".format(minutes, seconds, milliseconds)# last time mean nummean_time = int(statistics.mean(last_time_list))minutes = mean_time // 60000seconds = (mean_time // 1000) % 60milliseconds = mean_time % 1000mean_time = "{:02d}'{:02d}''{:03d}'''".format(minutes, seconds, milliseconds)# last time max nummaxmum = max(last_time_list)minutes = maxmum // 60000seconds = (maxmum // 1000) % 60milliseconds = 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 = Nonepair0_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 = Noneelse:if start_index is None:start_index = iif 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_listdef check_number(lst, num):result = []for sub_lst in lst:if num in sub_lst:result.append(True)else:result.append(False)return resultdef 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) - 1result.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 = idxfirst_element = change_pair[0]result_change = first_element + reschange_pair = (result_change, change_pair[1])idx = change_pairupdate_index_range.append(idx)# print(result, "\n", update_index_range)return result, update_index_rangedef 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.yearmonth = dt1.monthday = dt1.dayhour = dt1.hourminute = dt1.minutesecond = 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.yearmonth = dt2.monthday = dt2.dayhour = dt2.hourminute = dt2.minutesecond = 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_timeminutes = last_time // 60000seconds = (last_time // 1000) % 60milliseconds = last_time % 1000last_time = "{:02d}'{:02d}''{:03d}'''".format(minutes, seconds, milliseconds)return last_time, start_time, end_time, last_time_origindef localization_error_time_filter(status, vp31_lon, vp31_lat, log_time, data_path, file_name):file_save_path = data_path+file_namestatus_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 timewith 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.closefor 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 changesplit_indices = [i for i in range(1, len(status)) if status[i] == 4 and status[i-1] != 4]sublists = []start = 0for index in split_indices:sublists.append(status[start:index])start = indexsublists.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 - 1updated_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 = 4result_check = check_number(sublists, num)# print(result_check)index_status_change = 1four_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):continueelse: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 addzero_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_timedef 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 headingplt.scatter(status_5_x, status_5_y, marker='o',color='blue', label='status = 5') # ins_yawplt.scatter(status_1_x, status_1_y, marker='o',color='red', label='status = 1') # map headingplt.scatter(status_0_x, status_0_y, marker='o',color='black', label='status = 0') # ins_yaw5plt.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_resdef 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_resdef 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_resdef cma_filter(str):if str == 'nan':return '-1'else:return strdef 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 = 1cnter_lonlat = 1res_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 *= 1elif gnss_status == 5 and ins_status == 1:cnter_status *= 1.5elif gnss_status == 5 and ins_status == 0:cnter_status *= 2elif gnss_status == 4 and ins_status == 0:cnter_status *= 2.5else:cnter_status *= 0if abs(gnss_lon - ins_lon) < 2e-6 and abs(gnss_lat - ins_lat) < 2e-6:cnter_lonlat *= 1elif abs(gnss_lon - ins_lon) < 4e-6 and abs(gnss_lat - ins_lat) < 4e-6:cnter_lonlat *= 2else:cnter_lonlat *= -1res_cnter.append(cnter_status * cnter_lonlat)cnter_status = 1cnter_lonlat = 1show_counter(res_cnter, data_path)def Ablines_QC(line1_length, line2_length, diff1, diff2, diff3):cnter_ab1, cnter_ab2 = 1, 1cnter_vp1, cnter_vp2, cnter_vp3 = 1, 1, 1res_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 *= 1elif line1_length >= 50:cnter_ab1 *= 1.5elif line1_length >= 20:cnter_ab1 *= 2else:cnter_ab1 *= -1if line2_length >= 100:cnter_ab2 *= 1elif line2_length >= 50:cnter_ab2 *= 1.5elif line2_length >= 20:cnter_ab2 *= 2else:cnter_ab2 *= 0res_cnt_ab1.append(cnter_ab1)res_cnt_ab2.append(cnter_ab2)if diff1 < 0.1:cnter_vp1 *= 1elif diff1 < 0.3:cnter_vp1 *= 1.5elif diff1 < 0.5:cnter_vp1 *= 2elif diff1 < 0.7:cnter_vp1 *= 2.5elif diff1 < 0.9:cnter_vp1 *= 3else:cnter_vp1 *= 0if diff2 < 0.1:cnter_vp2 *= 1elif diff2 < 0.3:cnter_vp2 *= 1.5elif diff2 < 0.5:cnter_vp2 *= 2elif diff2 < 0.7:cnter_vp2 *= 2.5elif diff2 < 0.9:cnter_vp2 *= 3else:cnter_vp2 *= -1if diff3 < 0.1:cnter_vp3 *= 1elif diff3 < 0.3:cnter_vp3 *= 1.5elif diff3 < 0.5:cnter_vp3 *= 2elif diff3 < 0.7:cnter_vp3 *= 2.5elif diff3 < 0.9:cnter_vp3 *= 3else:cnter_vp3 *= 0.000001cnter_vp = cnter_vp3*cnter_vp1*cnter_vp2res_cnt_vp.append(cnter_vp)cnter_ab1, cnter_ab2 = 1, 1cnter_vp1, cnter_vp2, cnter_vp3 = 1, 1, 1show_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 = stringreturn resultdef 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 filterplt.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 headingplt.plot(idx, diff1, ls='-', lw=2, label='left_line_diff',color='blue') # map headingplt.plot(idx, diff3, ls='-', lw=2, label='right_line_diff',color='red') # map headingplt.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_namelocalization_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)
相关文章:
使用python实现自动化拉取压缩包并处理流程
使用python实现自动化拉取压缩包并处理流程 实现成果展示使用说明 实现成果展示 使用说明 执行./run.sh 脚本中的内容主要功能是: 1、从远程服务器上下拉制定时间更新的数据 2、将数据中的zip拷贝到指定文件夹内 3、解压后删除所有除了lcm之外的文件 4、新建一个ou…...
解构编程语言的基因密码:论数据类型如何被语言系统定义与重塑
摘要 本文从理论与实践层面系统探讨编程语言中数据类型的定义、实现与演化。通过静态与动态类型系统的差异分析,结合案例、流程图和表格,全面呈现主流语言数据类型设计特点及其对内存管理、错误防范与性能优化的影响。文章旨在为语言设计者和开发者提供…...
GRPO vs SFT:强化学习提升大模型多模态推理泛化能力的原因研究
GRPO vs SFT:强化学习提升大模型多模态推理泛化能力的原因研究 作者:吴宇斌 原文地址:https://zhuanlan.zhihu.com/p/1892362859628963761 训练目标与优化方式差异对比 监督微调(SFT)的目标: SFT使用带标注…...
从千兆到40G:飞速(FS)助力制造企业构建高可靠智能生产网络
案例亮点 部署S5850-24S2Q交换机,启用MLAG跨设备链路聚合,构建高性能冗余架构,消除单点故障风险,将网络可用性提升至99.99%,保障生产系统与全球业务连续性。采用40G光模块与US Conec MTP连接头多模跳线实现数据中心间…...
WHAT - 《成为技术领导者》思考题(第三章)
文章目录 涉及内容理解问题管理想法的交流保证质量 思考题思路和示例框架1. 观察一个你认为是领导者的人,列出他的行为,分类,并思考自己未采用的行为2. 观察一个不太像领导者的人,列出错过的简单机会,并反思3. 让别人注…...
Go 语言入门:(一) 环境安装
一、前言 这里不同于其他人的 Go 语言入门,环境安装我向来注重配置,比如依赖包、缓存的默认目录。因为前期不弄好,后面要整理又影响这影响那的,所以就干脆写成文章,方便后期捡起。 二、安装 1. 安装包 https://go.…...
GTC2025全球流量大会:领驭科技以AI云端之力,助力中国企业出海破浪前行
在全球化与数字化浪潮下,AI技术正成为中国企业出海的重要驱动力。一方面,AI通过语言处理、数据分析等能力显著提升出海企业的运营效率与市场适应性,尤其在东南亚等新兴市场展现出"高性价比场景适配"的竞争优势;另一方面…...
013几何数学——算法备赛
几何数学 平面切分 蓝桥杯2020年省赛题 问题描述 平面上有N条直线,其中第i条直线为yAxB.请计算这些直线将平面分成了几个部分? 输入 第一行输入一个N,接下来N行输入两个整数代表Ai和Bi。 1<N<10^5. 思路分析 初始时一条直线将…...
VUE3:封装一个评论回复组件
之前用React封装的评论回复组件,里面有三个主要部分:CommentComponent作为主组件,CommentItem处理单个评论项,CommentInput负责输入框。现在需要将这些转换为Vue3的组件。 Vue3和React在状态管理上有所不同,Vue3使用r…...
DELL R740服务器闪黄灯不开机故障案例
1:DELL R740服务器 2:东莞长安客户工厂晚上十一二点电路跳闸多次,导致R740 ERP服务器无法开机。 3:故障现象为:主机能正常通电,开机按钮无通电迹象,正常情况会闪绿灯慢闪,通电一会后…...
记录一下QA(from deepseek)
Q1:__init__.py文件 在 Python 中,当你在一个目录下创建 __init__.py 文件时,这个目录会被视为一个 包(Package)。包的存在使得 Python 能够通过点号(.)层级式地组织模块(.py 文件)&…...
码蹄集——进制输出、求最大公约数、最小公倍数
进制乱炖 本题考查输出的进制转换,可以直接使用c里的format格式输出 #include<iostream> #include<algorithm> #include<string> using namespace std;int main() {int x;cin>>x;printf("%d %o %x %u\n",x,x,x,x);//十进制 八进…...
从技术走向管理:带来哪些角色转变与挑战
文章目录 一、从技术到管理1、从技术转到管理的优劣势(1)优势(2)劣势 2、刚转岗容易犯的几个问题3、最大的变化:不再是一个人单打独斗4、警惕:一开始不要把“人”过早的介入到“事”5、如何完成角色的转变&…...
C语言-指针(一)
目录 指针 内存 概念 指针变量 取地址操作符(&) 操作符“ * ” 指针变量的大小 注意 指针类型的意义 作用 void * 指针 const修饰指针变量 const放在*前 const放在*后 双重const修饰 指针的运算 1.指针 - 整数 2.指针 - 指针 3.指…...
Python面试问题
一、Python 基础 1. Python 的特点 动态类型:变量无需声明类型。解释型语言:逐行解释执行。支持多种编程范式(面向对象、函数式、过程式)。 2. 列表(List)与元组(Tuple)的区别 特…...
RAG工程-基于LangChain 实现 Advanced RAG(预检索优化)
Advanced RAG 概述 Advanced RAG 被誉为 RAG 的第二范式,它是在 Naive RAG 基础上发展起来的检索增强生成架构,旨在解决 Naive RAG 存在的一些问题,如召回率低、组装 prompt 时的冗余和重复以及灵活性不足等。它重点聚焦在检索增强࿰…...
【时时三省】(C语言基础)循环结构程序设计习题1
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 习题1 输入两个正整数m和n,求其最大公约数和最小公倍数。 解题思路: 求两个正整数 m 和 n 的最大公约数通常使用辗转相除法(欧几里得算法ÿ…...
[密码学实战]SDF之设备管理类函数(一)
[密码学实战]SDF之设备管理类函数(一) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层功能范畴: #mermaid-svg-s3JXUdtH4erONmq9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16p…...
CDGP|如何建立高效的数据治理团队?
近年来,数据治理行业迅速发展,越来越多的企业开始重视并投入大量资源来建立和完善数据治理体系。数据治理体系不仅能够帮助企业更好地管理和利用数据资源,提升数据质量和数据价值,还能够为企业带来竞争优势和可持续发展能力。 然…...
如何评价 DeepSeek 的 DeepSeek-V3 模型?
DeepSeek-V3 是由杭州 DeepSeek 公司于 2024 年 12 月 26 日发布的一款开源大语言模型,其性能和创新技术在国内外引起了广泛关注。从多个方面来看,DeepSeek-V3 的表现令人印象深刻,具体评价如下: 性能卓越 DeepSeek-V3 拥有 6710 …...
【基础篇】prometheus命令行参数详解
文章目录 本篇内容讲解命令行参数详解 本篇内容讲解 prometheus高频修改命令行参数详解 命令行参数详解 在页面的/页面上能看到所有的命令行参数,如图所示: 使用shell命令查看 # ./prometheus --help usage: prometheus [<flags>]The Promethe…...
SpringBoot实现接口防刷的5种高效方案详解
目录 前言:接口防刷的重要性 方案一:基于注解的访问频率限制 实现原理 核心代码实现 使用示例 优缺点分析 方案二:令牌桶算法实现限流 算法原理 核心实现 配置使用 适用场景分析 方案三:分布式限流(Redis …...
DeepSearch复现篇:QwQ-32B ToolCall功能初探,以Agentic RAG为例
DeepSearch复现篇:QwQ-32B ToolCall功能初探,以Agentic RAG为例 作者:CyPaul Space 原文地址:https://zhuanlan.zhihu.com/p/30289363967 全文阅读约3分钟~ 背景 今天看到 论文:Search-R1: Training LLMs to Reason …...
项目实战-贪吃蛇大作战【补档】
这其实算是一个补档,因为这个项目是我在大一完成的,但是当时没有存档的习惯,今天翻以前代码的时候翻到了,于是乎补个档,以此怀念和志同道合的网友一起做项目的日子 ₍ᐢ ›̥̥̥ ༝ ‹̥̥̥ ᐢ₎♡ 这里面我主要负责…...
power bi获取局域网内共享文件
power bi获取局域网内共享文件 需求: 数据源并不一定都是在本地,有可能在云端,也有可能在其他服务器,今天分享如果数据源在另外一台服务器,如何获取数据源的方法。 明确需求:需要通过PowerBI获取局域网中的…...
100%提升信号完整性:阻抗匹配在高速SerDes中的实践与影响
一个高速信号SerDes通道(例如PCIe、112G/224G-PAM4)包含了这些片段: 传输线连通孔(PTH or B/B via)连接器高速Cable锡球(Ball and Bump) 我们会希望所有的片段都可以有一致的阻抗,…...
第六章:Tool and LLM Integration
Chapter 6: Tool and LLM Integration 从执行流到工具集成:如何让AI“调用真实世界的技能”? 在上一章的执行流框架中,我们已经能让多个代理协作完成复杂任务。但你是否想过:如果用户要求“查询实时天气”或“打开网页搜索”&…...
prompt提示词编写技巧
为什么学习prompt编写 目的:通过prompt的编写,提升LLM输出相关性、准确性和多样性,并对模型输出的格式进行限制,满足我们的业务需求。 学过提示词工程的人:像“专业导演”,通过精准指令控制 AI 输出&#…...
Nginx配置SSL详解
文章目录 Nginx配置SSL详解1. SSL/TLS 基础知识2. 准备工作3. 获取SSL证书4. Nginx SSL配置步骤4.1 基础配置4.2 配置说明 5. 常见配置示例5.1 双向认证配置5.2 多域名SSL配置 6. 安全优化建议7. 故障排查总结参考资源下载验证的完整实例 Nginx配置SSL详解 1. SSL/TLS 基础知识…...
网络安全之红队LLM的大模型自动化越狱
前言 大型语言模型(LLMs)已成为现代机器学习的重要支柱,广泛应用于各个领域。通过对大规模数据的训练,这些模型掌握了多样化的技能,展现出强大的生成与理解能力。然而,由于训练数据中难以完全剔除有毒内容&…...
【技术笔记】通过Cadence Allegro创建一个PCB封装(以SOT23为例)
【技术笔记】通过Cadence Allegro创建一个PCB封装(以SOT23为例) 一、焊盘创建二、PCB封装设计三、丝印位号及标识添加 更多内容见专栏:【硬件设计遇到了不少问题】、【Cadence从原理图到PCB设计】 一、焊盘创建 首先要找到元器件的相关手册&…...
新环境注册为Jupyter 内核
1. 确认环境是否已注册为内核 在终端运行以下命令,查看所有已注册的内核: jupyter kernelspec list2. 为自定义环境注册内核 步骤 1:激活目标虚拟环境 conda activate your_env_name # 替换为你的环境名步骤 2:安装…...
[Spring] Seata详解
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
使用JDK的数据校验和Spring的自定义注解校验前端传递参数的两种方法
第一种:JDK的数据校验注解 PostMapping("/test")public String test(QueryParam param, RequestHeader(value "App_key") String App_key,RequestHeader(value "App_secret") String App_secret) throws IOException {param.setApp…...
JS错误处理的新方案 (不使用try-catch)
错误处理一直是JavaScript开发者需要认真对待的问题,传统的try-catch语法虽然简单直观,但在异步代码中使用时存在诸多限制。 try-catch的局限性 传统try-catch模式在现代JavaScript开发中面临的问题: 1. 异步错误捕获的缺陷 try-catch无法…...
前端实现商品放大镜效果(Vue3完整实现)
前端实现商品放大镜效果(Vue3完整实现) 前言 在电商类项目中,商品图片的细节展示至关重要。放大镜效果能显著提升用户体验,允许用户在不跳转页面的情况下查看高清细节。本文将基于Vue3实现一个高性能的放大镜组件,完整…...
redis未授权访问漏洞学习
一、Redis常见用途 1. Redis介绍 全称与起源: Redis全称Remote Dictionary Service(远程字典服务),最初由antirez在2009年开发,用于解决网站访问记录统计的性能问题。发展历程: 从最初仅支持列表功能的内存数据库,经过十余年发展已支持多种…...
阿里qiankun微服务搭建
主服务 chat vue3 ts vite 子服务 ppt react 18 vite 子服务 agent 主服务 npm i vite-plugin-qiankun mian.ts import ./style/base.scss import virtual:svg-icons-register import { createApp } from vue import { createPinia } from piniaimport App from ./App.vue im…...
【CodeSprint】第二章-2.1 简单模拟
第二章 2.1 简单模拟 ✏️ 关于专栏:专栏用于记录 prepare for the coding test。 1. 简单模拟 简单模拟题目不需要复杂算法,直接按照题意一步步模拟即可。 1.1 促销计算 题目描述 某百货公司为了促销,采用购物打折的优惠方法:…...
Golang实现函数默认参数
golang原生不支持默认参数 在日常开发中,我们有时候需要使用默认设置,但有时候需要提供自定义设置 结构体/类,在Java我们可以使用无参、有参构造函数来实现,在PHP中我们也可以实现(如 public function xxx($isCName false, $sec…...
【Python Web开发】03-HTTP协议
文章目录 1. HTTP协议基础1.1 请求-响应模型1.2 请求方法1.3 请求和响应结构1.4 状态码 2. Python 发送 HTTP 请求2.1 urllib库2.2 requests 库 3. Python 构建 HTTP 服务器3.1 http.server模块3.2 Flask 框架 4. HTTP 协议的安全问题5. 缓存和性能优化 HTTP(Hypert…...
提高营销活动ROI:大数据驱动的精准决策
提高营销活动ROI:大数据驱动的精准决策 大家好,我是Echo_Wish。今天我们来聊聊如何通过大数据来提高营销活动的ROI(投资回报率)。我们都知道,随着市场的日益竞争,营销的成本不断增加,如何在这片红海中脱颖而出,不仅需要精准的营销策略,还需要依靠先进的技术,尤其是大…...
前端excel导出
在数据可视化和管理日益重要的今天,前端实现 Excel 导出功能已经成为众多项目中的刚需。 一、Excel 导出的常见场景 数据报表导出:在企业管理系统、数据分析平台中,用户经常需要将系统中的数据以 Excel 表格的形式导出,便于离…...
pymsql(SQL注入与防SQL注入)
SQL注入: import pymysql# 创建数据库连接 返回一个对象 conn pymysql.connect(host"localhost", # MySQL服务器地址 本地地址 127.0.0.1user"root", # 用户名 (账号)password"155480", # 密码database&qu…...
基于Springboot + vue + 爬虫实现的高考志愿智能推荐系统
项目描述 本系统包含管理员和学生两个角色。 管理员角色: 个人中心管理:管理员可以管理自己的个人信息。 高校信息管理:管理员可以查询、添加或删除高校信息,并查看高校详细信息。 学生管理:管理员可以查询、添加或…...
delphi使用sqlite3
看了一下delphi调用sqlite3最新版本的调用,网上说的都很片面,也没有完整的资料了。 我自己研究了一下,分享出来。 在调用demo中,官方也给了一个demo但是功能很少,没有参考价值。 1.定义: 首先把sqlite3…...
高压开关柜局部放电信号分析系统
高压开关柜局部放电信号分析系统 - 开发笔记 1. 项目概述 这个项目是我在2025年实现的高压开关柜局部放电信号分析系统,目的是通过采集分析局部放电信号,判断设备的工作状态和潜在故障。系统包含从信号模拟生成、特征提取、到深度学习模型训练的全流程…...
ai环境conda带torch整体迁移。
conda打包好的GPU版torch环境,其实很简单,就是conda装好的torch环境env整体打包,然后到新机器上再解压到env路径。 打开搭建好的环境,找自己路径,我默认的是这个。 cd/root/anaconda3/envs/ 然后整个文件夹打包。tar -…...
电价单位解析与用电设备耗电成本计算
一、电价单位 元/kWh 的解析 定义: 元/kWh 表示每千瓦时电能的费用,即1度电的价格。例如,若电价为0.5元/kWh,则使用1千瓦的电器1小时需支付0.5元。 电价构成: 中国销售电价由四部分组成: 上网电价…...
辛格迪客户案例 | 华道生物细胞治疗生产及追溯项目(CGTS)
01 华道(上海)生物医药有限公司:细胞治疗领域的创新先锋 华道(上海)生物医药有限公司(以下简称“华道生物”)是一家专注于细胞治疗技术研发与应用的创新型企业,尤其在CAR-T细胞免疫…...