keenon / nimblephysics

Nimble: Physics Engine for Biomechanics and Deep Learning
http://www.nimblephysics.org
Other
389 stars 43 forks source link

GRF of the first frame of all the trials are always 0 #208

Open TheOne-1 opened 2 months ago

TheOne-1 commented 2 months ago

I load subject GRF data as follows:

            subject = nimble.biomechanics.SubjectOnDisk(subject_path)
            frames: nimble.biomechanics.FrameList = subject.readFrames(trial_index, 0, trial_length,
                                                                       includeSensorData=False,
                                                                       includeProcessingPasses=True)
            try:
                first_passes: List[nimble.biomechanics.FramePass] = [frame.processingPasses[0] for frame in frames]
            except IndexError:
                print(f'{subject_name}, {trial_index} has no processing passes, skipping')
                continue
            forces = [frame.groundContactForce for frame in first_passes]
            if (forces[0] == 0).all():
                print(f'{subject_name}, {trial_index} has 0 GRF at the first frame.', end='')

Then the (forces[0] == 0).all() returns True for every trial of all the datasets I processed. Forces show up starting at index 1.

nickbianco commented 2 months ago

As discussed in person, we lose a time point when finite differencing the inverse kinematics trajectories, and this lost time point might be getting propagated to the forces when aligning time points during preprocessing. Since there is no acceleration at this time point the forces might be getting assigned zeros by default.

@TheOne-1, how is this specifically impacting your workflow? Is it not sufficient to trim off the first time step in each trial?

TheOne-1 commented 1 month ago

Not impacting much. Yes, I should simply trim it off.

Also just realized that the GRF of the last frame is also missing.