Giter Club home page Giter Club logo

denoise-imu-gyro's People

Contributors

mbrossar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

denoise-imu-gyro's Issues

Jumps in ground truth of orientation estimate

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.

roll_gt

Pre-trained model

Hello.

Thanks for your code. Do you have a pretrained model for your experiment? I thought it could be mentioned in Testing here
Download optimized parameters at this url, extract and copy in the results folder.

But url contains
image

Maybe you could upload to google drive or something?

Different test results on TUM-VI datasets

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!

Support different IMU sensors as input

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!

TUM-VI room_4 Raw data

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.

Issue about the global frame

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!

gyro_std of new dataset

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!

What is self.N0 for?

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!

Running without CUDA/Nvidia?

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?

Cannot validate results on new dataset.

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")

`

Dataset Download URL not Working

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.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.