diff --git a/robot_controller/constants.h b/robot_controller/constants.h index 2335cfc..6a5970d 100644 --- a/robot_controller/constants.h +++ b/robot_controller/constants.h @@ -15,7 +15,7 @@ const float DEG_CM = (PI*WHEEL_DIAMETER) / 360.0; const float FORWARD_DISTANCE = 100.0; // cm const float TURN_AMOUNT = 180.0; // degrees -const float TURN_DISTANCE = (TURN_AMOUNT / 360.0) * WHEEL_TO_WHEEL * PI; +const float TURN_DISTANCE = (TURN_AMOUNT / 360.0) * WHEEL_TO_WHEEL * PI * 0.5; const float RETURN_DISTANCE = 100.0; // cm const float FF_ACCEL = 0.7; // motor acceleration feedforward @@ -24,5 +24,5 @@ const float FF_STAT = 15.4; // motor static friction const float KP = 2.0; // proportional const float KI = 0.5; // integral const float KD = 0.05; // derivative -const float KPP = 0.55; // position proportional -const float KPI = 1.50; // position integral +const float KPP = 0.15; // position proportional +const float KPI = 0.05; // position integral diff --git a/robot_controller/robot_controller.ino b/robot_controller/robot_controller.ino index 4ef0028..c40ff6c 100644 --- a/robot_controller/robot_controller.ino +++ b/robot_controller/robot_controller.ino @@ -30,6 +30,9 @@ float left_iaccum = 0.0; float right_iaccum = 0.0; float time_p = 0.0; +float left_home = 0.0; +float right_home = 0.0; + void write_rpm_ff(SmartMotor* motor, int32_t rpm, float ff) { if (rpm == 0) {rpm = 1;}; float kV = ff / (float) rpm; // calculate velocity feedforward that causes desired absolute feedforward @@ -73,8 +76,8 @@ void loop() { float turnsig = (robot_state == TURN ? 1.0 : -1.0); // direction of travel for right motor // position PI controller - float pos_err_left = (setpoint.position / DEG_CM) - left_motor.read_angle(); - float pos_err_right = (turnsig * setpoint.position / DEG_CM) - right_motor.read_angle(); + float pos_err_left = ((setpoint.position / DEG_CM) + left_home) - left_motor.read_angle(); + float pos_err_right = ((turnsig * setpoint.position / DEG_CM) + right_home) - right_motor.read_angle(); // delta should be ~4ms if (time > time_p) { @@ -130,18 +133,19 @@ void loop() { float total_pos_error = abs(pos_err_left) + abs(pos_err_right); // move on if at setpoint TODO: give up after timeout if (setpoint.complete && total_pos_error < 10.0) { + // rehome + left_home += (setpoint.position / DEG_CM); + right_home += (turnsig * setpoint.position / DEG_CM); + // zero accumulators + right_iaccum = 0.0; left_iaccum = 0.0; + switch (robot_state) { case FORWARD: robot_state = TURN; - // TODO: don't forget about remaining err (add previous setpoint to global offset?) - left_motor.home(); - right_motor.home(); phase_start = (float)millis() / 1000.0; break; case TURN: robot_state = RETURN; - left_motor.home(); - right_motor.home(); phase_start = (float)millis() / 1000.0; break;