2 minute read

Esta semana el objetivo fue modificar el script o3d-lidarViz.py, un Visor 3D en tiempo real con CARLA realizado por algunos compañeros, para que al dar un botón se intercambiase entre control manual o automático y añadir los controles manuales.

o3d-lidarViz-manual.py

spawn_vehicle_lidar_camera()

Ha esta función se la ha añadido el spawn de la camara para poder visualizar el coche en tercera persona, ya que antes solo aparecian el vehículo y el sensor LiDAR.

def spawn_vehicle_lidar_camera(world, bp, traffic_manager, delta):
    vehicle_bp = bp.filter('vehicle.*')[0]
    spawn_points = world.get_map().get_spawn_points()
    spawn_point = random.choice(spawn_points)
    vehicle = world.spawn_actor(vehicle_bp, spawn_point)

    lidar_bp = bp.find('sensor.lidar.ray_cast')
    lidar_bp.set_attribute('range', '100')
    lidar_bp.set_attribute('rotation_frequency', str(1 / delta))
    lidar_bp.set_attribute('channels', '64')
    lidar_bp.set_attribute('points_per_second', '500000')
    lidar_position = carla.Transform(carla.Location(x=-0.5, z=1.8))
    lidar = world.spawn_actor(lidar_bp, lidar_position, attach_to=vehicle)

    camera_bp = bp.find('sensor.camera.rgb')
    camera_bp.set_attribute('image_size_x', '800')
    camera_bp.set_attribute('image_size_y', '600')
    camera_bp.set_attribute('fov', '90')
    camera_transform = carla.Transform(carla.Location(x=-4.0, z=2.5))
    camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)

    vehicle.set_autopilot(True, traffic_manager.get_port())
    return vehicle, lidar, camera

camera_callback()

Se añadió la función que procesa el formato de las imágenes recibidas por la camara para hacerlas visualizables y las muestra en la pantalla mediante Pygame.

def camera_callback(image, display_surface):
    array = np.frombuffer(image.raw_data, dtype=np.uint8)
    array = np.reshape(array, (image.height, image.width, 4))
    array = array[:, :, :3]  # Quitar el canal alfa
    array = array[:, :, ::-1]  # Convertir de BGRA a RGB
    surface = pygame.surfarray.make_surface(array.swapaxes(0, 1))
    display_surface.blit(surface, (0, 0))
    # Actualizar solo esta superficie en vez de toda la pantalla
    pygame.display.update(display_surface.get_rect())

vehicle_control()

Finalmente, también se creo la función encargada de detectar que teclas son pulsadas y que acción realizan. Cuando es pulsada la R se cambia entre control automático y manual, con un tiempo de descanso para evitar múltiples activaciones. Después, para el control manual se usó:

  • W: acelerar.
  • A: giro a la izquierda.
  • D: giro a la derecha.
  • S: frenar.
def vehicle_control(vehicle):
    global manual_mode
    control = carla.VehicleControl()  # Crear un control en blanco

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            cleanup()
            sys.exit()

        if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
            manual_mode = not manual_mode
            vehicle.set_autopilot(not manual_mode)
            mode = "manual" if manual_mode else "automático"
            print(f"\nCoche en modo {mode}.")
            time.sleep(0.3)  # Evitar múltiples activaciones por pulsación rápida

    # Aplicar controles si estamos en modo manual
    keys = pygame.key.get_pressed()
    if manual_mode:
        control.throttle = 1.0 if keys[pygame.K_w] else 0.0
        control.brake = 1.0 if keys[pygame.K_s] else 0.0
        control.steer = -0.3 if keys[pygame.K_a] else 0.3 if keys[pygame.K_d] else 0.0
        vehicle.apply_control(control)

main()

También se tuvieron que realizar algunos cambios en main para inicializar camera_callback() y vehicle_control(), pero no se realizaron cambios significativos.

Resultado

Datasets RELLIS-3D y GOOSE

Se descargaron y se estudiaron las estructuras de ambos datasets para usarlos de referencia en el futuro, viendo los tipos de datos que utilizan y como están organizados dichos datos en cada caso.

Problemas

  • Open3D: Debido a que no se consiguó solucionar los problemas de Violación de segmentación, se tuvo que comentar el código relacionado con este. Por lo tanto, no se podía comprobar si él código funcionaba correctamente con el visor de los puntos LiDAR y la cámara del vehículo. Se decidió pedir ayuda a otro compañero, Félix Martínez Alonso, ya que él no tenía dicho problema. Al iniciar el programa o3d-lidarVizFinal.py notó que el visor de puntos estaba en negro, pero lo consiguió solucionar e hizo algunos cambios al programa, resultando en el o3d-lidarViz-manual.py.