Skip to content

Instantly share code, notes, and snippets.

@gasparian
Last active April 28, 2020 15:55
Show Gist options
  • Save gasparian/7cd1b82e78a2ebefe895242616e87411 to your computer and use it in GitHub Desktop.
Save gasparian/7cd1b82e78a2ebefe895242616e87411 to your computer and use it in GitHub Desktop.
kitti_raw_imu
import os
import re
import sys
import shutil
import argparse
from tqdm import tqdm
parser = argparse.ArgumentParser(description='')
parser.add_argument("--path", type=str, required=False, default="./data")
parser.add_argument("--out_path", type=str, required=False, default="./rides")
parser.add_argument("--min_len", type=int, required=False, default=3000)
args = parser.parse_args()
globals().update(vars(args))
"""
python3 get_poses.py --path ./data --out_path ./rides --min_len 3000
"""
if __name__ == "__main__":
if os.path.exists(out_path):
shutil.rmtree(out_path)
os.mkdir(out_path)
for day in tqdm(os.listdir(path)):
day_path = os.path.join(path, day)
if os.path.isdir(day_path):
for ride in os.listdir(day_path):
ride_path = os.path.join(day_path, ride)
if os.path.isdir(ride_path):
ts = open(os.path.join(ride_path, "oxts", "timestamps.txt"), "r").readlines()
if len(ts) < min_len:
continue
ts = [t[:-1] for t in ts]
f_out = open(os.path.join(out_path, ride+".csv"), "w")
data_path = os.path.join(ride_path, "oxts", "data")
sorted_names = sorted(os.listdir(data_path))
for i, fn in enumerate(sorted_names):
fname = os.path.join(data_path, fn)
f_in = open(fname, "r").readlines()[0]
f_in = f_in.replace(" ", ",")
f_out.write(ts[i]+",")
f_out.write(f_in)
f_out.close()

If you want to get raw 100Hz IMU/GNSS measurements from KITTI dataset:

  1. Download rides via raw_data_downloader.sh (synced --> extract).
  2. Then accumulate all rides data into csv files with timestamps:
python3 get_poses.py --path ./data --out_path ./rides --min_len 10000
python3 preprocess_poses.py --path ./rides

Columns reference:

  - lat:     latitude of the oxts-unit (deg)
  - lon:     longitude of the oxts-unit (deg)
  - alt:     altitude of the oxts-unit (m)
  - roll:    roll angle (rad),  0 = level, positive = left side up (-pi..pi)
  - pitch:   pitch angle (rad), 0 = level, positive = front down (-pi/2..pi/2)
  - yaw:     heading (rad),     0 = east,  positive = counter clockwise (-pi..pi)
  - vn:      velocity towards north (m/s)
  - ve:      velocity towards east (m/s)
  - vf:      forward velocity, i.e. parallel to earth-surface (m/s)
  - vl:      leftward velocity, i.e. parallel to earth-surface (m/s)
  - vu:      upward velocity, i.e. perpendicular to earth-surface (m/s)
  - ax:      acceleration in x, i.e. in direction of vehicle front (m/s^2)
  - ay:      acceleration in y, i.e. in direction of vehicle left (m/s^2)
  - az:      acceleration in z, i.e. in direction of vehicle top (m/s^2)
  - af:      forward acceleration (m/s^2)
  - al:      leftward acceleration (m/s^2)
  - au:      upward acceleration (m/s^2)
  - wx:      angular rate around x (rad/s)
  - wy:      angular rate around y (rad/s)
  - wz:      angular rate around z (rad/s)
  - wf:      angular rate around forward axis (rad/s)
  - wl:      angular rate around leftward axis (rad/s)
  - wu:      angular rate around upward axis (rad/s)
  - posacc:  velocity accuracy (north/east in m)
  - velacc:  velocity accuracy (north/east in m/s)
  - navstat: navigation status
  - numsats: number of satellites tracked by primary GPS receiver
  - posmode: position mode of primary GPS receiver
  - velmode: velocity mode of primary GPS receiver
  - orimode: orientation mode of primary GPS receiver
import os
import re
import sys
import shutil
import argparse
import pandas as pd
from tqdm import tqdm
cols = [ "timestamp",
"lat", "lon", "alt", "roll", "pitch", "yaw", "vn", "ve", "vf",
"vl", "vu", "ax", "ay", "az", "af", "al", "au", "wx", "wy", "wz",
"wf", "wl", "wu", "pos_accuracy", "vel_accuracy", "navstat",
"numsats", "posmode", "velmode", "orimode"
]
cols_select = [ "timestamp",
"lat", "lon", "alt", "roll", "pitch", "yaw", "vn", "ve",
"vu", "ax", "ay", "az", "wx", "wy", "wz",
"pos_accuracy", "vel_accuracy", "navstat",
"numsats", "posmode", "velmode", "orimode"
]
parser = argparse.ArgumentParser(description='')
parser.add_argument("--path", type=str, required=False, default="./rides")
args = parser.parse_args()
globals().update(vars(args))
"""
python3 preprocess_poses.py --path ./rides
"""
if __name__ == "__main__":
for fname in tqdm(os.listdir(path)):
fpath = os.path.join(path, fname)
df = pd.read_csv(fpath, header=None, parse_dates=[0])
df.rename(columns={k:v for k, v in zip(df.columns.tolist(), cols)}, inplace=True)
df.sort_values("timestamp", inplace=True)
df.reset_index(drop=True, inplace=True)
df.to_csv(fpath, index=None)
#!/bin/bash
files=(2011_09_26_calib.zip
2011_09_26_drive_0001
2011_09_26_drive_0002
2011_09_26_drive_0005
2011_09_26_drive_0009
2011_09_26_drive_0011
2011_09_26_drive_0013
2011_09_26_drive_0014
2011_09_26_drive_0015
2011_09_26_drive_0017
2011_09_26_drive_0018
2011_09_26_drive_0019
2011_09_26_drive_0020
2011_09_26_drive_0022
2011_09_26_drive_0023
2011_09_26_drive_0027
2011_09_26_drive_0028
2011_09_26_drive_0029
2011_09_26_drive_0032
2011_09_26_drive_0035
2011_09_26_drive_0036
2011_09_26_drive_0039
2011_09_26_drive_0046
2011_09_26_drive_0048
2011_09_26_drive_0051
2011_09_26_drive_0052
2011_09_26_drive_0056
2011_09_26_drive_0057
2011_09_26_drive_0059
2011_09_26_drive_0060
2011_09_26_drive_0061
2011_09_26_drive_0064
2011_09_26_drive_0070
2011_09_26_drive_0079
2011_09_26_drive_0084
2011_09_26_drive_0086
2011_09_26_drive_0087
2011_09_26_drive_0091
2011_09_26_drive_0093
2011_09_26_drive_0095
2011_09_26_drive_0096
2011_09_26_drive_0101
2011_09_26_drive_0104
2011_09_26_drive_0106
2011_09_26_drive_0113
2011_09_26_drive_0117
2011_09_26_drive_0119
2011_09_28_calib.zip
2011_09_28_drive_0001
2011_09_28_drive_0002
2011_09_28_drive_0016
2011_09_28_drive_0021
2011_09_28_drive_0034
2011_09_28_drive_0035
2011_09_28_drive_0037
2011_09_28_drive_0038
2011_09_28_drive_0039
2011_09_28_drive_0043
2011_09_28_drive_0045
2011_09_28_drive_0047
2011_09_28_drive_0053
2011_09_28_drive_0054
2011_09_28_drive_0057
2011_09_28_drive_0065
2011_09_28_drive_0066
2011_09_28_drive_0068
2011_09_28_drive_0070
2011_09_28_drive_0071
2011_09_28_drive_0075
2011_09_28_drive_0077
2011_09_28_drive_0078
2011_09_28_drive_0080
2011_09_28_drive_0082
2011_09_28_drive_0086
2011_09_28_drive_0087
2011_09_28_drive_0089
2011_09_28_drive_0090
2011_09_28_drive_0094
2011_09_28_drive_0095
2011_09_28_drive_0096
2011_09_28_drive_0098
2011_09_28_drive_0100
2011_09_28_drive_0102
2011_09_28_drive_0103
2011_09_28_drive_0104
2011_09_28_drive_0106
2011_09_28_drive_0108
2011_09_28_drive_0110
2011_09_28_drive_0113
2011_09_28_drive_0117
2011_09_28_drive_0119
2011_09_28_drive_0121
2011_09_28_drive_0122
2011_09_28_drive_0125
2011_09_28_drive_0126
2011_09_28_drive_0128
2011_09_28_drive_0132
2011_09_28_drive_0134
2011_09_28_drive_0135
2011_09_28_drive_0136
2011_09_28_drive_0138
2011_09_28_drive_0141
2011_09_28_drive_0143
2011_09_28_drive_0145
2011_09_28_drive_0146
2011_09_28_drive_0149
2011_09_28_drive_0153
2011_09_28_drive_0154
2011_09_28_drive_0155
2011_09_28_drive_0156
2011_09_28_drive_0160
2011_09_28_drive_0161
2011_09_28_drive_0162
2011_09_28_drive_0165
2011_09_28_drive_0166
2011_09_28_drive_0167
2011_09_28_drive_0168
2011_09_28_drive_0171
2011_09_28_drive_0174
2011_09_28_drive_0177
2011_09_28_drive_0179
2011_09_28_drive_0183
2011_09_28_drive_0184
2011_09_28_drive_0185
2011_09_28_drive_0186
2011_09_28_drive_0187
2011_09_28_drive_0191
2011_09_28_drive_0192
2011_09_28_drive_0195
2011_09_28_drive_0198
2011_09_28_drive_0199
2011_09_28_drive_0201
2011_09_28_drive_0204
2011_09_28_drive_0205
2011_09_28_drive_0208
2011_09_28_drive_0209
2011_09_28_drive_0214
2011_09_28_drive_0216
2011_09_28_drive_0220
2011_09_28_drive_0222
2011_09_28_drive_0225
2011_09_29_calib.zip
2011_09_29_drive_0004
2011_09_29_drive_0026
2011_09_29_drive_0071
2011_09_29_drive_0108
2011_09_30_calib.zip
2011_09_30_drive_0016
2011_09_30_drive_0018
2011_09_30_drive_0020
2011_09_30_drive_0027
2011_09_30_drive_0028
2011_09_30_drive_0033
2011_09_30_drive_0034
2011_09_30_drive_0072
2011_10_03_calib.zip
2011_10_03_drive_0027
2011_10_03_drive_0034
2011_10_03_drive_0042
2011_10_03_drive_0047
2011_10_03_drive_0058)
for i in ${files[@]}; do
if [ ${i:(-3)} != "zip" ]
then
shortname=$i'_extract.zip'
fullname=$i'/'$i'_extract.zip'
else
shortname=$i
fullname=$i
fi
echo "Downloading: "$shortname
wget 'https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/'$fullname
unzip -o $shortname
rm $shortname
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment