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 ***********************************
// ***************************************************************************