Hello everyone,
I have found that on the website of api, there is no expression for Matlab. For CustomJoint, which relates to the operation of SpatialTransform, always outputs errors in my case.
I have attached my codes here:
spatialTrans = SpatialTransform();
spatialTrans.updTransformAxis(0).setCoordinateNames('rotation1',1);
spatialTrans.updTransformAxis(0).setFunction(LinearFunction(1,0));
spatialTrans.updTransformAxis(0).setAxis(Vec3(1,0,0));
spatialTrans.updTransformAxis(1).setCoordinateNames('rotation2',1);
spatialTrans.updTransformAxis(1).setAxis(Vec3(0, 1, 0));
spatialTrans.updTransformAxis(2).setCoordinateNames('rotation3',1);
spatialTrans.updTransformAxis(2).setAxis(Vec3(0, 0, 1));
spatialTrans.updTransformAxis(3).setCoordinateNames('translation1',1);
spatialTrans.updTransformAxis(3).setAxis(Vec3(1, 0, 0));
spatialTrans.updTransformAxis(4).setCoordinateNames('translation2',1);
spatialTrans.updTransformAxis(4).setAxis(Vec3(0, 1, 0));
spatialTrans.updTransformAxis(5).setCoordinateNames('translation3',1);
spatialTrans.updTransformAxis(5).setAxis(Vec3(0, 0, 1));
I_to_II = CustomJoint('joint', body_I, locationInParent,...
orientationInParent, body_II, locationInChild, orientationInChild, spatialTrans);
% Update the coordinates of the new joint
exoCoord =I_to_II.upd_CoordinateSet();
exoCoord.get(0).setRange([0.0, 120*pi/180]);
exoCoord.get(0).setName('rotation');
Each time when I run this snippet of codes, there is always error warning:
No method 'setCoordinateNames' with matching signature
found for class 'org.opensim.modeling.TransformAxis'.
It may tell me that the variables in 'setCoordinateNames()' are not correctly filled.
Any suggestions from the experts?
Thanks a lot for your assistance.
CustomJoint in Matlab
- Charles Yin
- Posts: 11
- Joined: Mon Feb 05, 2018 12:45 am
- Ayman Habib
- Posts: 2248
- Joined: Fri Apr 01, 2005 12:24 pm
Re: CustomJoint in Matlab
Hello Charles,
The TransformAxis class indeed has no method setCoordinateNames(String, int) instead it has a setCoordinateNames(ArrayStr), so you'll have to create an ArrayStr object, append the name you want to it then send it to the method. Documentation for version 3.3 API is available here
https://simtk.org/api_docs/opensim/api_ ... mAxis.html
Best regards,
-Ayman
The TransformAxis class indeed has no method setCoordinateNames(String, int) instead it has a setCoordinateNames(ArrayStr), so you'll have to create an ArrayStr object, append the name you want to it then send it to the method. Documentation for version 3.3 API is available here
https://simtk.org/api_docs/opensim/api_ ... mAxis.html
Best regards,
-Ayman
- Charles Yin
- Posts: 11
- Joined: Mon Feb 05, 2018 12:45 am
Re: CustomJoint in Matlab
Hello Ayman,
Thanks for your support. Now I think I have delt with this problem based on your advice.
However, I also encounted with the problem underlying coordinates update. The definition of CustomJoint CoordinateSet is different from the others since the number of coordinates is not fixed (from 1-6). Thus, I think there may be errors of my codes for defining the coordinates:
angleRange = [0.0, 2*pi/3];
exoCoord =I_to_II.getCoordinateSet(); % or 'upd_CoordinateSet()';
exoCoord.get(0).setRange(angleRange);
exoCoord.get(0).setName('exo_revolute');
Both of getCoordinateSet() and upd_CoordinateSet() output errors. Would you have any suggestions?
Besides, is the coordinate name 'exo_revolute' equal to the name in setCoordinateNames()?
Thanks for your support.
Best Regards.
-Charles
Thanks for your support. Now I think I have delt with this problem based on your advice.
However, I also encounted with the problem underlying coordinates update. The definition of CustomJoint CoordinateSet is different from the others since the number of coordinates is not fixed (from 1-6). Thus, I think there may be errors of my codes for defining the coordinates:
angleRange = [0.0, 2*pi/3];
exoCoord =I_to_II.getCoordinateSet(); % or 'upd_CoordinateSet()';
exoCoord.get(0).setRange(angleRange);
exoCoord.get(0).setName('exo_revolute');
Both of getCoordinateSet() and upd_CoordinateSet() output errors. Would you have any suggestions?
Besides, is the coordinate name 'exo_revolute' equal to the name in setCoordinateNames()?
Thanks for your support.
Best Regards.
-Charles
- Ayman Habib
- Posts: 2248
- Joined: Fri Apr 01, 2005 12:24 pm
Re: CustomJoint in Matlab
Hi Charles,
I'm posting a link to the 3.3 documentation of CustomJoint so you can see what methods are available:
https://simtk.org/api_docs/opensim/api_ ... Joint.html
As you can see there's no getCoordinateSet or updCoordinateSet methods available for the CustomJoint class.
It will save you time and frustration to check the documentation first to see what methods are available. Please consult the page
below for how to use our doxygen documentation
https://simtk-confluence.stanford.edu/d ... ng+Doxygen
Best regards,
-Ayman
I'm posting a link to the 3.3 documentation of CustomJoint so you can see what methods are available:
https://simtk.org/api_docs/opensim/api_ ... Joint.html
As you can see there's no getCoordinateSet or updCoordinateSet methods available for the CustomJoint class.
It will save you time and frustration to check the documentation first to see what methods are available. Please consult the page
below for how to use our doxygen documentation
https://simtk-confluence.stanford.edu/d ... ng+Doxygen
Best regards,
-Ayman
- Charles Yin
- Posts: 11
- Joined: Mon Feb 05, 2018 12:45 am
Re: CustomJoint in Matlab
Hi Ayman,
Now I have succeeded in CustomJoint modeling with C++. Based on your suggestions, creating Osim models with API Doxygen is quite efficient.
While, I try to execute the same in Matlab, there is still a problem. For the codes in C++ as below, it worked without problem:
CoordinateSet& exoCoord = I2II->upd_CoordinateSet();
double angleRange[2] = {0.0, SimTK::Pi*2/3};
exoCoord[0].setRange(angleRange);
However, the same logic in MATLAB, where I have written:
angleRange = [0.0, 2*pi/3];
exoCoord =I_to_II.upd_CoordinateSet();
exoCoord.get(0).setRange(angleRange);
Which cannot give out reasonable results. And I cannot find the answer from API.
Do you have any adivce or is there the answer someplace in API?
Thanks a lot for your support.
As well, thanks for anyone who has some suggestions.
-Charles.
Now I have succeeded in CustomJoint modeling with C++. Based on your suggestions, creating Osim models with API Doxygen is quite efficient.
While, I try to execute the same in Matlab, there is still a problem. For the codes in C++ as below, it worked without problem:
CoordinateSet& exoCoord = I2II->upd_CoordinateSet();
double angleRange[2] = {0.0, SimTK::Pi*2/3};
exoCoord[0].setRange(angleRange);
However, the same logic in MATLAB, where I have written:
angleRange = [0.0, 2*pi/3];
exoCoord =I_to_II.upd_CoordinateSet();
exoCoord.get(0).setRange(angleRange);
Which cannot give out reasonable results. And I cannot find the answer from API.
Do you have any adivce or is there the answer someplace in API?
Thanks a lot for your support.
As well, thanks for anyone who has some suggestions.
-Charles.
- Ayman Habib
- Posts: 2248
- Joined: Fri Apr 01, 2005 12:24 pm
Re: CustomJoint in Matlab
Hi Charles,
The issue in conversion from C++ to Matlab is primarily of data-types. In C++ you clearly state that you have an array of doubles that gets passed to the method Coordinate::setRange(), there's no ambiguity or data-type conversion. The Matlab side however creates a Matlab Array which is not the same as an array of doubles so can't be passed in. You could set the range using setRangeMin(double), setRangeMax(double) as primitive type 'double' should map without an issue.
Hope this helps, and please let me know how it goes.
-Ayman
The issue in conversion from C++ to Matlab is primarily of data-types. In C++ you clearly state that you have an array of doubles that gets passed to the method Coordinate::setRange(), there's no ambiguity or data-type conversion. The Matlab side however creates a Matlab Array which is not the same as an array of doubles so can't be passed in. You could set the range using setRangeMin(double), setRangeMax(double) as primitive type 'double' should map without an issue.
Hope this helps, and please let me know how it goes.
-Ayman
- Charles Yin
- Posts: 11
- Joined: Mon Feb 05, 2018 12:45 am
Re: CustomJoint in Matlab
Hi Ayman,
Thanks for your advice. I have delt with this problem.
Actually, it was the cause that I misunderstood the 'ArrayStr' as:
spatialTrans.updTransformAxis(0).setCoordinateNames(ArrayStr('exo_rotation'));
I checked it with the api, and I found the correct form should be 'ArrayStr('exo_rotation', int)'.
Thus,
exoCoord =I_to_II.upd_CoordinateSet();
numCoord=I_to_II.numCoordinates();
exoCoord.get(0).setRange([value1, value2]);
if exoCoord didn't contain coordinates, its motion range cannot be defined.
Thanks again for all your help.
Best Regards.
-Charles
Thanks for your advice. I have delt with this problem.
Actually, it was the cause that I misunderstood the 'ArrayStr' as:
spatialTrans.updTransformAxis(0).setCoordinateNames(ArrayStr('exo_rotation'));
I checked it with the api, and I found the correct form should be 'ArrayStr('exo_rotation', int)'.
Thus,
exoCoord =I_to_II.upd_CoordinateSet();
numCoord=I_to_II.numCoordinates();
exoCoord.get(0).setRange([value1, value2]);
if exoCoord didn't contain coordinates, its motion range cannot be defined.
Thanks again for all your help.
Best Regards.
-Charles