• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
(slam工具)5 绘画可视化
 
 

 

 

https://github.com/Dongvdong/v1_1_slam_tool

 

 

链接:https://pan.baidu.com/s/1ntXJch2t3GcLJhFBXFrBdw?pwd=kles
提取码:kles

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import math


from pyecharts import Line3D


from pyecharts import Line

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
import numpy as np

# matplotlib画一条单独的3D轨迹
def Draw_trace1(x,y,z):
    fig = plt.figure()
    ax = fig.gca(projection='3d')

    ax.set_title("3D_Curve")
    ax.set_xlabel("x(m)")
    ax.set_ylabel("y(m)")
    ax.set_zlabel("z(m)")
    figure = ax.plot(x, y, z, c='r')
    
    plt.show()


# matplotlib将多条3D轨迹画在同一个图里
def API_txt_to_Draw3D(list_name_xyz):
   
    
    x_list=[]
    y_list=[]
    z_list=[]
    for data_i in list_name_xyz:
        nam_i=data_i[0]
        x_i=float(data_i[1])
        y_i=float(data_i[2])
        z_i=float(data_i[3])
        x_list.append(x_i)
        y_list.append(y_i)
        z_list.append(z_i)
    return x_list,y_list,z_list


def Draw3D_trace_more(tracelist):

    fig = plt.figure()
    ax = fig.gca(projection='3d')
    #ax = fig.add_subplot(projection='3d')

    #ax.set_zlim3d(zmin=-2, zmax=2) #纵轴范围
        
    #plt.xlim(-1500,100)
    #plt.ylim(-50,50)

    #ax.set_title("3D_Curve")
    ax.set_xlabel("x(m)")
    ax.set_ylabel("y(m)")
    ax.set_zlabel("z(m)")

    
    ax.set_aspect("auto")#设置x,y z轴等比例

    color=["blue","green","red","orange","purple","pink","yellow"]
    linestyle=["-","--","-.","-"] #":"


    for i in range(0,len(tracelist)):
        #print(tracelist[i])

        xi_list,yi_list,zi_list=API_txt_to_Draw3D(tracelist[i]) 

        color_i=color[i]
        figure = ax.plot(xi_list, yi_list, zi_list, c=color_i,linestyle=linestyle[i])

    plt.grid()#网格线
    plt.show()

#画单个2维平面轨迹
def Draw2D_trace_gpsvreal(x1,y1,x2,y2):
    
    #绘画轨迹
    print("画轨迹图")
    plt.title('Error mapped onto trajectory')
    plt.ylabel('Y(m)')
    plt.xlabel('X(m)')
    #plt.annotate('blue ', xy=(2,5), xytext=(2, 10),arrowprops=dict(facecolor='black', shrink=0.01),)
    #x=[1, 2, 3, 4,3,2,1]
    #y=[1, 4, 9, 16,3,5,6]
    plt.plot(x1,y1,color='b',linestyle='dashed')

    '''
    color:线条颜色,值r表示红色(red)
    marker:点的形状,值o表示点为圆圈标记(circle marker)
    linestyle:线条的形状,值dashed表示用虚线连接各点
    '''
    #x=[3, 4, 5, 6]
    #y=[1, 4, 9, 16]

    #plt.plot(x2, y2, color='r',marker='o',linestyle='dashed')
    plt.plot(x2, y2, color='r')

    '''
    axis:坐标轴范围
    语法为axis[xmin, xmax, ymin, ymax],
    也就是axis[x轴最小值, x轴最大值, y轴最小值, y轴最大值]
    '''

    #plt.axis([0, 6, 0, 20])
    plt.grid()#网格线
    #plt.grid(axis='x',color = 'r', linestyle = '--', linewidth = 0.5)## 设置 y 就在轴方向显示网格线
    plt.show()   

#画3个对对比 2维平面轨迹
"""
输入 data_list 多个轨迹的enu列表
     要画的x轴 xlabel='X(m)' "Y(m)" "Z(m)"
     要画的y轴 ylabeln='X(m)' "Y(m)" "Z(m)"


"""


def Draw2D_trace_gpsvreal_list(data_list,xlabel='X(m)',ylabeln='Y(m)'):
    
    color=["blue","green","red","orange","purple","pink","yellow"]
    '''
    '-'       solid    line style
    '--'      dashed   line style
    '-.'      dash-dot line style
    ':'       dotted   line style
    '''
    linestyle=["-","--","-.","-"] #:
    xmax=0
    xmin=0
    ymax=0
    ymin=0
    for i in range(0,len(data_list)):

      
        linexylist=data_list[i]
        linexlist=[]
        lineylist=[]
        #根据轴 决定画的是侧视图还是俯视图
        if xlabel=="X(m)":
            linexlist=linexylist[0]
        elif xlabel=="Y(m)":
            linexlist=linexylist[1]
        elif xlabel=="Z(m)":
            linexlist=linexylist[2]    



        if ylabeln=="X(m)":
            lineylist=linexylist[0]
        elif ylabeln=="Y(m)":
            lineylist=linexylist[1]
        elif ylabeln=="Z(m)":
            lineylist=linexylist[2]

        threah=0
        #if xlabel=="X(m)" and ylabeln=="Y(m)":
            #threah=100
       

        # xmax=int(max(linexlist)+threah)
        # xmin=int(min(linexlist)-threah)
        # ymax=int(max(lineylist)+threah)
        # ymin=int(min(lineylist)-threah)
    
        #绘画轨迹
        #print("画轨迹图")
        #plt.title('Error mapped onto trajectory')
        
        plt.xlabel(xlabel)
        plt.ylabel(ylabeln)
        #plt.annotate('blue ', xy=(2,5), xytext=(2, 10),arrowprops=dict(facecolor='black', shrink=0.01),)
        #x=[1, 2, 3, 4,3,2,1]
        #y=[1, 4, 9, 16,3,5,6]
        color_i=color[i]
        line_i=linestyle[i]
        

        plt.plot(linexlist,lineylist,color=color_i,linestyle=line_i)

        #plt.xlim(xmin,xmax)
        #plt.ylim(ymin,ymax) 



    plt.grid()#网格线
    plt.show()   
       
'''
        color:线条颜色,值r表示红色(red)

            cnames = {
            'aliceblue':            '#F0F8FF',
            'antiquewhite':         '#FAEBD7',
            'aqua':                 '#00FFFF',
            'aquamarine':           '#7FFFD4',
            'azure':                '#F0FFFF',
            'beige':                '#F5F5DC',
            'bisque':               '#FFE4C4',
            'black':                '#000000',
            'blanchedalmond':       '#FFEBCD',
            'blue':                 '#0000FF',
            'blueviolet':           '#8A2BE2',
            'brown':                '#A52A2A',
            'burlywood':            '#DEB887',
            'cadetblue':            '#5F9EA0',
            'chartreuse':           '#7FFF00',
            'chocolate':            '#D2691E',
            'coral':                '#FF7F50',
            'cornflowerblue':       '#6495ED',
            'cornsilk':             '#FFF8DC',
            'crimson':              '#DC143C',
            'cyan':                 '#00FFFF',
            'darkblue':             '#00008B',
            'darkcyan':             '#008B8B',
            'darkgoldenrod':        '#B8860B',
            'darkgray':             '#A9A9A9',
            'darkgreen':            '#006400',
            'darkkhaki':            '#BDB76B',
            'darkmagenta':          '#8B008B',
            'darkolivegreen':       '#556B2F',
            'darkorange':           '#FF8C00',
            'darkorchid':           '#9932CC',
            'darkred':              '#8B0000',
            'darksalmon':           '#E9967A',
            'darkseagreen':         '#8FBC8F',
            'darkslateblue':        '#483D8B',
            'darkslategray':        '#2F4F4F',
            'darkturquoise':        '#00CED1',
            'darkviolet':           '#9400D3',
            'deeppink':             '#FF1493',
            'deepskyblue':          '#00BFFF',
            'dimgray':              '#696969',
            'dodgerblue':           '#1E90FF',
            'firebrick':            '#B22222',
            'floralwhite':          '#FFFAF0',
            'forestgreen':          '#228B22',
            'fuchsia':              '#FF00FF',
            'gainsboro':            '#DCDCDC',
            'ghostwhite':           '#F8F8FF',
            'gold':                 '#FFD700',
            'goldenrod':            '#DAA520',
            'gray':                 '#808080',
            'green':                '#008000',
            'greenyellow':          '#ADFF2F',
            'honeydew':             '#F0FFF0',
            'hotpink':              '#FF69B4',
            'indianred':            '#CD5C5C',
            'indigo':               '#4B0082',
            'ivory':                '#FFFFF0',
            'khaki':                '#F0E68C',
            'lavender':             '#E6E6FA',
            'lavenderblush':        '#FFF0F5',
            'lawngreen':            '#7CFC00',
            'lemonchiffon':         '#FFFACD',
            'lightblue':            '#ADD8E6',
            'lightcoral':           '#F08080',
            'lightcyan':            '#E0FFFF',
            'lightgoldenrodyellow': '#FAFAD2',
            'lightgreen':           '#90EE90',
            'lightgray':            '#D3D3D3',
            'lightpink':            '#FFB6C1',
            'lightsalmon':          '#FFA07A',
            'lightseagreen':        '#20B2AA',
            'lightskyblue':         '#87CEFA',
            'lightslategray':       '#778899',
            'lightsteelblue':       '#B0C4DE',
            'lightyellow':          '#FFFFE0',
            'lime':                 '#00FF00',
            'limegreen':            '#32CD32',
            'linen':                '#FAF0E6',
            'magenta':              '#FF00FF',
            'maroon':               '#800000',
            'mediumaquamarine':     '#66CDAA',
            'mediumblue':           '#0000CD',
            'mediumorchid':         '#BA55D3',
            'mediumpurple':         '#9370DB',
            'mediumseagreen':       '#3CB371',
            'mediumslateblue':      '#7B68EE',
            'mediumspringgreen':    '#00FA9A',
            'mediumturquoise':      '#48D1CC',
            'mediumvioletred':      '#C71585',
            'midnightblue':         '#191970',
            'mintcream':            '#F5FFFA',
            'mistyrose':            '#FFE4E1',
            'moccasin':             '#FFE4B5',
            'navajowhite':          '#FFDEAD',
            'navy':                 '#000080',
            'oldlace':              '#FDF5E6',
            'olive':                '#808000',
            'olivedrab':            '#6B8E23',
            'orange':               '#FFA500',
            'orangered':            '#FF4500',
            'orchid':               '#DA70D6',
            'palegoldenrod':        '#EEE8AA',
            'palegreen':            '#98FB98',
            'paleturquoise':        '#AFEEEE',
            'palevioletred':        '#DB7093',
            'papayawhip':           '#FFEFD5',
            'peachpuff':            '#FFDAB9',
            'peru':                 '#CD853F',
            'pink':                 '#FFC0CB',
            'plum':                 '#DDA0DD',
            'powderblue':           '#B0E0E6',
            'purple':               '#800080',
            'red':                  '#FF0000',
            'rosybrown':            '#BC8F8F',
            'royalblue':            '#4169E1',
            'saddlebrown':          '#8B4513',
            'salmon':               '#FA8072',
            'sandybrown':           '#FAA460',
            'seagreen':             '#2E8B57',
            'seashell':             '#FFF5EE',
            'sienna':               '#A0522D',
            'silver':               '#C0C0C0',
            'skyblue':              '#87CEEB',
            'slateblue':            '#6A5ACD',
            'slategray':            '#708090',
            'snow':                 '#FFFAFA',
            'springgreen':          '#00FF7F',
            'steelblue':            '#4682B4',
            'tan':                  '#D2B48C',
            'teal':                 '#008080',
            'thistle':              '#D8BFD8',
            'tomato':               '#FF6347',
            'turquoise':            '#40E0D0',
            'violet':               '#EE82EE',
            'wheat':                '#F5DEB3',
            'white':                '#FFFFFF',
            'whitesmoke':           '#F5F5F5',
            'yellow':               '#FFFF00',
            'yellowgreen':          '#9ACD32'}



        marker:点的形状,值o表示点为圆圈标记(circle marker)
                '.'       point marker
                ','       pixel marker
                'o'       circle marker
                'v'       triangle_down marker
                '^'       triangle_up marker
                '<'       triangle_left marker
                '>'       triangle_right marker
                '1'       tri_down marker
                '2'       tri_up marker
                '3'       tri_left marker
                '4'       tri_right marker
                's'       square marker
                'p'       pentagon marker
                '*'       star marker
                'h'       hexagon1 marker
                'H'       hexagon2 marker
                '+'       plus marker
                'x'       x marker
                'D'       diamond marker
                'd'       thin_diamond marker
                '|'       vline marker
                '_'       hline marker


        linestyle:线条的形状,值dashed表示用虚线连接各点
                '-'       solid line style
                '--'      dashed line style
                '-.'      dash-dot line style
                ':'       dotted line style
'''

   



#画单个折线图 水平误差折线 
def Draw2D(realgps_enu_listx,realgps_enu_listy,slamgps_enu_listx,slamgps_enu_listy):

    line = Line("真值和定位轨迹") 
    v_x = [5, 20, 36, 10, 10, 100]
    v_y = [55, 60, 16, 20, 15, 80]
    line.add("真值",
        realgps_enu_listx, 
        realgps_enu_listy, 
        #mark_point=["average"] 
    )

    line.add( 
        "SLAM",
        slamgps_enu_listx,
        slamgps_enu_listy,
        #mark_line=[“average”] 表示补充一条平均值线
        mark_line=["average", "max", "min"],
        #mark_point=["average", "max", "min"],
        #mark_point_symbol="diamond",
        #mark_point_textcolor="#40ff27",
        is_smooth=True,
    )

    line.render()

#画多个折线图 在同一个图里 水平误差折线 
def Draw2D_error_onePic(slam_enu_error_list_xyz):
    # 第一个为真值


    # len(gps_data_list)和 len(slam_data_list)数量应该是对等的
   
    error_list=[]

    hengzuobiao=[]
    fps=20.0
    time_interbval=1.0/fps
    

    for i in range(0,len(slam_enu_error_list_xyz)):

        slam_enu_error_i=slam_enu_error_list_xyz[i]

        #line = Line("Positioning  Error (m) "+ str(i)) 


        error_x_list=slam_enu_error_i[0]
        error_y_list=slam_enu_error_i[1]
        error_z_list=slam_enu_error_i[2]

        for j in range(0,len(error_x_list)):
            hengzuobiao.append((j*time_interbval))


        plt.figure(figsize=(20, 10), dpi=100)
        
        plt.plot(hengzuobiao, error_x_list, c='red', label="x")
        plt.plot(hengzuobiao, error_y_list, c='green', linestyle='--', label="y")
        plt.plot(hengzuobiao, error_z_list, c='blue', linestyle='-.', label="z")
        plt.scatter(hengzuobiao, error_x_list, c='red')
        plt.scatter(hengzuobiao, error_y_list, c='green')
        plt.scatter(hengzuobiao, error_z_list, c='blue')
        plt.legend(loc='best')
        #plt.yticks(range(0, 50, 5))
        plt.grid(True, linestyle='--', alpha=0.5)
        plt.xlabel("Time (s)", fontdict={'size': 16})
        plt.ylabel("Error (m)", fontdict={'size': 16})
        plt.title("Position Error", fontdict={'size': 20})
        plt.show()


#画单组 3个折线图 各自单独一个图里 水平误差折线 
def Draw2D_error_MorePic(slam_enu_error_list_xyz):
    # 第一个为真值
    # len(gps_data_list)和 len(slam_data_list)数量应该是对等的
   
    fps=10.0
    time_interbval=1.0/fps
    
    plt.figure()
    
    '''
    num = None,               # 设定figure名称。系统默认按数字升序命名的figure_num(透视表输出窗口)e.g. “figure1”。可自行设定figure名称,名称或是INT,或是str类型;
    figsize=None,             # 设定figure尺寸。系统默认命令是rcParams["figure.fig.size"] = [6.4, 4.8],即figure长宽为6.4 * 4.8;
    dpi=None,                 # 设定figure像素密度。系统默命令是rcParams["sigure.dpi"] = 100;
    facecolor=None,           # 设定figure背景色。系统默认命令是rcParams["figure.facecolor"] = 'w',即白色white;
    edgecolor=None, frameon=True,    # 设定要不要绘制轮廓&轮廓颜色。系统默认绘制轮廓,轮廓染色rcParams["figure.edgecolor"]='w',即白色white;
    FigureClass=<class 'matplotlib.figure.Figure'>,   # 设定使不使用一个figure模板。系统默认不使用;
    '''
    #fig, axs = plt.subplots(nrows=3, ncols=1)#3行1列  figsize=(20, 6) dpi=100 像素密度
    colors = ['red', 'green', 'blue']
    line_style = ['-', '--', '-.']
    y_labels = ["x Error (m)", "y Error (m)", "z Error (m)"] #Error (m)
    
    
    
     
    slam_enu_error_i=slam_enu_error_list_xyz


    error_x_list=slam_enu_error_i[0]
    error_y_list=slam_enu_error_i[1]


    
    error_z_list=slam_enu_error_i[2]
    x_i=[]
    for j in range(0,len(error_x_list)):
        x_i.append(j)

    x_data=x_i
    y_data = [error_x_list, error_y_list, error_z_list]

    # xmin=int(min(x_data))
    # xmax=int(max(x_data))
    # ymin=int(min(y_data))
    # ymax=int(max(y_data))
    # yth=2

    for i in range(1,4):
        plt.subplot(3,1,i)


        
        #plt.plot([0,1],[0,1])
        i=i-1
        # axs[i].plot(x_data, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i],linewidth=1,marker='.'
    # ,markeredgecolor=colors[i],markersize='1',markeredgewidth=1) #label='total' alpha=0.5
        plt.plot(x_data, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i],linewidth=1,marker='.',markersize=0.1)
        #plt.scatter(x_data, y_data[i], c=colors[i])
        plt.xlabel("ID")
        plt.ylabel(y_labels[i])
        #axs[i].legend(loc='best') #默认: 对于Axes, ‘best’, 对于Figure, 'upper right'
        
        #axs[i].set_aspect(aspect=0.1)#y轴的单位刻度显示长度 与 x轴的单位刻度显示长度 的比例
        #axs[i].axis('equal')#设置y轴和x轴的单位刻度显示长度相同
        
        #axs[i].set_yticks(range(ymin,ymax, 2)) # y轴的间距和显示范围
        
         
        plt.grid(True, linestyle='--', alpha=0.5)#背景网格线
        #plt.set_xlabel("Time (s)", fontdict={'size': 10})#x轴坐标名字 和 字号
        #plt.set_ylabel(y_labels[i], fontdict={'size': 10}, rotation=90) #y轴坐标名字 和 字号
        #plt.set_title("Position {}".format(y_labels[i]), fontdict={'size': 12}) #标题

    #fig.autofmt_xdate()
    plt.show()

#画单组 3个折线图 各自单独一个图里 水平误差折线 
def Draw2D_error_MorePicv2(slam_enu_error_list_xyz):
    # 第一个为真值
    # len(gps_data_list)和 len(slam_data_list)数量应该是对等的
   
    fps=10.0
    time_interbval=1.0/fps
    
    '''
    num = None,               # 设定figure名称。系统默认按数字升序命名的figure_num(透视表输出窗口)e.g. “figure1”。可自行设定figure名称,名称或是INT,或是str类型;
    figsize=None,             # 设定figure尺寸。系统默认命令是rcParams["figure.fig.size"] = [6.4, 4.8],即figure长宽为6.4 * 4.8;
    dpi=None,                 # 设定figure像素密度。系统默命令是rcParams["sigure.dpi"] = 100;
    facecolor=None,           # 设定figure背景色。系统默认命令是rcParams["figure.facecolor"] = 'w',即白色white;
    edgecolor=None, frameon=True,    # 设定要不要绘制轮廓&轮廓颜色。系统默认绘制轮廓,轮廓染色rcParams["figure.edgecolor"]='w',即白色white;
    FigureClass=<class 'matplotlib.figure.Figure'>,   # 设定使不使用一个figure模板。系统默认不使用;
    '''
    fig, axs = plt.subplots(nrows=3, ncols=1)#3行1列  figsize=(20, 6) dpi=100 像素密度
    colors = ['red', 'green', 'blue']
    line_style = ['-', '--', '-.']
    y_labels = ["x Error (m)", "y Error (m)", "z Error (m)"] #Error (m)
    
    
    
     
    slam_enu_error_i=slam_enu_error_list_xyz


    error_x_list=slam_enu_error_i[0]
    error_y_list=slam_enu_error_i[1]


    
    error_z_list=slam_enu_error_i[2]
    x_i=[]
    for j in range(0,len(error_x_list)):
        x_i.append((j*time_interbval))

    x_data=x_i
    y_data = [error_x_list, error_y_list, error_z_list]

    # xmin=int(min(x_data))
    # xmax=int(max(x_data))
    # ymin=int(min(y_data))
    # ymax=int(max(y_data))
    # yth=2

    for i in range(3):
        # axs[i].plot(x_data, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i],linewidth=1,marker='.'
    # ,markeredgecolor=colors[i],markersize='1',markeredgewidth=1) #label='total' alpha=0.5
        axs[i].plot(x_data, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i],linewidth=1,marker='.',markersize=0.1)
        #axs[i].scatter(x_data, y_data[i], c=colors[i])
        #axs[i].legend(loc='best') #默认: 对于Axes, ‘best’, 对于Figure, 'upper right'
        
        #axs[i].set_aspect(aspect=0.1)#y轴的单位刻度显示长度 与 x轴的单位刻度显示长度 的比例
        #axs[i].axis('equal')#设置y轴和x轴的单位刻度显示长度相同
        
        #axs[i].set_yticks(range(ymin,ymax, 2)) # y轴的间距和显示范围
        
         
        axs[i].grid(True, linestyle='--', alpha=0.5)#背景网格线
        axs[i].set_xlabel("Time (s)", fontdict={'size': 10})#x轴坐标名字 和 字号
        axs[i].set_ylabel(y_labels[i], fontdict={'size': 10}, rotation=90) #y轴坐标名字 和 字号
        axs[i].set_title("Position {}".format(y_labels[i]), fontdict={'size': 12}) #标题

    #fig.autofmt_xdate()
    plt.show()

     


#画多组 多个折线图 各自单独一个图里 水平误差折线 
def Draw2D_error_More33Pic(slam_enu_error_list_xyz):


    fps=10.0
    time_interbval=1.0/fps
    
    '''
    num = None,               # 设定figure名称。系统默认按数字升序命名的figure_num(透视表输出窗口)e.g. “figure1”。可自行设定figure名称,名称或是INT,或是str类型;
    figsize=None,             # 设定figure尺寸。系统默认命令是rcParams["figure.fig.size"] = [6.4, 4.8],即figure长宽为6.4 * 4.8;
    dpi=None,                 # 设定figure像素密度。系统默命令是rcParams["sigure.dpi"] = 100;
    facecolor=None,           # 设定figure背景色。系统默认命令是rcParams["figure.facecolor"] = 'w',即白色white;
    edgecolor=None, frameon=True,    # 设定要不要绘制轮廓&轮廓颜色。系统默认绘制轮廓,轮廓染色rcParams["figure.edgecolor"]='w',即白色white;
    FigureClass=<class 'matplotlib.figure.Figure'>,   # 设定使不使用一个figure模板。系统默认不使用;
    '''
    fig, axs = plt.subplots(nrows=3, ncols=1,dpi=100)#3行1列  figsize=(20, 6) dpi=100 像素密度
    #colors = ['blue','green','red']
    colors = ['blue','green','red']
    line_style = ['-', '--', '-.']
    #datalabls=["nogps-nogps","gps-nogps","gps-gps"]
    datalabls=["true","vio + gps","vio"]
    y_labels = ["x Error (m)", "y Error (m)", "z Error (m)"] #Error (m)


    
    for i in range(0,len(slam_enu_error_list_xyz)):

     
        slam_enu_error_i=slam_enu_error_list_xyz[i]

        error_x_list=slam_enu_error_i[0]
        error_y_list=slam_enu_error_i[1]
        error_z_list=slam_enu_error_i[2]
        x_i=[]
        for j in range(0,len(error_x_list)):
            
            x_i.append((j*time_interbval))

        x_data=x_i
        y_data = [error_x_list, error_y_list, error_z_list]

        print("数据点总共",len(x_i))

        
        for ii in range(0,3):
           # axs[i].plot(x_data, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i],linewidth=1,marker='.'
        # ,markeredgecolor=colors[i],markersize='1',markeredgewidth=1) #label='total' alpha=0.5
            #添加lable标签显示
            #axs[ii].plot(x_data, y_data[ii], c=colors[i], label=datalabls[i], linestyle=line_style[i],linewidth=1,marker='.',markersize=0.1)
            axs[ii].plot(x_data, y_data[ii], c=colors[i], linestyle=line_style[i],linewidth=1,marker='.',markersize=0.1)


            #axs[ii].scatter(x_data, y_data[ii], c=colors[i])
            axs[ii].legend(loc='best')
            #axs[ii].gca().set_box_aspect((3, 5, 2))  # 当x、y、z轴范围之比为3:5:2时。
            #axs[ii].set_yticks(range(-4, 4, 2))

            #if ii==2:
                #axs[ii].set_yticks(range(-4, 8, 2))
            # if ii==0:
            #     axs[ii].set_yticks(range(-60, 30, 10))
            # elif ii==1:
            #     axs[ii].set_yticks(range(-30, 70, 20)) # y轴的间距和显示范围
            # else:
            #     axs[ii].set_yticks(range(-20, 30, 10)) 
            
            axs[ii].grid(True, linestyle='--', alpha=0.5)#背景网格线
            axs[ii].set_xlabel("Time (s)", fontdict={'size': 10})#x轴坐标名字 和 字号
            axs[ii].set_ylabel(y_labels[ii], fontdict={'size': 10}, rotation=90) #y轴坐标名字 和 字号  Y轴说明是否旋转90度
            axs[ii].set_title("Position {}".format(y_labels[ii]), fontdict={'size': 12}) #标题

    fig.autofmt_xdate()
    plt.show()


def API_Cal_wucha(errorlist_txyz0_error):
        # 0 累计误差 计算总体转化均方根误差
        error_all=0
        for i in range(0,len(errorlist_txyz0_error)):
            #print(errorlist_txyz0_error[i])

            #distance=sqrt((errorlist_txyz0_error[i][0])**2+(errorlist_txyz0_error[i][1])**2)
            #
            distance=sqrt((errorlist_txyz0_error[i][0])**2+(errorlist_txyz0_error[i][1])**2+(errorlist_txyz0_error[i][2])**2)
            #print(i,time_realgps_slamgps_list[i])
            error_all=error_all+distance
        error_averrange=sqrt(error_all/len(errorlist_txyz0_error))
        return error_averrange



if __name__ == "__main__":

    


    from API_0File_Read_Write import *

    data_list=[] #文件名
    data_list.append("data/1GNSS_from_img.txt")
    #data_list.append("data/2ENU_from_GNSS.txt") 
    data_list.append("data/3GNSS_From_ENU.txt")

    draw_tracelist=[]# 存放多组要绘画的3D图数据 分列存放

    for txt_name_i in data_list:
       
        list_name_xyz = API_read2txt(txt_name_i)     
        draw_tracelist.append(list_name_xyz)
    
    Draw3D_trace_more(draw_tracelist)


'''  
        #1 gps真值
        #enu_realgps_txt_savename0=root_path+"真实gps完整.txt"
        enu_realgps_txt_savename0=root_path+"带gps建图带gps定位"+"/匹配enu_real"+slamgps_txt_name
        #2 不同状态的定位
        enu_slamgps_txt_savename2=root_path+"不带gps建图不带gps定位"+"/匹配enu_slam"+slamgps_txt_name
        enu_slamgps_txt_savename1=root_path+"带gps建图不带gps定位"+"/匹配enu_slam"+slamgps_txt_name
        enu_slamgps_txt_savename3=root_path+"带gps建图带gps定位"+"/匹配enu_slam"+slamgps_txt_name
        
        data_list=[] #文件名
        data_list.append(enu_realgps_txt_savename0)
        data_list.append(enu_slamgps_txt_savename1)
        data_list.append(enu_slamgps_txt_savename2)
        data_list.append(enu_slamgps_txt_savename3)
    
        
        
        draw_tracelist=[]# enu数据列表
        for i in range(0,len(data_list)):

            list_txyz0,list_x0,list_y0,list_z0 = readtxt_ENU(data_list[i])
            draw_tracelist.append([list_x0,list_y0,list_z0])


        #==========1 画多个3D轨迹在同一个3D图 对比轨迹
        Draw3D_trace_more(draw_tracelist)
        
        #==========2 画多个3D轨迹的2D侧视图
        Draw2D_trace_gpsvreal_list(draw_tracelist,"X(m)","Y(m)") #-俯视图xy
        Draw2D_trace_gpsvreal_list(draw_tracelist,"X(m)","Z(m)") #-左视图xz
        Draw2D_trace_gpsvreal_list(draw_tracelist,"Y(m)","Z(m)") #-右视图yz


        #============3 画2D折线图误差

        #3-1 加载数据 折线误差slam值

        SlamEnuError_txtNamelist=[]  #保存slam enu error轨迹 文件名
        #SlamEnuError_txtNamelist.append(enu_realgps_txt_savename0)
        SlamEnuError_txtNamelist.append(enu_slamgps_txt_savename3)
        SlamEnuError_txtNamelist.append(enu_slamgps_txt_savename1)
        SlamEnuError_txtNamelist.append(enu_slamgps_txt_savename2)

        draw_slamEnutraceError_list=[] #保存slam enu轨迹 数据

        for i in range(0,len(SlamEnuError_txtNamelist)):

            errorlist_txyz0_error,list_x0_error,list_y0_error,list_z0_error = readtxt_ENU_Error(SlamEnuError_txtNamelist[i])

            errorlist_txyx0_error_skip=[]
            errorlist_txyy0_error_skip=[]
            errorlist_txyz0_error_skip=[]

            # #步长 3
            # for i in range(0,len(errorlist_txyz0_error),100):
            #     errorlist_txyx0_error_skip.append(list_x0_error[i])
            #     errorlist_txyy0_error_skip.append(list_y0_error[i])
            #     errorlist_txyz0_error_skip.append(list_z0_error[i])

            draw_slamEnutraceError_list.append([list_x0_error,list_y0_error,list_z0_error])
            #draw_slamEnutraceError_list.append([errorlist_txyx0_error_skip,errorlist_txyy0_error_skip,errorlist_txyz0_error_skip])
        
        #=============3-2 画数据 2D折线图画在多个行里
        Draw2D_error_More33Pic(draw_slamEnutraceError_list)
'''





        
    

  

posted on 2024-06-17 22:23  MKT-porter  阅读(52)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3