UD04 · EX2 — Navegar con cámara¶
Esta vez, haremos un seguidor de línea usando la cámara del robot. Para hacer esto, usaremos la cámara para capturar imágenes del suelo y procesarlas para detectar la línea. Luego usaremos la información obtenida para controlar el robot y hacer que siga la línea.
Para hacer esto, usaremos la librería opencv para procesar imágenes y aitk.robots para controlar el robot.
Comencemos por instalar e importar las librerías necesarias:
!pip install aitk numpy opencv-python-headless matplotlib requests Pillow
import aitk.robots as bots
import numpy as np
import matplotlib.pyplot as plt
import cv2
Seguidor de línea simple¶
Crearemos el mundo de Robot y Robot. Necesitaremos la imagen del mapa para este ejemplo (tienes 5 diponibles de EX2_pista_1.png a EX2_pista_5.png), contiene una pista con una línea negra.
El robot tendrá una cámara que capturará imágenes del suelo y las procesará para detectar la línea. Será de tipo GroundCamera y la añadiremos al robot.
nom_imatge = "EX2_pista_1.png"
# Cargamos la imagen en una variable
img = cv2.imread(nom_imatge)
# Mostramos la imagen
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
<matplotlib.image.AxesImage at 0x7f40671da1d0>
world = bots.World(220, 180, boundary_wall_color="yellow", ground_image_filename=nom_imatge)
robot = bots.Scribbler(x=24, y=90, a=90)
robot.add_device(bots.GroundCamera(width=120, height=50))
world.add_robot(robot)
robot['ground-camera'].watch()
world.watch()
Random seed set to: 9750301
HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') Image(value=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00x\x00\x00\x002\x08\x06\x00\x00\x00\x97\xa7\x1f\xd…
Image(value=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x0…
Implementa la función controlador_cam que será el que tendrá que controlar el robot. Puedes basarte en el ejemplo hecho en UD04_N01_introduccion_opencv.ipynb para detectar la línea (ten en cuenta que la cámara aquí está debajo del robot, por lo que si usamos la parte inferior de la imagen seguramente el robot sea demasiado inestable, sería mejor usar la parte superior de la imagen) y en el ejemplo hecho en UD04_N03_ejemplos_robots.ipynb para controlar el robot.
def controlador_cam(robot):
cam = robot['ground-camera']
image = cam.get_image()
# Detectamos la línea de pista y controlamos el robot para seguirla
world.reset()
world.seconds(60, [controlador_cam], real_time=True)
Using random seed: 9750301
0%| | 0/600 [00:00<?, ?it/s]
Simulation stopped at: 00:01:00.00; speed 0.97 x real time
Seguidor de doble línea (mantenerse en el camino)¶
Adapte el seguidor de la línea para que el robot pueda seguir dos líneas paralelas y permanecer en el camino. Para hacer esto, usaremos la imagen EX2_pista__6.png que contiene dos líneas paralelas.
nom_imatge = "EX2_pista_6.png"
# Cargamos la imagen en una variable
img = cv2.imread(nom_imatge)
# Mostramos la imagen
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
<matplotlib.image.AxesImage at 0x7f40731815d0>
world = bots.World(220, 180, boundary_wall_color="yellow", ground_image_filename=nom_imatge)
amplada_camera = 120
alcada_camera = 50
robot = bots.Scribbler(x=36, y=80, a=90)
robot.add_device(bots.GroundCamera(width=amplada_camera, height=alcada_camera))
world.add_robot(robot)
robot['ground-camera'].watch()
world.watch()
Random seed set to: 118642
HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') Image(value=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00x\x00\x00\x002\x08\x06\x00\x00\x00\x97\xa7\x1f\xd…
Image(value=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x0…
def controlador_cam(robot):
cam = robot['ground-camera']
image = cam.get_image()
# Detectamos el camino y controlamos el robot para que lo siga
world.reset()
world.seconds(60, [controlador_cam], real_time=False)
Using random seed: 118642
0%| | 0/600 [00:00<?, ?it/s]
Simulation stopped at: 00:01:00.00; speed 198.25 x real time