diff --git a/Body/AAUHuman/LegTLEM/Mus.any b/Body/AAUHuman/LegTLEM/Mus.any index 45ccf7c21..4c1e16a1c 100644 --- a/Body/AAUHuman/LegTLEM/Mus.any +++ b/Body/AAUHuman/LegTLEM/Mus.any @@ -18,6 +18,9 @@ #if BM_FOOT_MODEL == _FOOT_MODEL_DEFAULT_ + +#if BM_LEG_MORPHOLOGY == 1 + AnyMuscleViaPoint SoleusMedialis1 = { AnyMuscleModel &MusMdl = ..MuscleModels.SoleusMedialis1Par; AnyRefNode &Org = ..Seg.Shank.SoleusMedialis1Node; @@ -66,7 +69,7 @@ AnyMuscleViaPoint SoleusLateralis3 = { }; }; -#if BM_LEG_MORPHOLOGY == 1 + AnyMuscleShortestPath GastrocnemiusLateralis1 = { AnyMuscleModel &MusMdl = ..MuscleModels.GastrocnemiusLateralis1Par; AnyRefNode &Org = ..Seg.Thigh.GastrocnemiusLateralis1Node; @@ -95,22 +98,93 @@ AnyMuscleShortestPath GastrocnemiusMedialis1 = { #endif #if BM_LEG_MORPHOLOGY == 2 + +AnyMuscleShortestPath SoleusMedialis1 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusMedialis1Par; + AnyRefNode &Org = ..Seg.Shank.SoleusMedialis1Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusMedialis1SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusMedialis1Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + +AnyMuscleShortestPath SoleusMedialis2 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusMedialis2Par; + AnyRefNode &Org = ..Seg.Shank.SoleusMedialis2Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusMedialis2SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusMedialis2Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + +AnyMuscleShortestPath SoleusMedialis3 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusMedialis3Par; + AnyRefNode &Org = ..Seg.Shank.SoleusMedialis3Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusMedialis3SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusMedialis3Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + +AnyMuscleShortestPath SoleusLateralis1 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusLateralis1Par; + AnyRefNode &Org = ..Seg.Shank.SoleusLateralis1Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusLateralis1SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusLateralis1Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + +AnyMuscleShortestPath SoleusLateralis2 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusLateralis2Par; + AnyRefNode &Org = ..Seg.Shank.SoleusLateralis2Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusLateralis2SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusLateralis2Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + +AnyMuscleShortestPath SoleusLateralis3 = { + AnyMuscleModel &MusMdl = ..MuscleModels.SoleusLateralis3Par; + AnyRefNode &Org = ..Seg.Shank.SoleusLateralis3Node; + AnyRefNode &Via1 = ..Seg.Foot.SoleusLateralis3SuperiorNode; + AnyRefNode &Ins = ..Seg.Foot.SoleusLateralis3Node; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" + }; +}; + + + AnyMuscleShortestPath GastrocnemiusLateralis1 = { AnyMuscleModel &MusMdl = ..MuscleModels.GastrocnemiusLateralis1Par; AnyRefNode &Org = ..Seg.Thigh.GastrocnemiusLateralis1Node; AnySurface &srf = ..Seg.Thigh.GastroWrapSurf.cyl; - // AnyRefNode &Via1 = ..Seg.Thigh.GastrocnemiusLateralis1ViaNode; - // AnyRefNode &Via2 = ..Seg.Thigh.GastrocnemiusLateralis2ViaNode; - // AnyRefNode &Via3 = ..Seg.Thigh.GastrocnemiusLateralis3ViaNode; - // AnyRefNode &Via4 = ..Seg.Thigh.GastrocnemiusLateralis4ViaNode; - // AnyRefNode &Via5 = ..Seg.Thigh.GastrocnemiusLateralis5ViaNode; - // AnyRefNode &Via6 = ..Seg.Thigh.GastrocnemiusLateralis6ViaNode; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; AnyRefNode &Via7 = ..Seg.Shank.GastrocnemiusLateralis7ViaNode; AnyRefNode &Via8 = ..Seg.Shank.GastrocnemiusLateralis8ViaNode; AnyRefNode &Via9 = ..Seg.Shank.GastrocnemiusLateralis9ViaNode; - AnyRefNode &Via10 = ..Seg.Shank.GastrocnemiusLateralis10ViaNode; + AnyRefNode &Via10 =..Seg.Foot.GastrocnemiusLateralis1SuperiorNode; AnyRefNode &Ins = ..Seg.Foot.GastrocnemiusLateralis1Node; - SPLine.StringMesh = 45; + SPLine.StringMesh = 30; AnyDrawMuscle DrwMus = { #include "../DrawSettings/MusDrawSettings.any" }; @@ -121,16 +195,15 @@ AnyMuscleShortestPath GastrocnemiusMedialis1 = { AnyRefNode &Org = ..Seg.Thigh.GastrocnemiusMedialis1Node; AnyRefNode &Via1 = ..Seg.Thigh.GastrocnemiusMedialis1ViaNode; AnySurface &srf = ..Seg.Thigh.GastroWrapSurf.cyl; - // AnyRefNode &Via2 = ..Seg.Thigh.GastrocnemiusMedialis2ViaNode; - // AnyRefNode &Via3 = ..Seg.Thigh.GastrocnemiusMedialis3ViaNode; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; AnyRefNode &Via4 = ..Seg.Shank.GastrocnemiusMedialis4ViaNode; AnyRefNode &Via5 = ..Seg.Shank.GastrocnemiusMedialis5ViaNode; AnyRefNode &Via6 = ..Seg.Shank.GastrocnemiusMedialis6ViaNode; AnyRefNode &Via7 = ..Seg.Shank.GastrocnemiusMedialis7ViaNode; - AnyRefNode &Via8 = ..Seg.Shank.GastrocnemiusMedialis8ViaNode; - AnyRefNode &Via9 = ..Seg.Shank.GastrocnemiusMedialis9ViaNode; + AnyRefNode &Via8 =..Seg.Foot.GastrocnemiusMedialis1SuperiorNode; AnyRefNode &Ins = ..Seg.Foot.GastrocnemiusMedialis1Node; - SPLine.StringMesh = 45; + SPLine.StringMesh = 30; AnyDrawMuscle DrwMus = { #include "../DrawSettings/MusDrawSettings.any" }; @@ -2944,13 +3017,10 @@ AnyMuscleShortestPath Plantaris1 = { AnyMuscleModel &MusMdl = ..MuscleModels.Plantaris1Par; AnyRefNode &Org = ..Seg.Thigh.Plantaris1Node; AnySurface &srf = ..Seg.Thigh.GastroWrapSurf.cyl; - SPLine = { - AnyMatrix InitWrapPos = { - transf3D({0.5*.srf.Radius, 1.2*...Sign*.srf.Radius, 0.8*.srf.Length}, &.srf) - }; - InitWrapPosVecArr = {&InitWrapPos}; - StringMesh = 90; - }; + AnySurface &srf1 = ..Seg.Shank.AchillesWrapping1.Cyl; + AnySurface &srf2 = ..Seg.Shank.AchillesWrapping2.Cyl; + SPLine.StringMesh = 30; + AnyRefNode &Via1 =..Seg.Foot.Plantaris1SuperiorNode; AnyRefNode &Ins = ..Seg.Foot.Plantaris1Node; AnyDrawMuscle DrwMus = {#include "../DrawSettings/MusDrawSettings.any" }; diff --git a/Body/AAUHuman/LegTLEM/Seg.any b/Body/AAUHuman/LegTLEM/Seg.any index c7a31b1d9..08924eb6b 100644 --- a/Body/AAUHuman/LegTLEM/Seg.any +++ b/Body/AAUHuman/LegTLEM/Seg.any @@ -520,7 +520,21 @@ AnySeg Foot = AnyRefNode SoleusLateralis2Node = {sRel = .Scale( .StdPar.SoleusLateralis2Node );}; AnyRefNode SoleusLateralis3Node = {sRel = .Scale( .StdPar.SoleusLateralis3Node );}; - //Insertion points on Midfoot: +#if BM_LEG_MORPHOLOGY == 2 + AnyRefNode TendonCalcaneousSuperiorNode = {sRel = .Scale( .StdPar.TendonCalcaneousSuperiorNode );}; + AnyRefNode GastrocnemiusLateralis1SuperiorNode = {sRel = .Scale( .StdPar.GastrocnemiusLateralis1SuperiorNode );}; + AnyRefNode GastrocnemiusMedialis1SuperiorNode = {sRel = .Scale( .StdPar.GastrocnemiusMedialis1SuperiorNode );}; + AnyRefNode Plantaris1SuperiorNode = {sRel = .Scale( .StdPar.Plantaris1SuperiorNode );}; + + AnyRefNode SoleusMedialis1SuperiorNode = {sRel = .Scale( .StdPar.SoleusMedialis1SuperiorNode );}; + AnyRefNode SoleusMedialis2SuperiorNode = {sRel = .Scale( .StdPar.SoleusMedialis2SuperiorNode );}; + AnyRefNode SoleusMedialis3SuperiorNode = {sRel = .Scale( .StdPar.SoleusMedialis3SuperiorNode );}; + AnyRefNode SoleusLateralis1SuperiorNode = {sRel = .Scale( .StdPar.SoleusLateralis1SuperiorNode );}; + AnyRefNode SoleusLateralis2SuperiorNode = {sRel = .Scale( .StdPar.SoleusLateralis2SuperiorNode );}; + AnyRefNode SoleusLateralis3SuperiorNode = {sRel = .Scale( .StdPar.SoleusLateralis3SuperiorNode );}; +#endif + +//Insertion points on Midfoot: #if BM_LEG_MORPHOLOGY == 1 AnyRefNode PeroneusBrevis1Node = {sRel = .Scale( .StdPar.PeroneusBrevis1Node );}; AnyRefNode PeroneusBrevis2Node = {sRel = .Scale( .StdPar.PeroneusBrevis2Node );}; @@ -781,6 +795,27 @@ AnySeg Shank = }; #endif + + #if BM_FOOT_MODEL != _FOOT_MODEL_NONE_ + AnyRefNode AchillesWrapping1 = { + AnyVar ShankLengthScale = vnorm(.AnkleJoint.sRel-.KneeJoint.sRel) + /vnorm(.StdPar.AnkleJoint-.StdPar.KneeJoint); + sRel = .Scale({-0.0336, 0.0987, 0}); + AnySurfCylinder Cyl = { + Length = 0.2; + sRel = {-Radius,0,-0.5*Length}; + Radius = .ShankLengthScale*0.105; + }; + }; + AnyRefNode AchillesWrapping2 = { + sRel = .Scale({-0.032, 0.0437, 0.000}); + AnySurfCylinder Cyl = { + Length = 0.2; + sRel = {Radius,0,-0.5*Length}; + Radius = ..AchillesWrapping1.ShankLengthScale*0.07; + }; + }; + #endif //BonyLandMarks AnyRefNode MedialTibialEpicondyle = diff --git a/Body/AAUHuman/LegTLEM/TLEM2.1/ModelParameters.any b/Body/AAUHuman/LegTLEM/TLEM2.1/ModelParameters.any index 3f727e846..a938bedc6 100644 --- a/Body/AAUHuman/LegTLEM/TLEM2.1/ModelParameters.any +++ b/Body/AAUHuman/LegTLEM/TLEM2.1/ModelParameters.any @@ -728,17 +728,31 @@ AnyFolder ModelParameters = { // TendonCalcaneousNode, Point using 1 elements AnyVec3 TendonCalcaneousNode = {-0.03679,-0.01718,-0.00514}*.TF'; - AnyVec3 TendonCalcaneousMedialisNode = TendonCalcaneousNode-{0, 0,0.005}*.TF'; - AnyVec3 TendonCalcaneousLateralisNode = TendonCalcaneousNode+{0, 0,0.005}*.TF'; + AnyVec3 TendonCalcaneousMedialisNode = TendonCalcaneousNode-{0, 0, 0.003}*.TF'; + AnyVec3 TendonCalcaneousLateralisNode = TendonCalcaneousNode+{-0.001, 0, 0.003}*.TF'; AnyVec3 GastrocnemiusLateralis1Node = TendonCalcaneousLateralisNode; AnyVec3 GastrocnemiusMedialis1Node = TendonCalcaneousMedialisNode; - AnyVec3 Plantaris1Node = TendonCalcaneousNode; + AnyVec3 Plantaris1Node = TendonCalcaneousMedialisNode; AnyVec3 SoleusMedialis1Node = TendonCalcaneousMedialisNode; AnyVec3 SoleusMedialis2Node = TendonCalcaneousMedialisNode; AnyVec3 SoleusMedialis3Node = TendonCalcaneousMedialisNode; AnyVec3 SoleusLateralis1Node = TendonCalcaneousLateralisNode; AnyVec3 SoleusLateralis2Node = TendonCalcaneousLateralisNode; AnyVec3 SoleusLateralis3Node = TendonCalcaneousLateralisNode; + + AnyVec3 TendonCalcaneousSuperiorNode = {-0.03679,-0.003,-0.00514}*.TF'; + AnyVec3 TendonCalcaneousMedialisSuperiorNode = TendonCalcaneousSuperiorNode-{0, 0,0.003}*.TF'; + AnyVec3 TendonCalcaneousLateralisSuperiorNode = TendonCalcaneousSuperiorNode+{-0.001, 0,0.003}*.TF'; + AnyVec3 GastrocnemiusLateralis1SuperiorNode = TendonCalcaneousLateralisSuperiorNode; + AnyVec3 GastrocnemiusMedialis1SuperiorNode = TendonCalcaneousMedialisSuperiorNode; + AnyVec3 Plantaris1SuperiorNode = TendonCalcaneousMedialisSuperiorNode; + AnyVec3 SoleusMedialis1SuperiorNode = TendonCalcaneousMedialisSuperiorNode; + AnyVec3 SoleusMedialis2SuperiorNode = TendonCalcaneousMedialisSuperiorNode; + AnyVec3 SoleusMedialis3SuperiorNode = TendonCalcaneousMedialisSuperiorNode; + AnyVec3 SoleusLateralis1SuperiorNode = TendonCalcaneousLateralisSuperiorNode; + AnyVec3 SoleusLateralis2SuperiorNode = TendonCalcaneousLateralisSuperiorNode; + AnyVec3 SoleusLateralis3SuperiorNode = TendonCalcaneousLateralisSuperiorNode; + // PeroneusBrevisDistal, Point using 1 elements AnyVec3 PeroneusBrevisDistal1Node = {0.04494,-0.02783,0.03219}*.TF'; diff --git a/CHANGELOG.md b/CHANGELOG.md index e57558b04..99e40f515 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,15 @@ to account for pelvis segment morphing into leg pelvis coordinate system using ### Changed: +* Wrapping surfaces have been added to the achilles tendon around the ankle in + the TLEM 2.0 leg model. This ensures a even ratio of moment arms between + the soleus and gastrocnemius muscles. Hence, gastroc is recruited less in + especially during downhill walking and stair descent, solving the models tendency + to overpredict the knee contact forces at toe off. + This is the first of a number of improvements to the leg model by Dr. Enrico De Pieri + who is working on a publication on improvements and validation of the TLEM 2 leg model. + + * Adjustments to pelvic tilt have changed position of MoCap markers on the pelvis segment. This mostly affect markers with hardcoded positions. Particularly PSIS markers furthest posterior from the origin between ASIS. When migrating