Friday, 16 May 2014

Identifying all the fingers seperately

In order to control each servo we have to identify fingers separately(thumb, index, pinky, ring, middle). The sdk assigns an ID to each finger however this randomise always. So I did some research regarding this and most of them were suggesting to identify each finger by taking their lengths and the angle between palm and the tip position.

However I managed to identify each finger by sorting the x coordinates. So the left most finger is the Thumb, then index and vice versa.

var webSocket = require('ws'),
ws = new webSocket('ws://127.0.0.1:6437'),
i=0,frame;
var Fingers = new Object();
Fingers.id = new Array();
Fingers.xposition = new Array();
Fingers.yposition = new Array();
Fingers.zposition = new Array();
Fingers.xdirection = new Array();
Fingers.ydirection = new Array();
Fingers.zdirection = new Array();
Fingers.length = new Array();
ws.on('message', function(data, flags) {
i++;
//console.log('a');
frame = JSON.parse(data);
if (frame.hands && frame.hands.length>0 && frame.pointables.length>4) {
var v1 = frame.hands[0].palmNormal;
var NumFingers = frame.pointables.length;
//console.log('d');
//if (NumFingers==5){
var rawFingers = new Array();
for (var i=0; i<NumFingers; i++){
// console.log('f');
rawFingers[i] = frame.pointables[i].tipPosition;
rawFingers[i].direction = frame.pointables[i].direction;
rawFingers[i].id = frame.pointables[i].id;
rawFingers[i].Length = frame.pointables[i].length;
//console.log(rawFingers[i]);
}
rawFingers.sort(function(a, b)
{if(a[0] == b[0]) return 0;
return a[0] < b[0] ? -1 : 1;
});
for(var i=0; i<5; i++){
//set base positions and ID's
Fingers.xposition[i] = rawFingers[i][0];
Fingers.yposition[i] = rawFingers[i][1];
Fingers.zposition[i] = rawFingers[i][2];
Fingers.xdirection[i] = rawFingers[i].direction[0];
Fingers.ydirection[i] = rawFingers[i].direction[1];
Fingers.zdirection[i] = rawFingers[i].direction[2];
Fingers.id[i] = rawFingers[i].id;
Fingers.length[i] = rawFingers[i].Length; }
var v2 = rawFingers[0].direction;
var v3 = rawFingers[1].direction;
var v4 = rawFingers[2].direction;
var v5 = rawFingers[3].direction;
var v6 = rawFingers[4].direction;
var dotProduct_thumb = v1[0]*v2[0] +v1[1]*v2[1] +v1[2]*v2[2];
var v1normal_thumb = Math.sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
var v2normal_thumb = Math.sqrt(v2[0]*v2[0]+v2[1]*v2[1]+v2[2]*v2[2]);
var angle_thumb = 90-((Math.acos(dotProduct_thumb/(v1normal_thumb*v2normal_thumb)))*180/Math.PI);
var dotProduct_index = v1[0]*v3[0] +v1[1]*v3[1] +v1[2]*v3[2];
var v1normal_index = Math.sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
var v2normal_index = Math.sqrt(v3[0]*v3[0]+v3[1]*v3[1]+v3[2]*v3[2]);
var angle_index = 90-((Math.acos(dotProduct_index/(v1normal_index*v2normal_index)))*180/Math.PI);
var dotProduct_middle = v1[0]*v4[0] +v1[1]*v4[1] +v1[2]*v4[2];
var v1normal_middle = Math.sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
var v2normal_middle = Math.sqrt(v4[0]*v4[0]+v4[1]*v4[1]+v4[2]*v4[2]);
var angle_middle = 90-((Math.acos(dotProduct_middle/(v1normal_middle*v2normal_middle)))*180/Math.PI);
var dotProduct_ring = v1[0]*v5[0] +v1[1]*v5[1] +v1[2]*v5[2];
var v1normal_ring = Math.sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
var v2normal_ring = Math.sqrt(v5[0]*v5[0]+v5[1]*v5[1]+v5[2]*v5[2]);
var angle_ring = 90-((Math.acos(dotProduct_ring/(v1normal_ring*v2normal_ring)))*180/Math.PI);
var dotProduct_pinky = v1[0]*v6[0] +v1[1]*v6[1] +v1[2]*v6[2];
var v1normal_pinky = Math.sqrt(v1[0]*v1[0]+v1[1]*v1[1]+v1[2]*v1[2]);
var v2normal_pinky = Math.sqrt(v6[0]*v6[0]+v6[1]*v6[1]+v6[2]*v6[2]);
var angle_pinky = 90-((Math.acos(dotProduct_pinky/(v1normal_pinky*v2normal_pinky)))*180/Math.PI);
console.log(' '+' Thumb '+' Index '+' Middle '+' Ring '+' Pinky ');
console.log(Fingers);
console.log('\n');
console.log("angle_thumb: "+angle_thumb);
console.log("angle_index: "+angle_index);
console.log("angle_middle: "+angle_middle);
console.log("angle_Ring: "+angle_ring);
console.log("angle_Pinky: "+angle_pinky);
console.log('\n');
}
});




No comments:

Post a Comment