美文网首页
kitti Odometry数据集对齐raw的oxts数据,包含

kitti Odometry数据集对齐raw的oxts数据,包含

作者: VellBibi | 来源:发表于2023-09-11 18:59 被阅读0次

    kitti Odometry数据集,带位置真值的数据,包含11个场景,但可惜只对齐了图像和激光数据,没有oxts数据,也就是没有rtk、imu等数据,对于做vio、lio等任务就没法搞了,好在数据说明里有写到这11个场景对应的raw数据,如下:

    seq_map = {
        "00": {"name": "2011_10_03_drive_0027", "start": 0, "end": 4540},
        "01": {"name": "2011_10_03_drive_0042", "start": 0, "end": 1100},
        "02": {"name": "2011_10_03_drive_0034", "start": 0, "end": 4660},
        "03": {"name": "2011_09_26_drive_0067", "start": 0, "end": 800},
        "04": {"name": "2011_09_30_drive_0016", "start": 0, "end": 270},
        "05": {"name": "2011_09_30_drive_0018", "start": 0, "end": 2760},
        "06": {"name": "2011_09_30_drive_0020", "start": 0, "end": 1100},
        "07": {"name": "2011_09_30_drive_0027", "start": 0, "end": 1100},
        "08": {"name": "2011_09_30_drive_0028", "start": 1100, "end": 5170},
        "09": {"name": "2011_09_30_drive_0033", "start": 0, "end": 1590},
        "10": {"name": "2011_09_30_drive_0034", "start": 0, "end": 1200}
    }
    

    有了raw数据,就有了oxts数据了,只要基于时间戳做个对齐就行了,由于想要100hz的oxts数据,所以选择unsync的raw数据,sync的raw数据只有10hz
    还有大神支出raw里的oxts数据时间戳存在跳变情况,需要做些处理,详见:https://zhuanlan.zhihu.com/p/75672946
    https://zhuanlan.zhihu.com/p/115562083

    我实现的一个处理oxts时间戳跳变情况函数,可以参考下

    def load_timestamps(timestamps_file):
        timestamps = []
        with open(timestamps_file, 'r') as f:
            for line in f.readlines():
                # NB: datetime only supports microseconds, but KITTI timestamps
                # give nanoseconds, so need to truncate last 4 characters to
                # get rid of \n (counts as 1) and extra 3 digits
                t = dt.datetime.strptime(line[:-4], '%Y-%m-%d %H:%M:%S.%f')
                t = dt.datetime.timestamp(t)
                timestamps.append(t)
        return timestamps
    
    
    def load_sync_timestamps(timestamps_file, std_dt=0.01):
        max_dt = std_dt * 1.5
        timestamps = np.array(load_timestamps(timestamps_file))
        x = np.arange(0, len(timestamps))
    
        last_timestamp = timestamps[:-1]
        curr_timestamp = timestamps[1:]
        dt = np.array(curr_timestamp - last_timestamp)  # 计算前后帧时间差
    
        print(timestamps_file)
        print("dt > {}: \n{}".format(max_dt, dt[dt > max_dt]))
        dt = dt.tolist()
        dt.append(std_dt)
        dt = np.array(dt)
        unsync_x = x[dt > max_dt]
        print("dt > {}: \n{}".format(max_dt, unsync_x))
        for i in unsync_x:
            succ = False
            # 向前对齐
            while (not succ):
                ii = i-1
                if ii < 0:
                    break
                if ii not in unsync_x:
                    for j in range(ii+1, i+1):
                        timestamps[j] = timestamps[j-1] + std_dt
                    succ = True
                    break
            # 向后对齐
            while (not succ):
                ii = i+1
                if ii >= len(timestamps):
                    break
                if ii not in unsync_x:
                    for j in range(ii, i, -1):
                        timestamps[j-1] = timestamps[j] - std_dt
                    succ = True
                    break
            if not succ:
                print("cannot sync timestamp", i, timestamps[i], dt[i])
        return timestamps
    

    对齐逻辑也简单粗暴

    
    def concat_oxts(oxts_timestamps, extract_raw_dir, start_time, end_time, out_file):
        oxts_data = []
        for idx, oxts_t in enumerate(oxts_timestamps):
            if oxts_t < start_time:
                continue
            if oxts_t > end_time:
                break
            oxts_file = os.path.join(
                extract_raw_dir, "oxts", "data", "{:0>10d}.txt".format(idx))
            if not os.path.exists(oxts_file):
                print("oxts file not exists", oxts_file)
                continue
            with open(oxts_file, "r") as f:
                for line in f.readlines():
                    oxts_data.append(line)
        os.makedirs(os.path.dirname(out_file), exist_ok=True)
        with open(out_file, "w") as f:
            f.writelines(oxts_data)
    
    
    if __name__ == "__main__":
        os.makedirs(oxts_out_dir, exist_ok=True)
        # 对齐时间戳找到oxts数据
        for seq in seq_map:
            print(seq)
            post_raw_dir = seq_map[seq]["name"][:10]
            extract_raw_dir = os.path.join(
                raw_dir, post_raw_dir, seq_map[seq]["name"] + "_extract")
            if not os.path.exists(extract_raw_dir):
                print("raw seq data not exists", extract_raw_dir)
                continue
    
            start_idx = seq_map[seq]["start"]
            end_idx = seq_map[seq]["end"]
            image_timestamps_file = os.path.join(
                extract_raw_dir, "image_02", 'timestamps.txt')
            image_timestamps = load_sync_timestamps(image_timestamps_file, 0.1)
    
            # 扣出对应时间戳内的oxts数据
            oxts_timestamps_file = os.path.join(
                extract_raw_dir, "oxts", 'timestamps.txt')
            oxts_timestamps = load_sync_timestamps(oxts_timestamps_file, 0.01)
            # 上一帧到当前帧之间的oxts数据
            for i in range(start_idx, end_idx + 1):
                if i == 0:
                    start_time = image_timestamps[i] - 0.1
                else:
                    start_time = image_timestamps[i-1]
                end_time = image_timestamps[i]
                oxts_file = os.path.join(
                    oxts_out_dir, seq, "{:0>10d}.txt".format(i-start_idx))
                concat_oxts(oxts_timestamps, extract_raw_dir,
                            start_time, end_time, oxts_file)
    

    提供一个我对齐好的oxts数据,由于03对应的2011_09_26_drive_0067数据官网无法下载,所以没有03对应的oxts数据

    链接: https://pan.baidu.com/s/1CR8aaNB83cWC0nrIatag5w 提取码: gi9c

    相关文章

      网友评论

          本文标题:kitti Odometry数据集对齐raw的oxts数据,包含

          本文链接:https://www.haomeiwen.com/subject/cetyvdtx.html