5. | Métodos de Sensorización
5.13 Detección de carriles
Introducción
Robobo puede detectar los carriles por los que circula utilizando la cámara del smartphone y un algoritmo de detección. Este algoritmo está explicado con detalle en la página siguiente:
Los carriles básicos están formados por dos líneas rectas, mientras que los carriles pro están formados por dos polinomios de segundo grado.
Este módulo no está implementado en el simulador.
Elementos de programación
5.13.1 Clase LaneBasic
Representa un carril básico detectado por Robobo, formado por dos líneas rectas.
Atributos:
- coeffs1 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea izquierda.
- coeffs2 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea derecha.
- id (int): Número de secuencia de frame. Desde que la cámara se inicial, cada frame tiene un número que lo identifica. El valor es siempre positivo.
5.13.2 Clase LanePro
Representa un carril pro detectado por Robobo, formado por dos polinomios de segundo grado.
Atributos:
- coeffs1 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax² + bx + c), coeficientes de la línea izquierda.
- coeffs2 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax² + bx + c), coeficientes de la línea derecha.
- minv (array): Matriz de transformación para obtener la perspectiva original.
- id (int): Número de secuencia de frame. Desde que la cámara se inicial, cada frame tiene un número que lo identifica. El valor es siempre positivo.
5.13.3 Método startLaneDetection
| startLineDetection() |
|
Habilita la detección de carriles.
La detección de carriles está deshabilitada por defecto. Este cambio es persistente. |
5.13.4 Método stopLaneDetection
| stopLineDetection() |
|
Deshabilita la detección de carriles.
La detección de carriles está deshabilitada por defecto. Este cambio es persistente. |
5.13.5 Método readLaneBasic
| readLineBasic() |
|
Lee el último carril detectado.
Devuelve: |
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que Robobo se mueva en línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes ‘a’ y ‘b’ que forman la recta de uno de los carriles básicos detectados.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob.wait(1)5.13.6 Método readLanePro
| readLinePro() |
|
Lee el último carril pro detectado.
Devuelve: |
Ejemplo de Uso
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que se mueva en línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes ‘a’, ‘b’ y ‘c’ que forman el polinomio de grado 2 de uno de los carriles detectados.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob.wait(1)5.13.7 Método whenALaneBasicDetected
| whenALaneBasicDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un carril básico.
Parámetros: |
Ejemplo de Uso
En el siguiente programa, cuando Robobo detecta un carril simple se llama a una función que leerá los coeficientes ‘a’ y ‘b’ que forman la recta de una de las líneas detectadas.
from robobopy.Robobo import Robobo
def fun():
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALaneBasicDetected(fun)
# el programa se mantiene en ejecución continua
while True:
rob.wait(1)5.13.8 Método whenALaneProDetected
| whenALaneProDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un carril pro.
Parámetros: |
Ejemplo de Uso
A continuación, se muestra un programa que cuando el robot detecte un carril simple llame a una función que leerá los coeficientes ‘a’, ‘b’ y ‘c’ que forman el polinomio de grado 2 de uno de los carriles detectados.
from robobopy.Robobo import Robobo
def fun():
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALaneProDetected(fun)
# el programa se mantiene en ejecución continua
while True:
rob.wait(1)5.13.9 Método setLaneColorInversion
| setLaneColorInversion(set_on) |
|
Configura la inversión de color para el módulo de detección de carriles. Por lo general, se detectan carriles claros sobre fondo oscuro, pero también es posible detectar carriles oscuros sobre fondos claros.
Este cambio es persistente. Parámetros: Advertencia: Solo utiliza esta función si sabes lo que estás haciendo. Una mala configuración podría traer consecuencias inesperadas. |
Ejemplo de Uso
En el siguiente programa, se activa la inversión de color para leer carriles oscuros sobre fondo claro.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.setLaneColorInversion(True)
rob.sayText('Inversión de color activada')5. | Métodos de sensorización
5.13 Detección de carriles
Introducción
Robobo puede detectar los carriles por los que circula utilizando la cámara del smartphone y un algoritmo de detección explicado con detalle en esta página:
Los carriles básicos están formados por dos líneas rectas, mientras que los carriles pro están formados por dos polinomios de segundo grado.
Este módulo no está implementado en el simulador.
Elementos de programación
5.13.1 Clase LaneBasic
Representa un carril básico detectado por Robobo, formado por dos líneas rectas.
Atributos:
• coeffs1 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea izquierda.
• coeffs2 (dict): Diccionario con ‘a’ y ‘b’ (ax + b), coeficientes de la línea derecha.
• id (int): Número de secuencia de frame. Desde que la cámara se inicial, cada frame tiene un número que lo identifica. El valor es siempre positivo.
5.13.2 Clase LanePro
Respresenta un carril pro detectado por Robobo, formado por dos polinomios de segundo grado.
Atributos:
• coeffs1 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax2 + bx + c), coeficientes de la línea izquierda.
• coeffs2 (dict): Diccionario con ‘a’, ‘b’ y ‘c’ (ax2 + bx + c), coeficientes de la línea derecha.
• minv (array): Matriz de transformación para obtener la perspectiva original.
• id (int): Número de secuencia de frame. Desde que la cámara se inicial, cada frame tiene un número que lo identifica. El valor es siempre positivo.
5.13.3 Método startLaneDetection
| startLineDetection() |
|
Habilita la detección de carriles.
La detección de carriles está deshabilitada por defecto. Este cambio es persistente. |
5.13.4 Método stopLaneDetection
| stopLineDetection() |
|
Deshabilita la detección de carriles. La detección de carriles está deshabilitada por defecto. Este cambio es persistente. |
5.13.5 Método readLaneBasic
| readLineBasic() |
|
Lee el último carril detectado.
Devuelve: |
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que Robobo se mueva en línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes ‘a’ y ‘b’ que forman la recta de uno de los carriles básicos detectado.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob.wait(1)5.13.6 Método readLanePro
| readLinePro() |
|
Lee el último carril pro detectado.
Devuelve: |
Ejemplo de Uso
El siguiente programa hace que Robobo habilite la detección de carriles. Luego, hace que se mueva en línea recta de forma indefinida a velocidad 20 y vaya mostrando por pantalla los coeficientes ‘a’, ‘b’ y ‘c’ que forman el polinomio de grado 2 de uno de los carriles detectado.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
while True:
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob.wait(1)5.13.7 Método whenALaneBasicDetected
| whenALaneBasicDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un carril básico.
Parámetros: |
Ejemplo de Uso
En el siguiente programa, cuando Robobo detecta un carril simple se llama a una función que leerá los coeficientes ‘a’ y ‘b’ que forman la recta de una de las líneas detectada.
from robobopy.Robobo import Robobo
def fun():
lane_basic = rob.readLaneBasic()
print(f"El coeficente a del carril es: {lane_basic.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_basic.coeffs1['b']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALaneBasicDetected(fun)
# el programa se mantiene en ejecución continua
while True:
rob.wait(1)5.13.8 Método whenALaneProDetected
| whenALaneProDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un carril pro.
Parámetros: |
Ejemplo de Uso
A continuación, se muestra un programa que cuando el robot detecte un carril simple llame a una función que leerá los coeficientes ‘a’, ‘b’ y ‘c’ que forman el polinomio de grado 2 de uno de los carriles
detectado.
from robobopy.Robobo import Robobo
def fun():
lane_pro = rob.readLanePro()
print(f"El coeficente a del carril es: {lane_pro.coeffs1['a']}")
print(f"El coeficente b del carril es: {lane_pro.coeffs1['b']}")
print(f"El coeficente c del carril es: {lane_pro.coeffs1['c']}")
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.moveWheels(20,20)
rob.whenALaneProDetected(fun)
# el programa se mantiene en ejecución continua
while True:
rob.wait(1)5.13.9 Método setLaneColorInversion
| setLaneColorInversion(set_on) |
|
Configura la inversión de color para el módulo de detección de carriles. Por lo general, se detectan carriles claros sobre fondo oscuro, pero también es posible detectar carriles oscuros sobre fondos claros.
Este cambio es persistente. Parámetros: Advertencia: Solo utiliza esta función si sabes lo que estás haciendo. Una mala configuración podría traer consecuencias inesperadas. |
Ejemplo de Uso
En el siguiente programa, se activa la inversión de color para leer carriles oscuros sobre fondo claro.
from robobopy.Robobo import Robobo
rob = Robobo('10.113.26.150')
rob.connect()
rob.startLaneDetection()
rob.setLaneColorInversion(True)
rob.sayText('Inversión de color activada')