def getForceData(self, acq, frame, noFrames): pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() pfe.SetInput(acq) pfc = pfe.GetOutput() grwf.SetInput(pfc) grwc = grwf.GetOutput() grwc.Update() for filename in self.fileNames: forceData = [] acq = qtools.fileOpen(filename) for forceNumber in range(grwc.GetItemNumber()): forceData.append({ "id": forceNumber + 1, "forceCount": 1, "forcenumber": 2951, "data": { "force": list( self.resampleForceData(grwc, forceNumber, 0, noFrames)[frame, :]), "moment": list( self.resampleForceData(grwc, forceNumber, 1, noFrames)[frame, :]), "position": list( self.resampleForceData(grwc, forceNumber, 2, noFrames)[frame, :]) } }) return forceData
def test_PluginC3D_Threshold50(self): reader = btk.btkAcquisitionFileReader() reader.SetFilename(_TDDConfigure.C3DFilePathIN + "sample09/PlugInC3D.c3d") reader.Update() pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() dswc = btk.btkWrenchCollectionDownsampleFilter() dswc.SetUpDownRatio(reader.GetOutput().GetNumberAnalogSamplePerFrame()) pfe.SetInput(reader.GetOutput()) grwf.SetInput(pfe.GetOutput()) dswc.SetInput(grwf.GetOutput()) vgrfged = btk.btkVerticalGroundReactionForceGaitEventDetector() vgrfged.SetInput(dswc.GetOutput()) vgrfged.SetThresholdValue(50) vgrfged.SetForceplateContextMapping(["Right", "Left"]) vgrfged.SetAcquisitionInformation( reader.GetOutput().GetFirstFrame(), reader.GetOutput().GetPointFrequency(), "") output = vgrfged.GetOutput() output.Update() self.assertEqual(output.GetItemNumber(), 4) ev = output.GetItem(0) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "Right") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 67) self.assertEqual(ev.GetTime(), 67.0 / 60.0) ev = output.GetItem(1) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "Right") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 114) self.assertEqual(ev.GetTime(), 114.0 / 60.0) ev = output.GetItem(2) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "Left") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 109) self.assertEqual(ev.GetTime(), 109.0 / 60.0) ev = output.GetItem(3) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "Left") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 148) self.assertEqual(ev.GetTime(), 148.0 / 60.0)
def test_Gait_NoMapping(self): reader = btk.btkAcquisitionFileReader() reader.SetFilename(_TDDConfigure.C3DFilePathIN + "others/Gait.c3d") reader.Update() pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() dswc = btk.btkWrenchCollectionDownsampleFilter() dswc.SetUpDownRatio(reader.GetOutput().GetNumberAnalogSamplePerFrame()) pfe.SetInput(reader.GetOutput()) grwf.SetInput(pfe.GetOutput()) dswc.SetInput(grwf.GetOutput()) vgrfged = btk.btkVerticalGroundReactionForceGaitEventDetector() vgrfged.SetInput(dswc.GetOutput()) vgrfged.SetAcquisitionInformation( reader.GetOutput().GetFirstFrame(), reader.GetOutput().GetPointFrequency(), "") output = vgrfged.GetOutput() output.Update() self.assertEqual(output.GetItemNumber(), 4) ev = output.GetItem(0) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "General") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 257) self.assertEqual(ev.GetTime(), 2.57) ev = output.GetItem(1) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "General") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 316) self.assertEqual(ev.GetTime(), 3.16) ev = output.GetItem(2) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "General") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 209) self.assertEqual(ev.GetTime(), 2.09) ev = output.GetItem(3) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "General") self.assertEqual( ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 267) self.assertEqual(ev.GetTime(), 2.67)
def test_FileSample10Type4a(self): reader = btk.btkAcquisitionFileReader() reader.SetFilename(_TDDConfigure.C3DFilePathIN + "sample10/type-4a.c3d") pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() pfe.SetInput(reader.GetOutput()) grwf.SetInput(pfe.GetOutput()) grwc = grwf.GetOutput() grwc.Update() self.assertEqual(grwc.GetItemNumber(), 2) grw1 = grwc.GetItem(0) self.assertEqual(grw1.GetPosition().GetFrameNumber(), 5760)
def test_PluginC3D_Threshold50(self): reader = btk.btkAcquisitionFileReader() reader.SetFilename(_TDDConfigure.C3DFilePathIN + "sample09/PlugInC3D.c3d") reader.Update() pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() dswc = btk.btkWrenchCollectionDownsampleFilter() dswc.SetUpDownRatio(reader.GetOutput().GetNumberAnalogSamplePerFrame()) pfe.SetInput(reader.GetOutput()) grwf.SetInput(pfe.GetOutput()) dswc.SetInput(grwf.GetOutput()) vgrfged = btk.btkVerticalGroundReactionForceGaitEventDetector() vgrfged.SetInput(dswc.GetOutput()) vgrfged.SetThresholdValue(50) vgrfged.SetForceplateContextMapping(["Right","Left"]) vgrfged.SetAcquisitionInformation(reader.GetOutput().GetFirstFrame(), reader.GetOutput().GetPointFrequency(), "") output = vgrfged.GetOutput() output.Update() self.assertEqual(output.GetItemNumber(), 4) ev = output.GetItem(0) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "Right") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 67) self.assertEqual(ev.GetTime(), 67.0/60.0) ev = output.GetItem(1) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "Right") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 114) self.assertEqual(ev.GetTime(), 114.0/60.0) ev = output.GetItem(2) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "Left") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 109) self.assertEqual(ev.GetTime(), 109.0/60.0) ev = output.GetItem(3) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "Left") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 148) self.assertEqual(ev.GetTime(), 148.0/60.0)
def test_Gait_NoMapping(self): reader = btk.btkAcquisitionFileReader() reader.SetFilename(_TDDConfigure.C3DFilePathIN + "others/Gait.c3d") reader.Update() pfe = btk.btkForcePlatformsExtractor() grwf = btk.btkGroundReactionWrenchFilter() dswc = btk.btkWrenchCollectionDownsampleFilter() dswc.SetUpDownRatio(reader.GetOutput().GetNumberAnalogSamplePerFrame()) pfe.SetInput(reader.GetOutput()) grwf.SetInput(pfe.GetOutput()) dswc.SetInput(grwf.GetOutput()) vgrfged = btk.btkVerticalGroundReactionForceGaitEventDetector() vgrfged.SetInput(dswc.GetOutput()) vgrfged.SetAcquisitionInformation(reader.GetOutput().GetFirstFrame(), reader.GetOutput().GetPointFrequency(), "") output = vgrfged.GetOutput() output.Update() self.assertEqual(output.GetItemNumber(), 4) ev = output.GetItem(0) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "General") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 257) self.assertEqual(ev.GetTime(), 2.57) ev = output.GetItem(1) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "General") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 316) self.assertEqual(ev.GetTime(), 3.16) ev = output.GetItem(2) self.assertEqual(ev.GetLabel(), "Foot Strike") self.assertEqual(ev.GetContext(), "General") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 1) self.assertEqual(ev.GetFrame(), 209) self.assertEqual(ev.GetTime(), 2.09) ev = output.GetItem(3) self.assertEqual(ev.GetLabel(), "Foot Off") self.assertEqual(ev.GetContext(), "General") self.assertEqual(ev.GetDetectionFlags(), btk.btkEvent.Automatic | btk.btkEvent.FromForcePlatform) self.assertEqual(ev.GetId(), 2) self.assertEqual(ev.GetFrame(), 267) self.assertEqual(ev.GetTime(), 2.67)
def get_fp_wrench(acq, threshold=0.0): pfe = btk.btkForcePlatformsExtractor() pfe.SetInput(acq) pfe.Update() pfc = pfe.GetOutput() grwf = btk.btkGroundReactionWrenchFilter() grwf.SetInput(pfc) grwf.SetTransformToGlobalFrame(True) grwf.SetThresholdState(True) grwf.SetThresholdValue(threshold) grwf.Update() grwc = grwf.GetOutput() grwc.Update() wc_output = {} for i in range(grwc.GetItemNumber()): wc_data = {} pos = grwc.GetItem(i).GetPosition().GetValues() force = grwc.GetItem(i).GetForce().GetValues() moment = grwc.GetItem(i).GetMoment().GetValues() wc_data.update({'POS': pos}) wc_data.update({'FORCE': force}) wc_data.update({'MOMENT': moment}) wc_output.update({i: wc_data}) return wc_output
#Convert c3d force data to file #Load in the c3d data via btk dynamicC3D = btk.btkAcquisitionFileReader() dynamicC3D.SetFilename(dynamicFiles[tt]) dynamicC3D.Update() dynamicAcq = dynamicC3D.GetOutput() #Extract the force platforms data forcePlatforms = btk.btkForcePlatformsExtractor() forcePlatforms.SetInput(dynamicAcq) forcePlatforms.Update() #Get the wrenchs for position and force data groundReactionWrenches = btk.btkGroundReactionWrenchFilter() groundReactionWrenches.SetInput(forcePlatforms.GetOutput()) groundReactionWrenches.Update() #Grab the data from the singular force platform grf = groundReactionWrenches.GetOutput().GetItem(0).GetForce().GetValues() grm = groundReactionWrenches.GetOutput().GetItem(0).GetMoment().GetValues() cop = groundReactionWrenches.GetOutput().GetItem(0).GetPosition().GetValues() #Convert mm units to m grm = grm / 1000 cop = cop / 1000 #Define filter for forces data #Replicates the Fukuchi et al. (2017) processing #(10Hz low-pass 4th Order Butterworth)