44
55import json
66from dataclasses import dataclass
7- from typing import Any , Dict
7+ from typing import Any , Dict , Optional
88
99import numpy as np
1010
11- from zod .constants import EGO , Camera , CoordinateFrame , Lidar
11+ from zod .constants import EGO , Camera , CoordinateFrame , Lidar , Radar
1212from zod .data_classes .geometry import Pose
1313from zod .utils .geometry import transform_points
1414
@@ -28,10 +28,16 @@ class CameraCalibration:
2828 field_of_view : np .ndarray # horizontal, vertical (degrees)
2929
3030
31+ @dataclass
32+ class RadarCalibration :
33+ extrinsics : Pose # radar pose in the ego frame
34+
35+
3136@dataclass
3237class Calibration :
3338 lidars : Dict [Lidar , LidarCalibration ]
3439 cameras : Dict [Camera , CameraCalibration ]
40+ radars : Optional [Dict [Radar , RadarCalibration ]] = None
3541
3642 @classmethod
3743 def from_dict (cls , calib_dict : Dict [str , Any ]) -> Calibration :
@@ -48,7 +54,14 @@ def from_dict(cls, calib_dict: Dict[str, Any]) -> Calibration:
4854 field_of_view = np .array (calib_dict ["FC" ]["field_of_view" ]),
4955 ),
5056 }
51- return cls (lidars = lidars , cameras = cameras )
57+
58+ if "radar_extrinsics" in calib_dict ["FC" ]:
59+ radars = {
60+ Radar .FRONT : RadarCalibration (extrinsics = Pose (np .array (calib_dict ["FC" ]["radar_extrinsics" ]))),
61+ }
62+ return cls (lidars = lidars , cameras = cameras , radars = radars )
63+ else :
64+ return cls (lidars = lidars , cameras = cameras )
5265
5366 @classmethod
5467 def from_json_path (cls , json_path : str ) -> Calibration :
@@ -85,5 +98,12 @@ def get_extrinsics(self, frame: CoordinateFrame) -> Pose:
8598 return self .lidars [frame ].extrinsics
8699 elif isinstance (frame , Camera ):
87100 return self .cameras [frame ].extrinsics
101+ elif isinstance (frame , Radar ):
102+ if self .radars is None :
103+ err = "No radar calibration info available!"
104+ err += "\n Please download the latest version of ZOD to access radar data. "
105+ err += "\n Radar is available for ZOD Sequences and Drives only."
106+ raise ValueError (err )
107+ return self .radars [frame ].extrinsics
88108 else :
89109 raise ValueError (f"Unknown frame { frame } " )
0 commit comments