changeset 38:718f93c14ba9

changed ports on tim's grid mapper to work with joe - now using 12346 to send to joe and receive on 12345, added stoppped person in the of patch
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Fri, 25 Feb 2011 17:34:52 +0000
parents 9840e732a586
children 7286e5d455a7
files README of/testApp.cpp of/testApp.h tim_grid_mapper/grid_mapper.py
diffstat 4 files changed, 97 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/README	Fri Feb 25 17:33:00 2011 +0000
+++ b/README	Fri Feb 25 17:34:52 2011 +0000
@@ -7,3 +7,11 @@
 
 # if you quit the interpreter without stopping, 
 # need to find and kill the process
+
+
+
+import grid_mapper
+grid_mapper.joe = etc
+grid_mapper.start()
+
+
--- a/of/testApp.cpp	Fri Feb 25 17:33:00 2011 +0000
+++ b/of/testApp.cpp	Fri Feb 25 17:34:52 2011 +0000
@@ -21,13 +21,21 @@
   // 	ofEnableAlphaBlending();
    	ofSetLineWidth(12);
 
+
 	
 	anubis.loadImage("images/anubis-wall-mask.gif");
 	
 	franklinBook.loadFont("frabk.ttf", 32);
 
 	sender.setup( HOST, PORT );
+	stopSender.setup( HOST, STOPPORT );
 	
+	maxTorsoValues[0] = 0;
+	maxTorsoValues[1] = 0;
+	maxTorsoValues[2] = 0;
+	double timeNow = ofGetElapsedTimeMillis();
+	for (int user = 0;user < NUMBER_OF_USERS;user++)
+	lastRecordedTime[user] = timeNow;
 }
 
 //--------------------------------------------------------------
@@ -36,6 +44,7 @@
 	// update the open ni context and user tracker
 	context.update();
 	user.update();
+
 	
 }
 
@@ -45,15 +54,33 @@
 	ofxTrackedUser* tracked = user.getTrackedUser(userID);
 	
 
-	
-	if (fabs(torso[userID][0] - tracked->left_upper_torso.end.x) + fabs(torso[userID][1] - tracked->left_upper_torso.end.y) > 0.1 && tracked->left_upper_torso.end.x > 0) {
-	userPresent[userID] = true;
+	double timeNow = ofGetElapsedTimeMillis();
+
+		
+		
+		
+		if ((fabs(torso[userID][0] - tracked->left_upper_torso.end.x) + fabs(torso[userID][1] - tracked->left_upper_torso.end.y) > 0.1 && tracked->left_upper_torso.end.x > 0 )){
+			//printf("tracking time %d and last recorded %d\n", timeNow, lastRecordedTime[userID]);
+		userPresent[userID] = true;
+		lastRecordedTime[userID] = timeNow ;
 		torso[userID][0] = tracked->left_upper_torso.end.x;
 		torso[userID][1] = tracked->left_upper_torso.end.y;
 		torso[userID][2] = tracked->left_upper_torso.end.z;
-	}else
-	{
+		
+		checkTorsoMaxima(userID);
+		
+		//recent track, low distance but do nothing yet
+	}
+	else if(userPresent[userID] && 	(timeNow - lastRecordedTime[userID]) > 500 ){
+		//not recent track => stopped
 		userPresent[userID] = false;
+		printf("user %i has STOPPED!\n", userID);
+		torso[userID][0] = tracked->left_upper_torso.end.x;
+		torso[userID][1] = tracked->left_upper_torso.end.y;
+		torso[userID][2] = tracked->left_upper_torso.end.z;
+		
+		sendStopMessageForUser(userID);
+
 	}
 	ofSetColor(0x00FF00);
 	outputString = "HeadX : ";
@@ -62,18 +89,35 @@
 
 }
 
+void testApp::checkTorsoMaxima(int id){
+	for (int h = 0; h < 3;h++){
+	if (torso[id][h] > maxTorsoValues[h])
+		maxTorsoValues[h] = torso[id][h];
+	}
+}
+
 void testApp::sendDataViaOSC(int userID){
 
 	ofxOscMessage m;
 	m.setAddress( "/person" );
 	m.addIntArg( userID );
-	m.addFloatArg( torso[userID][0] );
-	m.addFloatArg( torso[userID][1] );
-	m.addFloatArg( torso[userID][2] );
+	m.addFloatArg( torso[userID][0]/maxTorsoValues[0] );
+	m.addFloatArg( torso[userID][1] /maxTorsoValues[1]);
+	m.addFloatArg( torso[userID][2] /maxTorsoValues[2]);
 	sender.sendMessage( m );
 
 }
 
+void testApp::sendStopMessageForUser(int userID){
+	ofxOscMessage m;
+	m.setAddress( "/stoppedperson" );
+	m.addIntArg( userID );
+	m.addFloatArg( torso[userID][0]/maxTorsoValues[0] );
+	m.addFloatArg( torso[userID][1] /maxTorsoValues[1]);
+	m.addFloatArg( torso[userID][2] /maxTorsoValues[2]);
+	stopSender.sendMessage( m );
+}
+
 //--------------------------------------------------------------
 void testApp::draw(){
 		ofBackground(238,238,224);
@@ -96,6 +140,7 @@
 	for(int i = 0; i < user.getNumTrackedUsers(); ++i) {
 		ofxTrackedUser* tracked = user.getTrackedUser(i);
 		if(tracked != NULL) {
+
 			
 		
 		//andrews code
@@ -136,14 +181,16 @@
 			}
 			
 			//end andrew
-			
+
 			info << i << " neck pos: "
 				 << tracked->left_lower_arm.end.x << " " 
 				 << tracked->left_lower_arm.end.y << " "
 				 << tracked->neck.begin.z << endl; 
+
 			
 			if (tracked->neck.begin.x != 0)
 
+
 			ofSetColor(139,0,0,100);
 			ofNoFill();
 			float w = ofGetWidth();
@@ -155,7 +202,7 @@
 //		ofBezier(tracked->neck.begin.x,tracked->neck.begin.y,tracked->neck.end.x,tracked->neck.end.y,tracked->right_lower_leg.begin.x,tracked->right_lower_leg.begin.y,tracked->right_lower_leg.end.x,/*tracked->right_lower_leg.end.y*/ h);
 
 		//acid smiley	
-		ofFill();
+	/*	ofFill();
 		ofSetColor(255,255,100);
 		ofCircle(tracked->neck.begin.x,tracked->neck.begin.y,30);
 		ofSetColor(0);
@@ -165,9 +212,26 @@
 		ofSetColor(0);
 		ofCircle(tracked->neck.begin.x+10.0f,tracked->neck.begin.y,6);
 		ofCircle(tracked->neck.begin.x-10.0f,tracked->neck.begin.y,6);
-			
+			*/
 //		anubis.draw(tracked->neck.begin.x,tracked->neck.begin.y);	
 		
+
+
+ofBezier(tracked->neck.begin.x,tracked->neck.begin.y,tracked->neck.end.x,tracked->neck.end.y,tracked->left_lower_arm.begin.x,tracked->left_lower_arm.begin.y,tracked->left_lower_arm.end.x,/*tracked->left_lower_arm.end.y*/ w);
+ofBezier(tracked->neck.begin.x,tracked->neck.begin.y,tracked->neck.end.x,tracked->neck.end.y,tracked->right_lower_arm.begin.x,tracked->right_lower_arm.begin.y,tracked->right_lower_arm.end.x,/*tracked->right_lower_arm.end.y*/ w);
+ofBezier(tracked->neck.begin.x,tracked->neck.begin.y,tracked->neck.end.x,tracked->neck.end.y,tracked->left_lower_leg.begin.x,tracked->left_lower_leg.begin.y,tracked->left_lower_leg.end.x,/*tracked->left_lower_leg.end.y*/ h);
+ofBezier(tracked->neck.begin.x,tracked->neck.begin.y,tracked->neck.end.x,tracked->neck.end.y,tracked->right_lower_leg.begin.x,tracked->right_lower_leg.begin.y,tracked->right_lower_leg.end.x,/*tracked->right_lower_leg.end.y*/ h);
+ofFill();
+ofSetColor(255,255,100);
+	ofCircle(tracked->neck.begin.x,tracked->neck.begin.y,30);
+ofSetColor(0);
+ofCircle(tracked->neck.begin.x,tracked->neck.begin.y,35);
+ofSetColor(255,255,100);
+	ofCircle(tracked->neck.begin.x,tracked->neck.begin.y,30);
+	ofSetColor(0);
+ofCircle(tracked->neck.begin.x+10.0f,tracked->neck.begin.y,6);
+ofCircle(tracked->neck.begin.x-10.0f,tracked->neck.begin.y,6);
+
 		}
 	}
 	
--- a/of/testApp.h	Fri Feb 25 17:33:00 2011 +0000
+++ b/of/testApp.h	Fri Feb 25 17:34:52 2011 +0000
@@ -7,9 +7,10 @@
 #include "ofMain.h"
 #include "ofxOpenNI.h"
 #include "ofxOsc.h"
-
+#define NUMBER_OF_USERS 6
 #define HOST "localhost"
-#define PORT 12346
+#define PORT 12344
+#define STOPPORT 12343
 
 class testApp : public ofBaseApp{
 
@@ -33,17 +34,21 @@
 		ofxUserGenerator user;
 		ofxImageGenerator image;
 		//ofImage Davy;
+	void sendStopMessageForUser(int userID);
 	
 		ofImage anubis;
 		bool drawIt;
+	
+	float maxTorsoValues[3];
+	void checkTorsoMaxima(int id);
 
-
+	double lastRecordedTime[6];//x,y,and z of the head
 	float torso[6][3];//x,y,and z of the head
 	bool userPresent[6];
 	
 	ofTrueTypeFont franklinBook;
 	string outputString;
-	ofxOscSender sender;
+	ofxOscSender sender, stopSender;
 	
 };
 #endif
--- a/tim_grid_mapper/grid_mapper.py	Fri Feb 25 17:33:00 2011 +0000
+++ b/tim_grid_mapper/grid_mapper.py	Fri Feb 25 17:34:52 2011 +0000
@@ -18,9 +18,9 @@
                  # make noise).
 
 #### OSC OPTIONS - THESE NEED TO BE SET MANUALLY ####
-my_port = 12344 # to receive OSC messages
-joe     = ('localhost', 12345)
-ableton = ('localhost', 12346)
+my_port = 12344 # to receive OSC messages from kinect
+#joe     = ('localhost', 12346)#changed by andrew - python sending to joe 
+ableton = ('localhost', 12345)#changed by andrew - max receiving from Joe
 
 ### Constants for grid mapping:
 # The range of values that the input coordinates and output values may take:
@@ -93,7 +93,7 @@
 	message = OSCMessage(address)
 	message.extend(data)
 	client.sendto(message, ableton)
-	print('\n==OSC Output "%s" to Ableton %s:==\n    %s' % (address, ableton, data))
+#	print('\n==OSC Output "%s" to Ableton %s:==\n    %s' % (address, ableton, data))
 	
 
 
@@ -121,7 +121,7 @@
 	`data` should be in form [person_id, x, y, z]
 	'''
 	pitch, velocity, channel, cc1, cc2 = grid_map(*data)
-	
+	channel = channel + 1 
 	cc1, cc2 = int(round(cc1)), int(round(cc2))
 	if cc1 != last_value_sent[(channel, 1)]:
 		send_to_ableton([channel, 1, cc1], '/cc')