Add catapult to collision avoidance
Signed-off-by: Henry Speiser <henry@speiser.net>
Change-Id: I504fbfc23d549f25c8e345818f7ee84f183508c6
Signed-off-by: Milind Upadhyay <milind.upadhyay@gmail.com>
diff --git a/y2022/control_loops/superstructure/collision_avoidance.cc b/y2022/control_loops/superstructure/collision_avoidance.cc
index d87054a..0c13295 100644
--- a/y2022/control_loops/superstructure/collision_avoidance.cc
+++ b/y2022/control_loops/superstructure/collision_avoidance.cc
@@ -33,6 +33,25 @@
return true;
}
+ // If we aren't firing, no need to check the catapult
+ if (!status.shooting) {
+ return false;
+ }
+
+ // Checks if intake front is collided with catapult.
+ if (TurretCollided(
+ status.intake_front_position, status.turret_position + M_PI,
+ kMinCollisionZoneFrontTurret, kMaxCollisionZoneFrontTurret)) {
+ return true;
+ }
+
+ // Checks if intake back is collided with catapult.
+ if (TurretCollided(status.intake_back_position, status.turret_position + M_PI,
+ kMinCollisionZoneBackTurret,
+ kMaxCollisionZoneBackTurret)) {
+ return true;
+ }
+
return false;
}
@@ -96,20 +115,39 @@
// Calculating the avoidance with either intake, and when the turret is
// wrapped.
- CalculateAvoidance(true, intake_front_position, turret_goal,
- kMinCollisionZoneFrontTurret, kMaxCollisionZoneFrontTurret,
- turret_position);
- CalculateAvoidance(false, intake_back_position, turret_goal,
- kMinCollisionZoneBackTurret, kMaxCollisionZoneBackTurret,
- turret_position);
+ CalculateAvoidance(true, false, intake_front_position, turret_position,
+ turret_goal, kMinCollisionZoneFrontTurret,
+ kMaxCollisionZoneFrontTurret);
+ CalculateAvoidance(false, false, intake_back_position, turret_position,
+ turret_goal, kMinCollisionZoneBackTurret,
+ kMaxCollisionZoneBackTurret);
+
+ // If we aren't firing, no need to check the catapult
+ if (!status.shooting) {
+ return;
+ }
+
+ CalculateAvoidance(true, true, intake_front_position, turret_position,
+ turret_goal, kMinCollisionZoneFrontTurret,
+ kMaxCollisionZoneFrontTurret);
+ CalculateAvoidance(false, true, intake_back_position, turret_position,
+ turret_goal, kMinCollisionZoneBackTurret,
+ kMaxCollisionZoneBackTurret);
}
-void CollisionAvoidance::CalculateAvoidance(bool intake_front,
+void CollisionAvoidance::CalculateAvoidance(bool intake_front, bool catapult,
double intake_position,
+ double turret_position,
double turret_goal,
double min_turret_collision_goal,
- double max_turret_collision_goal,
- double turret_position) {
+ double max_turret_collision_goal) {
+ // If we are checking the catapult, offset the turret angle to represent where
+ // the catapult is
+ if (catapult) {
+ turret_position += M_PI;
+ turret_goal += M_PI;
+ }
+
auto [turret_position_wrapped, turret_position_wraps] =
WrapTurretAngle(turret_position);
@@ -161,12 +199,15 @@
// If the intake is in the way, limit the turret until moved. Otherwise,
// let'errip!
if (!turret_pos_unsafe && (intake_position > kCollisionZoneIntake)) {
+ // If we were comparing the position of the catapult,
+ // remove that offset of pi to get the turret position
+ const double bounds_offset = (catapult ? -M_PI : 0);
if (turret_position < min_turret_collision_goal_unwrapped) {
- update_max_turret_goal(min_turret_collision_goal_unwrapped -
- kEpsTurret);
+ update_max_turret_goal(min_turret_collision_goal_unwrapped +
+ bounds_offset - kEpsTurret);
} else {
update_min_turret_goal(max_turret_collision_goal_unwrapped +
- kEpsTurret);
+ bounds_offset + kEpsTurret);
}
}
}