data_process.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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. import warnings
  21. warnings.filterwarnings("ignore", category=FutureWarning, module='pandas')
  22. pd.set_option('future.no_silent_downcasting', True)
  23. class DataProcess(object):
  24. """
  25. The data process class. It is a template to get evaluation raw data and process the raw data.
  26. Attributes:
  27. """
  28. def __init__(self, data_path, config):
  29. self.data_path = data_path
  30. self.casePath = data_path
  31. # config info
  32. self.config = config
  33. # self.safe_config = config.config['safe']
  34. # self.function_config = config.config['function']
  35. # self.compliance_config = config.config['compliance']
  36. self.comfort_config = config.config['comfort']
  37. self.efficient_config = config.config['efficient']
  38. # data process
  39. self.ego_df = pd.DataFrame()
  40. self.object_df = pd.DataFrame()
  41. # self.driver_ctrl_df = pd.DataFrame()
  42. # self.road_mark_df = pd.DataFrame()
  43. # self.road_pos_df = pd.DataFrame()
  44. # self.traffic_light_df = pd.DataFrame()
  45. # self.traffic_signal_df = pd.DataFrame()
  46. # self.status_df = pd.DataFrame()
  47. self.obj_data = {}
  48. self.ego_data = {}
  49. self.obj_id_list = {}
  50. self.car_info = {}
  51. self.report_info = {}
  52. self.driver_ctrl_data = {}
  53. self._process()
  54. def _process(self):
  55. # self._merge_csv()
  56. self._read_csv()
  57. self._draw_track()
  58. # self._signal_mapping()
  59. # self.car_info = self._get_car_info(self.object_df)
  60. # self._compact_data()
  61. # self._abnormal_detect()
  62. # self._status_map(self.object_df)
  63. self._object_df_process()
  64. self.report_info = self._get_report_info(self.obj_data[1])
  65. self.driver_ctrl_data = self._get_driver_ctrl_data(self.ego_df)
  66. def _read_csv(self):
  67. """
  68. Read csv files to dataframe.
  69. Args:
  70. data_path: A str of the path of csv files
  71. Returns:
  72. No returns.
  73. """
  74. # self.object_df = pd.read_csv(os.path.join(self.data_path, 'merged_ObjState.csv'))
  75. # self.object_df = pd.read_csv(os.path.join(self.data_path, 'ObjState.csv'))
  76. self.ego_df = pd.read_csv(os.path.join(self.data_path, 'EgoState_pji.csv'))
  77. self.ego_df['playerId'] = 1
  78. # self.driver_ctrl_df = pd.read_csv(os.path.join(self.data_path, 'DriverCtrl.csv'))
  79. # self.road_mark_df = pd.read_csv(os.path.join(self.data_path, 'RoadMark.csv'))
  80. # self.road_pos_df = pd.read_csv(os.path.join(self.data_path, 'RoadPos.csv'))
  81. # self.traffic_light_df = pd.read_csv(os.path.join(self.data_path, 'TrafficLight.csv'))
  82. # self.traffic_signal_df = pd.read_csv(os.path.join(self.data_path, 'TrafficSign.csv'))
  83. # self.lane_info_df = pd.read_csv(os.path.join(self.data_path, 'LaneInfo.csv')).drop_duplicates()
  84. # self.status_df = pd.read_csv(os.path.join(self.data_path, 'VehicleState.csv'))
  85. # self.vehicle_sys_df = pd.read_csv(
  86. # os.path.join(self.data_path, 'VehicleSystems.csv')).drop_duplicates() # 车灯信息
  87. def _draw_track(self):
  88. """
  89. """
  90. df = self.ego_df.copy()
  91. plt.scatter(df['posX'], df['posY'], c=df['simTime'], s=0.1)
  92. plt.axis('equal')
  93. # 添加坐标轴标签和标题
  94. plt.xlabel('posX')
  95. plt.ylabel('posY')
  96. plt.title('Trajectory')
  97. # 显示图形
  98. plt.savefig(os.path.join(self.casePath, "./track.png"))
  99. plt.close()
  100. def _signal_mapping(self):
  101. pass
  102. # singal mapping
  103. # signal_json = r'./signal.json'
  104. # signal_dict = json2dict(signal_json)
  105. # df_objectstate = signal_name_map(df_objectstate, signal_dict, 'objectState')
  106. # df_roadmark = signal_name_map(df_roadmark, signal_dict, 'roadMark')
  107. # df_roadpos = signal_name_map(df_roadpos, signal_dict, 'roadPos')
  108. # df_trafficlight = signal_name_map(df_trafficlight, signal_dict, 'trafficLight')
  109. # df_trafficsignal = signal_name_map(df_trafficsignal, signal_dict, 'trafficSignal')
  110. # df_drivectrl = signal_name_map(df_drivectrl, signal_dict, 'driverCtrl')
  111. # df_laneinfo = signal_name_map(df_laneinfo, signal_dict, 'laneInfo')
  112. # df_status = signal_name_map(df_status, signal_dict, 'statusMachine')
  113. # df_vehiclesys = signal_name_map(df_vehiclesys, signal_dict, 'vehicleSys')
  114. def _get_car_info(self, df):
  115. """
  116. Args:
  117. df:
  118. Returns:
  119. """
  120. first_row = df[df['playerId'] == 1].iloc[0].to_dict()
  121. length = first_row['dimX']
  122. width = first_row['dimY']
  123. height = first_row['dimZ']
  124. offset = first_row['offX']
  125. car_info = {
  126. "length": length,
  127. "width": width,
  128. "height": height,
  129. "offset": offset
  130. }
  131. return car_info
  132. def _compact_data(self):
  133. """
  134. Extra necessary data from dataframes.
  135. Returns:
  136. """
  137. self.object_df = self.object_df[CsvData.OBJECT_INFO].copy()
  138. def _abnormal_detect(self): # head and tail detect
  139. """
  140. Detect the head of the csv whether begin with 0 or not.
  141. Returns:
  142. A dataframe, which 'time' column begin with 0.
  143. """
  144. pass
  145. # def _mileage_cal(self, df1):
  146. # """
  147. # Calculate mileage of given df.
  148. #
  149. # Args:
  150. # df1: A dataframe of driving data.
  151. #
  152. # Returns:
  153. # mileage: A float of the mileage(meter) of the driving data.
  154. #
  155. # """
  156. # df = df1.copy()
  157. #
  158. # if 9999.00 in df['travelDist'].values or "9999.00" in df['travelDist'].values:
  159. # # if df['travelDist'].nunique() == 1:
  160. # df['time_diff'] = df['simTime'].diff() # 计算时间间隔
  161. # df['avg_speed'] = (df['v'] + df['v'].shift()) / 2 # 计算每个时间间隔的平均速度
  162. # df['distance_increment'] = df['avg_speed'] * df['time_diff'] / 3.6 # 计算每个时间间隔的距离增量
  163. #
  164. # # 计算当前里程
  165. # df['travelDist'] = df['distance_increment'].cumsum()
  166. # df['travelDist'] = df['travelDist'].fillna(0)
  167. #
  168. # mile_start = df['travelDist'].iloc[0]
  169. # mile_end = df['travelDist'].iloc[-1]
  170. # mileage = round(mile_end - mile_start, 2)
  171. # return mileage
  172. def _mileage_cal(self, df):
  173. """
  174. Calculate mileage of given df.
  175. Args:
  176. df: A dataframe of driving data.
  177. Returns:
  178. mileage: A float of the mileage(meter) of the driving data.
  179. """
  180. travelDist = df['traveledDist'].values.tolist()
  181. travelDist = [x for x in travelDist if not np.isnan(x)]
  182. # mile_start = df['travelDist'].iloc[0]
  183. mile_start = travelDist[0]
  184. mile_end = travelDist[-1]
  185. mileage = mile_end - mile_start
  186. return mileage
  187. def _duration_cal(self, df):
  188. """
  189. Calculate duration of given df.
  190. Args:
  191. df: A dataframe of driving data.
  192. Returns:
  193. duration: A float of the duration(second) of the driving data.
  194. """
  195. time_start = df['simTime'].iloc[0]
  196. time_end = df['simTime'].iloc[-1]
  197. duration = time_end - time_start
  198. return duration
  199. def _get_report_info(self, df):
  200. """
  201. Get report infomation from dataframe.
  202. Args:
  203. df: A dataframe of driving data.
  204. Returns:
  205. report_info: A dict of report infomation.
  206. """
  207. mileage = self._mileage_cal(df)
  208. duration = self._duration_cal(df)
  209. report_info = {
  210. "mileage": mileage,
  211. "duration": duration
  212. }
  213. return report_info
  214. # def _status_mapping(self, df):
  215. # df['ACC_status'] = df['ACC_status'].apply(lambda x: acc_status_mapping(x))
  216. # df['LKA_status'] = df['LKA_status'].apply(lambda x: lka_status_mapping(x))
  217. # df['LDW_status'] = df['LDW_status'].apply(lambda x: ldw_status_mapping(x))
  218. def _object_df_process(self):
  219. """
  220. Process the data of object dataframe. Save the data groupby object_ID.
  221. Returns:
  222. No returns.
  223. """
  224. data = self.ego_df.copy()
  225. data.rename(
  226. columns={"speedY": "lat_v", "speedX": "lon_v", "accelY": "lat_acc", "accelX": "lon_acc", "dimZ": "speedH"},
  227. inplace=True)
  228. # calculate common parameters
  229. # data['lat_v'] = data['speedX'] * np.sin(data['posH']) * -1 + data['speedY'] * np.cos(data['posH'])
  230. # data['lon_v'] = data['speedX'] * np.cos(data['posH']) + data['speedY'] * np.sin(data['posH'])
  231. data['v'] = data.apply(lambda row: cal_velocity(row['lat_v'], row['lon_v']), axis=1)
  232. # calculate acceleraton components
  233. # data['lat_acc'] = data['accelX'] * np.sin(data['posH']) * -1 + data['accelY'] * np.cos(data['posH'])
  234. # data['lon_acc'] = data['accelX'] * np.cos(data['posH']) + data['accelY'] * np.sin(data['posH'])
  235. data['accel'] = data.apply(lambda row: cal_velocity(row['lat_acc'], row['lon_acc']), axis=1)
  236. # data.rename(columns={"yawrate_roc": "accelH"}, inplace=True)
  237. self.object_df = data.copy()
  238. # calculate respective parameters
  239. for obj_id, obj_data in data.groupby("playerId"):
  240. self.obj_data[obj_id] = obj_data
  241. self.obj_data[obj_id]['lat_acc_diff'] = self.obj_data[obj_id]['lat_acc'].diff()
  242. self.obj_data[obj_id]['lon_acc_diff'] = self.obj_data[obj_id]['lon_acc'].diff()
  243. self.obj_data[obj_id]['speedH_diff'] = self.obj_data[obj_id]['speedH'].diff()
  244. self.obj_data[obj_id]['time_diff'] = self.obj_data[obj_id]['simTime'].diff()
  245. self.obj_data[obj_id]['lat_acc_roc'] = self.obj_data[obj_id]['lat_acc_diff'] / self.obj_data[obj_id][
  246. 'time_diff']
  247. self.obj_data[obj_id]['lon_acc_roc'] = self.obj_data[obj_id]['lon_acc_diff'] / self.obj_data[obj_id][
  248. 'time_diff']
  249. self.obj_data[obj_id]['accelH'] = self.obj_data[obj_id]['speedH_diff'] / self.obj_data[obj_id][
  250. 'time_diff']
  251. # get object id list
  252. self.obj_id_list = list(self.obj_data.keys())
  253. self.ego_data = self.obj_data[1]
  254. def _get_driver_ctrl_data(self, df):
  255. """
  256. Process and get drive ctrl information. Such as brake pedal, throttle pedal and steering wheel.
  257. Args:
  258. df: A dataframe of driver ctrl data.
  259. Returns:
  260. driver_ctrl_data: A dict of driver ctrl info.
  261. """
  262. time_list = df['simTime'].values.tolist()
  263. frame_list = df['simFrame'].values.tolist()
  264. # df['brakePedal'] = df['brakePedal'] * 100
  265. # brakePedal_list = df['brakePedal'].values.tolist()
  266. # df['throttlePedal'] = df['throttlePedal'] * 100
  267. # throttlePedal_list = df['throttlePedal'].values.tolist()
  268. # steeringWheel_list = df['steeringWheel'].values.tolist()
  269. driver_ctrl_data = {
  270. "time_list": time_list,
  271. "frame_list": frame_list,
  272. # "brakePedal_list": brakePedal_list,
  273. # "throttlePedal_list": throttlePedal_list,
  274. # "steeringWheel_list": steeringWheel_list
  275. }
  276. return driver_ctrl_data