|  |  | @ -1,4 +1,5 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | import numpy as np |  |  |  | from common.numpy_fast import interp | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | from math import atan2, sqrt | 
			
		
	
		
		
			
				
					
					|  |  |  | from common.realtime import DT_CTRL, DT_DMON |  |  |  | from common.realtime import DT_CTRL, DT_DMON | 
			
		
	
		
		
			
				
					
					|  |  |  | from selfdrive.controls.lib.drive_helpers import create_event, EventTypes as ET |  |  |  | from selfdrive.controls.lib.drive_helpers import create_event, EventTypes as ET | 
			
		
	
		
		
			
				
					
					|  |  |  | from common.filter_simple import FirstOrderFilter |  |  |  | from common.filter_simple import FirstOrderFilter | 
			
		
	
	
		
		
			
				
					|  |  | @ -56,8 +57,8 @@ def face_orientation_from_net(angles_desc, pos_desc, rpy_calib): | 
			
		
	
		
		
			
				
					
					|  |  |  |   roll_net = angles_desc[2] |  |  |  |   roll_net = angles_desc[2] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   face_pixel_position = ((pos_desc[0] + .5)*W - W + FULL_W, (pos_desc[1]+.5)*H) |  |  |  |   face_pixel_position = ((pos_desc[0] + .5)*W - W + FULL_W, (pos_desc[1]+.5)*H) | 
			
		
	
		
		
			
				
					
					|  |  |  |   yaw_focal_angle = np.arctan2(face_pixel_position[0] - FULL_W//2, RESIZED_FOCAL) |  |  |  |   yaw_focal_angle = atan2(face_pixel_position[0] - FULL_W//2, RESIZED_FOCAL) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   pitch_focal_angle = np.arctan2(face_pixel_position[1] - H//2, RESIZED_FOCAL) |  |  |  |   pitch_focal_angle = atan2(face_pixel_position[1] - H//2, RESIZED_FOCAL) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   roll = roll_net |  |  |  |   roll = roll_net | 
			
		
	
		
		
			
				
					
					|  |  |  |   pitch = pitch_net + pitch_focal_angle |  |  |  |   pitch = pitch_net + pitch_focal_angle | 
			
		
	
	
		
		
			
				
					|  |  | @ -66,7 +67,7 @@ def face_orientation_from_net(angles_desc, pos_desc, rpy_calib): | 
			
		
	
		
		
			
				
					
					|  |  |  |   # no calib for roll |  |  |  |   # no calib for roll | 
			
		
	
		
		
			
				
					
					|  |  |  |   pitch -= rpy_calib[1] |  |  |  |   pitch -= rpy_calib[1] | 
			
		
	
		
		
			
				
					
					|  |  |  |   yaw -= rpy_calib[2] |  |  |  |   yaw -= rpy_calib[2] | 
			
		
	
		
		
			
				
					
					|  |  |  |   return np.array([roll, pitch, yaw]) |  |  |  |   return roll, pitch, yaw | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | class DriverPose(): |  |  |  | class DriverPose(): | 
			
		
	
		
		
			
				
					
					|  |  |  |   def __init__(self): |  |  |  |   def __init__(self): | 
			
		
	
	
		
		
			
				
					|  |  | @ -153,7 +154,7 @@ class DriverStatus(): | 
			
		
	
		
		
			
				
					
					|  |  |  |     if pitch_error > 0.: |  |  |  |     if pitch_error > 0.: | 
			
		
	
		
		
			
				
					
					|  |  |  |       pitch_error = max(pitch_error - _PITCH_POS_ALLOWANCE, 0.) |  |  |  |       pitch_error = max(pitch_error - _PITCH_POS_ALLOWANCE, 0.) | 
			
		
	
		
		
			
				
					
					|  |  |  |     pitch_error *= _PITCH_WEIGHT |  |  |  |     pitch_error *= _PITCH_WEIGHT | 
			
		
	
		
		
			
				
					
					|  |  |  |     pose_metric = np.sqrt(yaw_error**2 + pitch_error**2) |  |  |  |     pose_metric = sqrt(yaw_error**2 + pitch_error**2) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if pose_metric > _METRIC_THRESHOLD*pose.cfactor: |  |  |  |     if pose_metric > _METRIC_THRESHOLD*pose.cfactor: | 
			
		
	
		
		
			
				
					
					|  |  |  |       return DistractedType.BAD_POSE |  |  |  |       return DistractedType.BAD_POSE | 
			
		
	
	
		
		
			
				
					|  |  | @ -164,8 +165,8 @@ class DriverStatus(): | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def set_policy(self, model_data): |  |  |  |   def set_policy(self, model_data): | 
			
		
	
		
		
			
				
					
					|  |  |  |     ep = min(model_data.meta.engagedProb, 0.8) / 0.8 |  |  |  |     ep = min(model_data.meta.engagedProb, 0.8) / 0.8 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.pose.cfactor = np.interp(ep, [0, 0.5, 1], [_METRIC_THRESHOLD_STRICT, _METRIC_THRESHOLD, _METRIC_THRESHOLD_SLACK])/_METRIC_THRESHOLD |  |  |  |     self.pose.cfactor = interp(ep, [0, 0.5, 1], [_METRIC_THRESHOLD_STRICT, _METRIC_THRESHOLD, _METRIC_THRESHOLD_SLACK])/_METRIC_THRESHOLD | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     self.blink.cfactor = np.interp(ep, [0, 0.5, 1], [_BLINK_THRESHOLD_STRICT, _BLINK_THRESHOLD, _BLINK_THRESHOLD_SLACK])/_BLINK_THRESHOLD |  |  |  |     self.blink.cfactor = interp(ep, [0, 0.5, 1], [_BLINK_THRESHOLD_STRICT, _BLINK_THRESHOLD, _BLINK_THRESHOLD_SLACK])/_BLINK_THRESHOLD | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def get_pose(self, driver_monitoring, cal_rpy, car_speed, op_engaged): |  |  |  |   def get_pose(self, driver_monitoring, cal_rpy, car_speed, op_engaged): | 
			
		
	
		
		
			
				
					
					|  |  |  |     # 10 Hz |  |  |  |     # 10 Hz | 
			
		
	
	
		
		
			
				
					|  |  | 
 |