From bf47424fc531bf3ae3f997ca90543d2e4bc5bbfe Mon Sep 17 00:00:00 2001
From: rachelmoan <moanrachel516@gmail.com>
Date: Wed, 16 Oct 2024 21:17:49 -0500
Subject: [PATCH] make the curved path have exactly N points

---
 guided_mrmp/conflict_resolvers/curve_path.py | 24 ++++++++++++++------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/guided_mrmp/conflict_resolvers/curve_path.py b/guided_mrmp/conflict_resolvers/curve_path.py
index e425e71..a20aaa3 100644
--- a/guided_mrmp/conflict_resolvers/curve_path.py
+++ b/guided_mrmp/conflict_resolvers/curve_path.py
@@ -3,14 +3,14 @@ import matplotlib.pyplot as plt
 from guided_mrmp.utils import Library
 import sys
 
-from guided_mrmp.conflict_resolvers import TrajOptMultiRobot
-
+# from guided_mrmp.conflict_resolvers import TrajOptMultiRobot
+# 
 # Function to calculate the Bézier curve points
 def bezier_curve(t, control_points):
     P0, P1, P2 = control_points
     return (1 - t)**2 * P0 + 2 * (1 - t) * t * P1 + t**2 * P2
 
-def smooth_path(points, control_point_distance):
+def smooth_path(points, control_point_distance, N=40):
     # List to store the points along the smoothed curve
     smoothed_curve = []
 
@@ -27,8 +27,12 @@ def smooth_path(points, control_point_distance):
         P2 = points[i + 2]
         
         # Calculate the tangent directions at the start and end points
-        tangent_start = (P1 - P0) / np.linalg.norm(P1 - P0)
-        tangent_end = (P2 - P1) / np.linalg.norm(P2 - P1)
+        if np.linalg.norm(P1 - P0) == 0:
+            tangent_start = np.array([0, 0])
+        else: tangent_start = (P1 - P0) / np.linalg.norm(P1 - P0)
+        if np.linalg.norm(P2 - P1) == 0:
+            tangent_end = np.array([0, 0])
+        else: tangent_end = (P2 - P1) / np.linalg.norm(P2 - P1)
         
         # Calculate the control points
         control_point_start = P1 - tangent_start * control_point_distance
@@ -36,13 +40,19 @@ def smooth_path(points, control_point_distance):
         
         # Construct the Bézier curve for the current set of points
         control_points = [control_point_start, P1, control_point_end]
-        t_values = np.linspace(0, 1, 20)
-        print(t_values)
+        t_values = np.linspace(0, 1, 10)
+        # print(t_values)
         curve_points = np.array([bezier_curve(t, control_points) for t in t_values])
         
         # Append the points along the curve to the smoothed curve list
         smoothed_curve.extend(curve_points[1:])
 
+        smoothed_curve = np.array(smoothed_curve)
+        t_original = np.linspace(0, 1, len(smoothed_curve))
+        t_resampled = np.linspace(0, 1, N)
+        smoothed_curve = np.array([np.interp(t_resampled, t_original, smoothed_curve[:, i]) for i in range(smoothed_curve.shape[1])]).T
+        smoothed_curve = smoothed_curve.tolist()
+
     # Connect the last control point to the last point
     # control_point_end = points[-1] - (points[-1] - points[-2]) * control_point_distance
     # smoothed_curve.append(control_point_end)
-- 
GitLab