Thorax Model

Dear Sirs,

as described in the General Forum, my first attempt generated the general question if the problem can be simulated with AnyBody.

Below the very simple model, which I was not able to drive.

// Lifting of the sternum (actually two) via two connected rib segments.

Main = {

// The actual body model goes in this folder
AnyFolder MyModel = {

// Global Reference Frame
AnyFixedRefFrame GlobalRef = {
  AnyDrawRefFrame DrwGlobalRef = {
   ScaleXYZ = {20, 20, 20};
   RGB = {0,1,0};
  };
      AnyRefNode SpineNodeLeftUpper = {
        sRel = {0.2, -2, 3}; 
      };
      AnyRefNode SpineNodeRightUpper = {
        sRel = {0.2, 2, 3}; 
      };
      AnyRefNode SpineNodeLeftLower = {
        sRel = {0.2, -2, -3}; 
      };
      AnyRefNode SpineNodeRightLower = {
        sRel = {0.2, 2, -3}; 
      };
       AnyRefNode SpineNodeBackUpper = {
        sRel = {-0.2, 0, 8}; 
      };
      AnyRefNode SpineNodeBackLower = {
        sRel = {-0.2, 0, -8}; 
      };   
};  // Global reference frame

// Segments
AnyFolder Segs = {
AnySeg Spine =
{
r0 = {0, 0, 0};
Mass = 0.05;
Jii = {1, 1, 0.01};
AnyDrawSeg drw = {};
};
AnySeg RibLeftUpper=
{
r0 = {8, -2, 3};
Mass = 0.1;
Jii = {0.05, 1, 1};
AnyDrawSeg drw = {};
AnyRefNode RibLeftUpperNodeSpine ={
sRel = {-7, 0, 0};
};
AnyRefNode RibLeftUpperNodeSternum ={
sRel = {7, 0, 0};
};
AnyRefNode RibLeftUpperNodeMidSternum ={
sRel = {3, -1, 0};
};
AnyRefNode RibLeftUpperNodeMidSpine ={
sRel = {-3, -1, 0};
};
AnyRefNode RibLeftUpperNodeMiddle ={
sRel = {0, -1, 0};
};
};
AnySeg RibRightUpper=
{
r0 = {8, 2, 3};
Mass = 0.1;
Jii = {0.05, 1, 1};
AnyDrawSeg drw = {};
AnyRefNode RibRightUpperNodeSpine ={
sRel = {-7, 0, 0};
};
AnyRefNode RibRightUpperNodeSternum ={
sRel = {7, 0, 0};
};
AnyRefNode RibRightUpperNodeMidSternum ={
sRel = {3, 1, 0};
};
AnyRefNode RibRightUpperNodeMidSpine ={
sRel = {-3, 1, 0};
};
AnyRefNode RibRightUpperNodeMiddle ={
sRel = {0, 1, 0};
};
};
AnySeg RibLeftLower=
{
r0 = {8, -2, -3};
Mass = 0.1;
Jii = {0.05, 1, 1};
AnyDrawSeg drw = {};
AnyRefNode RibLeftLowerNodeSpine ={
sRel = {-7, 0, 0};
};
AnyRefNode RibLeftLowerNodeSternum ={
sRel = {7, 0, 0};
};
AnyRefNode RibLeftLowerNodeMidSternum ={
sRel = {3, -1, 0};
};
AnyRefNode RibLeftLowerNodeMidSpine ={
sRel = {-3, -1, 0};
};
AnyRefNode RibLeftLowerNodeMiddle ={
sRel = {0, -1, 0};
};
};
AnySeg RibRightLower=
{
r0 = {8, 2, -3};
Mass = 0.1;
Jii = {0.05, 1, 1};
AnyDrawSeg drw = {};
AnyRefNode RibRightLowerNodeSpine ={
sRel = {-7, 0, 0};
};
AnyRefNode RibRightLowerNodeSternum ={
sRel = {7, 0, 0};
};
AnyRefNode RibRightLowerNodeMidSternum ={
sRel = {3, 1, 0};
};
AnyRefNode RibRightLowerNodeMidSpine ={
sRel = {-3, 1, 0};
};
AnyRefNode RibLeftLowerNodeMiddle ={
sRel = {0, 1, 0};
};
};
AnySeg SternumLeft=
{
r0 = {16, -2, 0};
Mass = 0.2;
Jii = {1, 1, 0.03};
AnyDrawSeg drw = {};
AnyRefNode SternumLeftNodeUpper ={
sRel = {-0.1, 0, 3};
};
AnyRefNode SternumLeftNodeLower ={
sRel = {-0.1, 0, -3};
};
};
AnySeg SternumRight=
{
r0 = {16, 2, 0};
Mass = 0.2;
Jii = {1, 1, 0.03};
AnyDrawSeg drw = {};
AnyRefNode SternumRightNodeUpper ={
sRel = {-0.1, 0, 3};
};
AnyRefNode SternumRightNodeLower ={
sRel = {-0.1, 0, -3};
};
};
}; // Segs folder

AnyFolder Jnts = {
  AnyRevoluteJoint SpineJointLeftUpper = {
    Axis = y;
    AnyRefNode &GroundNode = Main.MyModel.GlobalRef.SpineNodeLeftUpper;
    AnyRefNode &SpineJointLeftUpperNode = Main.MyModel.Segs.RibLeftUpper.RibLeftUpperNodeSpine;
  }; // Left Upper Spine joint
  AnyRevoluteJoint SpineJointRightUpper = {
    Axis = y;
    AnyRefNode &GroundNode = Main.MyModel.GlobalRef.SpineNodeRightUpper;
    AnyRefNode &SpineJointRightUpperNode = Main.MyModel.Segs.RibRightUpper.RibRightUpperNodeSpine;
  }; // Right Upper Spine joint
  AnyRevoluteJoint SpineJointLeftLower = {
    Axis = y;
    AnyRefNode &GroundNode = Main.MyModel.GlobalRef.SpineNodeLeftLower;
    AnyRefNode &SpineJointLeftLowerNode = Main.MyModel.Segs.RibLeftLower.RibLeftLowerNodeSpine;
  }; // Left Upper Spine joint
  AnyRevoluteJoint SpineJointRightLower = {
    Axis = y;
    AnyRefNode &GroundNode = Main.MyModel.GlobalRef.SpineNodeRightLower;
    AnyRefNode &SpineJointRightLowerNode = Main.MyModel.Segs.RibRightLower.RibRightLowerNodeSpine;
  }; // Right Upper Spine joint 

  AnyRevoluteJoint SternumJointLeftUpper = {
    Axis = y;
    AnyRefNode &SternumJointLeftUpperNodeRib = Main.MyModel.Segs.RibLeftUpper.RibLeftUpperNodeSternum;
    AnyRefNode &SternumJointLeftUpperNode = Main.MyModel.Segs.SternumLeft.SternumLeftNodeUpper;
  }; // Left Upper Sternum joint
  AnyRevoluteJoint SternumJointRightUpper = {
    Axis = y;
    AnyRefNode &SternumJointRightUpperNodeRib= Main.MyModel.Segs.RibRightUpper.RibRightUpperNodeSternum;
    AnyRefNode &SternumJointRightUpperNode= Main.MyModel.Segs.SternumRight.SternumRightNodeUpper;
  }; // Right Upper Sternum joint
  AnyRevoluteJoint SternumJointLeftLower = {
    Axis = y;        
    AnyRefNode &SternumJointLeftLowerNodeRib = Main.MyModel.Segs.RibLeftLower.RibLeftLowerNodeSternum;
    AnyRefNode &SternumJointLeftLowerNode = Main.MyModel.Segs.SternumLeft.SternumLeftNodeLower;
  }; // Left Upper Sternum joint
  AnyRevoluteJoint SternumJointRightLower = {
    Axis = y;
    AnyRefNode &SternumJointRightLowerNodeRib = Main.MyModel.Segs.RibRightLower.RibRightLowerNodeSternum;
    AnyRefNode &SternumJointRightLowerNode = Main.MyModel.Segs.SternumRight.SternumRightNodeLower;
  }; // Right Upper Sternum joint 
}; // Jnts folder

AnyFolder Drivers = {
  AnyKinEqSimpleDriver RibLeftUpperMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SpineJointLeftUpper;
    DriverPos = {0*pi/180};
    DriverVel = {30*pi/180};
  }; // Rib Left Upper driver
  AnyKinEqSimpleDriver RibRightUpperMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SpineJointRightUpper;
    DriverPos = {0*pi/180};
    DriverVel = {30*pi/180};
  }; // Rib Right Upper driver
  AnyKinEqSimpleDriver RibLeftLowerMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SpineJointLeftLower;
    DriverPos = {0*pi/180};
    DriverVel = {30*pi/180};
  }; // Rib Left Lower driver
  AnyKinEqSimpleDriver RibRightLowerMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SpineJointRightLower;
    DriverPos = {0*pi/180};
    DriverVel = {30*pi/180};
  }; // Rib Right Lower driver      
  AnyKinEqSimpleDriver SternumLeftUpperMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SternumJointLeftUpper;
    DriverPos = {0*pi/180};
    DriverVel = {-30*pi/180};
  }; // Rib Left Upper driver
  AnyKinEqSimpleDriver SternumRightUpperMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SternumJointRightUpper;
    DriverPos = {0*pi/180};
    DriverVel = {-30*pi/180};
  }; // Rib Right Upper driver
  AnyKinEqSimpleDriver SternumLeftLowerMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SternumJointLeftLower;
    DriverPos = {0*pi/180};
    DriverVel = {-30*pi/180};
  }; // Rib Left Lower driver
  AnyKinEqSimpleDriver SternumRightLowerMove = {
    AnyRevoluteJoint &Jnt = Main.MyModel.Jnts.SternumJointRightLower;
    DriverPos = {0*pi/180};
    DriverVel = {-30*pi/180};
  }; // Rib Right Lower driver      
}; // Driver folder

}; // MyModel
// The study: Operations to be performed on the model
AnyBodyStudy MyStudy = {
AnyFolder &Model = .MyModel;
Gravity = {0.0, 0.0, -9.81};
};
}; // Main

The warning states, that the model is statically indeterminate. There are 48 reactions but only 42 rigid body degrees of freedom.

If there is any way to get this going, I thank you in advance for any helpful comments.

Best regards,
Michael Egger

Attached the model as *.any file.

Hi Michael,

This situation occurs when you have too many hard constraints in the model compared to the number of degrees-of-freedom. This means that the hard constraints have to divide the reactions between them and since they are precisely “hard” they have no way to do that.

The usual way to address this problem is the following:

  1. Consider whether you really want the constraints you have defined. In many cases, when there are too many constraints, it is because the user has not fully understood the mechanics of the model and by mistake has defined more hard constraints than he really wants.

  2. If you decide that you really want the constraints, then convert as many of them as necessary to “soft” constraints with finite strength. This will give the system a possibility to systematically divide the reaction forces between the constraints. The best way to establish soft kinetic constraints is by means of the AnyGeneralMuscle class applied to some of the kinematic measures inside your constraints after you have switched the corresponding reaction forces off. Please refer to the tutorial on muscle modeling for a description of the AnyGeneralMuscle.

Best regards,
John

PS. Please notice that this section of the forum is the self-supported section. This means that you only get replies if somebody thinks your case is interesting and happens to have time. If you post on the professional forum instead you are guaranteed a reply by the supporters of AnyBody Technology.