Hi there!
I am trying to calculate the transformation matrices in a specific pose given by a .mot file.
However, I am having some difficulty in placing the musculoskeletal model in the specific pose. Here it is the code I am implementing:
% Import OpenSim libraries
import org.opensim.modeling.*
% Load an OpenSim model
model = Model('output_scaled_model_file.osim'); % Replace with the path to your model
% Initialize the model to get the default state
state = model.initSystem();
% Load the motion data (e.g., a .mot file)
motionData = Storage('StaticCal_0001_scale_ik.mot'); % Replace with the path to your motion file
% Define the time at which you want to extract the pose (e.g., 1.0 seconds)
desiredTime = 0;
% Get the number of states (coordinates) in the model
numStates = size(state.getY());
% Create an array to store the state values
stateValues = zeros(numStates, 1);
% Extract the state values at the desired time from the motion data
for i = 0:numStates-1
stateValues(i+1) = motionData.getStateVector(desiredTime).getData().get(i);
end
coordinate_set = model.getCoordinateSet();
opensimVector = Vector(length(stateValues), 0);
for i = 1:length(stateValues)
opensimVector.set(i-1, stateValues(i)); % OpenSim uses 0-based indexing
end
% Set the state values in the model state
state.setY(opensimVector);
% Get the number of coordinates (states) in the model
numCoordinates = model.getCoordinateSet().getSize();
% Loop through the coordinates to extract values and speeds
for i = 0:numCoordinates-1
coordinateName = model.getCoordinateSet().get(i);
coordinateName.setValue(state, 1)
coordinateName.setSpeedValue(state, 1)
end
% Update the model with the state
model.realizeVelocity(state);
% Print the state information
model.printDetailedInfo(state);
% Optionally, you can save the model with the updated state
model.print('UpdatedModelWithPose.osim');
If anyone is able to help, I'd appreciate the help very much!
Rodrigo
Calculate the transformation matrices in a specific pose using MATLAB
- Rodrigo Mateus
- Posts: 56
- Joined: Thu Feb 22, 2018 3:07 am
- Nicos Haralabidis
- Posts: 196
- Joined: Tue Aug 16, 2016 1:46 am
Re: Calculate the transformation matrices in a specific pose using MATLAB
Hey Rodrigo!
Hope you are well!
After you have set the relevant state information and realized to the necessary stage you can extract the Transform as follows:
bodySet = model.getBodySet();
body1 = bodySet.get('your_body');
body1Transform = body1.getTransformInGround(state);
if you then want the rotation matrix:
body1RotationMatrix = body1Transform.R();
Hope that helps!
Nicos
Hope you are well!
After you have set the relevant state information and realized to the necessary stage you can extract the Transform as follows:
bodySet = model.getBodySet();
body1 = bodySet.get('your_body');
body1Transform = body1.getTransformInGround(state);
if you then want the rotation matrix:
body1RotationMatrix = body1Transform.R();
Hope that helps!
Nicos
- Rodrigo Mateus
- Posts: 56
- Joined: Thu Feb 22, 2018 3:07 am
Re: Calculate the transformation matrices in a specific pose using MATLAB
Hey Nicos!
Everything going well thanks!! Hope you are well too!
Thank you for the help. apparently I needed to calculate the transforms before printing the model, so it's all working out well now, thank you!
Everything going well thanks!! Hope you are well too!
Thank you for the help. apparently I needed to calculate the transforms before printing the model, so it's all working out well now, thank you!
- Rodrigo Mateus
- Posts: 56
- Joined: Thu Feb 22, 2018 3:07 am
Re: Calculate the transformation matrices in a specific pose using MATLAB
Unfortunately, the marker positions are not being retrieved correctly, although I do not understand why... Here it is the code to retrieve the marker positions at the new state:
% Import OpenSim libraries
import org.opensim.modeling.*
% Load an OpenSim model
model = Model('output_scaled_model_file.osim'); % Replace with the path to your model
% Initialize the model to get the default state
state = model.initSystem();
% Load the motion data (e.g., a .mot file)
motionData = Storage('StaticCal_0001_scale_ik.mot'); % Replace with the path to your motion file
% Define the time at which you want to extract the pose (e.g., 1.0 seconds)
desiredTime = 0;
% Get the number of states (coordinates) in the model
numStates = size(state.getY());
% Create an array to store the state values
stateValues = zeros(numStates, 1);
stateSpeedValues = zeros(numStates, 1);
% Extract the state values at the desired time from the motion data
for i = 0:numStates-1
stateValues(i+1) = motionData.getStateVector(desiredTime).getData().get(i);
end
coordinate_set = model.getCoordinateSet();
opensimVector = Vector(length(stateValues), 0);
for i = 1:length(stateValues)
opensimVector.set(i-1, stateValues(i)); % OpenSim uses 0-based indexing
end
% % Set the state values in the model state
state.setY(opensimVector);
model.realizePosition(state);
markerSet = model.getMarkerSet();
% Initialize a cell array to store the marker positions
numMarkers = markerSet.getSize();
markerPositions = cell(numMarkers, 2); % Two columns: Marker name and Position
% Retrieve the positions of each marker in the ground frame
for i = 0:numMarkers-1
marker = markerSet.get(i);
markerName = char(marker.getName());
markerPosition = marker.getLocationInGround(state).getAsMat(); % Get the position as a MATLAB matrix
markerPositions{i+1, 1} = markerName;
markerPositions{i+1, 2} = markerPosition';
end
coordPositions = cell(numCoordinates, 2);
% Get the number of coordinates (states) in the model
numCoordinates = model.getCoordinateSet().getSize();
% Loop through the coordinates to extract values and speeds
for i = 0:numCoordinates-1
coordinateName = model.getCoordinateSet().get(i);
coordPositions{i+1, 1} = coordinateName.getValue(state);
coordPositions{i+1, 2} = coordinateName.getName();
end
% Import OpenSim libraries
import org.opensim.modeling.*
% Load an OpenSim model
model = Model('output_scaled_model_file.osim'); % Replace with the path to your model
% Initialize the model to get the default state
state = model.initSystem();
% Load the motion data (e.g., a .mot file)
motionData = Storage('StaticCal_0001_scale_ik.mot'); % Replace with the path to your motion file
% Define the time at which you want to extract the pose (e.g., 1.0 seconds)
desiredTime = 0;
% Get the number of states (coordinates) in the model
numStates = size(state.getY());
% Create an array to store the state values
stateValues = zeros(numStates, 1);
stateSpeedValues = zeros(numStates, 1);
% Extract the state values at the desired time from the motion data
for i = 0:numStates-1
stateValues(i+1) = motionData.getStateVector(desiredTime).getData().get(i);
end
coordinate_set = model.getCoordinateSet();
opensimVector = Vector(length(stateValues), 0);
for i = 1:length(stateValues)
opensimVector.set(i-1, stateValues(i)); % OpenSim uses 0-based indexing
end
% % Set the state values in the model state
state.setY(opensimVector);
model.realizePosition(state);
markerSet = model.getMarkerSet();
% Initialize a cell array to store the marker positions
numMarkers = markerSet.getSize();
markerPositions = cell(numMarkers, 2); % Two columns: Marker name and Position
% Retrieve the positions of each marker in the ground frame
for i = 0:numMarkers-1
marker = markerSet.get(i);
markerName = char(marker.getName());
markerPosition = marker.getLocationInGround(state).getAsMat(); % Get the position as a MATLAB matrix
markerPositions{i+1, 1} = markerName;
markerPositions{i+1, 2} = markerPosition';
end
coordPositions = cell(numCoordinates, 2);
% Get the number of coordinates (states) in the model
numCoordinates = model.getCoordinateSet().getSize();
% Loop through the coordinates to extract values and speeds
for i = 0:numCoordinates-1
coordinateName = model.getCoordinateSet().get(i);
coordPositions{i+1, 1} = coordinateName.getValue(state);
coordPositions{i+1, 2} = coordinateName.getName();
end