170 lines
5.8 KiB
Python
170 lines
5.8 KiB
Python
'''
|
|
* This file is part of ORB-SLAM3
|
|
*
|
|
* Copyright (C) 2017-2021 Carlos Campos, Richard Elvira, Juan J. Gómez Rodríguez, José M.M. Montiel and Juan D. Tardós, University of Zaragoza.
|
|
* Copyright (C) 2014-2016 Raúl Mur-Artal, José M.M. Montiel and Juan D. Tardós, University of Zaragoza.
|
|
*
|
|
* ORB-SLAM3 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
|
|
* License as published by the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* ORB-SLAM3 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with ORB-SLAM3.
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
'''
|
|
|
|
import sys
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
class dataset:
|
|
|
|
# imu_sync = np.zeros((1,7))
|
|
# acc = np.zeros((1,7))
|
|
# gyro = np.zeros((1,7))
|
|
|
|
def __init__(self, dirName):
|
|
self.name = dirName
|
|
self.acc = np.zeros((1, 4))
|
|
self.gyro = np.zeros((1, 4))
|
|
self.timesCam = np.zeros((1, 1))
|
|
|
|
timesName = self.name + "/cam0/times.txt"
|
|
timeFile = open(timesName, "r")
|
|
i = 0
|
|
next = 0
|
|
for line in timeFile:
|
|
currentline = line.split(",")
|
|
if i%2 == 0:
|
|
self.timesCam[next] = currentline
|
|
next = next + 1
|
|
self.timesCam = np.pad(self.timesCam, ((0, 1), (0, 0)), mode='constant', constant_values=0)
|
|
i = i + 1
|
|
print(i, "/", next)
|
|
|
|
|
|
accName = self.name + "/IMU/acc.txt"
|
|
accFile = open(accName, "r")
|
|
i = 0
|
|
for line in accFile:
|
|
currentline = line.split(",")
|
|
for j in range(0, 4):
|
|
self.acc[i][j] = currentline[j]
|
|
self.acc = np.pad(self.acc, ((0, 1), (0, 0)), mode='constant', constant_values=0)
|
|
i = i + 1
|
|
|
|
gyroName = self.name + "/IMU/gyro.txt"
|
|
gyroFile = open(gyroName, "r")
|
|
i = 0
|
|
for line in gyroFile:
|
|
currentline = line.split(",")
|
|
for j in range(0, 4):
|
|
self.gyro[i][j] = currentline[j]
|
|
self.gyro = np.pad(self.gyro, ((0, 1), (0, 0)), mode='constant', constant_values=0)
|
|
i = i + 1
|
|
|
|
self.timesCam = np.delete(self.timesCam, self.timesCam.shape[0] - 1, axis=0)
|
|
self.acc = np.delete(self.acc, self.acc.shape[0] - 1, axis=0)
|
|
self.gyro = np.delete(self.gyro, self.gyro.shape[0] - 1, axis=0)
|
|
|
|
print("Finished")
|
|
|
|
def interpolate(self):
|
|
self.imuSync = np.zeros((self.gyro.shape[0], 7))
|
|
print("shape = ", self.imuSync.shape)
|
|
|
|
totAcc = self.acc.shape[0]
|
|
totGyro = self.gyro.shape[0]
|
|
|
|
idxAcc = 0
|
|
idxGyro = 0
|
|
print(self.acc[idxAcc][0])
|
|
print(self.gyro[idxGyro][0])
|
|
while (self.acc[idxAcc][0] > self.gyro[idxGyro][0]):
|
|
idxGyro = idxGyro + 1
|
|
|
|
idxSync = 0
|
|
while (idxAcc + 1 < totAcc and idxGyro < totGyro):
|
|
# variables for interpolation
|
|
deltaTimeAcc = self.acc[idxAcc + 1, 0] - self.acc[idxAcc, 0]
|
|
deltaAcc = self.acc[idxAcc + 1, 1:4] - self.acc[idxAcc, 1:4]
|
|
while (idxGyro < totGyro and self.acc[idxAcc + 1, 0] >= self.gyro[idxGyro, 0]):
|
|
self.imuSync[idxSync, 0] = self.gyro[idxGyro, 0]
|
|
# Interpolate accelerometer
|
|
self.imuSync[idxSync, 4:7] = self.acc[idxAcc, 1:4] + (
|
|
self.gyro[idxGyro, 0] - self.acc[idxAcc, 0]) * deltaAcc / deltaTimeAcc
|
|
|
|
# Load gyroscope
|
|
self.imuSync[idxSync, 1:4] = self.gyro[idxGyro, 1:4]
|
|
|
|
idxGyro = idxGyro + 1
|
|
idxSync = idxSync + 1
|
|
|
|
idxAcc = idxAcc + 1
|
|
|
|
self.imuSync = np.delete(self.imuSync, range(idxSync, totGyro), axis=0)
|
|
|
|
def plotGyro(self):
|
|
for i in range(1, 4):
|
|
plt.plot(self.imuSync[:, 0], self.imuSync[:, i], label=str("acc ") + str(i))
|
|
plt.xlabel("time (s)")
|
|
plt.ylabel("ang. vel. (rad/s)")
|
|
plt.title("Gyroscope")
|
|
plt.legend()
|
|
plt.show()
|
|
|
|
def plotAcc(self):
|
|
for i in range(4, 7):
|
|
plt.plot(self.imuSync[:, 0], self.imuSync[:, i], label=str("acc ") + str(i))
|
|
plt.xlabel("time (s)")
|
|
plt.ylabel("acc (m/s^2)")
|
|
plt.title("Accelerometer")
|
|
plt.legend()
|
|
plt.show()
|
|
|
|
def saveSynchronized(self):
|
|
imuName = self.name + "/imu0.csv"
|
|
imuFile = open(imuName, "w")
|
|
imuFile.write("#timestamp [ns],w_RS_S_x [rad s^-1],w_RS_S_y [rad s^-1],w_RS_S_z [rad s^-1],a_RS_S_x [m s^-2],a_RS_S_y [m s^-2],a_RS_S_z [m s^-2]\n")
|
|
for row in self.imuSync:
|
|
i = 0
|
|
for num in row:
|
|
if i == 0:
|
|
imuFile.write(str((int)(1e9 * num)))
|
|
i = 1
|
|
else:
|
|
imuFile.write("," + str(num))
|
|
|
|
imuFile.write("\n")
|
|
|
|
def saveCorrectTimes(self):
|
|
timesName = self.name + "/cam0/corrTimes.txt"
|
|
timesFile = open(timesName, "w")
|
|
print("self.timesCam shape ", self.timesCam.shape)
|
|
for row in self.timesCam:
|
|
i = 0
|
|
for num in row:
|
|
timesFile.write(str((int) (num)))
|
|
timesFile.write("\n")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if len(sys.argv)!=2 and len(sys.argv)!=3:
|
|
print('Number of arguments != 2 and 3')
|
|
sys.exit()
|
|
|
|
dirName = sys.argv[1]
|
|
print('Processing :', dirName)
|
|
|
|
myDataset = dataset(dirName)
|
|
myDataset.interpolate()
|
|
myDataset.plotAcc()
|
|
myDataset.saveSynchronized()
|
|
|
|
if len(sys.argv)==3:
|
|
myDataset.saveCorrectTimes()
|