工具脚本 - IMU Timestamp Jitter 分析

dds recording_xxx.dat 数据生成 imu timestamp diff 解析图

工具脚本:

import sqlite3
import numpy as np
import matplotlib.pyplot as plt 
import sys
import struct
import os 

time_list = []
def parse_sqlite(file_list, file_dir):
    for file in file_list:
        dat_path = file_dir + '/' + file
        parse_sqlite_timelist(dat_path)
    plot_time_ellipses(file_dir)
    time_list = []

def plot_time_ellipses(file_dir):
    output_dir = file_dir + '/Imu_KPI_Output'
    if not os.path.exists(output_dir):
        print("create output dir:", output_dir)
        os.mkdir(output_dir)
    
    plt.close()
    fig = plt.figure(figsize=(20, 10))
    ellipses = []
    last_time = 0
    for time in time_list:
        if last_time > 0:
            elps = time - last_time
            if elps > 19 or elps < 0:
                print("Error elps >> " + str(elps) + " ms" )
                last_time = time
                continue
            ellipses.append(elps)
        last_time = time
    
    x = range(len(ellipses)) 
    x = [a*0.01 for a in x]
    y = ellipses

    print("ellipses max = ", max(ellipses), "min =", min(ellipses))
    print("len = " , len(x))#, '; x=', x)
    print("len = " , len(y))#, '; y=', y)

    plt.title("imu time ellipses")  
    # # 使用 matplotlib 来绘制点
    plt.plot(x, y, '.', markersize=0.5) 
    # fig = plt.figure(figsize=(20, 10))
    image_name = output_dir + '/Imu_TimeStamp_Ellipses.png'
    fig.savefig(image_name, dpi=144)
    # plt.savefig(image_name)
    print("save plot >>", image_name)
    plt.close(fig)
    # plt.show()

def parse_sqlite_timelist(file_name):
    print('parse dat file >>', file_name)

    conn = sqlite3.connect(file_name)
    cursor = conn.cursor()
    cursor.execute('select rti_cdr_sample from [ImuSysRxTopic@128]')
    values = cursor.fetchall()
    # print(values[0][0])

    delta_s_list = []
    last_real_time = 0
    for r in values:
        for c in r:
            
            # hex_str = 'raw_hex = '
            # for j in c:
            #     hex_str += "%02x" % j + " "
            # print(hex_str + "; size =", len(c))

            # time_hex = ''
            # for i in range(4,12,):
            #     time_hex += "%02x" % c[i]
            #     print(i, "%02x" % c[i])
            # print(time_hex)

            time_hex = ''
            time_ns = 0
            for i in range(11,3,-1):
                time_hex += "%02x" % c[i]
                # print(i, "%02x" % c[i])
            time_ns = int(time_hex, 16)
            time_ms = time_ns/1e6
            # print(time_hex , ">>", time_ns , ">>", time_ms)

            delta_s_hex = ''
            delta_s_float = 0.
            for i in range(1, 5):
                # print(-i, "%02x" % c[-i])
                delta_s_hex += "%02x" % c[-i]
            delta_s_float = struct.unpack('!f', bytes.fromhex(delta_s_hex))[0]
            # print(delta_s_hex, ">>", delta_s_float , "s") 
            cur_real_time = time_ms + delta_s_float*1000

            print("timestamp =", time_ms , "ms; delta =", delta_s_float, "s >> real_time =", time_ms + delta_s_float*1000 , "ms", "diff @ ", cur_real_time - last_real_time)

            time_list.append(cur_real_time)

            last_real_time = cur_real_time

        # time_str = ''
        # for i in range(0,8):
        #     time_str += r[4+i]
        # print(time_str)


    # first_time = values[0][0]
    
    # for sample in values:
    #     time_list.append((sample[0] - first_time) * 1e-06 * 1.0) # ns -> ms
    
    # time_length = (values[-1][0] - first_time) * 1e-09 * 1.0 # sec
    # print('data time length = ' + str(time_length) + 's')



if __name__ == '__main__':
    
    dat_list = []

    if len(sys.argv) > 1:
        print(len(sys.argv))
        if sys.argv[1]:
            dat_dir = sys.argv[1]
    else :
        print('please input dat_dir in argv[1]')
        sys.exit(1)

    print("parse dir:", dat_dir)

    # get dat list
    print("\n1. get dat_list")
    ow = os.walk(dat_dir)
    for path,dir_list,file_list in ow:  
        for file_name in file_list:  
            if ('recording' in file_name) and ('recording_0_' not in file_name) and ('.dat' in file_name):
                print(">> Add dat >>", file_name)
                dat_list.append(file_name)
    
    # sort dat list
    if len(dat_list) > 1:
        print("\n2. sort dat_list")
        dat_list.sort(key=lambda x:int(x[10:12].replace('_', '')))
        for d in dat_list:
            print(d[10:12].replace('_', '') , ">>", d)


    parse_sqlite(dat_list, dat_dir)

使用方法:

执行命令:

|

python3 sqlite_ImuSysT_reader.py [dat所在文件夹]

|

生成解析结果: dat所在文件夹/Imu_KPI_Output/Imu_TimeStamp_Ellipses.png

结果如图: (两帧之间时差, 期望值是10ms)

lALPBFuNbiwrwArNBaDNC0A_2880_1440.png

过滤了一些异常数值: (过滤 时差小于0,或大于19的数值)

工具原理:

  • 对'dat所在文件夹'中,所有的数据进行排序,
  • 使用sqlite库批量解析所有dat数据, 获取timelist
  • 遍历timelist, 计算time diff , 并绘制plot图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容