python 匹配linux时间戳

白嫖璜老板系列,璜老板牛逼
时间戳匹配的详细注释我有在python 用pose来拼接点云里写过

import argparse
import os
from tqdm import tqdm

parser = argparse.ArgumentParser()
parser.add_argument("--left_pcd_dir", type=str, default="pandar40L")
parser.add_argument("--right_pcd_dir", type=str, default="pandar40R")
parser.add_argument("--back_left_dir", type=str, default="robosenseM")
parser.add_argument("--max_time_diff", type=int, default=100000000)  # 100ms, 这里是按照100ms的阈值去匹配的 
args = parser.parse_args()

def read_timestamps(base_dir, separtor ,suffix):
    names = [f for f in os.listdir(base_dir) if f.endswith(suffix)]
    names = [x[:-len(suffix)].split(separtor) for x in names]
    return [(int(secs), int(nsecs)) for secs, nsecs in names]

def calc_diff(ts1, ts2):
    return (ts1[0] - ts2[0]) * 1000000000 + (ts1[1] - ts2[1])

def generate_pcd_file_name(timestamp):
    return str(timestamp[0]) + '_' + str(timestamp[1]) + '.pcd'

def matche_n_pcds(left_pcd_dir, right_pcd_dir, back_left_dir, max_time_diff):
    left_pcd_timestamps = sorted(read_timestamps(left_pcd_dir, '_' ,'.pcd'))
    right_pcd_timestamps = sorted(read_timestamps(right_pcd_dir,'_' ,'.pcd'))
    back_left_timestamps = sorted(read_timestamps(back_left_dir, '_' , '.pcd'))
    matched = []
    p = 0
    q = 0
    r = 0

    for i, ts in enumerate(left_pcd_timestamps):
        ################### left_pcd-right_pcd match start ###################
        while p < len(right_pcd_timestamps) and right_pcd_timestamps[p] < ts:
            p += 1
        closest_before = p - 1 if p > 0 else None
        closest_after = p if p < len(right_pcd_timestamps) else None

        if closest_before is None and closest_after is None:
            continue
        
        closest_diff = None
        closest = None
        
        if closest_before is not None:
            time_diff = calc_diff(ts, right_pcd_timestamps[closest_before])
            if time_diff < max_time_diff:
                closest_diff = time_diff
                closest = closest_before
        
        if closest_after is not None:
            time_diff = calc_diff(right_pcd_timestamps[closest_after], ts)
            if time_diff < max_time_diff and (closest_diff is None or time_diff < closest_diff):
                closest_diff = time_diff
                closest = closest_after

        if closest is None:
            continue
        
        right_pcd_matched = [right_pcd_timestamps[closest][0], right_pcd_timestamps[closest][1]]

        ################### left_pcd-back_left_pcd match start ###################
        while q < len(back_left_timestamps) and back_left_timestamps[q] < ts:
            q += 1
        closest_before = q - 1 if q > 0 else None
        closest_after = q if q < len(back_left_timestamps) else None

        if closest_before is None and closest_after is None:
            continue
        
        closest_diff = None
        closest = None
        
        if closest_before is not None:
            time_diff = calc_diff(ts, back_left_timestamps[closest_before])
            if time_diff < max_time_diff:
                closest_diff = time_diff
                closest = closest_before
        
        if closest_after is not None:
            time_diff = calc_diff(back_left_timestamps[closest_after], ts)
            if time_diff < max_time_diff and (closest_diff is None or time_diff < closest_diff):
                closest_diff = time_diff
                closest = closest_after

        if closest is None:
            continue

        back_left_matched = [back_left_timestamps[closest][0], back_left_timestamps[closest][1]]

        ################### End of match ###################
        matched.append([generate_pcd_file_name(ts), generate_pcd_file_name(right_pcd_matched), 
                    generate_pcd_file_name(back_left_matched)])

    return matched
    
def main():
    matched_pcd = matche_n_pcds(args.left_pcd_dir, args.right_pcd_dir, 
                                args.back_left_dir, args.max_time_diff)

    for i in tqdm(range(len(matched_pcd))):
        #输出匹配好的路径
        print(os.path.join(args.left_pcd_dir,matched_pcd[i][0]), \
                        os.path.join(args.right_pcd_dir, matched_pcd[i][1]), \
                        os.path.join(args.back_left_dir, matched_pcd[i][2]))

if __name__ == '__main__':
    main()

正常linux时间戳:

import os 
import argparse
     
parser = argparse.ArgumentParser()
parser.add_argument("--pcd_dir", type=str, default="")
parser.add_argument("--image_dir", type=str, default="")
parser.add_argument("--max_time_diff", type=int, default=100000000)  # 10ms
args = parser.parse_args()

def read_timestamps(base_dir, separtor ,suffix):
    names = [f for f in os.listdir(base_dir) if f.endswith(suffix)]
    ts = [x[:-len(suffix)].split(separtor) for x in names]
    return ts

def calc_diff(ts1, ts2):
    ts_a = int(ts1[0]) * 1000000000 + int(ts1[1])
    ts_b = int(ts2[0]) * 1000000000 + int(ts2[1])
    return ts_a - ts_b

def generate_file_name(timestamp, suffix):
    return str(timestamp[0]) + '.' + str(timestamp[1]) + suffix

def match_n_ts(master, slave1, max_time_diff):
    master_ts_list = sorted(read_timestamps(master, '.' ,'.pcd'))
    slave1_ts_list = sorted(read_timestamps(slave1, '.' ,'.png'))
    matched = []
    slave1_idx = 0
    for ts in master_ts_list:
        ################### slave1 match start ###################
        while slave1_idx < len(slave1_ts_list) and calc_diff(slave1_ts_list[slave1_idx], ts) < 0:
            slave1_idx += 1
        closest_before = slave1_idx - 1 if slave1_idx > 0 else None
        closest_after = slave1_idx if slave1_idx < len(slave1_ts_list) else None

        if closest_before is None and closest_after is None:
            continue
        
        closest_diff = None
        closest = None
        
        if closest_before is not None:
            time_diff = calc_diff(ts, slave1_ts_list[closest_before])
            if time_diff < max_time_diff:
                closest_diff = time_diff
                closest = closest_before
        
        if closest_after is not None:
            time_diff = calc_diff(slave1_ts_list[closest_after], ts)
            if time_diff < max_time_diff and (closest_diff is None or time_diff < closest_diff):
                closest_diff = time_diff
                closest = closest_after

        if closest is None:
            continue
        
        slave1_ts_matched = [slave1_ts_list[closest][0], slave1_ts_list[closest][1]]

        ################### End of match ###################
        matched.append([generate_file_name(ts, '.pcd'), generate_file_name(slave1_ts_matched, '.png')])
    return matched
    
def main():
    match_ts_result = match_n_ts(args.pcd_dir, args.image_dir, args.max_time_diff)
    match_path_result = []
    for i in range(len(match_ts_result)):
        match_path_result.append([os.path.join(args.pcd_dir,match_ts_result[i][0]), \
            os.path.join(args.image_dir, match_ts_result[i][1])])

comments

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值