Code and Supplementary Material for computing and visualizing the feasible activation space—the way that muscles combine to create forces at the end of a limb.
We don't know how the brain picks the optimal strategy to coordinate its muscles and limbs to generate motion.
If we understand the constraints of force generation, we can see how many solutions the brain can choose from. Prosthetic and robotic designs are dependent upon robust control algorithms; we have the opportunity to unveil how the brain optimizes its coordination strategy, and build the next generation of biologically-inspired robot arms, prosthetic designs, and orthopaedic treatments.
Take in data about a musculoskeletal arm or leg, and visualize how the brain optimizes the limb's force production. With many different muscles, there is an infinite number of control strategies. In this project, we look to constrain those possibilties as much as possible, until we uncover physical limitations to the solution space itself.
An N-Dimensional system of joints and muscles can get complex quickly. We look to approximate the volume of the solution subspace using custom random number generation and an analysis of the solutions we find.
This project can get computationally complex, very quickly. We have a cat-leg model that's got 31 muscles, 7 Degrees of freedom (at the joints), and 6 output dimensions (x,y,z,tx,ty,tz).
Imagine you're holding a brick in your palm that weighs 2kg, and you can't move your elbow or shoulder. You have to push up with 20N force or the brick will move. It will require a direct upward force, and you can't create any torque on the brick (you're not allowed to spin it).
The brick isn't heavy for you, and because it's not your 'maximal', there are many ways to create that force directly up. Your arm has many different muscles which can support the brick. Some muscles are absolutely necessary, while others you could inject with botox, and still maintain effective control of the brick (albeit it might be more difficult). Every muscle you have can be tensed from 0 to 100%, where 100% is as hard as you can possibly contract that muscle. Your nervous system controls the 'activations' of these muscles, thereby producing forces and controlling motion for your body. Every moment of your life, your arm muscles have a level of activation. When sleeping, you might have very low muscle tension, but when holding the brick, some of the muscles are more highly activated.
##a Think of your muscle activations as a list of percentages:
muscle | activation |
---|---|
m 0 | 30% |
m 1 | 20% |
m 2 | 100% |
... | ... |
m n | an % |
We represent this as a set of these activations, where activation is between 0 (0%) and 1 (100%). a = (a0 ,a1 ,a2 , ... , an )
###Example
if you had 3 muscles controlling the 20N force upon the brick, your activation set could be any of these combinations:
a = (0.1, 0.5, 0)
a = (0.5, 0.8, 0)
a = (0.6, 0.9, 0.1)
These are all feasible solutions, in that they can all generate the exact same output force in the same direction.
When you have n
muscles controlling the force at an endpoint, and you want to generate an exact force of 10N
directly up, what are all of the possible activation sets?
sudo apt-get update
sudo apt-get install scala
wget https://dl.bintray.com/sbt/debian/sbt-0.13.7.deb
sudo apt-get update
sudo dpkg -i sbt-0.13.7.deb
cd ~/your/path/to/space
mkdir output
sbt run 100
This will generate 100 uniformly distributed points within a 7-muscle index finger model, and put the results CSVs in the output folder.
J^{-T} \in \mathbb{R}^{m\times k} ,
R \in \mathbb{R}^{k\times n} ,
F_O \in \mathbb{R}^{n\times n} ,
\textbf{a} \in \mathbb{R}^n\\
m=\text{Output Dimensions}\\
k=\text{DOF}\\
n=\text{Muscles}\\