Specifications
196
huge advantage when creating models like this one. In the real world, the muscles would be pulling on the
bones, which causes the arms to exert forces on the handles, which subsequently creates the movement of
the wheel. The distinction between kinematics and kinetics in AnyBody allows you to let the wheel rotation
impose the kinematics of the entire system, i.e. reversely of how it happens in the real world, while the
forces flow the correct way from the muscles to the handles.
To make this happen, we must make a couple of additions to the model. Both concern the definition of the
wheel in the Environment.any file. When you open the file you can find the definition of the driver that
makes the wheel revolve. To this driver we must add the following setting:
AnyKinEqSimpleDriver WheelTurn = {
AnyRevoluteJoint &Hub = .WheelHub;
DriverVel = {-pi};
Reaction.Type = {Off}; // No motor in the driver
};
This setting ensures that the driver does not provide any torque to the wheel, and it is separation of
kinematics and kinetics in a nutshell: The driver provides the wheel rotation, which further down the
kinematic chain causes the arms to move too, but it does not provide any sort of torque, so other elements
in the system must do the work. We have to set everything up so that those "other elements" are the
muscles. Right now the muscles would not have a very difficult time providing the work because there wheel
still has no resistance to work against. This we can provide by means of an applied torque. We shall
presume that the arms are driving the wheel against a constant torque, which we can apply as an AnyForce
to the hub:
AnyKinEqSimpleDriver WheelTurn = {
AnyRevoluteJoint &Hub = .WheelHub;
DriverVel = {-pi};
Reaction.Type = {Off}; // No motor in the driver
};
AnyForce WheelTorque = {
AnyRevoluteJoint &Hub = .WheelHub;
F = {30};
};
AnyForce is a generic force object that imposes an external load on whatever kinematic measure you apply
it to. If the measure is linear in nature, then the load is a force. If the measure is rotational as in the case of
the revolute joint in the wheel, then the load becomes a torque. In the present case we are applying 30
torque units of load to the wheel, and because the wheel driver has no motor, this torque must be balanced
by the muscles in the system.
There are just a couple of things to do to ice the cake. The first thing issue is that the original standing
model has its forward/backward posture driven to maintain balance. This makes sense for a freely standing
model, but probably not for a model holding on to a wheel. A more reasonable way to do it would be to
control the distance between the thorax and the wheel hub. Let us initially remove the Center of Mass driver
that is responsible for the balancing condition. This takes place in the JointAndDrivers.any file:
//Constrain the collective CoM to be right above the GlobalRef
// AnyKinEqSimpleDriver CoMDriver = {
// AnyKinCoM CoM = {
// AnyFolder &Body = Main.Model.HumanModel;
// };
// MeasureOrganizer = {0,2}; // Only the x and z directions
// DriverPos = {0,0};
// DriverVel = {0,0};
// Reaction.Type = {Off,Off};
// };










