Context manager to synchronize output from different sensors. Synchronous mode is enabled as long as we are inside this context with CarlaSyncMode(world, sensors) as sync_mode: while True: data = sync_mode.tick(timeout=1.0)
| 334 | # ============================================================================== |
| 335 | |
| 336 | class CarlaSyncMode(object): |
| 337 | """ |
| 338 | Context manager to synchronize output from different sensors. Synchronous |
| 339 | mode is enabled as long as we are inside this context |
| 340 | |
| 341 | with CarlaSyncMode(world, sensors) as sync_mode: |
| 342 | while True: |
| 343 | data = sync_mode.tick(timeout=1.0) |
| 344 | |
| 345 | """ |
| 346 | def __init__(self, world, *sensors, **kwargs): |
| 347 | self.world = world |
| 348 | self.sensors = sensors |
| 349 | self.frame = None |
| 350 | self.delta_seconds = 1.0 / kwargs.get('fps', 20) |
| 351 | self._queues = [] |
| 352 | self._settings = None |
| 353 | |
| 354 | def __enter__(self): |
| 355 | self._settings = self.world.get_settings() |
| 356 | self.frame = self.world.apply_settings(carla.WorldSettings( |
| 357 | no_rendering_mode=False, |
| 358 | synchronous_mode=True, |
| 359 | fixed_delta_seconds=self.delta_seconds)) |
| 360 | |
| 361 | def make_queue(register_event): |
| 362 | q = queue.Queue() |
| 363 | register_event(q.put) |
| 364 | self._queues.append(q) |
| 365 | |
| 366 | make_queue(self.world.on_tick) |
| 367 | for sensor in self.sensors: |
| 368 | make_queue(sensor.listen) |
| 369 | return self |
| 370 | |
| 371 | def tick(self, timeout): |
| 372 | self.frame = self.world.tick() |
| 373 | data = [self._retrieve_data(q, timeout) for q in self._queues] |
| 374 | assert all(x.frame == self.frame for x in data) |
| 375 | return data |
| 376 | |
| 377 | def __exit__(self, *args, **kwargs): |
| 378 | self.world.apply_settings(self._settings) |
| 379 | |
| 380 | def _retrieve_data(self, sensor_queue, timeout): |
| 381 | while True: |
| 382 | data = sensor_queue.get(timeout=timeout) |
| 383 | if data.frame == self.frame: |
| 384 | return data |
| 385 | |
| 386 | # ============================================================================== |
| 387 | # -- Main Function-------------------------------------------------------------- |