LifeModeler.com  |  Overview  |  Modeling  |  Tutorials  |  Appendix

Tutorials
Antagonistic Muscles
Bed Settling
Bike
Bungee Jump
Car Crash
Dancing
Detailed Knee
Detailed Spine
Fall
Fighting
Gait Analysis
Golfing
Grasping
Ground Reaction Force
Hip Replacement
Lifting Styles
Muscle Recruitment
Muscle Relocation
Rehabilitation Machine
Tennis
Walking
NeckSIM:Whiplash

Muscle Recruitment

LifeMOD has a muscle recruitment capability for situations where multiple muscle activation patterns are capable of meeting the forward dynamics kinematic profile. This example demonstrates the muscle recruitment process using a simple arm flexion at the elbow.

 

Key skills exercised in this tutorial include:

  • Development of trainable muscle forces
  • Inverse-dynamics, forward-dynamics simulations.
  • Setup, evaluating, and running muscle recruitment optimization

Sections

 


Generating the Body Segments

In this phase, the arm model is created for simulation. The model will consist of a right arm and the upper body.


Figure 1: Body segment create panel and full body model

Step 1: Bring up segments panel and set fields
Launch the LifeMOD™ software and select CREATE NEW MODEL to begin a new modeling session. Select SEGMENTS from the main-menu and CREATE BASE SEGMENT SET from the sub-menu.

Step 2: Create the body
Generate a full body model using the GeBod database. Select a 170 lbs, 70 inch tall male. Name model Eric, set units to Inch Lbm Lbf, and hands to grip. Select "Create Body Parameter Table" to create the body measurement table, then select "Create Human Segments" to create the body.


Reducing the Model

In this phase, the segments of the model are deleted to focus only on the right arm. All segments are deleted except for the head, neck, upper_torso, central_torso, lower_torso, right_scapula, right_upper_arm, right_lower_arm, right_hand.


Figure 2: Segment delete panel and the resulting sub-model

Step 3: Bring up segment delete panel
Select SEGMENTS on the main-menu and DELETE on the sub-menu.

Step 4: Delete the various body segments
All segments are deleted except for the head, neck, upper_torso, central_torso, lower_torso, right_scapula, right_upper_arm, right_lower_arm, right_hand.

 


Generating the Joints

In this phase, the human segments created in the first phase are connected together with kinematic joints. At the same time passive torque functions are created at each joint degree of freedom. The passive joints are created on the arm and trunk to stabilize the model during the inverse-dynamics simulation and includes a spring-damper torque and angle limiting torque for each rotation degree of freedom for the individual joint (scapular, shoulder, elbow, wrist, upper neck, lower neck, thoracic and lumbar). For information on selecting specific model parameters for this section see Choosing Model Parameters.


Figure 3: Arm model with joints (right) and panel to create the passive joints on the right arm.

Step 5: Bring up joint create panel
Select JOINTS in the main-menu and CREATE BASE JOINT SET in the sub-menu. Select "Prepare Model with Recording Joints".

Step 6: Create passive spring damper joints with angle limits for the model
Check the Right Arm and the Spinal joint sets, and set to 1 and the damping to .1. Select MODIFY to bring up the joint matrix panels.

Step 7: Set all the spinal joints to fixed and create the first set
Select "Fixed" as the joint option for each degree-of-freedom for each spinal joint and select apply to create fixed joints in the spine.

Step 8: Set the right scapular joint and shoulder joint to fixed and create the set
Select "Fixed" as the joint option for each degree-of-freedom for each right arm joint, except for the right elbow sagittal freedom which should remain as passive. Select APPLY to create fixed joints in the arm.


Creating the Muscle Forces

The next step in the process is to create soft tissues (muscles) on the model. LifeMOD™ automatically creates a set of basic muscle groups for the body. Muscles consist of recording elements or trained elements. The recording elements are simple data collectors which record the contraction history of the muscle during an activity when the model is moved using external drivers such as motion agents. Trained elements can be either PID closed-loop force actuators or actuation curve open-loop force actuators acting to drive the skeleton's motion. Muscle parameters such as physiological cross sectional area (pCSA) and maximum tissue stress are used to calculate the maximum force potential of the particular muscle. LifeMOD™ contains a database of pCSA values for each muscle and is scaled accordingly based on the input body parameters (ht, wt, gender and age). Further, the force output of the muscle may be scaled from 0% to 200% to change the contributions of each particular muscle. For information on selecting specific model parameters for this section see Choosing Model Parameters.


Figure 4: Muscle groups created on the model. Note that the color of the muscles is "rust" indicating passive training elements.


Figure 5: Panel set up to create the right arm muscle groups. The default tissue stress is used and the muscle tone multiplier is set to 200.

Step 9:Bring up the tissue set create panel
Select SOFT TISSUES on the main-menu and CREATE BASE TISSUE SET on the sub-menu.

Step 10: Set the fields for the muscle generation
Select "Prepare Model with Recording Muscle Elements (To be trained in an inverse-dynamics simulation)" to bring up the panel displayed in figure 5. Set the passive stiffness and damping to 0.1, muscle resting load to 0, and set the muscle tone multiplier to 200%.

Step 11: Create the muscles
Check right arm and select APPLY to create the muscles.


Posing the Human Model

After the joints are created on the model the posture of the model may be adjusted, and the model moved into place. The posture may be adjusted by recalling one of several postures in the posture library then further modify the joint angles if necessary. The body is moved into place by selecting the Lower_Torso segment and changing the location.


Figure 6: The model placed in the riding posture


Figure 7: Posture modification panel to place the model in the riding posture.

Step 12: Bring up posture panel
Select POSTURE on the main-menu and CONFIGURE BASE MODEL on the sub-menu.

Step 13: Update the right shoulder joint
Enter -40 for the sagittal angle of the shoulder joint. Select the Shoulder button to update the joint with the angle.

Step 14: Update the right elbow joint
Enter -10 for the sagittal angle of the elbow joint. Select the Elbow button to update the joint with the angle.

 


Adding Motion Agents to the Human Model

The model, as it exists, is passive and must be driven or manipulated with an external force. To drive the model to capture the simple flexion and extension motion of the neck, Motion Agents will be added to the model. The motion will have the effect of simply rotating the lower arm through its motion, all the while the contraction of the muscles will be recorded for the subsequent forward-dynamics simulation.



Figure 8: Data for the driving spline for the motion agent. The left column is the simulation time and the right column is the angle of the lower arm.


Figure 9: Panel set up to create the motion agent to move the lower arm

Step 15:Bring up the create motion agent panel
Select MOTION on the main-menu and CREATE INDIVIDUAL MOTION AGENT on the sub-menu.

Step 16: Create a spline using data from Figure 9
Select Build, Data_Elements, Spline, New in the task bar. Enter data from figure 9. Select OK.

OR

Create the data spline using the ADAMS/View commands:

data_element create spline spline=.World.Eric_SPLINE_1 x = 0.0, 1.0, 2.0, 3.0, 4.0 y = 0.0, -10.0, -20.0, -40.0, -60.0 linear_extrapolate=no units=no_units

Step 17: Create motion agent on the lower arm
Select Eric_Right_Lower_Arm for the body segment. Use the Manually Select Location agent positioning method with a location of (-1.8, 10.7, 13.4) Set the parameters as in Figure 10. Set all dof's to free except Rx_dof which is set to driven referring to the Spline_2 created in the prior step. Select APPLY to create the motion agent

 


Running the Inverse-Dynamics Simulation

With the model developed, complete with passive training muscle groups and motion agents an inverse-dynamics simulation may be performed to capture the contraction of the muscles for the elbow flexion activity.


Figure 10. Animations from the inverse-dynamics simulation


Figure 11: Analyze panel set to run inverse-dynamics simulation

Step 18: Create a fixed joint between the upper_torso and ground
Select the fixed joint icon from the main toolbox. Select .World.Eric_Upper_Torso as the first body, and .World.ground as the second body. Right-click and set the location to (5, 9, 3) in the location panel. Select APPLY.

OR

Use the following ADAMS/View commands to create a fixed joint between the upper_torso and ground:

marker create marker=.World.Eric_Upper_Torso.ground location=5, 9, 3 rel=.world
marker create marker=.World.ground.Chest location=5, 9, 3 rel=.world

constraint create joint Fixed joint_name=.World.Chest_Ground i_marker_name=.World.Eric_Upper_Torso.ground j_marker_name=.World.ground.Chest

Step 19: Bring up the analyze panel
Select ANALYZE from the main-menu and DYNAMICS from the sub-menu

Step 20: Run the dynamics simulation
Set gravity at -386.0885826772 in the y direction and run the simulation for 4 seconds and 100 time steps using the default integrator settings.

Step 21: Display simulation results
Use the ADAMS/View main toolbox to animate the model.


Running the Forward Dynamics Simulation

With the muscle contraction history recorded from the inverse-dynamics simulation, it is now used in linear PID-Servo formulation to produce a force to recreate the motion history. The process entails deactivating the Motion Agents and updating the muscles. For information on selecting specific model parameters for this section see Choosing Model Parameters.


Figure 12: Panel set to run the analysis. Be sure to disable motion agents.


Figure 13: Model with active "trained" muscle force elements. Note that the color of the muscles is now red indicating active elements.

Step 22: Bring up soft tissue Training panel
Select SOFT TISSUES on the main-menu and TRAINING on the sub-menu. Select "Install Trained Closed-loop Contractile Elements on Muscles".

Step 23: Update the muscles using inverse dynamics data
Specify 1e6 as the proportional gain, 1e6 as the integral gain, and 1e4 as the derivative gain. These values control how well the PID-servo actuators will track the desired contraction at each time step in the analysis. Note that the individual muscle will not produce a force greater than the physiological cross section area (pCSA) times the maximum tissue stress. Select APPLY to update the muscles.

Step 24: Bring up the analyze panel
Select ANALYZE from the main-menu and DYNAMICS from the sub-menu

Step 25: Disable the motion agent and run the dynamics simulation
Set gravity at -386.0885826772 in the y direction and run the simulation for 4 seconds and 100 time steps using the default integrator settings. Select "Disable motion agents".

Select ANALYZE.

Step 26: View the simulation results
Use the ADAMS/View main toolbox to animate the model.

Step 27: Save the analysis
Select SAVE ANALYSIS and enter the name Baseline. Select OK.


Adding Muscle Recruitment Data Elements

We are done with a standard forward dynamics analysis. We will introduce the topic of muscle recruitment by first adding the data structures for muscle recruitment to the model. These include adding a goal and associated response measures to be used to evaluate and optimize recruitment response, dynamic gains to the muscles to represent the recruitment function, and adding a design variable for each muscle to be used for recruitment optimization.


Figure 14: Muscle Recruitment Setup panel

Step 28: Bring up the muscle recruitment setup panel
Select SOFT TISSUES on the main-menu and RECRUITMENT on the sub-menu and SETUP on the tertiary menu.

Step 29: Fill in the Recruitment Setup
Fill in all selection values as shown in Figure 14.

Make sure that the Goal option is checked, and select Min Activation for the goal, Power for the Measure, and 2.0 for the Exponent. These will be used to define measures and objectives for the muscle recruitment. The Suffix is a label associated with this goal that is used in the name of the created variable, measure, and objective.

Set the Dynamic Gain value to 10.0, the start to 0.0, end to 4.0, and Spline inc to 0.02. These will define a dynamic gain spline representing a default recruitment level that will be the same for all muscles, and span the entire time for the simulation. It is also good practice to set the spline increment to at least five times smaller than the optimization increment size to be used later.

Set the Design Variables min to 1.0 and max to 1000.0. These represent the minimum and maximum level that the recruitment level can be changed to during a recruitment optimization.

In the Muscles field, select all muscles by right clicking and selecting "*". Alternatively type "*" and hit enter in the field, and then highlight all muscles in the Which? panel and select OK (see Figure 15). By selecting all muscles, the objectives and measures will be created based on the full set.


Figure 15: Muscle selection panel.

Select APPLY.

Step 30: Bring up the analyze panel
Select ANALYZE from the main-menu and DYNAMICS from the sub-menu

Step 31: Disable the motion agent and run the dynamics simulation
Set gravity at -386.0885826772 in the y direction and run the simulation for 4 seconds and 100 time steps using the default integrator settings. Select "Disable motion agents".

Select ANALYZE.

Step 32: Save the analysis
Select SAVE ANALYSIS and enter the name PreOptimization. Select OK.

Step 33: Bring up results plotting
Select RESULTS on the main-menu and DATA DISPLAY on the sub-menu. Select "Results Window" button to bring up the results processor.

Step 34: Review Recruitment Measures
Right click on the plot window in the Adams/PostProcessor window and select Load Plot. Select the simulation PreOptimization, source Measures. There are now two measures for each muscle: _MEA_At measuring the activation of the muscle, and _MEA_DynGain showing the Dynamic Gain representing the recruitment level.

There is one additional measure called MEA_MinAct2. This represents the goal, which was set to Power of Exponent 2.0. The measure is the sum squared activation levels for all muscles, divided by the number of muscles, and then raised to the 1/2.0 power. In other words, for the Power of Exponent equal to 2.0, the MEA_MinAct2 measure is for the rms Activation level.

Select Surf and review the measures. Note that there are only five muscles with significant activation levels: _Bic1_Rtiss_1, _Bic2_Rtiss_1, _Brac1_Rtiss_1, _Ecarp1_Rtiss_1, and _Pron1_Rtiss_1.


Figure 16: Muscle Activation Measures.


Calculating Muscle Recruitment Sensitivities

Now that we have muscle recruitment data structure in place, and have an initial assessment of the muscle activations using default muscle recruitment levels, we would like to optimize the recruitment levels. Before proceeding with optimization, however, it would be nice to filter the muscle set down to the minimum number of muscles needed to optimize. This way the optimization will proceed as efficiently as possible.

Based on the initial evaluation of the muscle activations, the five muscles with significant activation levels would be good candidates for optimization. To determine if changes in the recruitment levels for these muscles have any effect on their and any other muscles activation levels, a sensitivity case will be run.


Figure 17: Muscle Recruitment Sensitivity panel

Step 35: Set Solution settings
Deselect the "Results Window" button to exit the post processor and return to the main simulation tool. Select ANALYZE on the main-menu and DYNAMICS on the sub-menu.

Set gravity at -386.0885826772 in the y direction. Select "Disable motion agents".

Step 36: Bring up the recruitment sensitivity panel
Select SOFT TISSUES on the main-menu and RECRUITMENT on the sub-menu and SENSITIVITY on the tertiary menu.

Step 37: Fill in the Sensitivity options
Fill in the values as shown in Figure 17.

Set the start to 0.0, end to 4.0, and Solver step to 0.1.

In the Muscles field, select just the five muscles with significant activation levels (_Bic1_Rtiss_1, _Bic2_Rtiss_1, _Brac1_Rtiss_1, _Ecarp1_Rtiss_1, and _Pron1_Rtiss_1). The names can be typed in, selected by right clicking adding the names sequentially, or type "*" and hit enter in the field, and then highlight the five muscles in the Which? panel and select OK (see Figure 18). By selecting these five muscles, a separate sensitivity analysis will be performed on each of these muscles.


Figure 18: Muscle selection panel.

Select "Modify" under Advance Settings. Set the Perturbation to 10.0, the Baseline Prefix to Sens_Baseline, and the Analysis Prefix to Sensitivity.

In the response muscles field select all muscles. This means that the change in activation for all muscles will be calculated for each sensitivity analysis. (if this field is left blank, only the five muscles in the Muscles field would be calculated).

Step 38: Run & Review Muscle Recruitment Sensitivity

Select APPLY.

Six analysis will be performed: a baseline analysis followed by five sensitivity analysis, one for each muscle in the Muscles field. Each sensitivity analysis will have the recruitment level for that muscle increased by the perturbation value. Results will be presented in an external CSV file with name based on the Analysis Prefix field value. When the analysis are done, a message will indicate where to find the results (see Figure 19).


Figure 19: Sensitivity Results info panel.

Open file Sensitivity.csv in Excel, or alternately a text editor. Values in the file represent rms (average over time) activation changes, relative to the baseline run, for the muscles. So, for example, the first row indicates that by changing the recruitment curve from 10.0 (baseline set in step 29) to 20.0 (by adding the perturbation value of 10.0) for muscle _Bic1_Rtiss_1, the activation for _Bic1_Rtiss_1 has an rms change of 0.17, with significant changes to _Bic2_Rtiss_1, _Brac1_Rtiss_1, _Pron1_Rtiss_1, and _Ecarp1_Rtiss_1 - i.e. the same five muscles with significant activation levels. More important, none of the rest of the muscles have a significant change in activation (from near zero levels) for a change in recruitment for these five muscles. The conclusion is that we should perform a recruitment optimization on these five muscles, but we can leave out the other muscles as not affected.


Figure 20: Sensitivity Results.


Running Recruitment Optimization

Now let's perform the Recruitment optimization. Optimization will use the recruitment levels of the five muscles as design variables, and minimize the goal of summed activation squared. For this example we will run a single optimization across the entire 4.0 second simulation, as opposed to running a separate optimization at each time step.


Figure 21: Muscle Recruitment Optimize panel

Step 39: Bring up the recruitment optimize panel
Select SOFT TISSUES on the main-menu and RECRUITMENT on the sub-menu and OPTIMIZE on the tertiary menu.

Step 40: Fill in the Recruitment Optimize panel
Fill in all selection values as shown in Figure 21.

Set the Start to 0, end to 4, and Solver step to 0.1. Select Single Stage to indicate that a single optimization across the entire simulation time will be performed. (Note: With Multi Stage you set an Optimize Increment to indicate that optimization will be done in sequential smaller time steps. For example, if we had wanted to run a separate simulation at each 0.1 second time steps - centered at 0.0, 0.1, 0.2, ... and spanning ranges 0.0-0.05, 0.05-0.15, 0.15-0.25, ... - we would select Multi Stage and put the optimization inc to 0.1)

Select Modify under Advanced Settings. Set the algorithm to SQP, Max Iterations to 3, Perturbation to 0.01, and Tolerance to 1.0e-4. Set the Analysis Prefix to Optimize_Run. Set Time Measure to Power, and Time Exponent to 2.0. (Note: Time Measure indicates how the Goal will be evaluated as a function of time to convert the goal from a curve to a scalar value. This evaluation is done over the appropriate time increment based on the time varying values of the Goal Variable.)

In the Muscles field, enter the five muscles we wish to optimize: _Bic1_Rtiss_1, _Bic2_Rtiss_1, _Brac1_Rtiss_1, _Ecarp1_Rtiss_1, and _Pron1_Rtiss_1.

In the Goal Variable field enter VAR_MinAct2. This is the name of the ADAMS_Variable associated with the measure previously created.

The objective of the optimization will be based on the objective settings in the optimization setup panel.

Select APPLY.


Interrogating Results

Results for the optimization objective vs. iteration should be plotted in a measure plot, as shown in Figure 22. Results for the optimization are stored in analysis Optimize_Run.


Figure 22: Optimization Objective vs Iteration

Step 41: Bring up results plotting
Select RESULTS on the main-menu and DATA DISPLAY on the sub-menu. Select "Results Window" button to bring up the results processor.

Step 42: Create Measure plots of Muscle Activation Level
Split the post-processing page into a 2x3 grid of plots. Select simulations PreOptimization and Optimize_Run. Select source Measures. In the top left plot window, plot measure MEA_minAct2 for the two simulations. In the remaining windows, plot the _MEA_At measure for the five muscles of interest: _Bic1_Rtiss_1, _Bic2_Rtiss_1, _Brac1_Rtiss_1, _Ecarp1_Rtiss_1, and _Pron1_Rtiss_1. For each muscle plot, set the Y axis to range from 0 to 1.0 with 4 tics.


Figure 23: Muscle Activation levels pre and post recruitment optimization.

Notice that the minAct2 curve that the optimization objective is calculated from (in this case the optimization objective is the sum square of the values of the minAct2 measure, summed over time) was reduced during the optimization. All of the muscle activations were reduced except for muscle _Bic2_Rtiss_1, which was increased.

Step 43: Create Measure plots of Recruitment Level
Add a second post-processing page in a 2x3 grid of plots. Select simulations PreOptimization and Optimize_Run. Select Measures. In five of the plot windows, plot _DynGain measures for the five muscles of interest. For each muscle plot, set the Y axis to range from 0 to 100.0 with 5 tics.


Figure 24: Muscle Recruitment levels pre and post recruitment optimization.

Notice that the dynamic gain, as represented in the _DynGain measures, have been adjusted during the optimization. The relative recruitment level between the muscles is represented by the ratio between these curves. Also note that the curves are flat, with a single value for the entire 4 seconds of simulation. That is because only a single stage optimization was performed. It is possible to optimize further in successive stages, with commensurate simulation time required.

Step 44: DEMO COMPLETE


Further

This model was put forth to demonstrate the muscle recruitment process. The intention with this model was to show the process with a relatively small model that solved the recruitment sensitivity and optimization multi-runs in relatively short time frame. The same process can be used on any model that has multiple trained muscles.

This model may be refined in many areas including:

  • Including more movements
  • Including more muscles in the model
  • Converting the muscles from simple trained to Hill trained
  • Change the optimization objectives
  • Optimizing the recruitment levels in smaller stages
 
Back To Top