I am trying to run the anybody with collected marker-based mocap data, and only found out that the parameter identification did not run normally. As in picture you see, the feet of the subject twisted in an abnormal angle. The ankle, or subtalar joint inversed nearly 90 degree.
The parameter identification can finish anyway somehow, but when running inverse dynamic, the programm failed immediately.
Do you know what is the possible reason, and how to fix that? Thanks a lot!
It is understandable that the inverse dynamics fails when you have bad kinematics.
From your image, it looks like you have only two markers on the foot: one at the heel, and one at the toes, isn't it? If this is the case, there is an indeterminacy in the model as the foot can freely rotate about an axis through these markers.
I can suggest adding some joint limits to the subtalar joint. This will prevent the extreme angles, but you may still end up with the foot at the actual joint limit.
Then, you can try adding weak mannequin drivers to the subtalar joint, which will try to keep the subtalar joint at 0 degrees.
Please add these drivers in the ExtraDrivers.any file that you can access through LabSpecificData.any
This might help you resolve the problem, but please be aware of the limitations, that is, it might not be representative of the actual movement, which we have no way of knowing.
thanks very much for your reply. I tried your method to limit the ROM of subtalar joint within a range of +/-20°, by changing the AnyMocapModel.any as follows:
#include "../libdef.any"
// This is the AnyMOCAP base model.
// There should be no reason to change this file directly.
//
// All user defined options can be configured in the application, by
// changing the files TrialSpcificData.any, SubjectSpecificData.any, LabSpecificData.any #include "PathDefinitions.any" #include "ClassTemplates.any" // include definition of range of motion #include "<AMMR_TOOLS>\ModelUtilities/KinematicLimits/RangeOfMotionLimits_template.any"
Main =
{
// AnyMoCap related setup #include "ModelSetup.any"
// Configure and include the human model. The configuration
// is controlled by the file (#include "<BODY_MODEL_CONFIG_FILE>") #include "<ANYBODY_PATH_BODY>/HumanModel.any"
RangeOfMotionLimits RoMLimits(
ARM_RIGHT = BM_ARM_RIGHT,
ARM_LEFT = BM_ARM_LEFT,
LEG_RIGHT = BM_LEG_RIGHT,
LEG_LEFT = BM_LEG_LEFT
) = {
// Example of changing af few of the limits:
Limits.Left.SubTalarEversion = {20, 20};
Limits.Right.SubTalarEversion = {20, 20};
};
#include "BodyModelWithoutMuscles.any"
…
I marked every new modified contents by making them italic. But the programm seems not to work. I did not observe any changes in the result, so that the joint motion is still so large.
I can see why you model shows no change. You have not added the lines at the correct location. The joint limits are not included in any of your studies. Please remove any changes you have made in AnyMocapModel.any. You should not change this file.
Actually, I would suggest you first of all use only the weak mannequin driver for subtalar joint. My earlier suggestion for using the joint limits will probably not help you so much in this case. You should use that as a supplement to the weak mannequin driver if the weak driver is not able to fix the problem. I am sorry for the inconvenience.
Please add these drivers in the ExtraDrivers.any file that you can access through LabSpecificData.any of your model. Please make sure the following lines are within the scope of ExtraDrivers = { };
#define BM_MANNEQUIN_DRIVER_ANKLE_SUBTALAR_EVERSION_RIGHT ON
#define BM_MANNEQUIN_DRIVER_ANKLE_SUBTALAR_EVERSION_LEFT ON
Main.HumanModel.DefaultMannequinDrivers = {
// You can make the driver stronger (or weaker) by increasing (or decreasing) its weight.
AnkleDriverRightEversion.WeakDriverWeight = 0.01;
AnkleDriverLeftEversion.WeakDriverWeight = 0.01;
};