Standing still!
Posted: Fri Mar 04, 2022 9:51 am
Hi all,
I had an unexpectedly hard time getting my Moco model (modified version of Rajagopal model) to do static upright standing, and thought I would document my adventures here.
Motivation is I'm doing some "predictive" (minimum metabolic cost) simulations of walking, and normally for that I use a tracking simulation as the initial guess. I want to check if this guess is biasing the predictive result to be similar to the tracking result, so I will try a standing simulation as an initial guess for predictive walking.
To simulate standing, I created a tracking targets file with all the coordinates set to zero except for the pelvis height, which was set to a height that should produce a vertical GRF of about bodyweight if all the other coordinates are zero. Also created a GRF tracking targets file with the vertical GRF set to one-half bodyweight under each foot and the other GRF set to zero. Then ran a simulation with a cost function of tracking errors plus "muscle fatigue" (sum of squared muscle excitations). The kinematic tracking targets were used as the initial guess.
The first problem was I was getting huge cost function scores from the initial guess, and IPOPT was having a hard time minimizing the cost function, even on a coarse grid. This seemed odd to me since this seems like a fairly easy optimization problem. Initially I thought I must be setting the pelvis target height to a too-low value, putting the feet deep under the floor and generating huge GRF. This was not the case though. The problem ended up being that I was still dividing the muscle fatigue term by the model's displacement, so there was a conflict there: tracking the targets well has zero displacement, but zero displacement sent the muscle fatigue term to infinity.
After removing the "divide by displacement" option, the optimizer was still having a hard time finding solutions where the model stood still. Another problem was my problem statement was lacking the usual periodicity/symmetry goals that I use for locomotion, so the optimizer again had a conflict: it was free to pick unconstrained initial states that allowed for low muscle excitations, but those states had bad tracking. I fixed this by (1) adding the generalized speeds to the tracking targets, and (2) adding a periodicity constraint on all states.
Finally this got a good solution on a coarse grid (11 nodes over T = 0.5 seconds) which I then interpolated onto a fine grid (N=51 nodes) that converged quickly. You can see the result here:
https://twitter.com/rosshm16/status/1499775843849101316
I'm skeptical that this pose is a "minimum fatigue" pose (most people don't stand still on their toes) but maybe humans don't stand with minimum fatigue. One of the earliest uses of optimality principles in biomechanics was on the question of why humans tend to adopt stereotypical poses when standing (Nubar & Contini, 1961):
https://link.springer.com/article/10.1007/BF02476493
Ross
I had an unexpectedly hard time getting my Moco model (modified version of Rajagopal model) to do static upright standing, and thought I would document my adventures here.
Motivation is I'm doing some "predictive" (minimum metabolic cost) simulations of walking, and normally for that I use a tracking simulation as the initial guess. I want to check if this guess is biasing the predictive result to be similar to the tracking result, so I will try a standing simulation as an initial guess for predictive walking.
To simulate standing, I created a tracking targets file with all the coordinates set to zero except for the pelvis height, which was set to a height that should produce a vertical GRF of about bodyweight if all the other coordinates are zero. Also created a GRF tracking targets file with the vertical GRF set to one-half bodyweight under each foot and the other GRF set to zero. Then ran a simulation with a cost function of tracking errors plus "muscle fatigue" (sum of squared muscle excitations). The kinematic tracking targets were used as the initial guess.
The first problem was I was getting huge cost function scores from the initial guess, and IPOPT was having a hard time minimizing the cost function, even on a coarse grid. This seemed odd to me since this seems like a fairly easy optimization problem. Initially I thought I must be setting the pelvis target height to a too-low value, putting the feet deep under the floor and generating huge GRF. This was not the case though. The problem ended up being that I was still dividing the muscle fatigue term by the model's displacement, so there was a conflict there: tracking the targets well has zero displacement, but zero displacement sent the muscle fatigue term to infinity.
After removing the "divide by displacement" option, the optimizer was still having a hard time finding solutions where the model stood still. Another problem was my problem statement was lacking the usual periodicity/symmetry goals that I use for locomotion, so the optimizer again had a conflict: it was free to pick unconstrained initial states that allowed for low muscle excitations, but those states had bad tracking. I fixed this by (1) adding the generalized speeds to the tracking targets, and (2) adding a periodicity constraint on all states.
Finally this got a good solution on a coarse grid (11 nodes over T = 0.5 seconds) which I then interpolated onto a fine grid (N=51 nodes) that converged quickly. You can see the result here:
https://twitter.com/rosshm16/status/1499775843849101316
I'm skeptical that this pose is a "minimum fatigue" pose (most people don't stand still on their toes) but maybe humans don't stand with minimum fatigue. One of the earliest uses of optimality principles in biomechanics was on the question of why humans tend to adopt stereotypical poses when standing (Nubar & Contini, 1961):
https://link.springer.com/article/10.1007/BF02476493
Ross