@@ -109,7 +109,7 @@ def run(self):
109
109
class CalibrationNode :
110
110
def __init__ (self , boards , service_check = True , synchronizer = message_filters .TimeSynchronizer , flags = 0 ,
111
111
pattern = Patterns .Chessboard , camera_name = '' , checkerboard_flags = 0 , max_chessboard_speed = - 1 ,
112
- queue_size = 1 ):
112
+ queue_size = 1 , mono_before_stereo = False ):
113
113
if service_check :
114
114
# assume any non-default service names have been set. Wait for the service to become ready
115
115
for svcname in ["camera" , "left_camera" , "right_camera" ]:
@@ -130,6 +130,7 @@ def __init__(self, boards, service_check = True, synchronizer = message_filters.
130
130
self ._pattern = pattern
131
131
self ._camera_name = camera_name
132
132
self ._max_chessboard_speed = max_chessboard_speed
133
+ self ._mono_before_stereo = mono_before_stereo
133
134
lsub = message_filters .Subscriber ('left' , sensor_msgs .msg .Image )
134
135
rsub = message_filters .Subscriber ('right' , sensor_msgs .msg .Image )
135
136
ts = synchronizer ([lsub , rsub ], 4 )
@@ -149,8 +150,10 @@ def __init__(self, boards, service_check = True, synchronizer = message_filters.
149
150
self .q_stereo = BufferQueue (queue_size )
150
151
151
152
self .c = None
152
-
153
153
self ._last_display = None
154
+ self .lcal = None
155
+ self .rcal = None
156
+ self .lock = threading .Lock ()
154
157
155
158
mth = ConsumerThread (self .q_mono , self .handle_monocular )
156
159
mth .setDaemon (True )
@@ -169,40 +172,55 @@ def queue_monocular(self, msg):
169
172
self .q_mono .put (msg )
170
173
171
174
def queue_stereo (self , lmsg , rmsg ):
172
- self .q_stereo .put ((lmsg , rmsg ))
175
+ if self ._mono_before_stereo :
176
+ if self .lcal == None :
177
+ self .q_mono .put (lmsg )
178
+ elif self .rcal == None :
179
+ self .q_mono .put (rmsg )
180
+ else :
181
+ self .q_stereo .put ((lmsg , rmsg ))
182
+ else :
183
+ self .q_stereo .put ((lmsg , rmsg ))
184
+
185
+ def init_monocular (self ):
186
+ if self ._camera_name :
187
+ c = MonoCalibrator (self ._boards , self ._calib_flags , self ._pattern , name = self ._camera_name ,
188
+ checkerboard_flags = self ._checkerboard_flags ,
189
+ max_chessboard_speed = self ._max_chessboard_speed )
190
+ else :
191
+ c = MonoCalibrator (self ._boards , self ._calib_flags , self ._pattern ,
192
+ checkerboard_flags = self .checkerboard_flags ,
193
+ max_chessboard_speed = self ._max_chessboard_speed )
194
+ return c
195
+
196
+ def init_stereo (self ):
197
+ if self ._camera_name :
198
+ c = StereoCalibrator (self ._boards , self ._calib_flags , self ._pattern , name = self ._camera_name ,
199
+ checkerboard_flags = self ._checkerboard_flags ,
200
+ max_chessboard_speed = self ._max_chessboard_speed ,
201
+ lcal = self .lcal , rcal = self .rcal )
202
+ else :
203
+ c = StereoCalibrator (self ._boards , self ._calib_flags , self ._pattern ,
204
+ checkerboard_flags = self ._checkerboard_flags ,
205
+ max_chessboard_speed = self ._max_chessboard_speed ,
206
+ lcal = self .lcal , rcal = self .rcal )
207
+ return c
173
208
174
209
def handle_monocular (self , msg ):
175
210
if self .c == None :
176
- if self ._camera_name :
177
- self .c = MonoCalibrator (self ._boards , self ._calib_flags , self ._pattern , name = self ._camera_name ,
178
- checkerboard_flags = self ._checkerboard_flags ,
179
- max_chessboard_speed = self ._max_chessboard_speed )
180
- else :
181
- self .c = MonoCalibrator (self ._boards , self ._calib_flags , self ._pattern ,
182
- checkerboard_flags = self .checkerboard_flags ,
183
- max_chessboard_speed = self ._max_chessboard_speed )
184
-
211
+ self .c = self .init_monocular ()
185
212
# This should just call the MonoCalibrator
186
213
drawable = self .c .handle_msg (msg )
187
214
self .displaywidth = drawable .scrib .shape [1 ]
188
215
self .redraw_monocular (drawable )
189
216
190
217
def handle_stereo (self , msg ):
191
218
if self .c == None :
192
- if self ._camera_name :
193
- self .c = StereoCalibrator (self ._boards , self ._calib_flags , self ._pattern , name = self ._camera_name ,
194
- checkerboard_flags = self ._checkerboard_flags ,
195
- max_chessboard_speed = self ._max_chessboard_speed )
196
- else :
197
- self .c = StereoCalibrator (self ._boards , self ._calib_flags , self ._pattern ,
198
- checkerboard_flags = self ._checkerboard_flags ,
199
- max_chessboard_speed = self ._max_chessboard_speed )
200
-
219
+ self .c = self .init_stereo ()
201
220
drawable = self .c .handle_msg (msg )
202
221
self .displaywidth = drawable .lscrib .shape [1 ] + drawable .rscrib .shape [1 ]
203
222
self .redraw_stereo (drawable )
204
223
205
-
206
224
def check_set_camera_info (self , response ):
207
225
if response .success :
208
226
return True
@@ -262,10 +280,29 @@ def on_mouse(self, event, x, y, flags, param):
262
280
if event == cv2 .EVENT_LBUTTONDOWN and self .displaywidth < x :
263
281
if self .c .goodenough :
264
282
if 180 <= y < 280 :
265
- print ("**** Calibrating ****" )
266
- self .c .do_calibration ()
267
- self .buttons (self ._last_display )
268
- self .queue_display .put (self ._last_display )
283
+ if self ._mono_before_stereo :
284
+ if self .lcal == None :
285
+ self .lcal = self .c
286
+ self .q_mono .clear ()
287
+ self .q_stereo .clear ()
288
+ self .c = self .init_monocular ()
289
+ elif self .rcal == None :
290
+ self .lock .acquire ()
291
+ self .rcal = self .c
292
+ self .q_mono .clear ()
293
+ self .q_stereo .clear ()
294
+ self .c = self .init_stereo ()
295
+ self .lock .release ()
296
+ else :
297
+ print ("**** Calibrating ****" )
298
+ self .c .do_calibration ()
299
+ self .buttons (self ._last_display )
300
+ self .queue_display .put (self ._last_display )
301
+ else :
302
+ print ("**** Calibrating ****" )
303
+ self .c .do_calibration ()
304
+ self .buttons (self ._last_display )
305
+ self .queue_display .put (self ._last_display )
269
306
if self .c .calibrated :
270
307
if 280 <= y < 380 :
271
308
self .c .do_save ()
0 commit comments