|
|
@ -162,6 +162,7 @@ struct State { |
|
|
|
comms->yaw_angle = ahrs_.getYaw(); |
|
|
|
comms->yaw_angle = ahrs_.getYaw(); |
|
|
|
UGV_State ugv_state = comms->ugv_state; |
|
|
|
UGV_State ugv_state = comms->ugv_state; |
|
|
|
comms->Unlock(); |
|
|
|
comms->Unlock(); |
|
|
|
|
|
|
|
UGV_State next_state = ugv_state; |
|
|
|
|
|
|
|
|
|
|
|
switch (ugv_state) { |
|
|
|
switch (ugv_state) { |
|
|
|
default: |
|
|
|
default: |
|
|
@ -180,13 +181,13 @@ struct State { |
|
|
|
outputs.left_motor = 0.0; |
|
|
|
outputs.left_motor = 0.0; |
|
|
|
outputs.right_motor = 0.0; |
|
|
|
outputs.right_motor = 0.0; |
|
|
|
if (not_old && not_invalid) { |
|
|
|
if (not_old && not_invalid) { |
|
|
|
comms->ugv_state = UGV_State::STATE_DRIVING; |
|
|
|
next_state = UGV_State::STATE_DRIVING; |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case UGV_State::STATE_DRIVING: { |
|
|
|
case UGV_State::STATE_DRIVING: { |
|
|
|
if (inputs.gps.fix_quality == io::GPS_FIX_INVALID) { |
|
|
|
if (inputs.gps.fix_quality == io::GPS_FIX_INVALID) { |
|
|
|
comms->ugv_state = UGV_State::STATE_AQUIRING; |
|
|
|
next_state = UGV_State::STATE_AQUIRING; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -195,7 +196,7 @@ struct State { |
|
|
|
|
|
|
|
|
|
|
|
if (tgt_dist <= MIN_DIST) { |
|
|
|
if (tgt_dist <= MIN_DIST) { |
|
|
|
ESP_LOGI(TAG, "Finished driving to target"); |
|
|
|
ESP_LOGI(TAG, "Finished driving to target"); |
|
|
|
comms->ugv_state = UGV_State::STATE_FINISHED; |
|
|
|
next_state = UGV_State::STATE_FINISHED; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -204,10 +205,11 @@ struct State { |
|
|
|
float angle_delta = tgt_bearing - cur_bearing; |
|
|
|
float angle_delta = tgt_bearing - cur_bearing; |
|
|
|
if (angle_delta < 180.f) angle_delta += 360.f; |
|
|
|
if (angle_delta < 180.f) angle_delta += 360.f; |
|
|
|
if (angle_delta > 180.f) angle_delta -= 360.f; |
|
|
|
if (angle_delta > 180.f) angle_delta -= 360.f; |
|
|
|
float angle_pwr = angle_delta * ANGLE_P; |
|
|
|
float angle_pwr = clamp_mag(angle_delta * ANGLE_P, MAX_ANGLE_POWER); |
|
|
|
|
|
|
|
float power = DRIVE_POWER; |
|
|
|
|
|
|
|
|
|
|
|
outputs.left_motor = DRIVE_POWER + angle_pwr; |
|
|
|
outputs.left_motor = power - angle_pwr; |
|
|
|
outputs.right_motor = DRIVE_POWER - angle_pwr; |
|
|
|
outputs.right_motor = power + angle_pwr; |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
case UGV_State::STATE_TEST: |
|
|
|
case UGV_State::STATE_TEST: |
|
|
@ -221,7 +223,7 @@ struct State { |
|
|
|
if (angle_delta < 180.f) angle_delta += 360.f; |
|
|
|
if (angle_delta < 180.f) angle_delta += 360.f; |
|
|
|
if (angle_delta > 180.f) angle_delta -= 360.f; |
|
|
|
if (angle_delta > 180.f) angle_delta -= 360.f; |
|
|
|
float angle_pwr = clamp_mag(angle_delta * ANGLE_P, MAX_ANGLE_POWER); |
|
|
|
float angle_pwr = clamp_mag(angle_delta * ANGLE_P, MAX_ANGLE_POWER); |
|
|
|
float power = 0.0; |
|
|
|
float power = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
outputs.left_motor = power - angle_pwr; |
|
|
|
outputs.left_motor = power - angle_pwr; |
|
|
|
outputs.right_motor = power + angle_pwr; |
|
|
|
outputs.right_motor = power + angle_pwr; |
|
|
@ -229,6 +231,10 @@ struct State { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
io->WriteOutputs(outputs); |
|
|
|
io->WriteOutputs(outputs); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comms->Lock(); |
|
|
|
|
|
|
|
comms->ugv_state = next_state; |
|
|
|
|
|
|
|
comms->Unlock(); |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|