With the kinematic analysis in place we are ready to compute forces and investigate ergonomic properties of the pedal arrangement. We shall presume that the pedal is loaded by a spring, the force of which the leg must overcome when stepping on the pedal. AnyScript™ has a ligament class, which can be used to create springs of various types. Please refer to the ligament tutorial for further information. However, here we shall take a simpler approach and simply define the spring force directly.
A force can be added to any kinematic measure by
means of the AnyForce class. Because the concept of
kinematic measures is general, the AnyForce class attains
the type given by the kinematic measure. If the measure is
a length, then an AnyForce is a force, and if it is an
angle, the AnyForce automatically becomes a moment. In the
present case we shall add the AnyForce to the kinematic
measure of the pedal's hinge. Let us initially study the
measure. Run the KinematicAnalysis again, open a ChartFX
2DView, and browse your way through the tree to
Main.MyStudy.Output.Model.EnvironmentModel.HingeJoint.Pos.
You should see the following graph:
The analysis runs in time from zero to one second, and the pedal angle develops in this time from 100 degrees (1.74 rad) to 145 degrees (2.53 rad). Let us presume that the pedal is loaded by a linear spring that is slack at 0 degrees and increases its moment linearly with the rotation of the hinge. We might be wondering: What would be a comfortable spring stiffness for a pedal like that? Not having much experience with pedal design it might be difficult to imagine just how stiff the spring should be, and we could find ourselves developing a series of hardware prototypes with different springs and perhaps conducting subjective investigations with test subjects. A simple task like this could potentially be very time consuming and expensive.
Let us do it with AnyBody™ instead. We shall start out by declaring an AnyForce to play the role of the spring. Since this is not a part of the body it is logical to place it in the Environment.any file. Here's what to add:
AnyRevoluteJoint HingeJoint = {
Axis = z;
AnyFixedRefFrame &Ground = .GlobalRef;
AnyRefNode &Pedal = .Pedal.Hinge;
};
AnyForce Spring = {
AnyRevoluteJoint &Hinge = .HingeJoint;
F = -0.0*.HingeJoint.Pos;
};
This looks easy, does it not? The AnyForce contains a reference to the HingeJoint. Since the degree of freedom in HingeJoint is rotational, the force is automatically turned into a moment and applied it to the hinge. The specification of F is the actual size of the force. We have made it proportional to the HingeJoint.Pos, which is the hinge angle, and we have initially set the spring stiffness to 0.0, to investigate the effect of having no spring before we start adding a spring force. Notice, by the way, the minus sign in front of spring constant. It has no importance now, but when we start adding non-zero stiffnesses it will signify that the spring force goes against the angle, i.e. pushes back onto the foot.
There are just a couple of things we need to do before we can do the InverseDynamicAnalysis operation and compute the forces: All the drivers we added in the previous lesson have motors built into them. This means that whatever force or moment is necessary to perform the movement will be provided by the drivers, and there will be nothing for the muscles to do. Motors in drivers are technically reaction forces, and they can be turned off inside the driver:
AnyFolder Drivers = {
AnyKinEqSimpleDriver PostureDriver ={
AnyKinMeasureOrg &Ref2 = ...HumanModel.Interface.Trunk.PelvisThoraxLateralBending;
AnyKinMeasureOrg &Ref3 = ...HumanModel.Interface.Trunk.PelvisThoraxRotation;
AnyKinMeasureOrg &Ref1 = ...HumanModel.Interface.Trunk.PelvisThoraxExtension;
DriverPos = {0,0,0};
DriverVel = {0,0,0};
Reaction.Type = {Off, Off, Off};
};
AnyKinEqSimpleDriver NeckJntDriver = {
AnyRevoluteJoint &T12L1Joint = ...HumanModel.Interface.Trunk.NeckJoint;
DriverPos = {0};
DriverVel = {0};
Reaction.Type = {Off};
};
AnyKinEqSimpleDriver AnkleDriver = {
AnyUniversalJoint &Ankle = Main.MyPedal.HumanModel.Right.Leg.Jnt.Ankle;
DriverPos = {1.570796, 0};
DriverVel = {0, 0};
Reaction.Type = {Off, Off};
};
AnyKinEqSimpleDriver KneeDriver = {
AnyKinLinear GlobKnee = {
AnyRefFrame &Glob = Main.MyPedal.EnvironmentModel.GlobalRef;
AnyRefFrame &Knee = Main.MyPedal.HumanModel.Right.Leg.Seg.Thigh.KneeJoint;
};
MeasureOrganizer = {2};
DriverPos = {0};
DriverVel = {0};
Reaction.Type = {Off};
};
AnyKinEqSimpleDriver Pedal = {
AnyRevoluteJoint &Hinge = Main.MyPedal.EnvironmentModel.HingeJoint;
DriverPos = {100*pi/180};
DriverVel = {45*pi/180};
Reaction.Type = {Off};
};
There is one more thing we have to do: The model has no muscles. This can be rectified by a simple change in the BodyPartsSetup file:
// Trunk: 1 included, 0 not included
// *********************************
#define TRUNK 1
// This is just the bones,
// Choose one of the following options to add muscles
#define TRUNK_SIMPLE_MUSCLES 1
...
// RightLeg: 1 included, 0 not included
// ************************************
#define RIGHT_LEG 1
// This is just the bones,
// Choose one of the following options to add muscles
#define RIGHT_LEG_SIMPLE_MUSCLES 1
#define RIGHT_LEG_MUS_3E 0
Now, reload the model and run the InverseDynamicAnalysis. The model should look like this:
Notice that the muscle forces are illustrated by the bulging of the muscles. In the ChartFx view near the top of the tree you can find the MaxMuscleActivity. It expresses theload on the body in percent of its strength. Plotting this property in the ChartFx View gives you the following result:
Obviously holding the leg out in the air like that without the support of a pedal spring and holding up the weight of the pedal as well is rather strenuous and in fact requires about 54% of the body's strength.
Now, let us study the effect of spring stifness. We initially try:
F = -10*.HingeJoint.Pos;
This produces the activity curve:
Obviously the level is much lower now starting at just 16%, so the spring really seems to help. Let us try to double the stiffness:
F = -20*.HingeJoint.Pos;
This appears to be equally good in terms of activity level and has the added quality of increasing muscle activity or effort for increasing angle. This can make it easier for the operator to control the pedal and thereby enhance the operability.
The completed model is available here: PedalDemo.zip .
The AnyBody™ Modeling System is all about making this type of investigation easy. The mechanical model we have put together in four simple lessons has a complexity worthy of a Ph.D. project if you develop it bottom up. In AnyBody™, this is a matter of a few hours of work when using the predefined models of the repository.
Let's continue to Lesson 9: Model Structure .
