Hi all,
Here is a crude prototype of a flexor-extensor muscle system that can control muscle tone and joint angle independently. It’s based on various Bill’s simulations and models of muscles and arms.
It is not a very realistic model of physical muscle systems, but the control system should be similar.
A muscle is modeled as a two-part system - one part is capable of contracting - that is a geared DC motor contracting a thread. The other part is elongating and storing elastic energy - a piece of rubber band. The rubber part is connected to a slider potentiometer and it is measuring elongation of the rubber. Elongation is proportional to tension of the rubber, so the equivalent measure in real muscles would be sensed by Golgi tendon receptors.
Joint angle is measured by a rotary potentiometer. In real muscle systems, the equivalent measure is probably sensed by muscle spindle receptors, as elongation of muscles.
In Bill’s models there is also a rate of change of muscle length component. This model moves very slowly, so it doesn’t need it, but it should be pretty straightforward to implement it, to be sensed as a derivative on joint anglular position.
In the attached video, you can see first - how the angle changes following angle reference change. Second - how muscle tone is increased, while angle is maintained. Then you can see the difference between disturbance rejection when muscle tone is high and when muscle tone is low - higher muscle tone also means higher angle gain.
This is third or fourth version of the system, first one that works, though. I tried using resistive/conductive rubber as tendon sensor, but that didn’t work very well, probably because of hysteresis of the material. I also tried using servo motors as contractive elements, but they don’t have positional feedback, so I didn’t find them very useful.
If someone would like to build one themselves, I’d be happy to help. I suggest using bigger and faster DC motors, as well as a faster Arduino board. The code is pretty simple and straightforward, here is the relevant part pasted, complete code for Arduino attached.
MuscleModelTest.ino (2.73 KB)
MuscleModel.wmv (3.87 MB)
···
cs[0].p = analogRead(senspin[0]); // left slider pot = tension of left tendon
cs[1].p = analogRead(senspin[1]); // right slider
angle.p = analogRead(sensPinAngle); // joint angle from rotary pot
tonus.p = cs[0].p + cs[1].p; // muscle tone is a sum of left and right tension
tonus.r = 2 * analogRead(refpin[0]); // reference tonus from external board
angle.r = analogRead(refpin[1]); // reference angle
angle.e = angle.r - angle.p;
tonus.e = tonus.r - tonus.p;
angle.qo = 30*angle.e;
tonus.qo = 1.5*tonus.e;
cs[0].r = tonus.qo + angle.qo;
cs[1].r = tonus.qo - angle.qo;
for (int i =0;i<2;i++) {
int e = cs[i].r - cs[i].p;
cs[i].qo = e * cs[i].Ko;
}
Best,
Adam