data_process.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##################################################################
  4. #
  5. # Copyright (c) 2023 CICV, Inc. All Rights Reserved
  6. #
  7. ##################################################################
  8. """
  9. @Authors: yangzihao(yangzihao@china-icv.cn)
  10. @Data: 2023/11/27
  11. @Last Modified: 2023/11/27
  12. @Summary: Csv data process functions
  13. """
  14. import os
  15. import numpy as np
  16. import pandas as pd
  17. from common import cal_velocity
  18. from data_info import CsvData
  19. import matplotlib.pyplot as plt
  20. class DataProcess(object):
  21. """
  22. The data process class. It is a template to get evaluation raw data and process the raw data.
  23. Attributes:
  24. """
  25. def __init__(self, data_path, config):
  26. self.data_path = data_path
  27. self.casePath = data_path
  28. # config info
  29. self.config = config
  30. self.safe_config = config.config['safe']
  31. self.comfort_config = config.config['comfort']
  32. self.accurate_config = config.config['accurate']
  33. self.efficient_config = config.config['efficient']
  34. print("efficient_config is", self.efficient_config)
  35. # data process
  36. self.ego_df = pd.DataFrame()
  37. self.object_df = pd.DataFrame()
  38. self.trajectory_df = pd.DataFrame()
  39. # self.obj_data = {}
  40. # self.ego_data = {}
  41. self.obj_id_list = {}
  42. self.car_info = {}
  43. self.report_info = {}
  44. self.driver_ctrl_data = {}
  45. self._process()
  46. def _process(self):
  47. # self._merge_csv()
  48. self._read_csv()
  49. self._columns_process()
  50. self._draw_track()
  51. # self._signal_mapping()
  52. # self.car_info = self._get_car_info(self.object_df)
  53. # self._compact_data()
  54. # self._abnormal_detect()
  55. # self._status_map(self.object_df)
  56. self._ego_df_process()
  57. self._object_df_process()
  58. self.report_info = self._get_report_info(self.ego_df)
  59. self.driver_ctrl_data = self._get_driver_ctrl_data(self.ego_df)
  60. def _read_csv(self):
  61. """
  62. Read csv files to dataframe.
  63. """
  64. # self.ego_df = pd.read_csv(os.path.join(self.data_path, 'EgoState_pji.csv'))
  65. # self.object_df = pd.read_csv(os.path.join(self.data_path, 'objects.csv'))
  66. # self.trajectory_df = pd.read_csv(os.path.join(self.data_path, 'trajectory_pji.csv'))
  67. self.ego_df = pd.read_csv(os.path.join(self.data_path, 'ego_pji.csv'))
  68. if self.ego_df.empty:
  69. raise ValueError("ego_pji.csv 中缺少数据,程序将退出")
  70. self.object_df = pd.read_csv(os.path.join(self.data_path, 'objects_pji.csv'))
  71. # if self.object_df.empty:
  72. # print("self.object_df is", self.object_df)
  73. # raise ValueError("objects_pji.csv 中缺少数据,程序将退出")
  74. self.trajectory_df = pd.read_csv(os.path.join(self.data_path, 'trajectory_pji.csv'))
  75. if self.trajectory_df.empty:
  76. raise ValueError("trajectory_pji.csv 中缺少数据,无规划路径给出,程序将退出")
  77. def _columns_process(self):
  78. # ego data process
  79. # self.ego_df.rename(columns={"speed_linear": "lon_v", "speed_angular": "speedH", "cmd_speed_linear": "cmd_lon_v",
  80. self.ego_df.rename(columns={"posH": "yaw", "speedX": "lon_v", "speedY": "lat_v", "speed_angular": "speedH", "cmd_speedX": "cmd_lon_v",
  81. "cmd_speedH": "cmd_speedH", }, inplace=True)
  82. self.ego_df['playerId'] = 1
  83. self.ego_df['lat_v'] = 0
  84. self.ego_df['lat_acc'] = 0
  85. # self.ego_df['lon_acc'] = 0
  86. # object data process
  87. self.object_df.rename(columns={"simtime": "simTime", "FrameID": "simFrame", "id": "playerId",
  88. "poseX": "posX", "poseY": "posY", "poseZ": "posZ",
  89. # "velocity_linear_x": "lon_v", "velocity_linear_y": "lat_v",
  90. "speedX": "lon_v", "speedY": "lat_v",
  91. # "velocity_angular_x": "speedH",
  92. "speedH_X": "speedH",
  93. # "acceleration_linear_x": "lon_acc", "acceleration_linear_y": "lat_acc",
  94. "accelX": "lon_acc", "accelY": "lat_acc",
  95. # "acceleration_angular_x": "accelH"}, inplace=True)
  96. "accelH_X": "accelH"}, inplace=True)
  97. # Time, simtime, FrameID, id, HeadingAngle, poseX, poseY, poseZ, label, dimX, dimY, dimZ,
  98. # velocity_linear_x, velocity_linear_y, velocity_linear_z, velocity_angular_x, velocity_angular_y, velocity_angular_z,
  99. # acceleration_linear_x, acceleration_linear_y, acceleration_linear_z, acceleration_angular_x, acceleration_angular_y, acceleration_angular_z
  100. def _draw_track(self):
  101. """
  102. """
  103. df = self.ego_df.copy()
  104. plt.scatter(df['posX'], df['posY'], c=df['simTime'], s=0.1, cmap='autumn')
  105. plt.axis('equal')
  106. # 添加坐标轴标签和标题
  107. plt.xlabel('posX(m)')
  108. plt.ylabel('posY(m)')
  109. # plt.title('Trajectory')
  110. # 显示图形
  111. plt.savefig(os.path.join(self.casePath, "./track.png"))
  112. plt.close()
  113. def _get_car_info(self, df):
  114. """
  115. Args:
  116. df:
  117. Returns:
  118. """
  119. first_row = df[df['playerId'] == 1].iloc[0].to_dict()
  120. length = first_row['dimX']
  121. width = first_row['dimY']
  122. height = first_row['dimZ']
  123. offset = first_row['offX']
  124. car_info = {
  125. "length": length,
  126. "width": width,
  127. "height": height,
  128. "offset": offset
  129. }
  130. return car_info
  131. def _mileage_cal(self, df):
  132. """
  133. Calculate mileage of given df.
  134. Args:
  135. df: A dataframe of driving data.
  136. Returns:
  137. mileage: A float of the mileage(meter) of the driving data.
  138. """
  139. travelDist = df['traveledDist'].values.tolist()
  140. travelDist = [x for x in travelDist if not np.isnan(x)]
  141. # mile_start = df['travelDist'].iloc[0]
  142. mile_start = travelDist[0]
  143. mile_end = travelDist[-1]
  144. mileage = mile_end - mile_start
  145. return mileage
  146. def _duration_cal(self, df_vtd):
  147. """
  148. Calculate duration of given df.
  149. Args:
  150. df: A dataframe of driving data.
  151. Returns:
  152. duration: A float of the duration(second) of the driving data.
  153. """
  154. time_start = df_vtd['simTime'].iloc[0]
  155. time_end = df_vtd['simTime'].iloc[-1]
  156. duration = time_end - time_start
  157. return duration
  158. def _get_report_info(self, df):
  159. """
  160. Get report infomation from dataframe.
  161. Args:
  162. df: A dataframe of driving data.
  163. Returns:
  164. report_info: A dict of report infomation.
  165. """
  166. mileage = self._mileage_cal(df)
  167. duration = self._duration_cal(df)
  168. report_info = {
  169. "mileage": mileage,
  170. "duration": duration
  171. }
  172. return report_info
  173. def _ego_df_process(self):
  174. # ego_df process
  175. self.ego_df['time_diff'] = self.ego_df['simTime'].diff()
  176. self.ego_df['lon_v_diff'] = self.ego_df['lon_v'].diff()
  177. self.ego_df['lon_acc'] = self.ego_df['lon_v_diff'] / self.ego_df['time_diff']
  178. data = self.ego_df.copy()
  179. data.rename(
  180. columns={"speedY": "lat_v", "speedX": "lon_v", "accelY": "lat_acc", "accelX": "lon_acc", "dimZ": "speedH"},
  181. inplace=True)
  182. # calculate common parameters
  183. # data['lat_v'] = data['speedX'] * np.sin(data['posH']) * -1 + data['speedY'] * np.cos(data['posH'])
  184. # data['lon_v'] = data['speedX'] * np.cos(data['posH']) + data['speedY'] * np.sin(data['posH'])
  185. data['v'] = data.apply(lambda row: cal_velocity(row['lat_v'], row['lon_v']), axis=1)/3.6
  186. data['time_diff'] = data['simTime'].diff()
  187. data['avg_speed'] = (data['v'] + data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  188. data['distance_increment'] = data['avg_speed'] * data['time_diff'] # 计算每个时间间隔的距离增量
  189. # 计算当前里程
  190. data['traveledDist'] = data['distance_increment'].cumsum() # .cumsum()返回累计和列表
  191. data['traveledDist'] = data['traveledDist'].fillna(0)
  192. # calculate acceleraton components
  193. # data['lat_acc'] = data['accelX'] * np.sin(data['posH']) * -1 + data['accelY'] * np.cos(data['posH'])
  194. # data['lon_acc'] = data['accelX'] * np.cos(data['posH']) + data['accelY'] * np.sin(data['posH'])
  195. # data['accel'] = data.apply(lambda row: cal_velocity(row['lat_acc'], row['lon_acc']), axis=1)
  196. data['accel'] = data['lon_acc']
  197. data['lat_acc_diff'] = data['lat_acc'].diff()
  198. data['lon_acc_diff'] = data['lon_acc'].diff()
  199. data['speedH_diff'] = data['speedH'].diff()
  200. data['time_diff'] = data['simTime'].diff()
  201. # self.obj_data['avg_speed'] = (self.obj_data['v'] + self.obj_data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  202. # self.obj_data['distance_increment'] = self.obj_data['avg_speed'] * self.obj_data['time_diff'] / 3.6 # 计算每个时间间隔的距离增量
  203. #
  204. # # 计算当前里程
  205. # self.obj_data['travelDist'] = self.obj_data['distance_increment'].cumsum()
  206. # self.obj_data['travelDist'] = self.obj_data['travelDist'].fillna(0)
  207. data['lat_acc_roc'] = data['lat_acc_diff'] / data['time_diff']
  208. data['lon_acc_roc'] = data['lon_acc_diff'] / data['time_diff']
  209. data['accelH'] = data['speedH_diff'] / data['time_diff']
  210. self.ego_df = data.copy()
  211. def _object_df_process(self):
  212. """
  213. Process the data of object dataframe. Save the data groupby object_ID.
  214. Returns:
  215. No returns.
  216. """
  217. self.obj_id_list = list(set(self.object_df.playerId))
  218. # self.object_df = pd.merge(self.object_df, self.ego_df, how='left')
  219. # calculate respective parameters
  220. # for obj_id, obj_data in self.object_df.groupby("playerId"):
  221. # self.obj_data[obj_id] = obj_data
  222. # self.obj_data[obj_id]['lat_acc_diff'] = self.obj_data[obj_id]['lat_acc'].diff()
  223. # self.obj_data[obj_id]['lon_acc_diff'] = self.obj_data[obj_id]['lon_acc'].diff()
  224. # self.obj_data[obj_id]['speedH_diff'] = self.obj_data[obj_id]['speedH'].diff()
  225. #
  226. # self.obj_data[obj_id]['time_diff'] = self.obj_data[obj_id]['simTime'].diff()
  227. # # self.obj_data['avg_speed'] = (self.obj_data['v'] + self.obj_data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  228. # # self.obj_data['distance_increment'] = self.obj_data['avg_speed'] * self.obj_data['time_diff'] / 3.6 # 计算每个时间间隔的距离增量
  229. # #
  230. # # # 计算当前里程
  231. # # self.obj_data['travelDist'] = self.obj_data['distance_increment'].cumsum()
  232. # # self.obj_data['travelDist'] = self.obj_data['travelDist'].fillna(0)
  233. #
  234. # self.obj_data[obj_id]['lat_acc_roc'] = self.obj_data[obj_id]['lat_acc_diff'] / self.obj_data[obj_id][
  235. # 'time_diff']
  236. # self.obj_data[obj_id]['lon_acc_roc'] = self.obj_data[obj_id]['lon_acc_diff'] / self.obj_data[obj_id][
  237. # 'time_diff']
  238. # self.obj_data[obj_id]['accelH'] = self.obj_data[obj_id]['speedH_diff'] / self.obj_data[obj_id][
  239. # 'time_diff']
  240. # get object id list
  241. # self.obj_id_list = list(self.obj_data.keys())
  242. # self.ego_data = self.obj_data[1]
  243. def _get_driver_ctrl_data(self, df):
  244. """
  245. Process and get drive ctrl information. Such as brake pedal, throttle pedal and steering wheel.
  246. Args:
  247. df: A dataframe of driver ctrl data.
  248. Returns:
  249. driver_ctrl_data: A dict of driver ctrl info.
  250. """
  251. time_list = df['simTime'].values.tolist()
  252. frame_list = df['simFrame'].values.tolist()
  253. # df['brakePedal'] = df['brakePedal'] * 100
  254. # brakePedal_list = df['brakePedal'].values.tolist()
  255. # df['throttlePedal'] = df['throttlePedal'] * 100
  256. # throttlePedal_list = df['throttlePedal'].values.tolist()
  257. # steeringWheel_list = df['steeringWheel'].values.tolist()
  258. driver_ctrl_data = {
  259. "time_list": time_list,
  260. "frame_list": frame_list,
  261. # "brakePedal_list": brakePedal_list,
  262. # "throttlePedal_list": throttlePedal_list,
  263. # "steeringWheel_list": steeringWheel_list
  264. }
  265. return driver_ctrl_data