| 
						
						
						
					 | 
					 | 
					@ -1,55 +1,55 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					import itertools | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import numpy as np | 
					 | 
					 | 
					 | 
					import numpy as np | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					from dataclasses import dataclass | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import openpilot.common.transformations.orientation as orient | 
					 | 
					 | 
					 | 
					import openpilot.common.transformations.orientation as orient | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					## -- hardcoded hardware params -- | 
					 | 
					 | 
					 | 
					## -- hardcoded hardware params -- | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_f_focal_length = 910.0 | 
					 | 
					 | 
					 | 
					@dataclass(frozen=True) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_d_focal_length = 650.0 | 
					 | 
					 | 
					 | 
					class CameraConfig: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_f_focal_length = 2648.0 | 
					 | 
					 | 
					 | 
					  width: int | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_e_focal_length = tici_d_focal_length = 567.0 # probably wrong? magnification is not consistent across frame | 
					 | 
					 | 
					 | 
					  height: int | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  focal_length: float | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_f_frame_size = (1164, 874) | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_d_frame_size = (816, 612) | 
					 | 
					 | 
					 | 
					  @property | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_f_frame_size = tici_e_frame_size = tici_d_frame_size = (1928, 1208) | 
					 | 
					 | 
					 | 
					  def intrinsics(self): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    # aka 'K' aka camera_frame_from_view_frame | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# aka 'K' aka camera_frame_from_view_frame | 
					 | 
					 | 
					 | 
					    return np.array([ | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_fcam_intrinsics = np.array([ | 
					 | 
					 | 
					 | 
					      [self.focal_length,  0.0, float(self.width)/2], | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [eon_f_focal_length,  0.0,  float(eon_f_frame_size[0])/2], | 
					 | 
					 | 
					 | 
					      [0.0, self.focal_length, float(self.height)/2], | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  eon_f_focal_length,  float(eon_f_frame_size[1])/2], | 
					 | 
					 | 
					 | 
					      [0.0,  0.0, 1.0] | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  0.0,                                          1.0]]) | 
					 | 
					 | 
					 | 
					    ]) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_intrinsics = eon_fcam_intrinsics # xx | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  @property | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_dcam_intrinsics = np.array([ | 
					 | 
					 | 
					 | 
					  def intrinsics_inv(self): | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [eon_d_focal_length,  0.0,  float(eon_d_frame_size[0])/2], | 
					 | 
					 | 
					 | 
					    # aka 'K_inv' aka view_frame_from_camera_frame | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  eon_d_focal_length,  float(eon_d_frame_size[1])/2], | 
					 | 
					 | 
					 | 
					    return np.linalg.inv(self.intrinsics) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  0.0,                                          1.0]]) | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					@dataclass(frozen=True) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_fcam_intrinsics = np.array([ | 
					 | 
					 | 
					 | 
					class DeviceCameraConfig: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [tici_f_focal_length,  0.0,  float(tici_f_frame_size[0])/2], | 
					 | 
					 | 
					 | 
					  fcam: CameraConfig | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  tici_f_focal_length,  float(tici_f_frame_size[1])/2], | 
					 | 
					 | 
					 | 
					  dcam: CameraConfig | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  0.0,                                            1.0]]) | 
					 | 
					 | 
					 | 
					  ecam: CameraConfig | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_dcam_intrinsics = np.array([ | 
					 | 
					 | 
					 | 
					ar_ox_fisheye = CameraConfig(1928, 1208, 567.0)  # focal length probably wrong? magnification is not consistent across frame | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [tici_d_focal_length,  0.0,  float(tici_d_frame_size[0])/2], | 
					 | 
					 | 
					 | 
					ar_ox_config = DeviceCameraConfig(CameraConfig(1928, 1208, 2648.0), ar_ox_fisheye, ar_ox_fisheye) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  tici_d_focal_length,  float(tici_d_frame_size[1])/2], | 
					 | 
					 | 
					 | 
					os_fisheye = CameraConfig(2688, 1520, 567.0 / 2 * 3) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  [0.0,  0.0,                                            1.0]]) | 
					 | 
					 | 
					 | 
					os_config = DeviceCameraConfig(CameraConfig(2688, 1520, 2648.0 * 2 / 3), os_fisheye, os_fisheye) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_ecam_intrinsics = tici_dcam_intrinsics | 
					 | 
					 | 
					 | 
					DEVICE_CAMERAS = { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  # A "device camera" is defined by a device type and sensor | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# aka 'K_inv' aka view_frame_from_camera_frame | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_fcam_intrinsics_inv = np.linalg.inv(eon_fcam_intrinsics) | 
					 | 
					 | 
					 | 
					  # sensor type was never set on eon/neo/two | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					eon_intrinsics_inv = eon_fcam_intrinsics_inv # xx | 
					 | 
					 | 
					 | 
					  ("neo", "unknown"): DeviceCameraConfig(CameraConfig(1164, 874, 910.0), CameraConfig(816, 612, 650.0), CameraConfig(0, 0, 0.)), | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  # unknown here is AR0231, field was added with OX03C10 support | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_fcam_intrinsics_inv = np.linalg.inv(tici_fcam_intrinsics) | 
					 | 
					 | 
					 | 
					  ("tici", "unknown"): ar_ox_config, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					tici_ecam_intrinsics_inv = np.linalg.inv(tici_ecam_intrinsics) | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  # before deviceState.deviceType was set, assume tici AR config | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  ("unknown", "ar0231"): ar_ox_config, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					FULL_FRAME_SIZE = tici_f_frame_size | 
					 | 
					 | 
					 | 
					  ("unknown", "ox03c10"): ar_ox_config, | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					FOCAL = tici_f_focal_length | 
					 | 
					 | 
					 | 
					} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					fcam_intrinsics = tici_fcam_intrinsics | 
					 | 
					 | 
					 | 
					prods = itertools.product(('tici', 'tizi', 'mici'), (('ar0231', ar_ox_config), ('ox03c10', ar_ox_config), ('os04c10', os_config))) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					DEVICE_CAMERAS.update({(d, c[0]): c[1] for d, c in prods}) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					W, H = FULL_FRAME_SIZE[0], FULL_FRAME_SIZE[1] | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# device/mesh : x->forward, y-> right, z->down | 
					 | 
					 | 
					 | 
					# device/mesh : x->forward, y-> right, z->down | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					# view : x->right, y->down, z->forward | 
					 | 
					 | 
					 | 
					# view : x->right, y->down, z->forward | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -93,7 +93,7 @@ def roll_from_ke(m): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                    -(m[0, 0] - m[0, 1] * m[2, 0] / m[2, 1])) | 
					 | 
					 | 
					 | 
					                    -(m[0, 0] - m[0, 1] * m[2, 0] / m[2, 1])) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def normalize(img_pts, intrinsics=fcam_intrinsics): | 
					 | 
					 | 
					 | 
					def normalize(img_pts, intrinsics): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # normalizes image coordinates | 
					 | 
					 | 
					 | 
					  # normalizes image coordinates | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # accepts single pt or array of pts | 
					 | 
					 | 
					 | 
					  # accepts single pt or array of pts | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  intrinsics_inv = np.linalg.inv(intrinsics) | 
					 | 
					 | 
					 | 
					  intrinsics_inv = np.linalg.inv(intrinsics) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -106,7 +106,7 @@ def normalize(img_pts, intrinsics=fcam_intrinsics): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return img_pts_normalized[:, :2].reshape(input_shape) | 
					 | 
					 | 
					 | 
					  return img_pts_normalized[:, :2].reshape(input_shape) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def denormalize(img_pts, intrinsics=fcam_intrinsics, width=np.inf, height=np.inf): | 
					 | 
					 | 
					 | 
					def denormalize(img_pts, intrinsics, width=np.inf, height=np.inf): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # denormalizes image coordinates | 
					 | 
					 | 
					 | 
					  # denormalizes image coordinates | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  # accepts single pt or array of pts | 
					 | 
					 | 
					 | 
					  # accepts single pt or array of pts | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  img_pts = np.array(img_pts) | 
					 | 
					 | 
					 | 
					  img_pts = np.array(img_pts) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -123,7 +123,7 @@ def denormalize(img_pts, intrinsics=fcam_intrinsics, width=np.inf, height=np.inf | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return img_pts_denormalized[:, :2].reshape(input_shape) | 
					 | 
					 | 
					 | 
					  return img_pts_denormalized[:, :2].reshape(input_shape) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					def get_calib_from_vp(vp, intrinsics=fcam_intrinsics): | 
					 | 
					 | 
					 | 
					def get_calib_from_vp(vp, intrinsics): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  vp_norm = normalize(vp, intrinsics) | 
					 | 
					 | 
					 | 
					  vp_norm = normalize(vp, intrinsics) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  yaw_calib = np.arctan(vp_norm[0]) | 
					 | 
					 | 
					 | 
					  yaw_calib = np.arctan(vp_norm[0]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  pitch_calib = -np.arctan(vp_norm[1]*np.cos(yaw_calib)) | 
					 | 
					 | 
					 | 
					  pitch_calib = -np.arctan(vp_norm[1]*np.cos(yaw_calib)) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |