Question about arm curl example


I’m interested in modeling new arm curl machine by AnyBody.
So first, I would investigate the existing arm curl example in AMMR V1.0.

Most interesting thing in this example is the implementation of wire.
Below is the code for it.

[FONT=Arial][COLOR=blue][FONT=Courier]AnyKinSPLine Wire={[/FONT]
[FONT=Arial] AnyRefNode &ref1=.Wheel1.CylNode1.WireNode;[/FONT]
[FONT=Arial] AnySeg &ref2=.Mass;[/FONT]
[FONT=Arial] AnySurfCylinder &ref3=.Wheel1.CylNode1.Cyl1;[/FONT]
 [FONT=Arial]  AnySurfCylinder &ref5=.Wheel2.CylNode1.Cyl1;[/FONT]
 [FONT=Arial]  AnyDrawPLine drw={Thickness=0.005; RGB={0.1,0.1,0.1};};[/FONT]
 [FONT=Arial]  InitWrapPosVectors ={{0,0.5,0},{-1,2,0}};[/FONT]
 [FONT=Arial]  StringMesh=60;[/FONT]
 [FONT=Arial]  RelTol=1e-4;[/FONT]
 [FONT=Arial]  };[/FONT]
[FONT=Arial]AnyReacForce WireReaction={[/FONT]
[FONT=Courier]AnyKinSPLine &ref=.Wire;[/FONT]
[FONT=Arial] };[/FONT]

[LEFT][FONT=Arial]And there are drivers for wheels and mass.[/FONT][/LEFT]

[FONT=Courier][COLOR=blue][FONT=Arial][COLOR=blue]AnyKinEqSimpleDriver[FONT=Courier] [FONT=Arial]Drv={[/FONT][/FONT]
[FONT=Arial] AnyRevoluteJoint Wheel1Jnt={[/FONT]
[FONT=Arial]    AnyRefNode &ref1=...ArmRest.RightWheelNode1;[/FONT]
 [FONT=Arial]     AnySeg &ref2 =..Wheel1;[/FONT]
 [FONT=Arial]    };[/FONT]
 [FONT=Arial]    DriverPos={1.4};[/FONT]
 [FONT=Arial]    DriverVel={0.7*pi}/Main.Study.tEnd;[/FONT]
 [FONT=Arial] };[/FONT]
 [FONT=Arial]    AnyRevoluteJoint JntWheel2={[/FONT]
 [FONT=Arial]    AnySeg  &ref1=..Wheel2;[/FONT]
 [FONT=Arial]    AnyRefNode  &ref2=...GlobalRef.RightWheelNode2;[/FONT]
 [FONT=Arial]    Axis=z;[/FONT]
 [FONT=Arial]  DriverPos={0};[/FONT]
 [FONT=Arial] };[/FONT]
[FONT=Arial]AnyKinEqInterPolDriver  MassDrv={[/FONT]
 [FONT=Arial]  AnyPrismaticJoint &ref1=.MassJnt;[/FONT]
 [FONT=Arial]  Type=Bspline;[/FONT]
 [FONT=Arial]  BsplineOrder = 4;[/FONT]
 [FONT=Arial]  T =    {0,0.25,0.33,0.5,0.75,1}*Main.Study.tEnd;[/FONT]
 [FONT=Arial]  Data={{-0.52,-0.515,-0.51,-0.505,-0.49,-0.43}};  [/FONT]

[FONT=Courier][COLOR=blue][FONT=Arial]In this example, wheels which are in contact with the wire are modeled as AnySurfCylinder.
Before writing this question article, I found a previous post:

I’d like to ask of you several questions.

  1. When I remove the code for wire, there is no change in the number of constraints of entire model. I think that a wire that is in contact with several wheels may affect as a constraint for those wheels. Is my idea wrong?

  2. In the example model, wheels are modeled as AnySurfCylinder. According to the previous post I referenced, AnySurfSTL can’t be used with AnyKinSPLine object. Let’s assume that designers may not design the pulleys of an arm curl machine as a shape of cylinder. Its sectional shape may be some parametric surface in form of B-Spline or NURBS surface. How can we model this type of pulleys for AnyKinSPLine?

  3. Because AnyKinSPLine doesn’t as a constraint, drivers for two wheels and mass may be need. Then, what is the relation between these velocities?

Thanks very much for reading this article. Please help me to get your advice.

Hi Moonki,
some answers:
For the time being only cylinders and elipsoids are available as wrapping surfaces. Please have also a look at the wrapping muscle tutorial. If you remove the wires the model will fail to solve the inverse dynamics as its missing the force reactions. It is nevertheless kinematically fully descriped and can run.
Best regards,

Hello Sebastian,

Thanks so much for your advice.

By virtue of your advice, I could get the answers for my question 1 and 2.
I would ask one more about drivers of wheel 1 joint and mass joint.

Wheel1 joint has a constant angular velocity driver.
Then I think that because wheel1 and mass are connected by a constant-length wire, there may be a relationship between the driver for wheel1 joint and the driver for mass.
But the driver for mass has a b-spline interpolated velocity profile.

Would you give me an advice for that one more please?

Hi Moonki,

As you correctly write the SPline can not be used for constraints, and because of this the driveres for the mass is a bit strange.

As i recall the model the driver for the mass was simply fitted to have a certain motion that would give an almost contants length of the wire. So when wheel geometry was optimized a constant force from the weight was applied to the wire resembling the mass of the weight, and once the new design was found the driver for the mass was fitted to macth a constant length. So this model does not truely capture dynamics effect of the mass the load.

I hope this made it a bit clearer

Best regards

Dear Søren,

Thanks very much for your kind advice.
By virtue of your advice, I can get the answer for my question.

Thank you very much again.

Hi Søren,

Could I ask you one more question?

When I performed an inverse dynamics analysis for the arm curl model in the repository, the maximum muscle force is generated by Brachialis among arm muscles.

Before I performed this simulation, I knew that the main agonist for this kind of arm curl machine is Biceps. Of course in the result Biceps generated relatively bigger force than other muscles.

These days I modeled my own arm curl machine and the analysis result of my model is nearly same as that of original model in the repository.

Could you give your opinion about this result? I would like to ask your advice.

Hi Moonki,

Sounds good you have a new arm curl model.

I am not sure, but if biceps is not so active it could be related to the boundary conditions on the hand, what are these?. In general i guess it should be active for this kind of exercise.

Best regards

[FONT=Arial]Hi Søren,[/FONT]

[FONT=Arial]I used exactly same constraints those are used in the arm curl model in the AnyBody repository for my own arm curl model.[/FONT]

[FONT=Arial]Here is the code for right hand constraints used in the arm curl model in the repository.[/FONT]

 AnyFolder Right ={


[FONT=Verdana]//Make a linear measure between the hand and the handle
AnyKinEqSimpleDriver HandDrv={
  AnyKinLinear  lin={
    AnyRefNode &ref1=...RefEM.Right.Handle.Node2;
    AnySeg &ref2=...RefHM.Right.ShoulderArm.Seg.Glove;
//Make a rotational reaction in the hand
AnyReacForce HandRotCon={
  AnyKinRotational  rot={
    AnyRefNode &ref1=...RefEM.Right.Handle.Node2;
    AnySeg &ref2=...RefHM.Right.ShoulderArm.Seg.Glove;

[FONT=Arial]And I attach the analysis result of arm curl model in the AnyBody repository.[/FONT]

[FONT=Arial]In my model, the number of constraints is bigger than the number of DOF by 3. I guess that the arm curl model in the repository is separated as left and right but my model there is no separation. So I used ‘Soft’ constraint type which is introduced in AnyBody 4.1 for hands and elbows. Then it works amazingly well.[/FONT]

Here is the video link for my arm curl machine:

If you advise me how to change the boundary conditions on the hand, then first I will modify it on the arm curl model in the repository. Then I may be able to change my model. :slight_smile:

Best regards,

Hi Moonki,

I have tried to rerun the ArmCurl model and looking into the boundary conditions.

It is true that the force in Brachialis is higher than the force in Biceps, but their activation is on the same level. Looking at the muscle strenght F0 of Brachialis and biceps shows that the strength of Brachialis is almost double of Biceps so this explains the difference in the force.

So i think the results are as expected, but you could consider adding a friction element in the elbow instead of the three reactions which is there now, it may change the results slightly, as it is now the elbow is glued to the ArmRest segment. I think the friction element was not available when this model originally was created, please have a look in the PedalDemoConditional model, for an example of this.

Best regards

Hi Søren,

Thanks very much for your advice! I’m trying to change those boundary conditions according to your advice.

Best regards,