Pneuman sim...

Load in package

Needs["Mech`Mech3D`"]

Set up origin definitions

origin = {0, 0, 0};
XAxis = {1, 0, 0};
YAxis = {0, 1, 0};
ZAxis = {0, 0, 1};

Assign body numbers...

ground = 1;
base  = 2;
LFSteerAsm = 3;
RFSteerAsm = 4;
RRSteerAsm = 5;
LRSteerAsm = 6;
LFWheel = 7;
RFWheel = 8;
RRWheel = 9;
LRWheel = 10;
UpperTorso = 11;
UBlock = 12;
NeckTilt = 13;
NeckPan = 14;
StereoHead = 15;
REyeConv = 16;
LEyeConv = 17;
RUpperArmPitch = 18;
RUpperArmYaw = 19;
RUpperArmRoll = 20;
RLowerArm = 21;
LUpperArmPitch = 22;
LUpperArmYaw = 23;
LUpperArmRoll = 24;
LLowerArm = 25;
RGripper = 26;
LGripper = 27;
LFWheelVelVal =. ;
RFWheelVelVal =. ;
RRWheelVelVal =. ;
LRWheelVelVal =. ;
LFSteerAngVal =. ;
RFSteerAngVal =. ;
RRSteerAngVal =. ;
LRSteerAngVal =. ;
WaistPitchVal =. ;
WaistYawVal =. ;
NeckTiltVal =. ;
NeckPanVal =. ;
EyeTiltVal =. ;
REyeConvVal =. ;
LEyeConvVal =. ;
RArmPitchVal =. ;
RArmYawVal =. ;
RArmRollVal =. ;
RArmElbowVal =. ;
RArmWristVal =. ;
LArmPitchVal =. ;
LArmYawVal =. ;
LArmRollVal =. ;
LArmElbowVal =. ;
LArmWristVal =. ;

Set up origin for ground

bd[ground] = 
      Body[ground,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  ZAxis}]

bd[base] = 
      Body[base, 
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              0.25} (*base upper plane*) , 
 (*p6*) {-6.45, 
              6.45, -8.25} (*LF ptA*) , 
 (*p7*) {-6.45, 6.45, 0} (*LF ptB*) , 
 (*p8*) {6.45, 
              6.45, -8.25} (*RF ptA*) , 
 (*p9*) {6.45, 6.45, 
              0} (*RF ptB*) , 
 (*p10*) {6.45, -6.45, -8.25} (*RR ptA*) , 
 (*p11*) {6.45, -6.45, 
              0} (*RR ptB*) , 
 (*p12*) {-6.45, -6.45, -8.25} (*LR ptA*) , 
 (*p13*) {-6.45, -6.45, 0} (*LR ptB*) , 
 (*p14*) {0, 0, 
              18.25} (*waist DOF*) , 
 (*p15*) {0, 1, 
              18.25} (*waist DOF axis*) }]

bd[LFSteerAsm] = 
      Body[LFSteerAsm, 
PointList -> {
 (*p1*) origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              8.25}}, 
InitialGuess -> {{-6.45, 
              6.45, -8.25}, {1, 0, 0, 0}}]

bd[RFSteerAsm] = 
      Body[RFSteerAsm, 
PointList -> {
 (*p1*) origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              8.25}}, 
InitialGuess -> {{6.45, 
              6.45, -8.25}, {1, 0, 0, 0}}]

bd[RRSteerAsm] = 
      Body[RRSteerAsm,  
PointList -> {
 (*p1*) origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              8.25}}, 
InitialGuess -> {{6.45, -6.45, -8.25}, {1, 0, 0, 0}}]

bd[LRSteerAsm] = 
      Body[LRSteerAsm, 
PointList -> {
 (*p1*) origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              8.25}}, 
InitialGuess -> {{-6.45, -6.45, -8.25}, {1, 0, 0, 0}}]

bd[LFWheel] = 
      Body[LFWheel,  
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {-0.5,  0, 
              0} (*wheel plane pointA*) , 
 (*p6*) {0.5, 
              0, 0} (*wheel plane pointB*) }, 
InitialGuess -> {{-6.45, 6.45, -8.25}, {1, 0, 
              0, 0}}]

bd[RFWheel] = 
      Body[RFWheel,  
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {-0.5,  0, 
              0} (*wheel plane pointA*) , 
 (*p6*) {0.5, 
              0, 0} (*wheel plane pointB*) }, 
InitialGuess -> {{6.45, 6.45, -8.25}, {1, 0, 0, 
              0}}]

bd[RRWheel] = 
      Body[RRWheel,  
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {-0.5,  0, 
              0} (*wheel plane pointA*) , 
 (*p6*) {0.5, 
              0, 0} (*wheel plane pointB*) }, 
InitialGuess -> {{6.45, -6.45, -8.25}, {1, 0, 
              0, 0}}]

bd[LRWheel] = 
      Body[LRWheel,  
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {-0.5,  0, 
              0} (*wheel plane pointA*) , 
 (*p6*) {0.5, 
              0, 0} (*wheel plane pointB*) }, 
InitialGuess -> {{-6.45, -6.45, -8.25}, {1, 0, 0, 0}}]

bd[UpperTorso] = 
      Body[UpperTorso, 
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              9.56} (*T base*) , 
 (*p6*) {6.39, 0, 
              11.56} (*T R side*) , 
 (*p7*) {-6.39, 
              0, 11.56} (*T L side*) , 
 (*p8*) {0, 0, 
              13.56} (*Neck intersectionA*) , 
 (*p9*) {2.6, 0, 15.06} (*RArm start*) , 
 (*p10*) {9.55, 0, 
              15.06} (*RArm intersection*) , 
 (*p11*) {10.55, 0, 15.06}, 
 (*p12*) {-2.6, 0, 
              15.06} (*LArm start*) , 
 (*p13*) {-9.55,  0,  
              15.06} (*LArm intersection*) , 
 (*p14*) {-10.55, 0, 15.06}, 
 (*p15*) {1, 0, 
              13.56} (*Neck intersectionB*) }, 
InitialGuess -> {{0, 0, 18.25}, {1, 0, 0, 
              0}}]

bd[UBlock] = 
      Body[UBlock,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis}, 
InitialGuess -> {{0, 0, 
              18.25}, {1, 0, 0, 0}}]

bd[NeckTilt] = 
      Body[NeckTilt,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 0, 
              10.51}}, 
InitialGuess -> {{0, 0, 
              31.81}, {1, 0, 0, 0}}]

bd[NeckPan] = 
      Body[NeckPan, 
        PointList -> {
 (*p1*) 
              origin, 
 (*p2*) 
              XAxis, 
 (*p3*) 
              YAxis, 
 (*p4*) 
              ZAxis, 
 (*p5*) {0, 0, 
              10.51} (*StereoHead attachment*) , 
 (*p6*) {1, 0, 10.51}}, 
InitialGuess -> {{0, 0, 31.81}, {1, 
              0, 0, 0}}]

bd[StereoHead] = 
      Body[StereoHead,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {4, 0, 
              0}  , 
  {4, 0, 
              1}, 
  {-4, 0, 
              0}  , 
  {-4, 
              0, 1}, 
  {6, 0, 
              0}  , 
  {-6, 0, 
              0}}]

bd[REyeConv] = 
      Body[REyeConv, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 3, 0}}]

bd[LEyeConv] = 
      Body[LEyeConv, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 3, 0}}]

bd[RUpperArmRoll] = 
      Body[RUpperArmRoll, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 
              0, -10.5},   
  {1, 
              0, -10.5}  }]

bd[RUpperArmPitch] = 
      Body[RUpperArmPitch,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  ZAxis}]

bd[RUpperArmYaw] = 
      Body[RUpperArmYaw,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  ZAxis}]

bd[RLowerArm] = 
      Body[RLowerArm,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 
              0, -6.375}  , 
  {0, 
              0, -5.375}}]

bd[LUpperArmRoll] = 
      Body[LUpperArmRoll, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 
              0, -10.5},   
  {1, 
              0, -10.5}  }]

bd[LUpperArmPitch] = 
      Body[LUpperArmPitch,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  ZAxis}]

bd[LUpperArmYaw] = 
      Body[LUpperArmYaw,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  ZAxis}]

bd[LLowerArm] = 
      Body[LLowerArm,  
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {0, 
              0, -6.375}  , 
  {0, 
              0, -5.375}}]

bd[RGripper] = 
      Body[RGripper, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {1, 
              0, -4}  , 
  {-1, 
              0, -4}  }]

bd[LGripper] = 
      Body[LGripper, 
        PointList -> {
  
              origin, 
  
              XAxis, 
  
              YAxis, 
  
              ZAxis, 
  {1, 
              0, -4}  , 
  {-1, 
              0, -4}  }]

SetBodies[bd[1], bd[2], bd[3], bd[4], bd[5], bd[6], bd[7], bd[8], 
      bd[9], bd[10], bd[11], bd[12], bd[13], bd[14], bd[15], bd[16], bd[17], 
      bd[18], bd[19], bd[20], bd[21], bd[22], bd[23], bd[24], bd[25], bd[26], 
      bd[27]]

Constrain the wheels to spin about the X axis of the wheel assembly

cs[1] = 
      Revolute5[1,  Line[LFWheel,  1, 2], 
        Line[LFSteerAsm, 1, 2]]

cs[2] = 
      Revolute5[2,  Line[RFWheel,  1, 2], 
        Line[RFSteerAsm, 1, 2]]

cs[3] = 
      Revolute5[3,  Line[RRWheel,  1, 2], 
        Line[RRSteerAsm, 1, 2]]

cs[4] = 
      Revolute5[4,  Line[LRWheel,  1, 2], 
        Line[LRSteerAsm, 1, 2]]

Constrain the steering assemblies to rotate about their respective points

cs[5] = 
      Revolute5[5, Line[LFSteerAsm,  1,  4], Line[base, 6, 7]]

cs[6] = 
      Revolute5[6, Line[RFSteerAsm,  1, 4], Line[base, 8, 9]]

cs[7] = 
      Revolute5[7, Line[RRSteerAsm, 1, 4], Line[base, 10, 11]]

cs[8] = 
      Revolute5[8, Line[LRSteerAsm, 1, 4], Line[base, 12, 13]]

Constrain steering asseblies so wheels steer...

cs[9] = 
      ProjectedAngle1[9, Vector[LFSteerAsm,  3], Vector[base, 3], 
        Vector[LFSteerAsm, 4],  2  N[π] T]

cs[10] = 
      ProjectedAngle1[10, Vector[RFSteerAsm,  3], Vector[base, 3], 
        Vector[RFSteerAsm, 4],  2  N[π] T]

cs[11] = 
      ProjectedAngle1[11, Vector[RRSteerAsm,  3], Vector[base, 3], 
        Vector[RRSteerAsm, 4], 2  N[π] T]

cs[12] = 
      ProjectedAngle1[12, Vector[LRSteerAsm,  3], Vector[base, 3], 
        Vector[LRSteerAsm, 4],  2  N[π] T]

Constrain wheels so they turn...

cs[13] = 
      ProjectedAngle1[13, Vector[LFWheel, 4], Vector[LFSteerAsm, 4], 
        Vector[LFSteerAsm, 2], 2  N [π] T]

cs[14] = 
      ProjectedAngle1[14, Vector[RFWheel, 4], Vector[RFSteerAsm, 4], 
        Vector[RFSteerAsm, 2], 2  N [π] T]

cs[15] = 
      ProjectedAngle1[15, Vector[RRWheel, 4], Vector[RRSteerAsm, 4], 
        Vector[RRSteerAsm, 2], 2  N [π] T]

cs[16] = 
      ProjectedAngle1[16, Vector[LRWheel, 4], Vector[LRSteerAsm, 4], 
        Vector[LRSteerAsm, 2], 2  N [π] T]

For the base

cs[17] = OriginLock3[17, base, {0, 0, 0}]

cs[18] = RotationLock3[18, base, {0, {1, 0, 0}}]

For the universal waist joint

cs[19] = 
      Revolute5[19,  Line[base, 14, 15], Line[UBlock, 1, 3]]

cs[20] = 
      Revolute5[20,  Line[UBlock, 1, 2], Line[UpperTorso, 1, 2]]

cs[21] = 
      ProjectedAngle1[21,  Vector[UBlock, 4], Vector[base, 4], 
        Vector[base, 3], N[WaistYawVal]]

cs[22] = 
      ProjectedAngle1[22, Vector[UBlock, 3], Vector[UpperTorso, 3], 
        Vector[UBlock, 2], N[WaistPitchVal]]

For the Neck joint...

cs[23] = 
      Revolute5[23, Line[UpperTorso, 8, 15], Line[NeckTilt, 1, 2]]

cs[24] = 
      ProjectedAngle1[24, Vector[UpperTorso, 4], Vector[NeckTilt, 4], 
        Vector[NeckTilt, 2], 0]

cs[25] = 
      Revolute5[25,  Line[NeckTilt, 1, 4], Line[NeckPan, 1, 4]]

cs[26] = 
      ProjectedAngle1[26, Vector[NeckTilt, 3], Vector[NeckPan, 3], 
        Vector[NeckTilt, 4], 0]

For neck/stereo head

cs[27] = 
      Revolute5[27, Line[NeckPan, 5, 6], Line[StereoHead, 1, 2]]

cs[28] = 
      ProjectedAngle1[28, Vector[NeckPan, 4], Vector[StereoHead, 4], 
        Vector[StereoHead, 2], 0]

REye...

cs[29] = 
      Revolute5[29, Line[StereoHead, 5, 6], Line[REyeConv, 1, 4]]

cs[30] = 
      ProjectedAngle1[30, Vector[StereoHead, 3], Vector[REyeConv, 3], 
        Vector[REyeConv, 4], 2  N[π] T]

Leye...

cs[31] = 
      Revolute5[31, Line[StereoHead, 7, 8], Line[LEyeConv, 1, 4]]

cs[32] = 
      ProjectedAngle1[32, Vector[StereoHead, 3], Vector[LEyeConv, 3], 
        Vector[LEyeConv, 4], 2  N[π] T]

R shoulder pitch...

cs[33] = 
      Revolute5[33, Line[UpperTorso, 10, 11], 
        Line[RUpperArmPitch, 1, 2]]

cs[34] = 
      ProjectedAngle1[34, Vector[UpperTorso, 4], Vector[RUpperArmPitch, 4], 
        Vector[RUpperArmPitch, 2], 0]

R arm yaw...

cs[35] = 
      Revolute5[35, Line[RUpperArmPitch, 1, 3], 
        Line[RUpperArmYaw, 1, 3]]

cs[36] = 
      ProjectedAngle1[36, Vector[RUpperArmPitch, 4], Vector[RUpperArmYaw, 4], 
        Vector[RUpperArmYaw, 3], 0]

R arm roll...

cs[37] = 
      Revolute5[37, Line[RUpperArmYaw, 1, 4], 
        Line[RUpperArmRoll, 1, 4]]

cs[38] = 
      ProjectedAngle1[38, Vector[RUpperArmYaw, 3], Vector[RUpperArmRoll, 3], 
        Vector[RUpperArmRoll, 4], 0]

Lower R arm/elbow...

cs[39] = 
      Revolute5[39, Line[RUpperArmRoll, 5, 6], 
        Line[RLowerArm, 1, 2]]

cs[40] = 
      ProjectedAngle1[40, Vector[RUpperArmRoll, 4], Vector[RLowerArm, 4], 
        Vector[RLowerArm, 2], 2  N[π] T]

L shoulder pitch...

cs[41] = 
      Revolute5[41, Line[UpperTorso, 13, 14], 
        Line[LUpperArmPitch, 1, 2]]

cs[42] = 
      ProjectedAngle1[42, Vector[UpperTorso, 4], Vector[LUpperArmPitch, 4], 
        Vector[LUpperArmPitch, 2], 0]

LArm yaw...

cs[43] = 
      Revolute5[43, Line[LUpperArmPitch,  1,  3], 
        Line[LUpperArmYaw, 1, 3]]

cs[44] = 
      ProjectedAngle1[44, Vector[LUpperArmPitch, 4], Vector[LUpperArmYaw, 4], 
        Vector[LUpperArmYaw, 3], 0]

Larm roll...

cs[45] = 
      Revolute5[45, Line[LUpperArmYaw, 1, 4], 
        Line[LUpperArmRoll, 1, 4]]

cs[46] = 
      ProjectedAngle1[46, Vector[LUpperArmYaw, 3], Vector[LUpperArmRoll, 3], 
        Vector[LUpperArmRoll, 4], 0]

Lower L arm/elbow...

cs[47] = 
      Revolute5[47, Line[LUpperArmRoll, 5, 6], 
        Line[LLowerArm, 1, 2]]

cs[48] = 
      ProjectedAngle1[48, Vector[LUpperArmRoll, 4], Vector[LLowerArm, 4], 
        Vector[LLowerArm, 2], 0]

RGripper.

cs[49] = 
      Revolute5[49, Line[RGripper, 1, 4], Line[RLowerArm, 5, 6]]

cs[50] = 
      ProjectedAngle1[50, Vector[RGripper, 3], Vector[RLowerArm, 3], 
        Vector[RGripper, 4], 0]

Lgripper

cs[51] = 
      Revolute5[51, Line[LGripper,  1, 4], 
        Line[LLowerArm,  5, 6]]

cs[52] = 
      ProjectedAngle1[52, Vector[LGripper, 3], Vector[LLowerArm, 3], 
        Vector[LGripper, 4], 0]

SetConstraints[cs[1], cs[2], cs[3], cs[4], cs[5], cs[6], cs[7], cs[8], 
      cs[9], cs[10], cs[11], cs[12], cs[13], cs[14], cs[15], cs[16], cs[17], 
      cs[18], cs[19], cs[20], cs[21], cs[22], cs[23], cs[24], cs[25], cs[26], 
      cs[27], cs[28], cs[29], cs[30], cs[31], cs[32], cs[33], cs[34], cs[35], 
      cs[36], cs[37], cs[38], cs[39], cs[40], cs[41], cs[42], cs[43], cs[44], 
      cs[45], cs[46], cs[47], cs[48], cs[49], cs[50], cs[51], 
      cs[52]]

LFSteerAngVal = π/2;
RFSteerAngVal = 1.0;
RRSteerAngVal = 1.0;
LRSteerAngVal = π/2;
WaistYawVal = 0;
WaistPitchVal = 0;

CheckSystem[]

graph := 
      Graphics3D[{Thickness[
            0.01], 
 (*ground*) 
{Line[{{30, 30, 0}, {-30, 30, 
                  0}, {-30, -30, 0}, {30, -30, 0}, {30, 30, 
                  0}}]}, 
 (*base*) 
Bar[
            Line[base, 1, 5], 13.0, 30], 
Bar[
            Line[base, 1, 14], 2, 
            8], 
 (*RUpperArm*) 
Bar[
            Line[RUpperArmRoll, 1, 5], 3, 
            4], 
 (*LUpperArm*) 
Bar[
            Line[LUpperArmRoll,  1, 5], 3, 
            4], 
 (*RLowerArm*) 
Bar[
            Line[RLowerArm,  1, 5], 2, 
            4], 
 (*LLowerArm*) 
Bar[
            Line[LLowerArm, 1, 5], 2, 
            4], 
 (*RGripper*) 
Bar[
            Line[RGripper, 1, 5], 0.5, 3], 
Bar[
            Line[RGripper, 1, 6], 0.5, 
            3], 
 (*LGripper*) 
Bar[
            Line[LGripper, 1, 5], 0.5, 3], 
Bar[
            Line[LGripper, 1, 6], 0.5, 
            3], 
 (*UpperTorso*) 
Bar[
            Line[UpperTorso, 1, 5], 3, 
            6],  (*T center*) 
Bar[Line[UpperTorso, 6, 7], 
            4, 6],  (*T cross*) 
Bar[
            Line[UpperTorso, 9, 10], 3, 
            6],  (*R shoulder*) 
Bar[
            Line[UpperTorso, 12, 13], 3, 
            6],  (*L shoulder*) 
 (*Neck*) 
Bar[Line[NeckPan, 1, 5], 1.5, 
            6], 
 (*StereoHead*) 
Bar[
            Line[StereoHead, 10, 9], 2, 
            8], 
 (*REye*) 
Bar[
            Line[REyeConv, 0, 5], 1, 
            4], 
 (*LEye*) 
Bar[
            Line[LEyeConv, 0, 5], 1, 
            4], 
 (*LFSteerAsm*) 
Bar[
            Line[LFSteerAsm, 1, 5], 2.5, 
            8], 
 (*RFSteerAsm*) 
Bar[
            Line[RFSteerAsm, 1, 5], 2.5, 
            8], 
 (*RRSteerAsm*) 
Bar[
            Line[RRSteerAsm,  1, 5], 2.5, 
            8], 
 (*LRSteerAsm*) 
Bar[
            Line[LRSteerAsm, 1, 5], 2.5, 
            8],  
 (*LFWheel*) 
Bar[
            Line[LFWheel, 5, 6], 3.0, 
            30], 
 (*RFWheel*) 
Bar[
            Line[RFWheel, 5, 6], 3.0, 
            30], 
 (*RRWheel*) 
Bar[
            Line[RRWheel, 5, 6], 3.0, 
            30], 
 (*LRWheel*) 
Bar[
            Line[LRWheel, 5, 6], 3.0, 
            30]}, 
PlotRange -> {{-20, 
              20}, {-20, 20}, {-12, 60}}, 
        Boxed -> False]

SetGuess[];

postab = SolveMech[{0,  5}, 15];

(Show[graph /. #1, ViewPoint -> {0, -2, 0}] &) /@ 
        Rest[postab];

SolveMech[1] // TraditionalForm