3333
3434# required attributes
3535cam_attr = "camera_name"
36+ camera_intrinsics = "camera_intrinsics"
3637pattern_attr = "pattern_size"
3738square_attr = "square_size_mm"
3839
40+ # Camera intrinsics required keys
41+ K_KEYS = ["fx" , "fy" , "cx" , "cy" ]
42+ DIST_KEYS = ["k1" , "k2" , "k3" , "p1" , "p2" ]
43+
44+
3945
4046class Chessboard (PoseTracker , EasyResource ):
4147 # To enable debug-level logging, either run viam-server with the --debug option,
@@ -81,6 +87,21 @@ def validate_config(
8187 raise Exception (f"Missing required { pattern_attr } attribute." )
8288 if attrs .get (square_attr ) is None :
8389 raise Exception (f"Missing required { square_attr } attribute." )
90+ if attrs .get (camera_intrinsics ) is not None :
91+ # Check to make sure the right keys are available
92+ intrinsics_config = attrs .get (camera_intrinsics )
93+ if intrinsics_config .get ("K" ) is None :
94+ raise Exception (f"Missing required K for camera intrinsics." )
95+ K : dict = intrinsics_config .get ("K" )
96+ for K_key in K_KEYS :
97+ if K .get (K_key ) is None :
98+ raise Exception (f"Missing required key { K_key } for K camera intrinsics." )
99+ if intrinsics_config .get ("dist" ) is None :
100+ raise Exception (f"Missing required dist for camera intrinsics" )
101+ dist : dict = intrinsics_config .get ("dist" )
102+ for dist_key in DIST_KEYS :
103+ if dist .get (dist_key ) is None :
104+ raise Exception (f"Missing required key { dist_key } for dist camera intrinsics." )
84105
85106 return [str (cam )], []
86107
@@ -104,14 +125,21 @@ def reconfigure(
104125 self .pattern_size = [int (x ) for x in pattern_list ]
105126 self .square_size = attrs .get (square_attr )
106127
128+ # Get camera intrinsics provided by user if available
129+ self .camera_intrinsics = attrs .get (camera_intrinsics )
130+
107131 return super ().reconfigure (config , dependencies )
108132
109133 async def get_camera_intrinsics (self ) -> tuple :
110134 """Get camera intrinsic parameters"""
111- camera_params = await self .camera .do_command ({"get_camera_params" : None })
112- intrinsics = camera_params ["Color" ]["intrinsics" ]
113- dist_params = camera_params ["Color" ]["distortion" ]
114-
135+ if self .camera_intrinsics is None :
136+ camera_params = await self .camera .do_command ({"get_camera_params" : None })
137+ intrinsics = camera_params ["Color" ]["intrinsics" ]
138+ dist_params = camera_params ["Color" ]["distortion" ]
139+ else :
140+ intrinsics = self .camera_intrinsics ["K" ]
141+ dist_params = self .camera_intrinsics ["dist" ]
142+
115143 K = np .array ([
116144 [intrinsics ["fx" ], 0 , intrinsics ["cx" ]],
117145 [0 , intrinsics ["fy" ], intrinsics ["cy" ]],
0 commit comments