void on_frame(leap_controller_ref controller, void *user_info) { leap_frame_ref frame = leap_controller_copy_frame(controller, 0); printf("frame %llu\n", leap_frame_timestamp(frame)); for (int i = 0; i < leap_frame_hands_count(frame); i++) { leap_hand_ref hand = leap_frame_hand_at_index(frame, i); printf("\thand %i: fingers=%i\n", leap_hand_id(hand), leap_hand_fingers_count(hand)); for (int p = 0; p < leap_hand_fingers_count(hand); p++) { leap_pointable_ref pointable = leap_hand_finger_at_index(hand, p); leap_vector tip_position = leap_pointable_tip_position(pointable); printf("\t\tfinger %i: tip-pos={%0.2f, %0.2f, %0.2f}\n", leap_pointable_id(pointable), tip_position.x, tip_position.y, tip_position.z); } for (int p = 0; p < leap_hand_tools_count(hand); p++) { leap_pointable_ref pointable = leap_hand_tool_at_index(hand, p); leap_vector tip_position = leap_pointable_tip_position(pointable); printf("\t\ttool %i: tip-pos={%0.2f, %0.2f, %0.2f}\n", leap_pointable_id(pointable), tip_position.x, tip_position.y, tip_position.z); } } leap_frame_delete(frame); }
void jamieOnFrame(leap_hand_ref hand,leap_frame_ref frame, CCrazyflie* cflie){ //printf("JAMIEonframe"); leap_vector current_position; leap_vector current_direction; leap_vector current_velocity; leap_vector current_normal; // perpendicular line to direction // Gets number of fingers on screen int num_fingers = leap_hand_fingers_count(hand); int num_hands = leap_frame_hands_count(frame); // Gets current position, direction, velocity of hand from Leap leap_hand_palm_position(hand, ¤t_position); leap_hand_direction(hand, ¤t_direction); leap_hand_palm_velocity(hand, ¤t_velocity); leap_hand_palm_normal(hand, ¤t_normal); // Print out values. Easier to determine thresholds for gestures. //printf("\n"); //printf("Position: \n X: %f \n Y: %f \n Z:%f", current_position.x, current_position.y, current_position.z); //printf("\nDirection: \n X: %f \n Y: %f \n Z:%f", current_direction.x, current_direction.y, current_direction.z); //printf("\nVelocity: \n X: %f \n Y: %f \n Z:%f", current_velocity.x, current_velocity.y, current_velocity.z); //printf("\nNormal: \n X: %f \n Y: %f \n Z:%f", current_normal.x, current_normal.y, current_normal.z); //printf("\nNumber of Fingers: %d", num_fingers); //printf("\ncurrent_signal == %d\n", current_signal); //lock //pthread_mutex_lock(&lockz); // Only send new signal if last signal has been processed if (current_signal == NO_SIG){ //Pitch // Palm is stationary. // looks at Y direction of palm vector (vector from middle of palm to finger) if ((current_velocity.x < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.y < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.z < MINIMUM_VELOCITY_THRESHOLD)){ if (current_direction.y < -PITCH_THRESHOLD){ // hand pointed down. increase pitch current_pitch = PITCH_CONSTANT; //printf("\n-------Decreased pitch "); }else if (current_direction.y > PITCH_THRESHOLD){ // hand pointed up. decrease pitch current_pitch = -PITCH_CONSTANT; //printf("\n-------Increased pitch "); } else { current_pitch = 0; } } //Roll // Palm is stationary. // looks at X direction of palm normal vector (prependicular to vector from middle of palm to finger) if ((current_velocity.x < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.y < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.z < MINIMUM_VELOCITY_THRESHOLD)){ if (current_normal.x < -ROLL_THRESHOLD){ // hand pointed left. decrease roll current_roll = ROLL_CONSTANT; //printf("\n-------Decreased roll "); }else if (current_normal.x > ROLL_THRESHOLD){ // hand pointed right. increase roll current_roll = -ROLL_CONSTANT; //printf("\n-------Increased roll "); } else { current_roll = 0; } } //Thrust // Palm is stationary. // looks at Y position. 2-3ft above leap = increase thrust. a few inches above leap = decrease thrust if ((current_velocity.x < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.y < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.z < MINIMUM_VELOCITY_THRESHOLD)){ current_thrust = current_position.y; } //FLY_SIG = Two hands. 5 fingers on each (open palm). Stationary hands // number of hands == 2. and each hand has 5 fingers // hand velocity is less than minimum threshold if (num_hands == 2){ leap_hand_ref hand_0 = leap_frame_hand_at_index(frame, 0); // gets hand objects leap_hand_ref hand_1 = leap_frame_hand_at_index(frame, 1); if ((leap_hand_fingers_count(hand_0) == 5) && (leap_hand_fingers_count(hand_1) == 5)){ if ((current_velocity.x < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.y < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.z < MINIMUM_VELOCITY_THRESHOLD)){ current_signal = FLY_SIG; printf("----------Two hands, 5 fingers each gesture: FLY_SIG\n"); } } } //LAND_SIG = Two hands. 0 fingers on each (fist). fists stationary. // number of hands == 2. number of fingers == 0 // hand velocity less than minimum threshold if (num_hands == 2){ leap_hand_ref hand_0 = leap_frame_hand_at_index(frame, 0); leap_hand_ref hand_1 = leap_frame_hand_at_index(frame, 1); if ((leap_hand_fingers_count(hand_0) == 2) && (leap_hand_fingers_count(hand_1) == 2)){ if ((current_velocity.x < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.y < MINIMUM_VELOCITY_THRESHOLD) && (current_velocity.z < MINIMUM_VELOCITY_THRESHOLD)){ current_signal = LAND_SIG; printf("----------Two hands, two fingers: LAND_SIG\n"); } } } // CHANGE_HOVER_SIG = Swipe gesture. From right to left. // X velocitiy less than SWIPE_VELOCITY_THRESHOLD // Recognizes swipes in both directions: CHANGE_HOVER_SIG if ( (num_hands == 2) && (current_velocity.x < -SWIPE_VELOCITY_THRESHOLD || current_velocity.x > SWIPE_VELOCITY_THRESHOLD)){ current_signal = CHANGE_HOVER_SIG; printf("----------Swipe gesture: CHANGE_HOVER_SIG\n"); } // POINTABLE OBJECT: FLY_PATTERN // Detects pointable. // Gets x,y,z position // calls record_tool_movement int num_tools = leap_hand_tools_count(hand); // printf("\n Number of tools: %d ", num_tools); if ((FLY_PATTERN == 1) && (num_tools == 1) && (num_hands == 2)){ // pointable taken off screen, done drawing pattern printf("\n----FLYING PATTERN----\n"); FLY_PATTERN = 2; totalFrames = frame_count; frame_count = 0; current_node = DLL_HEAD; }else if((num_tools > 0) && (FLY_PATTERN != 2)){ //printf("\nPointable tool detected\n"); //reset everything while recording current_pitch = 0; current_roll = 0; current_yaw = 0; current_thrust = 0; //hover mode while recording flightModeHover = 1; cflie->m_nThrust = HOVERTHRUST; cycle(cflie); leap_pointable_ref tool1; tool1 = leap_hand_tool_at_index(hand,0); leap_vector tool_position; //printf("FRAME COUNT: %d\n",frame_count); leap_pointable_tip_position(tool1, &tool_position); record_tool_movement(tool_position); FLY_PATTERN = 1; } }//end of if current_signal == NO_SIG //leap_pointable_ref leap_hand_finger_at_index(leap_hand_ref hand, int index); //unlock //pthread_mutex_unlock(&lockz); }