[38ba34]: / Application / Examples / ExoskeletonConcept / ExoConcept_BoxLift.main.any

Download this file

178 lines (156 with data), 6.7 kB

#include "../libdef.any"
/* ----------------------------------------------------------------------------------
  This is an example of developing an exoskeleton concept. The example is based on
  the webcast presented by Prof. John Rasmussen from Aalborg University on 28 Mar 2022.
  <https://www.anybodytech.com/simulation-driven-conceptual-design-of-exoskeletons/>
  
  The model is structured to include the BVH_BoxLift model from the AMMR and then apply
  the code for the exoskeleton concept. This was done to avoid duplicating the box lift
  model in the AMMR. If you want to apply the exo concept to your own model, you just 
  need to copy the code in the ExoConcept section to your own model.

---------------------------------------------------------------------------------- */

// ***************************** AnyMoCap ************************************
// This section points to the BVH_BoxLift Model in the AMMR and allows you to
// select the subject and trial folders.

// Path to the BVH_BoxLift model in the AMMR. The path to the mocap models in AMMR 
// generally follows the structure: <MocapModel>/<Subjects>/<S#>/<S#_T#>/Main.any
// where # is a number. 
// Please define here the path to the mocap model.
#path ANYMOCAP_BVH_BOXLIFT "<ANYBODY_PATH_AMMR>/Application/MocapExamples/BVH_BoxLift/Subjects/"
// Select Subject folder
#define MOCAP_NAME_SUBJECTDIR "S01"
// Select Trial folder suffix. 
#define MOCAP_NAME_TRIALDIR "_T05"

#define MOCAP_NAME_MAINFILEDIR MOCAP_NAME_SUBJECTDIR + MOCAP_NAME_TRIALDIR
#path BVH_BOXLIFT_MAINFILEDIR "<ANYMOCAP_BVH_BOXLIFT>" + MOCAP_NAME_SUBJECTDIR +"/" +MOCAP_NAME_MAINFILEDIR 
#include "<BVH_BOXLIFT_MAINFILEDIR>/Main.any"

// ***************************** AnyMoCap ************************************
// ***************************************************************************


// **************************** ExoConcept ***********************************
/*
  The code below implements the different steps from the webcast. In case you 
  want to apply this code to your own model, you can copy and paste the following
  lines of code to your own model. 

  In this example, two different exoskeleton concepts can be studied: Rotational
  springs at the knees, and extensible rods crossing the knees, hips and lumbar 
  spine. Both concepts are investigated by an idealized force and a spring force. 
  Please see the webcast for a detailed explanation of the steps implemented in 
  this model. Please note that the outputs from the model may not match exactly 
  the outputs from the webcast due to possible differences in the box lifting 
  model.
  
  There are four possibilities in this exoskeleton concept model:
  1  Idealized force at knees.
  2  Spring force at knees.
  3  Idealized extensible rods crossing the knees, hips and lumbar spine.
  4  Spring force-based extensible rods crossing the knees, hips and lumbar spine.
  
  The corresponding code can be included in the model by setting the #define 
  EXO_CONCEPT statement to 1, 2, 3 or 4. Setting the statement to 0 (or any 
  other value) will run the model without any assitive force.
*/

#ifndef EXO_CONCEPT
#define EXO_CONCEPT 4
#endif

Main = {
  EnvironmentModel = {
    
    #if EXO_CONCEPT == 1
    // Idealized forces at the knee using AnyReacForces.
    AnyReacForce Reacs = {
      AnyKinMeasure &k1 = Main.HumanModel.BodyModel.Right.Leg.Jnt.Knee;
      AnyKinMeasure &k2 = Main.HumanModel.BodyModel.Left.Leg.Jnt.Knee;
    };
    #endif

    #if EXO_CONCEPT == 2
    // Spring forces at the knee using position of the knee joints.
    AnyVar k = -89.22;
    AnyForce rSpring = {
      AnyKinMeasure &k1 = Main.HumanModel.BodyModel.Right.Leg.Jnt.Knee;
      F = .k*k1.Pos-24.73;
    };
    AnyForce lSpring = {
      AnyKinMeasure &k1 = Main.HumanModel.BodyModel.Left.Leg.Jnt.Knee;
      F = .k*k1.Pos-24.73;
    };
    #endif
    
    #if EXO_CONCEPT == 3
    // Idealized forces at the extensible rods crossing the knees, hips and lumbar spine.
    AnyReacForce Reacs = {
      AnyKinPLine right = {
        AnyRefFrame &p1 = Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg.rexo;
        AnyRefFrame &p2 = Main.HumanModel.BodyModel.Right.Leg.Seg.Shank.exo;
        AnyDrawPLine drw = {
          Thickness = 0.01;
          RGB = {1,0,0};
        };
      };
      AnyKinPLine left = {
        AnyRefFrame &p1 = Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg.lexo;
        AnyRefFrame &p2 = Main.HumanModel.BodyModel.Left.Leg.Seg.Shank.exo;
        AnyDrawPLine drw = {
          Thickness = 0.01;
          RGB = {1,0,0};
        };
      };
    };
    #endif

    #if EXO_CONCEPT == 4
    // Spring forces at the extensible rods crossing the knees, hips and lumbar spine.
    AnyForce Springs = {
      AnyKinPLine right = {
        AnyRefFrame &p1 = Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg.rexo;
        AnyRefFrame &p2 = Main.HumanModel.BodyModel.Right.Leg.Seg.Shank.exo;
        AnyDrawPLine drw = {
          Thickness = 0.01;
          RGB = {1,0,0};
        };
      };
      AnyKinPLine left = {
        AnyRefFrame &p1 = Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg.lexo;
        AnyRefFrame &p2 = Main.HumanModel.BodyModel.Left.Leg.Seg.Shank.exo;
        AnyDrawPLine drw = {
          Thickness = 0.01;
          RGB = {1,0,0};
        };
      };
      AnyVar k = 1000.0;
      AnyVar L0 = 1.35;
      F = k*{L0-right.Pos[0], L0-left.Pos[0]};
    };
    #endif

  }; // EnvironmentModel
  
  #if (EXO_CONCEPT == 3) | (EXO_CONCEPT == 4)
  // Create reference nodes for extensible rods if EXO_CONCEPT is 3 or 4
  Main.HumanModel.BodyModel.Right.Leg.Seg.Shank = {
    AnyRefNode exo = {
      sRel = {0.014, 0.057, 0.054};
      AnyDrawNode drw = {
        RGB = {1,0,0};
      };
    };  
  };
  Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg = {
    AnyRefNode rexo = {
      sRel = {0.091, 0.260, 0.214};
      AnyDrawNode drw = {
        RGB = {1,0,0};
      };
    };
  };
  
  Main.HumanModel.BodyModel.Left.Leg.Seg.Shank = {
    AnyRefNode exo = {
      sRel = {0.014, 0.057, -0.054};
      AnyDrawNode drw = {
        RGB = {1,0,0};
      };
    };  
  };
  Main.HumanModel.BodyModel.Trunk.SegmentsThorax.ThoraxSeg = {
    AnyRefNode lexo = {
      sRel = {0.091, 0.260, -0.214};
      AnyDrawNode drw = {
        RGB = {1,0,0};
      };
    };
  };  
  #endif

}; // Main

// **************************** ExoConcept ***********************************
// ***************************************************************************