moved force plates - graded walking

Dear AnyBody Team,

I am working on a project for graded walking. Force plates were not moved to their real position in Vicon. I moved the force plates to their real/graded positions by changing the corner data. However, also the force should be transformed, so z-direction should still be the vertical direction and not normal to the force plate. I wanted to ask how AnyBody deals with changed force plate positions? According to the coordinate system of the force plate I would guess that z-direction is normal to the force plate and not vertical. So in that case I will have to transform the force data. Usually I would use trigonometric functions to do so, can that be easily implemented in AnyBody? Or is there a way of saying that the force coordinate system should be the same as the Lab coordinate system?

Another question concerning this project: In my GaitLowerExtremity (uploaded GaitRamp) I can’t perform the analysis as Kinematic analysis fails in time step 0. Is it not enough if the look in the same direction? Do I have to further improve the initial conditions for the legs being in similar positions as well?
In AnyGait the same c3d file runs, however I haven’t changed the force plates there yet.
Since I have trials at several different inclinations and several subjects, it would be easier to handle the project with the GaitRamp model.

I am using AMS V5.3 and AMMR V1.5.1.

I would appreciate your help,
Nathalie

Dear Nathalie,

Attached please find the modified version of your model which is now working well.

  1. To fix your model to pass the MotionAndParameterOptimization process,
    I had to adjust the initial position of human model. And I had increased the lengths of the thigh and the shank segments.
    And sometimes it will be helpful to increase the weight factors of the markers on the trunk and the pelvis segments.
    You can find these changes in the ‘ModelSetup.any’ and ‘TrialSpecificData.any’ files.

  2. Regarding the modification of the force plates, I think that you did it very well. So it seems that you tried to modify the corner locations using your new force plate class templates.
    But I don’t think you should change the force values directly in the C3D file. As far as I know, most of force plate systems record the force values with respect to the local coordinate system of the force plate.
    So I don’t think you should change the force values in the C3D file.

I hope this may be helpful to you.

Best regards,
Moonki

P.S) I think that your model looks very nice so I’m looking forward to seeing your nice research in future.

Hi Moonki,

thanks for your reply and your help!

Concerning the force plates:
I don’t want to change the force values directly in the c3d file. As you already said I also think that, most of force plate systems record the force values with respect to the local coordinate system of the force plate. However, the position of the force plates was not changed in Vicon.

I made a small sketch just to easier explain what I mean:
So if I move the force plate in respect to the different corner positons the coordinate system will move as well (red coordinate system in the sketch). However, for data analysis I want the coordinate system to be like the green one in the sketch, so that Fz is my vertical force. Otherwise my vertical force is a product of the two forces in this direction.

My question would be how can I change the coordinate system? Do I have to change it via trigonometric functions or is there another way to do it?
One idea was to switch between F & Flocal in the AnyForce3D but that didn’t work.
Because it does make a difference for calculating internal structure forces how the coordinate system of the force plate is defined, right?

Thanks again, I really appreciate your help!
Nathalie

Dear Nathalie,

Attached please find the second modified version of your model.

In your force plate class template, I tried to add the following lines:

  AnySeg NewCoordinateSystem = 
  {
    Mass = 0 ;
    Jii = {0, 0, 0};
    r0 = .ForcePlate.r0 + .ForcePlate.TransducerLocation.sRel * .ForcePlate.Axes0';
    Axes0 = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
    AnyDrawRefFrame drw = 
    {
      ScaleXYZ=0.4*{1,1,1};RGB={0,1,0};
    };
  };
  
  AnyKinEqSimpleDriver NewCoordinateSystem_Driver = 
  {
    AnyKinLinear lin = 
    {
      Ref = 0;
      AnyRefFrame& base = ..ForcePlate.TransducerLocation ;
      AnyRefFrame& target = ..NewCoordinateSystem ;
    };
    AnyKinRotational rot = 
    {
      Type = PlanarAngles ;
      AnyRefFrame& target = ..NewCoordinateSystem ;
    };
    DriverPos = {0, 0, 0, 0, 0, 0};
    DriverVel = {0, 0, 0, 0, 0, 0};
  };
  
  AnyForceMomentMeasure2 NewCoordinateSystem_ForceMomentMeasure = 
  {
    AnyForceBase& Force = .Force;
    AnyForceBase& Moment = .Moment;
    AnyRefFrame& ref = .NewCoordinateSystem ;
    AnySeg& seg = .ForcePlate;
    
    AnyVec3 Flocal = F * ref.Axes ;
    AnyVec3 Mlocal = M * ref.Axes ;
  };

So I just created NewCoordinateSystem which will be located in the same position with the force plate center. And its orientation will be always as same as the global coordinate system.

You can just read these ‘Flocal’ and ‘Mlocal’ values of AnyForceMomentMeasure2 NewCoordinateSystem_ForceMomentMeasure object.

Best regards,
Moonki

Hi Moonki,

thanks a lot for your help!
I compared the forces between changed/not changed coordinate system and interestingly they are the same.
They are setup as I want them to have, so for running the model everything is fine.

Just do understand how the forceplate class is working:
Seeing no changes I would expect that the forces were not recorded in respect to the local force plate coordinate system but in respect to the lab coordinate system. Is it correct to assume that?

Thanks again,
Nathalie

Hi,

Let’s see the forces and moments input in the force plate class template:

  AnyForce3D Force ={
    
    AnyRefFrame  &ref=.ForcePlate.TransducerLocation ;
    Flocal=.OnOff*{.load(.ForcePlateDriver.t)[0],.load(.ForcePlateDriver.t)[1],.load(.ForcePlateDriver.t)[2]};
    AnyDrawVector DrawForce =     {
      AnyRefFrame &ref=.ref;
      Vec=.Flocal*1/1000;
      PointAway = Off;
      DrawCoord = Off;
      
      Line.RGB ={0,0,1};
      Line.Thickness = 0.01;
      Line.End.Thickness = 2*0.01;
      Line.End.Length = 4*0.01;
      GlobalCoord=Off;
    };
    
    
  };  
  
  
  AnyMoment3D Moment ={
    
    AnyRefFrame  &ref=.ForcePlate.TransducerLocation ;
    Mlocal=.OnOff*{.load(.ForcePlateDriver.t)[3],.load(.ForcePlateDriver.t)[4],.load(.ForcePlateDriver.t)[5]}*Folder.PointsScaleFactor;
    AnyDrawVector DrawMoment =     {
      AnyRefFrame &ref=.ref;
      Vec=.Mlocal*1/1000;
      PointAway = Off;
      DrawCoord = Off;
      
      Line.RGB ={0,1,1};
      Line.Thickness = 0.01;
      Line.End.Thickness = 2*0.01;
      Line.End.Length = 4*0.01;
      GlobalCoord=Off;
    };
    
    
  }; 

So here we are using ‘Flocal’ and ‘Mlocal’ properties from the force plate recording.
When you see the ‘F’ and ‘M’ values from these objects they will be represented in the global coordinate system.
That’s the reason why you could see that the ‘F’ values of this class will be as same as the output from the new coordinate system.

But we can’t say that the force and moments recorded values from the force plate are global. Those are always local.

Best regards,
Moonki