We are about to switch to a new forum software. Until then we have removed the registration on this forum.
hello i´m new here and i´m sorry for my englsich. i hope you understand my problem. i capture 3 angles with a kinect and i will send them to the sofware OpenCM which controlls the servos. my problem is that the different angles are not sending well. with one angle i can controll the right servo, but when i try it with 2 or more angles it doesn´t work, for that i have to uncomment the other two angles and of course the servos in the OpenCM code too. i hope that anyone could give me a advise how to fix the problem. the problem is in the region PROBLEM there are the 3 angles which have to be send thank you and i hope someone could help.
import SimpleOpenNI.*;//Einbinden von Libarys
SimpleOpenNI kinect;
import processing.serial.*;
Serial port; //Wichtig für die Serielle Kommunikation
PVector SchulterEllenbogenHand =new PVector();
float magnitude;
float magnitude1;
float magnitude2;
float magnitude3;
float magnitude4;
float magnitude5;
float magnitude6;
void setup()
{
kinect = new SimpleOpenNI(this);//Speicherplatz für diesen Namen
kinect.enableDepth(); //Tiefenmessung
kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL);//ganzes Skelet Tracking
kinect.setMirror(true);//Setzt das Bild in ein reales Bild
println(Serial.list());
String portName = Serial.list()[0];
size(640, 480);
stroke(255, 255, 0);//Farbe Linie
strokeWeight(5);//Breit Linie
textSize(20);//Text groeße
port = new Serial(this, portName, 9600);
}
void draw()
{
kinect.update();//einlesen der neuen Kamera Bilder
image(kinect.depthImage(), 0, 0);
IntVector userList = new IntVector();
kinect.getUsers(userList);
if (userList.size() > 0)
{
int userId = userList.get(0);
if ( kinect.isTrackingSkeleton(userId))
{
//!!!creat new vectors!!!
PVector leftShoulder = new PVector();//Vektoren left Shoulder
PVector rightShoulder = new PVector();//Vektor right Sholder
PVector leftElbow = new PVector();//Vector left Elbow
PVector leftHand = new PVector();//Vector left Hnad
PVector leftHip = new PVector();//Vector left Hip
//!!!creat the variable for the angles!!!
float Winkel_Ellenbogen;
float Winkel_Ellenbogen1;
float Winkel_Achsel_0;
float Winkel_Achsel_1;
float Winkel_Z_Achse_Schulter_0;
float Winkel_Z_Achse_Schulter_1;
//!!!get the position from the different vectors!!!
kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,leftShoulder);//Position of left Shoulder
kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_ELBOW,leftElbow);//Position of left Elbow
kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,rightShoulder);//Position of right Sholuder
kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_HIP,leftHip);//Position of left Hip
kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_LEFT_HAND,leftHand);//Position of left Hand
//!!!drawing a limb between two Vectors!!!
kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_ELBOW);//Linie zwischen gelenken Zeichnen
kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HAND);
kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_LEFT_HAND);
kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_ELBOW, SimpleOpenNI.SKEL_LEFT_HIP);
kinect.drawLimb(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER, SimpleOpenNI.SKEL_RIGHT_SHOULDER);
//!!!!!!!!Winkel Ellenbogen!!!!!!!
//!!!calculate difference by subtracting one vector from another!!!
PVector differenceVector = PVector.sub(leftShoulder, leftHand);
PVector differenceVector1 = PVector.sub(leftShoulder, leftElbow);
PVector differenceVector2 = PVector.sub(leftElbow, leftHand);
PVector differenceVector3 = PVector.sub(leftShoulder, leftHip);
PVector differenceVector4 = PVector.sub(leftElbow, leftHip);
PVector differenceVector5 = PVector.sub(rightShoulder, leftShoulder);
PVector differenceVector6 = PVector.sub(leftElbow, rightShoulder);
//!!!calculate the distance and direction of the difference vector!!!
magnitude = differenceVector.mag();
magnitude1 = differenceVector1.mag();
magnitude2 = differenceVector2.mag();
magnitude3 = differenceVector3.mag();
magnitude4 = differenceVector4.mag();
magnitude5 = differenceVector5.mag();
magnitude6 = differenceVector6.mag();
//!!!Normalize the vector to length 1 (make it a unit vector)!!!
differenceVector.normalize();
differenceVector1.normalize();
differenceVector2.normalize();
differenceVector3.normalize();
differenceVector4.normalize();
differenceVector5.normalize();
differenceVector6.normalize();
Winkel_Ellenbogen= acos(((magnitude*magnitude)-(magnitude2*magnitude2)-(magnitude1*magnitude1))/(-2*magnitude2*magnitude1));
Winkel_Ellenbogen1= degrees (Winkel_Ellenbogen);
Winkel_Achsel_0= acos(((magnitude4*magnitude4)-(magnitude3*magnitude3)-(magnitude1*magnitude1))/(-2*magnitude3*magnitude1));
Winkel_Achsel_1= degrees (Winkel_Achsel_0);
Winkel_Z_Achse_Schulter_0= acos(((magnitude6*magnitude6)-(magnitude1*magnitude1)-(magnitude5*magnitude5))/(-2*magnitude1*magnitude5));
Winkel_Z_Achse_Schulter_1= degrees (Winkel_Z_Achse_Schulter_0);
//PROBLEM
byte out[] = new byte[3]; //This is our output signal that goes serial to the Open Cm board
out[0] = byte(Winkel_Achsel_1); //Array 0 is the first axis for the shoulder
out[1] = byte(Winkel_Ellenbogen1); //Array 1 is the second axis for the shoulder
out[2] = byte(Winkel_Z_Achse_Schulter_1); //Array 2 is the complete ellenbow
port.write(out);
// display
pushMatrix();
text("Winkel_Ellenbogen: " + Winkel_Ellenbogen1, 10, 110);
text("Winkel_Achsel: " + Winkel_Achsel_1, 10, 130);
text("Winkel_Z_Schulter: " + Winkel_Z_Achse_Schulter_1, 10, 150);
popMatrix();
}
}
}
// user-tracking callbacks!
void onNewUser(int userId)
{
println("start pose detection");
kinect.startPoseDetection("Psi", userId);
}
void onEndCalibration(int userId, boolean successful)
{
if (successful)
{
println(" User calibrated !!!");
kinect.startTrackingSkeleton(userId);
}
else
{
println(" Failed to calibrate user !!!");
kinect.startPoseDetection("Psi", userId);
}
}
void onStartPose(String pose, int userId)
{
println("Started pose for user");
kinect.stopPoseDetection(userId);
kinect.requestCalibrationSkeleton(userId, true);
}
Answers
when i worked with serial i noticed that what is printed using print or println is also sent over the serial port, and that is going to cause geberish to be sent which will cause very weird problems and bugs i was using processing v2, i don't hnow if the problem is fixed now.
other things that might cause problems is sending and reviving data over the serial i suggest you only send or recive in processing
do this: processing --> serial or serial --> processing
not this: serial <-> processing