2 minute read

Instalación de Robotics Academy en Docker

Con el objetivo de avanzar en un nuevo aporte para el TFG, con la idea de avanzar sobre un sistema de navegación, se ha propuesto estudiar sobre el Control PID. Para ello, fue recomendado estudiar el ejercicio de Follow Line en Robotics Academy

Configuración del entorno Docker

Para poder realizar dicho ejercicio, primero fue necesaria la instalación de Docker Engine, siguiendo los pasos de instalación oficiales.

Robotics Academy

Tras la configuración del Docker, se pudo continuar con la instalación de Robotics Academy como se indicaba en la guía, primero haciendo el pull tanto del Robotics Academy como de su Database:

docker pull jderobot/robotics-database:latest
docker pull jderobot/robotics-academy:latest

Después se inicio ambos contenedores para poder empezar con el ejercicio:

docker run --hostname my-postgres --name academy_db -d \
  -e POSTGRES_DB=academy_db \
  -e POSTGRES_USER=user-dev \
  -e POSTGRES_PASSWORD=robotics-academy-dev \
  -e POSTGRES_PORT=5432 \
  -p 5432:5432 \
  jderobot/robotics-database:latest
docker run --rm -it $(nvidia-smi >/dev/null 2>&1 && echo "--gpus all" || echo "") \
  --device /dev/dri \
  -p 6080:6080 -p 1108:1108 -p 7163:7163 -p 7164:7164 \
  --link academy_db \
  jderobot/robotics-academy:latest

El contenedor inicia un servidor Django en http://localhost:7164/, donde pueden ejecutarse los ejercicios desde el navegador. Se confirmó el correcto funcionamiento de la base de datos (academy_db) y del entorno web de simulación.

Ejercicio: Follow Line

El objetivo de este ejercicio es diseñar un controlador visual que siga una línea roja en el suelo utilizando la cámara del vehículo. Para ello se desarrolló un script basado en OpenCV y un control PID simple. Primero se estudiaron algunas guías recomendadas por el ejercicio para la realización de la detección de color de la línea, el calculo del centro mediante de la línea mediante el uso de momentos geométricos y una explicación extra para entender el funcionamiento de un control PID

Detección de la línea roja

Para aislar la línea en la imagen BGR se aplicó una máscara por color, dado que en el entorno simulado las condiciones de iluminación son estables:

color_limit = ([0,0,150],[80,80,255])
lower = np.array(color_limit[0], dtype="uint8")
upper = np.array(color_limit[1], dtype="uint8")

mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask=mask)

Cálculo del centro de la línea

Para determinar la posición de la línea se emplearon momentos geométricos:

M = cv2.moments(mask)
if M["m00"] != 0:
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
else:
    cX, cY = 0, 0

De esta forma se obtiene el centroide de la zona roja detectada, que se compara con el centro ideal de la imagen (x_center).

Control PID

El error se define como la diferencia horizontal entre el centro de la cámara y el centro de la línea detectada:

    error = xcenter​−cX​​

Y se aplica un control PID clásico sobre la velocidad angular del vehículo:

Kp = 0.002
Ki = 0.0
Kd = 0.001

integral += error
derivative = error - previous_error
w = Kp * error + Ki * integral + Kd * derivative

Para evitar oscilaciones bruscas, la velocidad lineal se ajusta dinámicamente según el giro:

v_max, v_min = 4.0, 1.0
v = v_max - 2.0 * abs(w)
v = max(v, v_min)

Resultados

Observaciones

Después de la realización del ejercicio de Robotics Academy y el previo estudio del control PID, el objetivo de la proxima semana será implementar dicho ejercicio en el simulador CARLA en el nuevo mapa que se está creando sobre un pinar.