From 672f48c08f6fe0d7895705782fcf90504f411a1c Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Fri, 16 Nov 2012 16:45:44 -0800 Subject: [PATCH] Head tweaks, audio toggle --- .DS_Store | Bin 6148 -> 6148 bytes SerialInterface.cpp | 18 +++--- SerialInterface.h | 4 +- hardware/head_hand/head_hand.pde | 42 ++++++++------ head.cpp | 20 ++++++- head.h | 5 ++ .../UserInterfaceState.xcuserstate | Bin 99083 -> 101447 bytes main.cpp | 54 ++++++++++++------ 8 files changed, 95 insertions(+), 48 deletions(-) diff --git a/.DS_Store b/.DS_Store index 361ab67534efb94b6dcd4539d6dc13010ead094e..8a70b493dd03a6d3d3fde862d0b4df0112a17ed6 100644 GIT binary patch delta 213 zcmZoMXfc=|#>B!ku~2NHo+2aH#(>?7i!U%UF>-C@VX9 0) { @@ -72,20 +76,18 @@ int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_chan // At end - Extract value from string to variables if (serial_buffer[0] != 'p') { - sscanf(serial_buffer, "%d %d %d %d %d %d %d %d", /* Needs to match Num Channels */ + sscanf(serial_buffer, "%d %d %d %d %d", /* Needs to match Num Channels */ &adc_channels[0], &adc_channels[1], &adc_channels[2], &adc_channels[3], - &adc_channels[4], - &adc_channels[5], - &adc_channels[6], - &adc_channels[7]); + &adc_channels[4] + ); for (int i = 0; i < NUM_CHANNELS; i++) { if (!first_measurement) - avg_adc_channels[i] = (1.f - AVG_RATE)*avg_adc_channels[i] + - AVG_RATE*(float)adc_channels[i]; + avg_adc_channels[i] = (1.f - AVG_RATE[i])*avg_adc_channels[i] + + AVG_RATE[i]*(float)adc_channels[i]; else { avg_adc_channels[i] = (float)adc_channels[i]; diff --git a/SerialInterface.h b/SerialInterface.h index e2bb82fde1..3fd7a2146e 100644 --- a/SerialInterface.h +++ b/SerialInterface.h @@ -9,7 +9,7 @@ int init_port (int baud); int read_sensors(int first_measurement, float * avg_adc_channels, int * adc_channels); -#define NUM_CHANNELS 8 -#define SERIAL_PORT_NAME "/dev/tty.usbmodem411" +#define NUM_CHANNELS 5 +#define SERIAL_PORT_NAME "/dev/tty.usbmodem641" #endif diff --git a/hardware/head_hand/head_hand.pde b/hardware/head_hand/head_hand.pde index 7e4bb60955..2dbdecdb86 100644 --- a/hardware/head_hand/head_hand.pde +++ b/hardware/head_hand/head_hand.pde @@ -4,16 +4,16 @@ Read a set of analog input lines and echo their readings over the serial port wi // ADC PIN MAPPINGS // -// 0, 1 = Head Pitch, Yaw gyro -// 2,3,4 = Head Accelerometer -// 10,11,12 = Hand Accelerometer +// 15,16 = Head Pitch, Yaw gyro +// 17,18,19 = Head Accelerometer -#define NUM_CHANNELS 8 -#define AVERAGE_COUNT 100 -#define TOGGLE_LED_SAMPLES 1000 -int inputPins[NUM_CHANNELS] = {0,1,2,3,4,10,11,12}; +#define NUM_CHANNELS 5 +#define MSECS_PER_SAMPLE 10 +int inputPins[NUM_CHANNELS] = {19,20,15,16,17}; + +unsigned int time; int measured[NUM_CHANNELS]; float accumulate[NUM_CHANNELS]; @@ -29,24 +29,30 @@ void setup() accumulate[i] = measured[i]; } pinMode(BOARD_LED_PIN, OUTPUT); + time = millis(); } void loop() { int i; - sampleCount++; + sampleCount++; for (i = 0; i < NUM_CHANNELS; i++) { - if (sampleCount % AVERAGE_COUNT == 0) { - measured[i] = accumulate[i] / AVERAGE_COUNT; - SerialUSB.print(measured[i]); - SerialUSB.print(" "); - accumulate[i] = 0; - } else { - accumulate[i] += analogRead(inputPins[i]); - } + accumulate[i] += analogRead(inputPins[i]); } - if (sampleCount % AVERAGE_COUNT == 0) SerialUSB.println(""); - if (sampleCount % TOGGLE_LED_SAMPLES == 0) toggleLED(); + if ((millis() - time) >= MSECS_PER_SAMPLE) { + time = millis(); + for (i = 0; i < NUM_CHANNELS; i++) { + measured[i] = accumulate[i] / sampleCount; + SerialUSB.print(measured[i]); + SerialUSB.print(" "); + accumulate[i] = 0; + } + //SerialUSB.print("("); + //SerialUSB.print(sampleCount); + //SerialUSB.print(")"); + SerialUSB.println(""); + sampleCount = 0; + } } diff --git a/head.cpp b/head.cpp index bf1478db02..bb0e71d010 100644 --- a/head.cpp +++ b/head.cpp @@ -43,6 +43,8 @@ Head::Head() PitchTarget = YawTarget = 0; NoiseEnvelope = 1.0; PupilConverge = 2.1; + leanForward = 0.0; + leanSideways = 0.0; setNoise(0); } @@ -51,10 +53,22 @@ void Head::reset() position = glm::vec3(0,0,0); Pitch = 0; Yaw = 0; + leanForward = leanSideways = 0; +} + +// Read the sensors +void readSensors() +{ + +} + +void Head::addLean(float x, float z) { + // Add Body lean as impulse + leanSideways += x; + leanForward += z; } // Simulate the head over time - void Head::simulate(float deltaTime) { if (!noise) @@ -71,6 +85,9 @@ void Head::simulate(float deltaTime) Roll *= (1.f - DECAY*deltaTime); } + leanForward *= (1.f - DECAY*30.f*deltaTime); + leanSideways *= (1.f - DECAY*30.f*deltaTime); + if (noise) { Pitch += (randFloat() - 0.5)*0.05*NoiseEnvelope; @@ -118,6 +135,7 @@ void Head::render() glPushMatrix(); glLoadIdentity(); glTranslatef(0.f, 0.f, -7.f); + glTranslatef(leanSideways, 0.f, leanForward); glRotatef(Yaw/2.0, 0, 1, 0); glRotatef(Pitch/2.0, 1, 0, 0); glRotatef(Roll/2.0, 0, 0, 1); diff --git a/head.h b/head.h index eef04f2eb3..be228137ec 100644 --- a/head.h +++ b/head.h @@ -34,6 +34,8 @@ class Head { float MouthYaw; float MouthWidth; float MouthHeight; + float leanForward; + float leanSideways; float PitchTarget; float YawTarget; @@ -44,6 +46,8 @@ class Head { glm::vec3 position; + void readSensors(); + public: Head(void); void reset(); @@ -52,6 +56,7 @@ public: void setYaw(float y) {Yaw = y; } void addPitch(float p) {Pitch -= p; } void addYaw(float y){Yaw -= y; } + void addLean(float x, float z); void getPitch(float); void render(); void simulate(float); diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index 7f7bb244fffdb9c9c784aa06962122e08f953684..6c983b0f1039261b38ae49102b70dda728b186b1 100644 GIT binary patch delta 40200 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 delta 37910 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 diff --git a/main.cpp b/main.cpp index 455ae556fe..21fa1edf39 100644 --- a/main.cpp +++ b/main.cpp @@ -55,6 +55,7 @@ using namespace std; // Junk for talking to the Serial Port int serial_on = 0; // Is serial connection on/off? System will try +int audio_on = 0; // Whether to turn on the audio support // Network Socket Stuff // For testing, add milliseconds of delay for received UDP packets @@ -89,7 +90,7 @@ Hand myHand(HAND_RADIUS, glm::vec3(0,1,1)); // My hand (used to manipulate things in world) glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); -ParticleSystem balls(1000, +ParticleSystem balls(0, box, false, // Wrap? 0.02, // Noise @@ -112,7 +113,7 @@ ParticleSystem balls(1000, #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 10 +#define NUM_TRIS 100000 struct { float vertices[NUM_TRIS * 3]; // float normals [NUM_TRIS * 3]; @@ -154,7 +155,8 @@ int display_hand = 0; int display_field = 0; int display_head_mouse = 1; // Display sample mouse pointer controlled by head movement -int head_mouse_x, head_mouse_y; +int head_mouse_x, head_mouse_y; +int head_lean_x, head_lean_y; int mouse_x, mouse_y; // Where is the mouse int mouse_pressed = 0; // true if mouse has been pressed (clear when finished) @@ -194,7 +196,7 @@ double elapsedTime; // 1. Add to the XCode project in the Resources/images group // (ensure "Copy file" is checked // 2. Add to the "Copy files" build phase in the project -char texture_filename[] = "int-texture256-v4.png"; +char texture_filename[] = "./int-texture256-v4.png"; unsigned int texture_width = 256; unsigned int texture_height = 256; @@ -261,8 +263,10 @@ void init(void) { int i, j; - Audio::init(); - printf( "Audio started.\n" ); + if (audio_on) { + Audio::init(); + printf( "Audio started.\n" ); + } // Clear serial channels for (i = i; i < NUM_CHANNELS; i++) @@ -273,6 +277,8 @@ void init(void) head_mouse_x = WIDTH/2; head_mouse_y = HEIGHT/2; + head_lean_x = WIDTH/2; + head_lean_y = HEIGHT/2; // Initialize Field values field_init(); @@ -346,7 +352,9 @@ void terminate () { // Close serial port //close(serial_fd); - Audio::terminate(); + if (audio_on) { + Audio::terminate(); + } exit(EXIT_SUCCESS); } @@ -421,6 +429,9 @@ void reset_sensors() fwd_vel = 0.0; head_mouse_x = WIDTH/2; head_mouse_y = HEIGHT/2; + head_lean_x = WIDTH/2; + head_lean_y = HEIGHT/2; + myHead.reset(); myHand.reset(); if (serial_on) read_sensors(1, &avg_adc_channels[0], &adc_channels[0]); @@ -431,12 +442,14 @@ void update_pos(float frametime) { float measured_pitch_rate = adc_channels[0] - avg_adc_channels[0]; float measured_yaw_rate = adc_channels[1] - avg_adc_channels[1]; - float measured_lateral_accel = adc_channels[2] - avg_adc_channels[2]; - float measured_fwd_accel = avg_adc_channels[3] - adc_channels[3]; + float measured_lateral_accel = adc_channels[3] - avg_adc_channels[3]; + float measured_fwd_accel = avg_adc_channels[2] - adc_channels[2]; // Update avatar head position based on measured gyro rates - myHead.addYaw(measured_yaw_rate * 1.20 * frametime); - myHead.addPitch(measured_pitch_rate * -1.0 * frametime); + myHead.addYaw(measured_yaw_rate * 0.25 * frametime); + myHead.addPitch(measured_pitch_rate * -0.25 * frametime); + myHead.addLean(measured_lateral_accel * frametime * 0.05, measured_fwd_accel*frametime * 0.05); + // Decay avatar head back toward zero //pitch *= (1.f - 5.0*frametime); //yaw *= (1.f - 7.0*frametime); @@ -456,6 +469,7 @@ void update_pos(float frametime) head_mouse_y = min(head_mouse_y, HEIGHT); // Update hand/manipulator location for measured forces from serial channel + /* const float MIN_HAND_ACCEL = 30.0; const float HAND_FORCE_SCALE = 0.5; glm::vec3 hand_accel(-(avg_adc_channels[6] - adc_channels[6]), @@ -466,6 +480,7 @@ void update_pos(float frametime) { myHand.addVel(frametime*hand_accel*HAND_FORCE_SCALE); } + */ // Update render direction (pitch/yaw) based on measured gyro rates const int MIN_YAW_RATE = 300; @@ -596,6 +611,7 @@ void display(void) glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE ); glEnable( GL_POINT_SPRITE_ARB ); + if (!display_head) { glBegin( GL_POINTS ); { for (i = 0; i < NUM_TRIS; i++) @@ -606,9 +622,9 @@ void display(void) } } glEnd(); - - glDisable( GL_TEXTURE_2D ); + } glDisable( GL_POINT_SPRITE_ARB ); + glDisable( GL_TEXTURE_2D ); // Show field vectors if (display_field) field_render(); @@ -618,10 +634,10 @@ void display(void) if (display_hand) myHand.render(); - balls.render(); + if (!display_head) balls.render(); // Render the world box - render_world_box(); + if (!display_head) render_world_box(); glPopMatrix(); @@ -634,10 +650,10 @@ void display(void) glDisable(GL_LIGHTING); //drawvec3(100, 100, 0.15, 0, 1.0, 0, myHead.getPos(), 0, 1, 0); - + glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); + if (mouse_pressed == 1) { - glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, pointer_attenuation_quadratic ); glPointSize( 10.0f ); glColor3f(1,1,1); //glEnable(GL_POINT_SMOOTH); @@ -648,7 +664,7 @@ void display(void) sprintf(val, "%d,%d", target_x, target_y); drawtext(target_x, target_y-20, 0.08, 0, 1.0, 0, val, 0, 1, 0); } - if (display_head_mouse) + if (display_head_mouse && !display_head) { glPointSize(10.0f); glColor4f(1.0, 1.0, 0.0, 0.8); @@ -737,7 +753,7 @@ void key(unsigned char k, int x, int y) float add[] = {0.001, 0.001, 0.001}; field_add(add, pos); } - if (k == 't') { + if ((k == 't') && (audio_on)) { Audio::writeTone(0, 400, 1.0f, 0.5f); } if (k == '1')