mbrossar / denoise-imu-gyro Goto Github PK
View Code? Open in Web Editor NEWConvolutional Neural Networks for Denoising Gyroscopes of Low-Cost IMUs
License: MIT License
Convolutional Neural Networks for Denoising Gyroscopes of Low-Cost IMUs
License: MIT License
Thank you for your interesting work. I tested your repo on Euroc (with lowered epochs) and I am quite confused about the roll angle in the gt. Where do these jumps come from? I downloaded Euroc from the official website. The roll angle of the MH_04 sequence differs significantly from the figure that is shown in the README.
Hi,
I downloaded your pre-trained model on TUM-VI and evaluated it by the toolbox provided by https://github.com/uzh-rpg/rpg_trajectory_evaluation, which is also recommended by open-vins (https://docs.openvins.com/namespaceov__eval.html). The AOE results for rooms 2, 4, and 6 are 1.87, 1.44, and 1.93, respectively. However, the results provided by your paper are 1.31, 1.48, and 1.04. I wonder whether this is because of the existence of outliers in TUM-VI datasets and I need to remove them before I run the evaluation. Could you please give me any clue?
P.S. The evaluation results of EuRoC datasets with the toolbox provided by https://github.com/uzh-rpg/rpg_trajectory_evaluation are exactly the same as your paper.
Thanks!
Hello,
First of all, thank you for your work (paper + code), it's very well explained and the approach looks elegant.
I would like to push the work further by trying to make the method support multiple IMUs (you mention it on future works btw). I was wondering if by just keeping the same approach and architecture, but just adding different IMU source as inputs during training would be enough to leverage "multi IMU source"? Did you made some experiments on this already?
I would really like to hear your thoughts on this.
Thanks!
The dataset cannot be downloaded from the provided web page. What happened, please?
Has anyone reproduced the results of the TUM-VI room_4 raw IMU data, it doesn't seem to be as bad as Fig.6 in the papaer.
dataset link and parameters link is not avaliable, could you send the downloaded file to me ? thank you
My email address: [email protected]
Hi Mr.Brossard,
I'm very interested in your paper called Denoising IMU Gyroscopes with Deep Learning for Open-Loop Attitude Estimation.
I have a little question. In your paper,the rotation matrix Rn at timestamp n maps the IMU frame to the global frame. Does the global frame in your paper mean the geographical coordinate system ? or geocentric coordinate system ?
Thanks!
Hello Brossar and thanks for sharing your work.
I'm trying to use your method with a different dataset. In order to train and test the network - it seems like gyro_std needs to be defined.
How can one obtain the values for some arbitrary dataset?
Thanks again!
Hello, may I ask why are self.N0
predictions from the network removed, when computing the loss during training? My guess is this should account for the initial padding, but why have you set self.N0 = 5
, always?
Thanks in advance!
Hi,
wget "https://cloud.mines-paristech.fr/index.php/s/d2lHqzIk1PxzWmb/download" is error, could you upload another available link? The link of "https://cloud.mines-paristech.fr/index.php/s/OLnj74YXtOLA7Hv/download" is also unavailable, thanks.
I tried running this on Linux per the instructions, but with the cpu-only version of Torch. That still gives me the NVIDIA error:
RuntimeError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx
Is it possible to test this without CUDA/NVIDIA?
The fig of the repo maybe wrong, please check.
Hey, I tried to validate the results on two other datasets, the StructVIO dataset, and the ADVIO dataset. Have you guys tried to validate the results on any other datasets?
Attaching code of the Struct VIO data preparation.
`
class CustomDataset(BaseDataset):
def init(self, data_dir, predata_dir, train_seqs, val_seqs,
test_seqs, mode, N, min_train_freq, max_train_freq, dt=0.005):
super().init(predata_dir, train_seqs, val_seqs, test_seqs, mode, N, min_train_freq, max_train_freq, dt)
# convert raw data to pre loaded data
self.read_data(data_dir)
def read_data(self, data_dir):
r"""Read the data from the dataset"""
f = os.path.join(self.predata_dir, 'Mech-01.p') # if processed data exist
if True and os.path.exists(f):
print("Processed data found")
return
print("Start read_data, be patient please")
# change this to support advio dataset
def set_path(seq):
path_imu = os.path.join(data_dir, seq, seq, "imu0", "data.csv")
path_gt = os.path.join(data_dir, seq, seq+"-ArUco-a.txt")
path_gt1 = os.path.join(data_dir, seq, "vicon.txt")
return path_imu, path_gt, path_gt1
sequences = os.listdir(data_dir)
# read each sequence
for sequence in sequences:
print("\nSequence name: " + sequence)
path_imu, path_gt, path_gt1 = set_path(sequence)
imu = np.genfromtxt(path_imu, delimiter=",", skip_header=1)
try:
gt = np.genfromtxt(path_gt, delimiter="", skip_header=0)
print("Ground Truth File: %s" %path_gt)
except:
gt = np.genfromtxt(path_gt1, delimiter="", skip_header=0)
print("Ground Truth File: %s" % path_gt1)
# import ipdb; ipdb.set_trace()
imu[:, 0] = imu[:, 0]/1e9 # converting to second
# time synchronization between IMU and ground truth
t0 = np.max([gt[0, 0], imu[0, 0]])
t_end = np.min([gt[-1, 0], imu[-1, 0]])
# start index
idx0_imu = np.searchsorted(imu[:, 0], t0)
idx0_gt = np.searchsorted(gt[:, 0], t0)
# end index
idx_end_imu = np.searchsorted(imu[:, 0], t_end, 'right')
idx_end_gt = np.searchsorted(gt[:, 0], t_end, 'right')
# subsample
imu = imu[idx0_imu: idx_end_imu]
gt = gt[idx0_gt: idx_end_gt]
# printing the shape of the data
ts = np.array(imu[:, 0], dtype="float64")
# # interpolate
t_gt = gt[:, 0]
gt = self.interpolate(np.array(gt, dtype="float64"), np.array(gt[:, 0], dtype="float64"), ts)
imu[:, 1:4] = imu[:, 1:4] - imu[0, 1:4]
print(imu.shape)
print(gt.shape)
# import ipdb; ipdb.set_trace()
# take ground truth position
p_gt = gt[:, 1:4] #p_gt = gt[:, 1:4]
p_gt = p_gt - p_gt[0]
# take ground true quaternion pose
# q_gt = torch.Tensor(gt[:, 4:8]).double()
q_gt = SO3.qnorm(torch.Tensor(gt[:, 4:8]).double())
# q_gt = q_gt / q_gt.norm(dim=1, keepdim=True)
Rot_gt = SO3.from_quaternion(q_gt.cuda(), ordering='wxyz').cpu()
# convert from numpy
p_gt = torch.Tensor(p_gt).double()
v_gt = torch.zeros_like(p_gt).double()
v_gt[1:] = (p_gt[1:] - p_gt[:-1]) / self.dt
imu = torch.Tensor(imu[:, 1:]).double()
# compute pre-integration factors for all training
mtf = self.min_train_freq
dRot_ij = bmtm(Rot_gt[:-mtf], Rot_gt[mtf:])
dRot_ij = SO3.dnormalize(dRot_ij.cuda())
dxi_ij = SO3.log(dRot_ij).cpu()
# masks with 1 when ground truth is available, 0 otherwise
masks = dxi_ij.new_ones(dxi_ij.shape[0])
tmp = np.searchsorted(t_gt, ts[:-mtf])
diff_t = ts[:-mtf] - t_gt[tmp]
masks[np.abs(diff_t) > 0.01] = 0
# save for all training
mondict = {
'xs': torch.cat((dxi_ij, masks.unsqueeze(1)), 1).float(),
'us': imu.float(),
}
# print(mondict["xs"].shape)
# print(mondict["us"].shape)
pdump(mondict, self.predata_dir, sequence + ".p")
# save ground truth
mondict = {
'ts': ts,
'qs': q_gt.float(),
'vs': v_gt.float(),
'ps': p_gt.float(),
}
pdump(mondict, self.predata_dir, sequence + "_gt.p")
`
Hi,
Thanks for providing the code.
I am trying to download reformatted pickle format of the EuRoC and TUM-VI datasets from the URL that you have provided but the URL returns 404 Error.
Can you please provide the dataset files or a valid URL to get the files ?
Thanks.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.