Esempio n. 1
0
void setup_score_8_plus_8_poms_in_upper_storage() {
	initialize_camera();
	initialize_servos(); // FIXME: Make this take an argument to be robot-neutral.
	
	// FIXME: Must ask for these at run-time.
	_OUR_COLOR = PINK;
	_THEIR_COLOR = GREEN;
	
	set_mc_big_amount(10, 20);
	set_mc_small_amount(2, 3);
	set_mc_slow_speed(50, 80);
	set_mc_very_slow_speed(30, 50);

	turn_mc_off();
}
int main(int argc, char **argv) {
    // Initialize ROS elements
    ros::init(argc, argv, "manual_keyboard_control");
    ros::NodeHandle n;  
    ros::Rate loop_rate(20);

    // Publishers for sending commands to motor controller
	arm_cmd_manual = new ros::Publisher();
    steer_cmd_manual = new ros::Publisher();
	drive_cmd_manual = new ros::Publisher();
    mast_cmd_manual = new ros::Publisher();

    *arm_cmd_manual = n.advertise<std_msgs::Int16MultiArray>("arm_cmd_manual", 1000);
    *steer_cmd_manual = n.advertise<std_msgs::Int16MultiArray>("steer_cmd_manual", 1000);
    *drive_cmd_manual = n.advertise<std_msgs::Int16MultiArray>("drive_cmd_manual", 1000);
    *mast_cmd_manual = n.advertise<std_msgs::Int16>("mast_cmd_manual", 1000);
    
    // Keyboard subscribers
    ros::Subscriber keydown = n.subscribe("keyboard/keydown", 10, keyDown);
    ros::Subscriber keyup = n.subscribe("keyboard/keyup", 10, keyUp);

    // Other Initialization code
    initialize_servos();      
    initialize_key_states();

    std::cout << "STARTED PWM PUBLISHER!!!" << std::endl;

    while (ros::ok())
    {
        // Arm home (p)
        if (keys[keyboard::Key::KEY_p]) {
            int target_angle = 0;
            int angle_delta = 0;

            // For each arm servo
            for (int i = 0; i < 6; i++) {
                // If the shoulder is extended and the wrist is not brought in
                // then bring in the wrist (to reduce strain on shoulder servo)
                //      Which means if the current servo is not the wrist, skip it
                //      unless the wrist is retracted!
                if (arm_servo[ARM_SHOULDER] > 55 && arm_servo[ARM_WRIST] != -40 && i != ARM_WRIST) {
                    continue;
                }

                if (i == ARM_BASE && arm_servo[ARM_BASE] != 0 && arm_servo[ARM_SHOULDER] == 30) {
                    // If current servo is the base, and the base is not at 0 degrees,
                    // and the should is currently at 30 degrees (to avoid hitting things)
                    // then set the base target angle to 0 degrees
                    target_angle = 0;
                } else if (i == ARM_SHOULDER && arm_servo[ARM_BASE] != 0) {
                    // If the current servo is the shoulder, and the base is not 0 degrees,
                    // set the shoulder target angle to 30 degrees.
                    target_angle = 30;
                } else if (i == ARM_ELBOW && (arm_servo[ARM_BASE] != 0 || arm_servo[ARM_SHOULDER] > 20)) {
                    // If the current servo is the elbow, and either the base is not at 0 or the
                    // shoulder is bigger than 20 degrees, set the target angle for the elbow 
                    // to whatever the shoulder is plus 30 degrees (to avoid collisions)
                    target_angle = arm_servo[ARM_SHOULDER] + 30;
                } else if (i == ARM_WRIST && arm_servo[ARM_SHOULDER] > 50) {
                    // If the current servo is the wrist, and the shoulder is at more than
                    // 50 degrees, set the wrist angle to -40
                    target_angle = 0;
                } else if (i == ARM_GRIPPER_ROTATE) {
                    target_angle = 0;
                } else if (i == ARM_GRIPPER_CLAW) {
                    continue;
                } else {
                    // Otherwise set the target angle to "home" (ie 0 degrees)
                    target_angle = 0;
                }

                // Save change in angle
                if (arm_servo[i] < target_angle) {
                    angle_delta = 1;
                } else if (arm_servo[i] > target_angle) {
                    angle_delta = -1;
                } else {
                    angle_delta = 0;
                }

                // Double speed base, wrist gripper rotate or gripper claw
                if (i == ARM_BASE || i == ARM_WRIST || i == ARM_GRIPPER_ROTATE || i == ARM_GRIPPER_CLAW) {
                    if (arm_servo[i] - 1 != 0 && arm_servo[i] + 1 != 0) {
                        angle_delta *= 2;
                    }
                }

                // Publish change in angle
                arm_servo[i] += angle_delta;
            }
            arm_update_needed = true;
        }

        // Arm base (m and n)
        if (keys[keyboard::Key::KEY_n]) {
            arm_servo[ARM_BASE] += 1;
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_m]) {
            arm_servo[ARM_BASE] -= 1;
            arm_update_needed = true;
        }

        // Arm shoulder (j and u)
        if (keys[keyboard::Key::KEY_j]) {
            arm_servo[ARM_SHOULDER] += 1;
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_u]) {
            arm_servo[ARM_SHOULDER] -= 1;
            arm_update_needed = true;
        }

        // Arm elbow (i and k)
        if (keys[keyboard::Key::KEY_i]) {
            arm_servo[ARM_ELBOW] += 1;
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_k]) {
            arm_servo[ARM_ELBOW] -= 1;
            arm_update_needed = true;
        }

        // Arm wrist (o and l)
        if (keys[keyboard::Key::KEY_o]) {
            arm_servo[ARM_WRIST] += 1;
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_l]) {
            arm_servo[ARM_WRIST] -= 1;
            arm_update_needed = true;
        }
        
        // Arm gripper rotate (left arrow and right arrow)
        if (keys[keyboard::Key::KEY_LEFT]) {
            if (arm_servo[ARM_GRIPPER_ROTATE] + GRIPPER_ROTATE_INCREMENT >= GRIPPER_ROTATE_MAX) {
                arm_servo[ARM_GRIPPER_ROTATE] = GRIPPER_ROTATE_MAX;
            } else {
                arm_servo[ARM_GRIPPER_ROTATE] += GRIPPER_ROTATE_INCREMENT;
            }
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_RIGHT]) {
            if (arm_servo[ARM_GRIPPER_ROTATE] - GRIPPER_ROTATE_INCREMENT <= GRIPPER_ROTATE_MIN) {
                arm_servo[ARM_GRIPPER_ROTATE] = GRIPPER_ROTATE_MIN;
            } else {
                arm_servo[ARM_GRIPPER_ROTATE] -= GRIPPER_ROTATE_INCREMENT;
            }
            arm_update_needed = true;
        }

        // Arm gripper rotate (up arrow and down arrow)
        if (keys[keyboard::Key::KEY_UP]) {
            // OPEN GRIPPER
            if (arm_servo[ARM_GRIPPER_CLAW] - GRIPPER_CLAW_INCREMENT <= GRIPPER_CLAW_MIN) {
                arm_servo[ARM_GRIPPER_CLAW] = GRIPPER_CLAW_MIN;
            } else {
                arm_servo[ARM_GRIPPER_CLAW] -= GRIPPER_CLAW_INCREMENT;
            }
            arm_update_needed = true;
        } else if (keys[keyboard::Key::KEY_DOWN]) {
            // CLOSE GRIPPER
            if (arm_servo[ARM_GRIPPER_CLAW] + GRIPPER_CLAW_INCREMENT >= GRIPPER_CLAW_MAX) {
                arm_servo[ARM_GRIPPER_CLAW] = GRIPPER_CLAW_MAX;
            } else {
                arm_servo[ARM_GRIPPER_CLAW] += GRIPPER_CLAW_INCREMENT;
            }
            arm_update_needed = true;
        }

        // Steering (a and d and f)
        // q = CCW; e = cw
        if (keys[keyboard::Key::KEY_a]) {
            steer_servo[STEER_BACK] += 3;
            steer_servo[STEER_FRONT_RIGHT] += 3;
            steer_servo[STEER_FRONT_LEFT] += 3;
            steer_update_needed = true;
        } else if (keys[keyboard::Key::KEY_d]) {
            steer_servo[STEER_BACK] -= 3;
            steer_servo[STEER_FRONT_RIGHT] -= 3;
            steer_servo[STEER_FRONT_LEFT] -= 3;
            steer_update_needed = true;
        }
	    if (keys[keyboard::Key::KEY_f]) {
            steer_servo[STEER_BACK] = 0;
            steer_servo[STEER_FRONT_RIGHT] = 0;
            steer_servo[STEER_FRONT_LEFT] = 0;
            steer_update_needed = true;
        }

        // Drive motors (w and s and x)
        if (keys[keyboard::Key::KEY_w]) {
            (drive_motors[DRIVE_REAR] < 2000) ? drive_motors[DRIVE_REAR] += 100 : drive_motors[DRIVE_REAR] = 2000;
            (drive_motors[DRIVE_SIDE_RIGHT] < 2000) ? drive_motors[DRIVE_SIDE_RIGHT] += 100 : drive_motors[DRIVE_SIDE_RIGHT] = 2000;
            (drive_motors[DRIVE_SIDE_LEFT] < 2000) ? drive_motors[DRIVE_SIDE_LEFT] += 100 : drive_motors[DRIVE_SIDE_LEFT] = 2000;
            (drive_motors[DRIVE_FRONT_RIGHT] < 2000) ? drive_motors[DRIVE_FRONT_RIGHT] += 100 : drive_motors[DRIVE_FRONT_RIGHT] = 2000;
            (drive_motors[DRIVE_FRONT_LEFT] < 2000) ? drive_motors[DRIVE_FRONT_LEFT] += 100 : drive_motors[DRIVE_FRONT_LEFT] = 2000;
            drive_update_needed = true;
        } else if (keys[keyboard::Key::KEY_s]) {
            (drive_motors[DRIVE_REAR] > -2000) ? drive_motors[DRIVE_REAR] -= 100 : drive_motors[DRIVE_REAR] = -2000;
            (drive_motors[DRIVE_SIDE_RIGHT] > -2000) ? drive_motors[DRIVE_SIDE_RIGHT] -= 100 : drive_motors[DRIVE_SIDE_RIGHT] = -2000;
            (drive_motors[DRIVE_SIDE_LEFT] > -2000) ? drive_motors[DRIVE_SIDE_LEFT] -= 100 : drive_motors[DRIVE_SIDE_LEFT] = -2000;
            (drive_motors[DRIVE_FRONT_LEFT] > -2000) ? drive_motors[DRIVE_FRONT_RIGHT] -= 100 : drive_motors[DRIVE_FRONT_RIGHT] = -2000;
            (drive_motors[DRIVE_FRONT_LEFT] > -2000) ? drive_motors[DRIVE_FRONT_LEFT] -= 100 : drive_motors[DRIVE_FRONT_LEFT] = -2000;
            drive_update_needed = true;
        }
		if (keys[keyboard::Key::KEY_x]) {
            drive_motors[DRIVE_REAR] = 0;
            drive_motors[DRIVE_SIDE_RIGHT] = 0;
            drive_motors[DRIVE_SIDE_LEFT] = 0;
            drive_motors[DRIVE_FRONT_RIGHT] = 0;
            drive_motors[DRIVE_FRONT_LEFT] = 0;
            drive_update_needed = true;
        }

        // Mast Servo (q & w)
        if (keys[keyboard::Key::KEY_q]) {
            mast_servo = 5;
            if (0 < mast_release_timeout) {
                // If the mast was not previously moving
                mast_release_timeout = 0;
                mast_update_needed = true;
            }
        } else if (keys[keyboard::Key::KEY_e]) {
            mast_servo = -5;
            if (0 < mast_release_timeout) {
                // If the mast was not previously moving
                mast_release_timeout = 0;
                mast_update_needed = true;
            }
        } else if (mast_release_timeout < 5) {
            // Only execute this code if mast was previously moving
            mast_release_timeout++;
            mast_servo = 0;
            mast_update_needed = true;
        }

        // Check if comamnd updates are needed
        if (arm_update_needed) {
            arm_update_needed = false;
            publish_arm_servo_update();
        }
        if (steer_update_needed) {
            steer_update_needed = false;
            publish_steer_servo_update();
        }
        if (drive_update_needed) {
            drive_update_needed = false;
            publish_drive_motor_update();
        }
        if (mast_update_needed) {
            mast_update_needed = false;
            publish_mast_servo_update();
        }

        // 
        ros::spinOnce();
        loop_rate.sleep();
    }

    return 0;
}