Semana 29: Instalación de Robotics Academy en Docker y control PID para seguir líneas
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.