Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

osim model not scaled using Python API (Think it is a path problem) #4013

Open
EveCharbie opened this issue Feb 7, 2025 · 1 comment
Open

Comments

@EveCharbie
Copy link

I get an error message not informative in the Python API (see bellow).
The scaled wholebody_AOT_01.osim model file was created, but I still get an error message and the model was not scaled (it is a copy of the orginal .osim file).
Could someone help me understand?

[info] Processing subject AOT_scaled...
[info] Step 1: Loading generic model
[info] Updating Model file from 40500 to latest format...
[info] Loaded model Whole-body from file /home/charbie/Documents/Programmation/GaitAnalyzer/models/OpenSim_models/wholebody.osim
[info] Step 2: Scaling generic model
[info] Loaded marker file ../models/OpenSim_models/../../data/AOT_01/AOT_01_ManipStim_static.trc (49 markers, 531 frames)
[info] Measurement 'pelvis'
[info] 	pair 0 (RASIS, LASIS): model = 0.256, experimental = 0.255993
[info] 	pair 1 (LPSIS, RPSIS): model = 0.08, experimental = 0.0613892
[info] 	overall scale factor = 0.883668
[info] Measurement 'femur_r'
[info] 	pair 0 (RGT, RLFE): model = 0.395429, experimental = 0.431454
[info] 	pair 1 (RMFE, RLFE): model = 0.105000, experimental = 0.116833
[info] 	pair 2 (RMFE, RGT): model = 0.421769, experimental = 0.471831
[info] 	overall scale factor = 1.10750
[info] Measurement 'tibia_r'
[info] 	pair 0 (RLM, RATT): model = 0.359123, experimental = 0.385987
[info] 	pair 1 (RSPH, RATT): model = 0.33291, experimental = 0.375302
[info] 	pair 2 (RSPH, RLM): model = 0.103663, experimental = 0.0838040
[info] 	overall scale factor = 1.00352
[info] Measurement 'calcn_r'
[info] 	pair 0 (RCAL, RMFH1): model = 0.209521, experimental = 0.204883
[info] 	pair 1 (RMFH5, RCAL): model = 0.168846, experimental = 0.192522
[info] 	overall scale factor = 1.05904
[info] Measurement 'talus_r'
[info] 	pair 0 (RCAL, RSPH): model = 0.104459, experimental = 0.0927381
[info] 	pair 1 (RCAL, RLM): model = 0.0818, experimental = 0.0847098
[info] 	overall scale factor = 0.961683
[info] Measurement 'toes_r'
[info] 	pair 0 (RMFH1, RTT2): model = 0.0745078, experimental = 0.0779936
[info] 	pair 1 (RMFH5, RTT2): model = 0.101941, experimental = 0.0970183
[info] 	overall scale factor = 0.999246
[info] Measurement 'torso'
[info] 	pair 0 (STR, SUP): model = 0.170532, experimental = 0.170508
[info] 	pair 1 (C7, T10): model = 0.222612, experimental = 0.213531
[info] 	pair 2 (T10, STR): model = 0.210238, experimental = 0.222808
[info] 	pair 3 (SUP, C7): model = 0.127236, experimental = 0.145673
[info] 	overall scale factor = 1.04094
[info] Measurement 'head_and_neck'
[info] 	pair 0 (HV, C7): model = 0.253734, experimental = 0.281397
[info] 	pair 1 (LTEMP, RTEMP): model = 0.2, experimental = 0.181464
[info] 	pair 2 (OCC, SEL): model = 0.222072, experimental = 0.235356
[info] 	overall scale factor = 1.02539
[info] Measurement 'humerus_r'
[info] 	pair 0 (RA, RLHE): model = 0.32892, experimental = 0.319013
[info] 	pair 1 (RA, RMHE): model = 0.331216, experimental = 0.34462
[info] 	overall scale factor = 1.00517
[info] Measurement 'ulna_r'
[info] 	pair 0 (RMHE, RUS): model = 0.253226, experimental = 0.285188
[info] 	overall scale factor = 1.12622
[info] Measurement 'radius_r'
[info] 	pair 0 (RLHE, RRS): model = 0.261732, experimental = 0.274362
[info] 	overall scale factor = 1.04826
[info] Measurement 'lunate_r'
[info] 	pair 0 (RUS, RRS): model = 0.0690507, experimental = 0.0779091
[info] 	overall scale factor = 1.12829
[info] Measurement 'hand_r'
[info] 	pair 0 (RRS, RUS): model = 0.0690507, experimental = 0.0779091
[info] 	pair 1 (RHMH5, RHMH2): model = 0.0833136, experimental = 0.0966010
[info] 	pair 2 (RUS, RHMH5): model = 0.0725534, experimental = 0.0934954
[info] 	pair 3 (RRS, RHMH2): model = 0.0915186, experimental = 0.108150
[info] 	overall scale factor = 1.18954
[info] Measurement 'femur_l'
[info] 	pair 0 (LGT, LLFE): model = 0.395429, experimental = 0.393603
[info] 	pair 1 (LLFE, LMFE): model = 0.105000, experimental = 0.120284
[info] 	pair 2 (LMFE, LGT): model = 0.421769, experimental = 0.45211
[info] 	overall scale factor = 1.07096
[info] Measurement 'tibia_l'
[info] 	pair 0 (LLM, LATT): model = 0.360651, experimental = 0.390256
[info] 	pair 1 (LSPH, LATT): model = 0.331555, experimental = 0.365895
[info] 	pair 2 (LSPH, LLM): model = 0.103663, experimental = 0.0870216
[info] 	overall scale factor = 1.00838
[info] Measurement 'talus_l'
[info] 	pair 0 (LCAL, LLM): model = 0.0818, experimental = 0.0818030
[info] 	pair 1 (LCAL, LSPH): model = 0.104459, experimental = 0.101084
[info] 	overall scale factor = 0.983863
[info] Measurement 'calcn_l'
[info] 	pair 0 (LCAL, LMFH1): model = 0.209521, experimental = 0.211055
[info] 	pair 1 (LCAL, LMFH5): model = 0.168846, experimental = 0.184616
[info] 	overall scale factor = 1.05036
[info] Measurement 'toes_l'
[info] 	pair 0 (LMFH1, LTT2): model = 0.0745078, experimental = 0.0826411
[info] 	pair 1 (LMFH5, LTT2): model = 0.101941, experimental = 0.0958655
[info] 	overall scale factor = 1.02478
[info] Measurement 'humerus_l'
[info] 	pair 0 (LA, LLHE): model = 0.32892, experimental = 0.321982
[info] 	pair 1 (LA, LMHE): model = 0.331216, experimental = 0.341333
[info] 	overall scale factor = 1.00473
[info] Measurement 'ulna_l'
[info] 	pair 0 (LMHE, LUS): model = 0.253226, experimental = 0.291053
[info] 	overall scale factor = 1.14938
[info] Measurement 'radius_l'
[info] 	pair 0 (LLHE, LRS): model = 0.254918, experimental = 0.271812
[info] 	overall scale factor = 1.06627
[info] Measurement 'lunate_l'
[info] 	pair 0 (LRS, LUS): model = 0.0692475, experimental = 0.0768925
[info] 	overall scale factor = 1.11040
[info] Measurement 'hand_l'
[info] 	pair 0 (LUS, LRS): model = 0.0692475, experimental = 0.0768925
[info] 	pair 1 (LHMH2, LHMH5): model = 0.0833136, experimental = 0.0956044
[info] 	pair 2 (LUS, LHMH5): model = 0.0757493, experimental = 0.0963641
[info] 	pair 3 (LRS, LHMH2): model = 0.0948001, experimental = 0.107458
[info] 	overall scale factor = 1.1659
[info] Measurement 'finger_r'
[info] 	pair 0 (RHMH2, RFT3): model = 0.0855351, experimental = 0.110241
[info] 	pair 1 (RHMH5, RFT3): model = 0.0959083, experimental = 0.118706
[info] 	overall scale factor = 1.26327
[info] Measurement 'finger_l'
[info] 	pair 0 (LHMH2, LFT3): model = 0.0855351, experimental = 0.100809
[info] 	pair 1 (LHMH5, LFT3): model = 0.0959083, experimental = 0.115544
[info] 	overall scale factor = 1.19165
[info] Wrote model file '../../examples/results/AOT_01/models/wholebody_AOT_01.osim' from model.
[info] Step 3: Placing markers on model
[info] Loaded marker file ../models/OpenSim_models/../../data/AOT_01/AOT_01_ManipStim_static.trc (49 markers, 531 frames)
[info] Averaged frames from time 0.0 to 5.3 in ../models/OpenSim_models/../../data/AOT_01/AOT_01_ManipStim_static.trc (frames 1 to 531)
[info] Deleted 0 unused markers from model AOT_scaled.
[info] Frame at (t = 0.0):	 total squared error = 0.0552466, marker error: RMS = 0.033578, max = 0.0639436 (LGT)
[info] Moved markers in model AOT_scaled to match locations in marker file '../models/OpenSim_models/../../data/AOT_01/AOT_01_ManipStim_static.trc'.
Traceback (most recent call last):
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/examples/example_optimal_estimation.py", line 40, in <module>
    AnalysisPerformer(
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/gait_analyzer/analysis_performer.py", line 59, in __init__
    self.run_analysis()
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/gait_analyzer/analysis_performer.py", line 197, in run_analysis
    results = self.analysis_to_perform(subject_name, subject_mass, static_trial_full_file_path, c3d_file_name, result_folder)
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/examples/example_optimal_estimation.py", line 17, in analysis_to_perform
    results.create_model(osim_model_type=OsimModels.WholeBody(), skip_if_existing=False)
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/gait_analyzer/result_manager.py", line 65, in create_model
    self.model_creator = ModelCreator(subject_name=self.subject_name,
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/gait_analyzer/model_creator.py", line 173, in __init__
    self.scale_opensim_model()
  File "/home/charbie/Documents/Programmation/GaitAnalyzer/gait_analyzer/model_creator.py", line 256, in scale_opensim_model
    tool.run()
  File "/home/charbie/miniconda3/envs/dev_gait/lib/python3.10/site-packages/opensim/tools.py", line 2129, in run
    return _tools.ScaleTool_run(self)
RuntimeError: std::exception in 'bool OpenSim::ScaleTool::run() const': SimTK Exception thrown at Xml.cpp:113:
  Error detected by Simbody method Xml::writeToFile(): Failed to write to the Xml file '../models/OpenSim_models/../../examples/results/AOT_01/models/wholebody_AOT_01.osim' with error ' (line=1, col=1)'.
  (Required condition 'saveOK' was not met.)

Ubuntu 22.04
Python 3.10.16
OpenSim 4.5.1

@EveCharbie
Copy link
Author

No I am pretty sure it is a path problem since when I put all files (original_model.osim, static.trc, output_scaled_model.osim, output_scaled.xml) in the current directory it works without any problem :)

Moreover, I had to hack my way into accessing the right paths in the xml in the first place:

# Modify the original xml with the participants information
tree = ET.parse(self.osim_model_type.xml_setup_file)
root = tree.getroot()
for elem in root.iter():
    if elem.tag == "model_file":
        elem.text = os.path.abspath(self.osim_model_type.original_osim_model_full_path)
    elif elem.tag == "output_model_file":
        # Due to OpenSim, this path must be relative to xml
        rel_path = os.path.relpath(self.osim_model_full_path, os.path.dirname(self.new_xml_path))
        elem.text = rel_path
    elif elem.tag == "mass":
        elem.text = f"{self.subject_mass}"
    elif elem.tag == "marker_file":
        # Due to OpenSim, this path must be relative to original_osim_model_full_path
        trc_file_relative_path = os.path.relpath(self.trc_file_path,
                                                 os.path.abspath(
                                                     self.osim_model_type.original_osim_model_full_path))[
                                 3:]
        elem.text = trc_file_relative_path
tree.write(self.new_xml_path)

tool = osim.ScaleTool(self.new_xml_path)
tool.run()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant