From e8aad7984430fb46b608dacfd22aad297bfa6ba6 Mon Sep 17 00:00:00 2001
From: Michael Ferguson <mfergs7@gmail.com>
Date: Fri, 7 Apr 2023 15:50:41 -0400
Subject: [PATCH] tablebot: onsite debugging

* deal with laser noise by filtering noisy points
* deal with laser noise by looking only away from robot for goal
* add version number to make it easier to know if upload worked
---
 projects/tablebot/behaviors.hpp    |  6 +++---
 projects/tablebot/main.cpp         |  1 +
 projects/tablebot/segmentation.hpp | 24 +++++++++++++++++++++---
 projects/tablebot/tablebot.hpp     |  1 +
 projects/tablebot/tablebot.py      |  7 +++++++
 5 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/projects/tablebot/behaviors.hpp b/projects/tablebot/behaviors.hpp
index 2d70c6d..3283285 100644
--- a/projects/tablebot/behaviors.hpp
+++ b/projects/tablebot/behaviors.hpp
@@ -302,7 +302,7 @@ bool verify_neck(uint32_t * last_stable_stamp, uint32_t stop_time = 250)
 int is_table_present()
 {
   // Inspect only points right in front of us
-  int points_ct = project_points(line_points, MAX_POINTS, true, 0.1f, -0.1f, 0.2f);
+  int points_ct = project_points(line_points, MAX_POINTS, true, 0.0f, 3.0f, 0.1f, -0.1f, 0.2f);
   if (points_ct < 5)
   {
     // Not enough - call table missing
@@ -522,7 +522,7 @@ void run_behavior(uint16_t id, uint32_t stamp)
         }
 
         // Find all points on top of the table, less than 0.5m to either side of the robot
-        int points_ct = project_points(line_points, MAX_POINTS, true, 0.5f, 0.0f, 0.2f);
+        int points_ct = project_points(line_points, MAX_POINTS, true, 0.0f, 3.0f, 0.5f, 0.0f, 0.2f);
 
         // Send those points for debugging
         udp_send_packet((unsigned char *) &line_points, points_ct * 12, return_port, PACKET_PROJECTED_POINTS);
@@ -710,7 +710,7 @@ void run_behavior(uint16_t id, uint32_t stamp)
         }
 
         // Find all points on top of the table, less than 0.5m to either side of the robot
-        int points_ct = project_points(line_points, MAX_POINTS, true, 0.5f, 0.0f, 0.2f);
+        int points_ct = project_points(line_points, MAX_POINTS, true, 0.15f, 3.0f, 0.5f, 0.0f, 0.2f);
 
         // Send those points for debugging
         udp_send_packet((unsigned char *) &line_points, points_ct * 12, return_port, PACKET_PROJECTED_POINTS);
diff --git a/projects/tablebot/main.cpp b/projects/tablebot/main.cpp
index 3f7d8da..2ff5908 100644
--- a/projects/tablebot/main.cpp
+++ b/projects/tablebot/main.cpp
@@ -177,6 +177,7 @@ int main(void)
   system_state.pose_y = 0.0f;
   system_state.pose_th = 0.0f;
   system_state.last_motor_command = 0;
+  system_state.version = 100;
 
   // Setup drive motors
   m1_pid.set_max_step(10);
diff --git a/projects/tablebot/segmentation.hpp b/projects/tablebot/segmentation.hpp
index 3a505e0..9ceb0bf 100644
--- a/projects/tablebot/segmentation.hpp
+++ b/projects/tablebot/segmentation.hpp
@@ -50,7 +50,7 @@ typedef struct
 // Projects the points from the assembler
 // Returns the number of points projected
 int project_points(point_t * points, int max_points, bool project_neck,
-                   float limit_y, float min_z, float max_z)
+                   float min_x, float max_x, float limit_y, float min_z, float max_z)
 {
   float cos_neck = 1.0f, sin_neck = 0.0f;
   if (project_neck)
@@ -86,8 +86,9 @@ int project_points(point_t * points, int max_points, bool project_neck,
     float xx = cos_neck * x;
     float zz = -sin_neck * x + 0.127f;  // Neck is 5" off ground
 
-    if (zz < max_z && zz > min_z &&
-        y > -limit_y && y < limit_y && x > 0.0f)
+    if (xx < max_x && xx > min_x &&
+        zz < max_z && zz > min_z &&
+        y > -limit_y && y < limit_y)
     {
       points[points_idx].x = xx;
       points[points_idx].y = y;
@@ -133,6 +134,23 @@ int extract_segments(point_t * points, int num_points,
     }
     else
     {
+      // If we skip this point (as noise) does the segment continue?
+      int next = i + 1;
+      if (next < num_points)
+      {
+        dx = segments[segment_idx].end.x - points[next].x;
+        dy = segments[segment_idx].end.y - points[next].y;
+        d = dx * dx + dy * dy;
+        if (d < jump_distance_squared)
+        {
+          // Add to current segment
+          segments[segment_idx].end = points[i];
+          ++segments[segment_idx].points;
+          continue;
+        }
+      }
+
+      // Can't make the segment continue
       if (++segment_idx >= max_segments)
       {
         // Out of segments to fill
diff --git a/projects/tablebot/tablebot.hpp b/projects/tablebot/tablebot.hpp
index 5d392ea..fc60a01 100644
--- a/projects/tablebot/tablebot.hpp
+++ b/projects/tablebot/tablebot.hpp
@@ -202,6 +202,7 @@ typedef struct
   float target_dist;
   float target_yaw;
 
+  uint32_t version;
   uint32_t last_motor_command;
 } system_state_t;
 
diff --git a/projects/tablebot/tablebot.py b/projects/tablebot/tablebot.py
index 6303883..dc3fe5f 100755
--- a/projects/tablebot/tablebot.py
+++ b/projects/tablebot/tablebot.py
@@ -57,6 +57,8 @@ class TableBotGUI:
     goal_pose_y = 0
     goal_pose_z = 0
 
+    version = None
+
     # Table size in meters
     # TODO: read this from firmware
     TABLE_LENGTH = 1.2192
@@ -228,6 +230,11 @@ def handle_packets(self):
                     self.target_pose = struct.unpack_from("<f", packet, 96)[0]
                     self.target_yaw = struct.unpack_from("<f", packet, 100)[0]
 
+                    version = struct.unpack_from("<L", packet, 104)[0]
+                    if self.version != version:
+                        self.version = version
+                        print("Version: %i" % version)
+
                     if len(self.pose_x) == 0 or \
                             abs(pose_x - self.pose_x[-1]) > 0.01 or \
                             abs(pose_y - self.pose_y[-1]) > 0.01 or \