data_process.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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. # data process
  34. self.ego_df = pd.DataFrame()
  35. self.object_df = pd.DataFrame()
  36. self.trajectory_df = pd.DataFrame()
  37. # self.obj_data = {}
  38. # self.ego_data = {}
  39. self.obj_id_list = {}
  40. self.car_info = {}
  41. self.report_info = {}
  42. self.driver_ctrl_data = {}
  43. self._process()
  44. def _process(self):
  45. # self._merge_csv()
  46. self._read_csv()
  47. self._columns_process()
  48. self._draw_track()
  49. # self._signal_mapping()
  50. # self.car_info = self._get_car_info(self.object_df)
  51. # self._compact_data()
  52. # self._abnormal_detect()
  53. # self._status_map(self.object_df)
  54. self._ego_df_process()
  55. self._object_df_process()
  56. self.report_info = self._get_report_info(self.ego_df)
  57. self.driver_ctrl_data = self._get_driver_ctrl_data(self.ego_df)
  58. def _read_csv(self):
  59. """
  60. Read csv files to dataframe.
  61. """
  62. # self.object_df = pd.read_csv(os.path.join(self.data_path, 'merged_ObjState.csv'))
  63. self.ego_df = pd.read_csv(os.path.join(self.data_path, 'EgoState_pji.csv'))
  64. self.object_df = pd.read_csv(os.path.join(self.data_path, 'objects.csv'))
  65. self.trajectory_df = pd.read_csv(os.path.join(self.data_path, 'trajectory_pji.csv'))
  66. # self.driver_ctrl_df = pd.read_csv(os.path.join(self.data_path, 'DriverCtrl.csv'))
  67. # self.road_mark_df = pd.read_csv(os.path.join(self.data_path, 'RoadMark.csv'))
  68. # self.road_pos_df = pd.read_csv(os.path.join(self.data_path, 'RoadPos.csv'))
  69. # self.traffic_light_df = pd.read_csv(os.path.join(self.data_path, 'TrafficLight.csv'))
  70. # self.traffic_signal_df = pd.read_csv(os.path.join(self.data_path, 'TrafficSign.csv'))
  71. # self.lane_info_df = pd.read_csv(os.path.join(self.data_path, 'LaneInfo.csv')).drop_duplicates()
  72. # self.status_df = pd.read_csv(os.path.join(self.data_path, 'VehicleState.csv'))
  73. # self.vehicle_sys_df = pd.read_csv(
  74. # os.path.join(self.data_path, 'VehicleSystems.csv')).drop_duplicates() # 车灯信息
  75. def _columns_process(self):
  76. # ego data process
  77. self.ego_df.rename(columns={"speed_linear": "lon_v", "speed_angular": "speedH", "cmd_speed_linear": "cmd_lon_v",
  78. "cmd_speed_angular": "cmd_speedH", }, inplace=True)
  79. self.ego_df['playerId'] = 1
  80. self.ego_df['lat_v'] = 0
  81. self.ego_df['lat_acc'] = 0
  82. # self.ego_df['lon_acc'] = 0
  83. # object data process
  84. self.object_df.rename(columns={"simtime": "simTime", "FrameID": "simFrame", "id": "playerId",
  85. "poseX": "posX", "poseY": "posY", "poseZ": "posZ",
  86. "velocity_linear_x": "lon_v", "velocity_linear_y": "lat_v",
  87. "velocity_angular_x": "speedH",
  88. "acceleration_linear_x": "lon_acc", "acceleration_linear_y": "lat_acc",
  89. "acceleration_angular_x": "accelH"}, inplace=True)
  90. # Time, simtime, FrameID, id, HeadingAngle, poseX, poseY, poseZ, label, dimX, dimY, dimZ,
  91. # velocity_linear_x, velocity_linear_y, velocity_linear_z, velocity_angular_x, velocity_angular_y, velocity_angular_z,
  92. # acceleration_linear_x, acceleration_linear_y, acceleration_linear_z, acceleration_angular_x, acceleration_angular_y, acceleration_angular_z
  93. def _draw_track(self):
  94. """
  95. """
  96. df = self.ego_df.copy()
  97. plt.scatter(df['posX'], df['posY'], c=df['simTime'], s=0.1)
  98. plt.axis('equal')
  99. # 添加坐标轴标签和标题
  100. plt.xlabel('posX')
  101. plt.ylabel('posY')
  102. plt.title('Trajectory')
  103. # 显示图形
  104. plt.savefig(os.path.join(self.casePath, "./track.png"))
  105. plt.close()
  106. def _get_car_info(self, df):
  107. """
  108. Args:
  109. df:
  110. Returns:
  111. """
  112. first_row = df[df['playerId'] == 1].iloc[0].to_dict()
  113. length = first_row['dimX']
  114. width = first_row['dimY']
  115. height = first_row['dimZ']
  116. offset = first_row['offX']
  117. car_info = {
  118. "length": length,
  119. "width": width,
  120. "height": height,
  121. "offset": offset
  122. }
  123. return car_info
  124. def _mileage_cal(self, df):
  125. """
  126. Calculate mileage of given df.
  127. Args:
  128. df: A dataframe of driving data.
  129. Returns:
  130. mileage: A float of the mileage(meter) of the driving data.
  131. """
  132. travelDist = df['traveledDist'].values.tolist()
  133. travelDist = [x for x in travelDist if not np.isnan(x)]
  134. # mile_start = df['travelDist'].iloc[0]
  135. mile_start = travelDist[0]
  136. mile_end = travelDist[-1]
  137. mileage = mile_end - mile_start
  138. return mileage
  139. def _duration_cal(self, df):
  140. """
  141. Calculate duration of given df.
  142. Args:
  143. df: A dataframe of driving data.
  144. Returns:
  145. duration: A float of the duration(second) of the driving data.
  146. """
  147. time_start = df['simTime'].iloc[0]
  148. time_end = df['simTime'].iloc[-1]
  149. duration = time_end - time_start
  150. return duration
  151. def _get_report_info(self, df):
  152. """
  153. Get report infomation from dataframe.
  154. Args:
  155. df: A dataframe of driving data.
  156. Returns:
  157. report_info: A dict of report infomation.
  158. """
  159. mileage = self._mileage_cal(df)
  160. duration = self._duration_cal(df)
  161. report_info = {
  162. "mileage": mileage,
  163. "duration": duration
  164. }
  165. return report_info
  166. def _ego_df_process(self):
  167. # ego_df process
  168. self.ego_df['time_diff'] = self.ego_df['simTime'].diff()
  169. self.ego_df['lon_v_diff'] = self.ego_df['lon_v'].diff()
  170. self.ego_df['lon_acc'] = self.ego_df['lon_v_diff'] / self.ego_df['time_diff']
  171. data = self.ego_df.copy()
  172. data.rename(
  173. columns={"speedY": "lat_v", "speedX": "lon_v", "accelY": "lat_acc", "accelX": "lon_acc", "dimZ": "speedH"},
  174. inplace=True)
  175. # calculate common parameters
  176. # data['lat_v'] = data['speedX'] * np.sin(data['posH']) * -1 + data['speedY'] * np.cos(data['posH'])
  177. # data['lon_v'] = data['speedX'] * np.cos(data['posH']) + data['speedY'] * np.sin(data['posH'])
  178. data['v'] = data.apply(lambda row: cal_velocity(row['lat_v'], row['lon_v']), axis=1)
  179. data['time_diff'] = data['simTime'].diff()
  180. data['avg_speed'] = (data['v'] + data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  181. data['distance_increment'] = data['avg_speed'] * data['time_diff'] # 计算每个时间间隔的距离增量
  182. # 计算当前里程
  183. data['traveledDist'] = data['distance_increment'].cumsum() # .cumsum()返回累计和列表
  184. data['traveledDist'] = data['traveledDist'].fillna(0)
  185. # calculate acceleraton components
  186. # data['lat_acc'] = data['accelX'] * np.sin(data['posH']) * -1 + data['accelY'] * np.cos(data['posH'])
  187. # data['lon_acc'] = data['accelX'] * np.cos(data['posH']) + data['accelY'] * np.sin(data['posH'])
  188. # data['accel'] = data.apply(lambda row: cal_velocity(row['lat_acc'], row['lon_acc']), axis=1)
  189. data['accel'] = data['lon_acc']
  190. data['lat_acc_diff'] = data['lat_acc'].diff()
  191. data['lon_acc_diff'] = data['lon_acc'].diff()
  192. data['speedH_diff'] = data['speedH'].diff()
  193. data['time_diff'] = data['simTime'].diff()
  194. # self.obj_data['avg_speed'] = (self.obj_data['v'] + self.obj_data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  195. # self.obj_data['distance_increment'] = self.obj_data['avg_speed'] * self.obj_data['time_diff'] / 3.6 # 计算每个时间间隔的距离增量
  196. #
  197. # # 计算当前里程
  198. # self.obj_data['travelDist'] = self.obj_data['distance_increment'].cumsum()
  199. # self.obj_data['travelDist'] = self.obj_data['travelDist'].fillna(0)
  200. data['lat_acc_roc'] = data['lat_acc_diff'] / data['time_diff']
  201. data['lon_acc_roc'] = data['lon_acc_diff'] / data['time_diff']
  202. data['accelH'] = data['speedH_diff'] / data['time_diff']
  203. self.ego_df = data.copy()
  204. def _object_df_process(self):
  205. """
  206. Process the data of object dataframe. Save the data groupby object_ID.
  207. Returns:
  208. No returns.
  209. """
  210. self.obj_id_list = list(set(self.object_df.playerId))
  211. # self.object_df = pd.merge(self.object_df, self.ego_df, how='left')
  212. # calculate respective parameters
  213. # for obj_id, obj_data in self.object_df.groupby("playerId"):
  214. # self.obj_data[obj_id] = obj_data
  215. # self.obj_data[obj_id]['lat_acc_diff'] = self.obj_data[obj_id]['lat_acc'].diff()
  216. # self.obj_data[obj_id]['lon_acc_diff'] = self.obj_data[obj_id]['lon_acc'].diff()
  217. # self.obj_data[obj_id]['speedH_diff'] = self.obj_data[obj_id]['speedH'].diff()
  218. #
  219. # self.obj_data[obj_id]['time_diff'] = self.obj_data[obj_id]['simTime'].diff()
  220. # # self.obj_data['avg_speed'] = (self.obj_data['v'] + self.obj_data['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  221. # # self.obj_data['distance_increment'] = self.obj_data['avg_speed'] * self.obj_data['time_diff'] / 3.6 # 计算每个时间间隔的距离增量
  222. # #
  223. # # # 计算当前里程
  224. # # self.obj_data['travelDist'] = self.obj_data['distance_increment'].cumsum()
  225. # # self.obj_data['travelDist'] = self.obj_data['travelDist'].fillna(0)
  226. #
  227. # self.obj_data[obj_id]['lat_acc_roc'] = self.obj_data[obj_id]['lat_acc_diff'] / self.obj_data[obj_id][
  228. # 'time_diff']
  229. # self.obj_data[obj_id]['lon_acc_roc'] = self.obj_data[obj_id]['lon_acc_diff'] / self.obj_data[obj_id][
  230. # 'time_diff']
  231. # self.obj_data[obj_id]['accelH'] = self.obj_data[obj_id]['speedH_diff'] / self.obj_data[obj_id][
  232. # 'time_diff']
  233. # get object id list
  234. # self.obj_id_list = list(self.obj_data.keys())
  235. # self.ego_data = self.obj_data[1]
  236. def _get_driver_ctrl_data(self, df):
  237. """
  238. Process and get drive ctrl information. Such as brake pedal, throttle pedal and steering wheel.
  239. Args:
  240. df: A dataframe of driver ctrl data.
  241. Returns:
  242. driver_ctrl_data: A dict of driver ctrl info.
  243. """
  244. time_list = df['simTime'].values.tolist()
  245. frame_list = df['simFrame'].values.tolist()
  246. # df['brakePedal'] = df['brakePedal'] * 100
  247. # brakePedal_list = df['brakePedal'].values.tolist()
  248. # df['throttlePedal'] = df['throttlePedal'] * 100
  249. # throttlePedal_list = df['throttlePedal'].values.tolist()
  250. # steeringWheel_list = df['steeringWheel'].values.tolist()
  251. driver_ctrl_data = {
  252. "time_list": time_list,
  253. "frame_list": frame_list,
  254. # "brakePedal_list": brakePedal_list,
  255. # "throttlePedal_list": throttlePedal_list,
  256. # "steeringWheel_list": steeringWheel_list
  257. }
  258. return driver_ctrl_data