Added interpolated bottom of the target angle.
Change-Id: I88483985afcffcfc887e8c531bc08ce16a553b9e
diff --git a/y2016/vision/target_receiver.cc b/y2016/vision/target_receiver.cc
index 04fbac2..3ccb1dd 100644
--- a/y2016/vision/target_receiver.cc
+++ b/y2016/vision/target_receiver.cc
@@ -40,7 +40,8 @@
void SelectTargets(const VisionData &left_target,
const VisionData &right_target,
::aos::vision::Vector<2> *center_left,
- ::aos::vision::Vector<2> *center_right) {
+ ::aos::vision::Vector<2> *center_right, double *angle_left,
+ double *angle_right) {
// No good targets. Let the caller decide defaults.
if (right_target.target_size() == 0 || left_target.target_size() == 0) {
return;
@@ -75,6 +76,7 @@
const double angle = h / wid1;
if (min_angle == -1.0 || ::std::abs(angle) < ::std::abs(min_angle)) {
min_angle = angle;
+ *angle_left = angle;
left_index = i;
}
}
@@ -99,6 +101,7 @@
if (min_ang_err == -1.0 || min_ang_err > ang_err) {
min_ang_err = ang_err;
right_index = j;
+ *angle_right = ang;
}
}
@@ -159,16 +162,20 @@
TargetWithTimes last_;
};
-::aos::vision::Vector<2> CalculateFiltered(
- const CameraHandler &older, const CameraHandler &newer,
- const ::aos::vision::Vector<2> &newer_center,
- const ::aos::vision::Vector<2> &last_newer_center) {
+void CalculateFiltered(const CameraHandler &older, const CameraHandler &newer,
+ const ::aos::vision::Vector<2> &newer_center,
+ const ::aos::vision::Vector<2> &last_newer_center,
+ double angle, double last_angle,
+ ::aos::vision::Vector<2> *interpolated_result,
+ double *interpolated_angle) {
const double age_ratio =
(older.capture_time() - newer.last_capture_time()).ToSeconds() /
(newer.capture_time() - newer.last_capture_time()).ToSeconds();
- return ::aos::vision::Vector<2>(
+ interpolated_result->Set(
newer_center.x() * age_ratio + (1 - age_ratio) * last_newer_center.x(),
newer_center.y() * age_ratio + (1 - age_ratio) * last_newer_center.y());
+
+ *interpolated_angle = angle * age_ratio + (1 - age_ratio) * last_angle;
}
// Handles calculating drivetrain offsets.
@@ -324,28 +331,39 @@
if (left_image_valid && right_image_valid) {
::aos::vision::Vector<2> center_left(0.0, 0.0);
::aos::vision::Vector<2> center_right(0.0, 0.0);
+ double angle_left;
+ double angle_right;
SelectTargets(left.target(), right.target(), ¢er_left,
- ¢er_right);
+ ¢er_right, &angle_left, &angle_right);
// TODO(Ben): Remember this from last time instead of recalculating it
// each time.
::aos::vision::Vector<2> last_center_left(0.0, 0.0);
::aos::vision::Vector<2> last_center_right(0.0, 0.0);
+ double last_angle_left;
+ double last_angle_right;
SelectTargets(left.last_target(), right.last_target(),
- &last_center_left, &last_center_right);
+ &last_center_left, &last_center_right,
+ &last_angle_left, &last_angle_right);
::aos::vision::Vector<2> filtered_center_left(0.0, 0.0);
::aos::vision::Vector<2> filtered_center_right(0.0, 0.0);
+ double filtered_angle_left;
+ double filtered_angle_right;
if (left.capture_time() < right.capture_time()) {
filtered_center_left = center_left;
+ filtered_angle_left = angle_left;
new_vision_status->target_time = left.capture_time().ToNSec();
- filtered_center_right =
- CalculateFiltered(left, right, center_right, last_center_right);
+ CalculateFiltered(left, right, center_right, last_center_right,
+ angle_right, last_angle_right,
+ &filtered_center_right, &filtered_angle_right);
} else {
filtered_center_right = center_right;
+ filtered_angle_right = angle_right;
new_vision_status->target_time = right.capture_time().ToNSec();
- filtered_center_left =
- CalculateFiltered(right, left, center_left, last_center_left);
+ CalculateFiltered(right, left, center_left, last_center_left,
+ angle_left, last_angle_left, &filtered_center_left,
+ &filtered_angle_left);
}
double distance, horizontal_angle, vertical_angle;
@@ -360,6 +378,8 @@
new_vision_status->horizontal_angle = horizontal_angle;
new_vision_status->vertical_angle = vertical_angle;
new_vision_status->distance = distance;
+ new_vision_status->angle =
+ (filtered_angle_left + filtered_angle_right) / 2.0;
}
if (drivetrain_offset.CompleteVisionStatus(new_vision_status.get())) {