cut_trigger_jinlong.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import print_function
  4. import rospy
  5. import sys
  6. import math
  7. from perception_msgs.msg import PerceptionLocalization
  8. from perception_msgs.msg import PerceptionObjects
  9. from perception_msgs.msg import Object
  10. from control_msgs.msg import Jinlong_Control_Command
  11. from common_msgs.msg import Retrieval
  12. from std_msgs.msg import Bool
  13. import math
  14. import rosbag
  15. import threading
  16. import time
  17. import subprocess
  18. from datetime import datetime
  19. from subprocess import Popen, PIPE
  20. import signal
  21. import os
  22. import datetime
  23. from threading import Thread
  24. from fnmatch import fnmatch
  25. from fnmatch import fnmatch, fnmatchcase
  26. from rosbag import Bag
  27. from scipy import stats
  28. obj_lock = threading.Lock()
  29. difference_lock = threading.Lock()
  30. ego_Steering_real=[1]
  31. ego_throttle_real=[1]
  32. ego_brake_real=[1]
  33. ego_Steering_cmd=[1]
  34. ego_throttle_cmd=[1]
  35. ego_brake_cmd=[1]
  36. obj_dic={}
  37. #Strg_Angle_Real_Value=0
  38. num_count_data_read=0
  39. angular_velocity_z=0
  40. num_count_jinlong_Control_Command=0
  41. def callback_cicv_location(data):
  42. global angular_velocity_z
  43. angular_velocity_z=data.angular_velocity_z
  44. def callback_Jinlong_Control_Command(data):
  45. global ego_Steering_cmd
  46. global ego_throttle_cmd
  47. global ego_brake_cmd
  48. global num_count_jinlong_Control_Command
  49. num_count_jinlong_Control_Command+=1
  50. if num_count_jinlong_Control_Command == 10:
  51. ego_Steering_cmd.append(data.AS_Strg_Angle_Req)
  52. ego_throttle_cmd.append(data.AS_AutoD_Accel_Pos_Req)
  53. ego_brake_cmd.append(data.AS_AutoD_BrkPelPos_Req)
  54. num_count_jinlong_Control_Command=0
  55. def callback_data_read(data):
  56. #global Strg_Angle_Real_Value
  57. global ego_Steering_real
  58. global ego_throttle_real
  59. global ego_brake_real
  60. global num_count_data_read
  61. num_count_data_read+=1
  62. if num_count_data_read == 10:
  63. ego_Steering_real.append(data.Strg_Angle_Real_Value)
  64. ego_throttle_real.append(data.VCU_Accel_Pos_Value)
  65. ego_brake_real.append(data.VCU_BrkPel_Pos_Value)
  66. num_count_data_read=0
  67. #Strg_Angle_Real_Value=data.ActStrWhAng
  68. def callback_tpperception(data):
  69. global obj_dic
  70. obj_list=data.objs
  71. for obj in obj_list:
  72. if (obj.type !=1 and obj.type !=0 ) or obj.x<=5 or abs(obj.y)>=10: # (obj.type !=1 and obj.type !=0 )
  73. continue
  74. #print(f"obj.type={obj.type},obj.id={obj.id},obj.x={obj.x},obj.y={obj.y}")
  75. if obj.id not in obj_dic:
  76. obj_dic[obj.id]=[]
  77. obj_dic[obj.id].append(obj.y)
  78. #print("----------------------------------------------------")
  79. def if_cutin(obj_y_list):
  80. global Strg_Angle_Real_Value
  81. global angular_velocity_z
  82. print(obj_y_list)
  83. flag_cutin=False
  84. for i, obj_y in enumerate(obj_y_list):
  85. if abs(obj_y)>=1.3 and abs(angular_velocity_z)<=0.6:
  86. for j in range(len(obj_y_list)-i-1):
  87. if abs(obj_y_list[1+i+j])<=0.7 and abs(angular_velocity_z)<=0.6:
  88. flag_cutin=True
  89. print('front car cut in')
  90. return flag_cutin
  91. return flag_cutin
  92. def if_cutout(obj_y_list):
  93. global Strg_Angle_Real_Value
  94. global angular_velocity_z
  95. #print(angular_velocity_z)
  96. #print(obj_y_list)
  97. #print('----------------------------------------------------------------------------')
  98. flag_cutout=False
  99. for i, obj_y in enumerate(obj_y_list):
  100. if abs(obj_y)<=0.6 and abs(angular_velocity_z)<=0.6:
  101. for j in range(len(obj_y_list)-i-1):
  102. if abs(obj_y_list[1+i+j])>=1.2 and abs(angular_velocity_z)<=0.6:
  103. flag_cutout=True
  104. print('front car cut out')
  105. return flag_cutout
  106. return flag_cutout
  107. def if_difference(ego_Steering_real,ego_throttle_real,ego_brake_real,
  108. ego_Steering_cmd,ego_throttle_cmd,ego_brake_cmd): # 利用曼惠特尼U检验的方式判断车端数据和驾驶员控制数据是否存在显著差异
  109. difference_flag=False
  110. statistic_Steering, p_value_Steering = stats.mannwhitneyu(ego_Steering_real, ego_Steering_cmd)
  111. statistic_throttle, p_value_throttle = stats.mannwhitneyu(ego_throttle_real, ego_throttle_cmd)
  112. statistic_brake, p_value_brake = stats.mannwhitneyu(ego_brake_real, ego_brake_cmd)
  113. if p_value_Steering < 0.05 or p_value_throttle < 0.05 or p_value_brake < 0.05:
  114. difference_flag=True
  115. return difference_flag
  116. def callback_failure_lidar(data):
  117. if data.data: #为true,代表该传感器未匹配的目标过多
  118. event_label='failurelidar'
  119. def callback_failure_radar(data):
  120. if data.data: #为true,代表该传感器未匹配的目标过多
  121. event_label='failureradar'
  122. def callback_failure_camera(data):
  123. if data.data: #为true,代表该传感器未匹配的目标过多
  124. event_label='failurecamera'
  125. def final_callback(event):
  126. global obj_dic
  127. global ego_Steering_real
  128. global ego_throttle_real
  129. global ego_brake_real
  130. global ego_Steering_cmd
  131. global ego_throttle_cmd
  132. global ego_brake_cmd
  133. cutin_flag = False
  134. cutout_flag = False
  135. flag_difference = False
  136. #print('ego_Steering_real=')
  137. #print(ego_Steering_real)
  138. #print('--------------------------------------------------------------')
  139. with obj_lock:
  140. # 先判断前车是否切入
  141. for obj_id, obj_value in obj_dic.items():
  142. if len(obj_value) <= 5:
  143. continue
  144. cutin_flag=if_cutin(obj_value)
  145. # 再判断前车是否切出 来自 /tpperception
  146. for obj_id, obj_value in obj_dic.items():
  147. if len(obj_value) <= 5:
  148. continue
  149. cutout_flag=if_cutout(obj_value)
  150. with difference_lock:
  151. if cutin_flag:
  152. print('The cutting-in behavior of the front car was detected')
  153. flag_difference=if_difference(ego_Steering_real,ego_throttle_real,ego_brake_real,
  154. ego_Steering_cmd,ego_throttle_cmd,ego_brake_cmd)
  155. if flag_difference:
  156. event_label='cutin_difference'
  157. print('********cutin_difference********')
  158. if cutout_flag:
  159. print('The cutting-out behavior of the front car was detected')
  160. flag_difference=if_difference(ego_Steering_real,ego_throttle_real,ego_brake_real,
  161. ego_Steering_cmd,ego_throttle_cmd,ego_brake_cmd)
  162. if flag_difference:
  163. event_label='cutout_difference'
  164. print('********cutout_difference********')
  165. '''
  166. print('ego_Steering_real=')
  167. print(ego_Steering_real)
  168. print('--------------------------------------------------------------')
  169. print('ego_Steering_cmd=')
  170. print(ego_Steering_cmd)
  171. print('--------------------------------------------------------------')
  172. print('ego_throttle_real=')
  173. print(ego_throttle_real)
  174. print('--------------------------------------------------------------')
  175. print('ego_throttle_cmd=')
  176. print(ego_throttle_cmd)
  177. print('--------------------------------------------------------------')
  178. #print('----------------------------------------------------------------------------')
  179. '''
  180. #ego_Steering_real.clear()
  181. #ego_throttle_real.clear()
  182. #ego_Steering_cmd.clear()
  183. #ego_throttle_cmd.clear()
  184. ego_Steering_real=[1]
  185. ego_throttle_real=[1]
  186. ego_Steering_cmd=[1]
  187. ego_throttle_cmd=[1]
  188. obj_dic.clear()
  189. def listener():
  190. rospy.init_node('listener', anonymous=True)
  191. rospy.Subscriber("/cicv_location",PerceptionLocalization,callback_cicv_location)
  192. rospy.Subscriber("/tpperception",PerceptionObjects,callback_tpperception)
  193. rospy.Subscriber("/jinlong_control_pub",Jinlong_Control_Command,callback_Jinlong_Control_Command)
  194. rospy.Subscriber("/data_read",Retrieval,callback_data_read)
  195. rospy.Subscriber("/failure/lidar",Bool,callback_failure_lidar)
  196. rospy.Subscriber("/failure/radar",Bool,callback_failure_radar)
  197. rospy.Subscriber("/failure/camera",Bool,callback_failure_camera)
  198. timer1 = rospy.Timer(rospy.Duration(4), final_callback)
  199. rospy.spin()
  200. if __name__ == '__main__':
  201. listener()