
    *i"                     f    d Z ddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZmZ  G d de          ZdS )	a  ZED stereo camera implementation using the pyzed SDK.

Recording mode  : opens by serial number, records to SVO2 (H264).
                  Depth is NOT computed during recording (depth_mode=NONE)
                  for lower CPU usage; the raw stereo pair is stored instead.
Playback mode   : opens an SVO2 file, computes depth (NEURAL) for each frame.
                  Use ZedCamera.from_svo() to create a playback instance.
    )Path)OptionalTupleN   )CameraCameraFramec            
       x   e Zd ZdZddededefdZedefd            Zedefd	            Z	edefd
            Z
d dZd dZdeddfdZd dZdefdZdefdZe	 d!dedededd fd            Zdeej        ej        eeef         f         fdZdej        fdZd"dZdefdZdefdZdefdZdefdZ dS )#	ZedCamerau   ZED camera – records to .svo2   camera_nameserial_numberfpsc                    || _         || _        || _        t          j                    | _        d| _        t          j                    | _        t          j                    | _	        t          j                    | _
        d| _        d S NF)_name_serial_fpsslr   _camera_is_openMat_image_depth_right_image
_has_depth)selfr   r   r   s       0/home/robot-lab/raiden_cmu/raiden/cameras/zed.py__init__zZedCamera.__init__   s^     
$	y{{fhhfhhFHH    returnc                     | j         S N)r   r   s    r   namezZedCamera.name%   s
    zr   c                 *    t          | j                  S r"   )strr   r#   s    r   r   zZedCamera.serial_number)   s    4<   r   c                     dS )Nsvo2 r#   s    r   recording_extensionzZedCamera.recording_extension-   s    vr   Nc                    t          j                    }|                    | j                   t           j        j        |_        | j        |_        t           j	        j
        |_        t           j        j        |_        | j                            |          }|t           j        j        k    r"t'          d| j         d| j         d|           d| _        d| _        dS )zAOpen live camera. Depth is disabled to reduce recording overhead.zFailed to open ZED camera 'z' (serial: z): TFN)r   InitParametersset_from_serial_numberr   
RESOLUTIONHD720camera_resolutionr   
camera_fps
DEPTH_MODENONE
depth_modeUNITMETERcoordinate_unitsr   open
ERROR_CODESUCCESSRuntimeErrorr   r   r   )r   init_paramsstatuss      r   r8   zZedCamera.open5   s    '))**4<888(*(;%!%!#!3')w}$"";//R]***6dj 6 6 L6 6-36 6   r   c                 X    | j         r"| j                                         d| _         d S d S r   )r   r   closer#   s    r   r?   zZedCamera.closeG   s5    = 	"L   !DMMM	" 	"r   pathc                    t          j                    }t           j        j        |_        t          |          |_        | j                            |          }|t           j	        j
        k    rt          d| j         d|           dS )z>Enable SVO2 recording. Every subsequent grab() writes a frame.z$Failed to start SVO2 recording for '': N)r   RecordingParametersSVO_COMPRESSION_MODEH264compression_moder&   video_filenamer   enable_recordingr9   r:   r;   r   )r   r@   paramsr=   s       r   start_recordingzZedCamera.start_recordingL   s    '))"$"9"> #D		..v66R]***NtzNNfNN   +*r   c                 8    | j                                          d S r"   )r   disable_recordingr#   s    r   stop_recordingzZedCamera.stop_recordingW   s    &&(((((r   c                     t          j                    }| j                            |          }|t           j        j        k    S )z3Grab next frame (blocks until ready at camera FPS).)r   RuntimeParametersr   grabr9   r:   )r   runtime_paramsr=   s      r   rP   zZedCamera.grabZ   s5    -//"">22...r   c                    | j                             | j        t          j        j                   | j                                        ddddddf                                         }d}| j        r| j         	                    | j
        t          j        j                   | j
                                                                        }t          j        t          j        |          |d                              t          j                  }| j                             t          j        j                                                  }t-          |||          S )z>Retrieve color (and depth if in playback mode) from last grab.N           )colordepthtimestamp_ns)r   retrieve_imager   r   VIEWLEFTget_datacopyr   retrieve_measurer   MEASUREDEPTHnpwhereisfiniteastypefloat32get_timestampTIME_REFERENCEIMAGEget_nanosecondsr   )r   rU   rV   rawrW   s        r   	get_framezZedCamera.get_frame`   s   ##DK>>>$$&&qqq!!!RaRx05577&*? 	LL))$+rz7GHHH+&&((--//CHR[--sC88??
KKE|11#
 

/

 	 e,OOOOr   Tsvo_pathcompute_sdk_depthc                    |                      |           }||_        d|_        d|_        t	          j                    |_        d|_        t	          j                    |_	        t	          j                    |_
        t	          j                    |_        ||_        t	          j                    }|                    t          |                     d|_        |rt          j        j        nt          j        j        |_        t          j        j        |_        d|_        |j                            |          }|t          j        j        k    rt9          d| d|           d|_        |S )ac  Open an SVO2 file for frame-by-frame extraction.

        Parameters
        ----------
        compute_sdk_depth : bool
            If True (default) depth is computed by the ZED SDK (NEURAL_LIGHT).
            Set to False when you will compute depth externally (e.g. with FFS);
            this skips the SDK depth pass for lower CPU/GPU load.
        r   r   Fg{Gz?zFailed to open SVO2 'rB   T)__new__r   r   r   r   r   r   r   r   r   r   r   r   r,   set_from_svo_filer&   svo_real_time_moder2   NEURAL_LIGHTr3   r4   r5   r6   r7   depth_minimum_distancer8   r9   r:   r;   )clsr   rk   rl   camr<   r=   s          r   from_svozZedCamera.from_svou   s"     kk#	ikkVXX
VXX
688*'))%%c(mm444).&*;SBM&&AS 	 (*w}$-1*!!+..R]***LxLLFLLMMM
r   c                    | j                                         }|j        j        j        }|j        j        }t          j        |j        d|j	        gd|j
        |j        gg dgt          j                  }t          j        |j        d         |j        d         |j        d         |j        d         |j        d         gt          j                  }|j        |j        f}|||fS )	z?Return ZED SDK factory-calibrated intrinsics for the left lens.rT   )rT   rT   g      ?)dtyper   r      rS      )r   get_camera_informationcamera_configurationcalibration_parametersleft_cam
resolutionr`   arrayfxcxfycyfloat64distowidthheight)r   infocalrescamera_matrixdist_coeffs
image_sizes          r   get_intrinsicszZedCamera.get_intrinsics   s    |2244'>G'2fc36"S#&#&$9???K*
 
 

 hYq\39Q<1sy|SYq\R*
 
 
 i,
k:55r   c                     | j                             | j        t          j        j                   | j                                        ddddddf                                         S )zReturn the right-camera BGR image for the most recently grabbed frame.

        Only valid after a successful grab(). Used by external stereo depth
        predictors (e.g. Fast Foundation Stereo) that need both views.
        NrS   )r   rX   r   r   rY   RIGHTr[   r\   r#   s    r   get_right_colorzZedCamera.get_right_color   s[     	##D$5rw}EEE ))++AAAqqq"1"H5::<<<r   tuple[float, float]c                     | j                                         }|j        j        }t	          |j        j                  }t	          t          |                                                    }||fS )zReturn ``(fx, baseline_m)`` for the left camera at the current resolution.

        ``fx`` is the left-camera focal length in pixels and ``baseline_m`` is
        the stereo baseline in metres. Used to convert FFS disparity to depth.
        )	r   rz   r{   r|   floatr}   r   absget_camera_baseline)r   r   r   r   baselines        r   get_stereo_calibzZedCamera.get_stereo_calib   s^     |2244'>3<?##S446677888|r   c                 4    | j                                         S )z1Total frame count (valid for SVO2 playback only).)r   get_svo_number_of_framesr#   s    r   get_total_frameszZedCamera.get_total_frames   s    |44666r   c                 x    | j                             t          j        j                                                  S )zQTimestamp of the most recently grabbed frame in nanoseconds (ZED hardware clock).)r   re   r   rf   rg   rh   r#   s    r   get_frame_timestamp_nsz ZedCamera.get_frame_timestamp_ns   s*    |))"*;*ABBRRTTTr   c                 x    | j                             t          j        j                                                  S )zCurrent host time in nanoseconds via the ZED SDK.

        On the same clock as ``get_frame_timestamp_ns()``, so robot observations
        recorded with this value can be directly interpolated against camera
        frame timestamps.
        )r   re   r   rf   CURRENTrh   r#   s    r   get_current_timestamp_nsz"ZedCamera.get_current_timestamp_ns   s,     |))"*;*CDDTTVVVr   c                    | j                                         }|j        j        j        }|j        j        }t          | j                  pdt          |j                  | j	        |j
        |j        |j        |j        |j        |j        |j        d         |j        d         |j        d         |j        d         |j        d         dS )z6Return camera intrinsics and metadata as a plain dict.unknownr   r   rx   rS   ry   )r   modelr   r   r   r   r   r   r   k1k2p1p2k3)r   rz   r{   r|   r}   r~   r&   r   camera_modelr   r   r   r   r   r   r   r   )r   r   r   r   s       r   get_camera_infozZedCamera.get_camera_info   s    |2244'>G'2 ..;)*++9Yj&&&&)A,)A,)A,)A,)A,
 
 	
r   )r   )r    N)T)r    r   )!__name__
__module____qualname____doc__r&   intr   propertyr$   r   r*   r8   r?   r   rJ   rM   boolrP   r   rj   classmethodru   r   r`   ndarrayr   r   r   r   r   r   dictr   r)   r   r   r
   r
      s       ))	  	 C 	  	 # 	  	  	  	  c    X !s ! ! ! X! S    X       $" " " "
	D 	T 	 	 	 	) ) ) )/d / / / /P; P P P P* 
 #'	( (( (  	(
 
( ( ( [(T6bj"*eCHo&M N 6 6 6 6$= = = = =
 
 
 
7# 7 7 7 7U U U U UW# W W W W
 
 
 
 
 
 
r   r
   )r   pathlibr   typingr   r   numpyr`   pyzed.slr   baser   r   r
   r)   r   r   <module>r      s           " " " " " " " "           % % % % % % % %Y
 Y
 Y
 Y
 Y
 Y
 Y
 Y
 Y
 Y
r   