Просмотр исходного кода

更新common.py和comfort.py模块

XGJ_zhaoyuan 19 часов назад
Родитель
Сommit
702caa00db
3 измененных файлов с 48 добавлено и 59 удалено
  1. 19 18
      modules/lib/common.py
  2. 27 39
      modules/metric/comfort.py
  3. 2 2
      modules/metric/function.py

+ 19 - 18
modules/lib/common.py

@@ -4,7 +4,7 @@ from typing import List, Dict, Tuple
 import numpy as np
 import pandas as pd
 
-        
+
 def dict2json(data_dict: Dict, file_path: str) -> None:
     """
     将字典转换为JSON格式并保存到文件中。
@@ -41,24 +41,24 @@ def get_interpolation(x: float, point1: Tuple[float, float], point2: Tuple[float
         return f"Error: {str(e)}"
 
 
-def get_frame_with_time(df1: pd.DataFrame, df2: pd.DataFrame) -> pd.DataFrame:
+def get_frame_with_time_fast(time_to_frame, target_time):
     """
-    将两个DataFrame按照时间列进行合并,并返回结果。
-
-    参数:
-        df1: 包含start_time和end_time的DataFrame。
-        df2: 包含simTime和simFrame的DataFrame。
-
-    返回:
-        合并后的DataFrame。
+    使用字典快速查找最接近的帧号(假设时间戳是精确匹配的)
     """
-    df1_start = df1.merge(df2[["simTime", "simFrame"]], left_on="start_time", right_on="simTime")
-    df1_start = df1_start[["start_time", "simFrame"]].rename(columns={"simFrame": "start_frame"})
+    # 如果目标时间存在精确匹配
+    if target_time in time_to_frame:
+        return time_to_frame[target_time]
+
+    # 否则找最接近的时间(如果无法保证精确匹配)
+    closest_time = min(time_to_frame.keys(), key=lambda t: abs(t - target_time))
+    return time_to_frame[closest_time]
 
-    df1_end = df1.merge(df2[["simTime", "simFrame"]], left_on="end_time", right_on="simTime")
-    df1_end = df1_end[["end_time", "simFrame"]].rename(columns={"simFrame": "end_frame"})
 
-    return pd.concat([df1_start, df1_end], axis=1)
+# 辅助函数
+def get_frame_with_time(time_list, frame_list, target_time):
+    time_array = np.array(time_list)
+    idx = np.argmin(np.abs(time_array - target_time))
+    return frame_list[idx]
 
 
 class PolynomialCurvatureFitting:
@@ -117,7 +117,8 @@ class PolynomialCurvatureFitting:
         distances = np.sqrt((x1 - window_means[:, 0]) ** 2 + (y1 - window_means[:, 1]) ** 2)
         return np.argmin(distances)
 
-    def find_projection(self, x_point: float, y_point: float, polynomial: np.poly1d, x_data_range: Tuple[float, float], search_step: float = 0.0001) -> Tuple[float, float, float]:
+    def find_projection(self, x_point: float, y_point: float, polynomial: np.poly1d, x_data_range: Tuple[float, float],
+                        search_step: float = 0.0001) -> Tuple[float, float, float]:
         """
         找到目标点在多项式曲线上的投影点。
 
@@ -154,7 +155,8 @@ class PolynomialCurvatureFitting:
             x_window = self.x_data[best_start:best_start + window_size]
             y_window = self.y_data[best_start:best_start + window_size]
             coefficients, polynomial = self.polynomial_fit(x_window, y_window)
-            proj_x, proj_y, min_distance = self.find_projection(point[0], point[1], polynomial, (min(x_window), max(x_window)))
+            proj_x, proj_y, min_distance = self.find_projection(point[0], point[1], polynomial,
+                                                                (min(x_window), max(x_window)))
             curvature_value = self.curvature(coefficients, proj_x)
             second_derivative_coefficients = np.polyder(np.polyder(coefficients))
             curvature_change_value = np.polyval(second_derivative_coefficients, proj_x)
@@ -169,7 +171,6 @@ class PolynomialCurvatureFitting:
 
         return results
 
-    
 
 if __name__ == "__main__":
     data_path = "/home/kevin/kevin/zhaoyuan/zhaoyuan/data/raw/data/LaneMap.csv"

+ 27 - 39
modules/metric/comfort.py

@@ -1051,45 +1051,39 @@ class ComfortCalculator:
         return len(zigzag_events)
 
     def _detect_zigzag_events(self):
-        """检测蛇行事件"""
-        # 获取蛇行时间列表
         if not self.zigzag_time_list:
             return []
 
-        # 创建事件列表
+        # 提取时间和帧号列表
+
+
         events = []
-        for time_range in self.zigzag_time_list:
-            start_time, end_time = time_range
+        for start_time, end_time in self.zigzag_time_list:
             start_frame = get_frame_with_time(self.time_list, self.frame_list, start_time)
             end_frame = get_frame_with_time(self.time_list, self.frame_list, end_time)
 
-            events.append({
-                'start_time': start_time,
-                'end_time': end_time,
-                'start_frame': start_frame,
-                'end_frame': end_frame,
-                'type': 'zigzag'
-            })
-
-            # 添加到不舒适事件表
-            new_row = pd.DataFrame([{
+            event_data = {
                 'start_time': start_time,
                 'end_time': end_time,
                 'start_frame': start_frame,
                 'end_frame': end_frame,
                 'type': 'zigzag'
-            }])
-            self.discomfort_df = pd.concat([self.discomfort_df, new_row], ignore_index=True)
+            }
+            events.append(event_data)
+            self.discomfort_df = pd.concat([
+                self.discomfort_df,
+                pd.DataFrame([event_data])
+            ], ignore_index=True)
 
         return events
 
     def calculate_shake_count(self):
         """计算晃动指标并检测事件"""
         # 原有的计算逻辑
-        self._shake_detector()
+        shake_events = self._shake_detector()
 
         # 检测晃动事件
-        shake_events = self._detect_shake_events()
+        # shake_events = self._detect_shake_events()
         self.generate_metric_chart('shake')
 
         # 返回事件次数
@@ -1706,7 +1700,7 @@ class ComfortCalculator:
         使用车辆坐标系下的纵向加速度判断顿挫
 
         Args:
-            lon_acc: 纵向加速度(车辆坐标系)
+            lon_acc: 纵向加速度(车辆坐标 系)
             ip_acc: 加速阈值
             ip_dec: 减速阈值
 
@@ -1743,27 +1737,21 @@ class ComfortCalculator:
             if duration >= min_duration:
                 # 更新蛇行计数
                 self.zigzag_count += 1
-
-                # 添加到不舒适事件表
-                new_row = pd.DataFrame([{
-                    'start_time': start_time,
-                    'end_time': end_time,
-                    'start_frame': start_frame,
-                    'end_frame': end_frame,
-                    'type': 'zigzag'
-                }])
-                self.discomfort_df = pd.concat([self.discomfort_df, new_row], ignore_index=True)
-
-                # 记录事件信息到zigzag_time_list
-                self.zigzag_time_list.append({
-                    'start_time': start_time,
-                    'end_time': end_time,
-                    'start_frame': start_frame,
-                    'end_frame': end_frame,
-                    'duration': duration
-                })
+                #  # 添加到不舒适事件表
+                # new_row = pd.DataFrame([{
+                #     'start_time': start_time,
+                #     'end_time': end_time,
+                #     'start_frame': start_frame,
+                #     'end_frame': end_frame,
+                #     'type': 'zigzag'
+                # }])
+                # self.discomfort_df = pd.concat([self.discomfort_df, new_row], ignore_index=True)
+
+                # 只记录时间范围到zigzag_time_list
+            self.zigzag_time_list.append([start_time, end_time])
         else:
             self.zigzag_count += 0
+        return self.zigzag_count
 
     @peak_valley_decorator
     def _cal_zigzag_strength(self, p_curr, p_last, flag=True):

+ 2 - 2
modules/metric/function.py

@@ -1036,9 +1036,9 @@ def leastDistance_PGVIL(data):
                 ego, car_point, stop_line_points
             )
 
-            return {"minimumDistance_PGVIL": distance_to_stopline}
+            return {"leastDistance_PGVIL": distance_to_stopline}
 
-    return {"minimumDistance_PGVIL": -1}
+    return {"leastDistance_PGVIL": -1}
 
 
 def launchTimeinStopLine_PGVIL(data):