Extraiga líneas rectas de datos láser

        Si desea cargar de regreso al destino y no desea agregar otros sensores, solo puede confiar en LIDAR para identificar la forma y la posición de la pila de carga.

        Obviamente, la superficie de la pila de carga es una línea recta y plana, por lo que es necesario extraer la línea recta de tantos puntos y luego identificar qué línea recta es la pila de carga. Extraer la línea recta se convierte en el paso inicial.

Una mejor biblioteca de código abierto en GitHub: GitHub - kam3k/laser_line_extraction: un paquete ROS que extrae segmentos de línea de mensajes LaserScan.

El efecto no es malo

temas

      El tema suscrito obviamente se escanea y se publican dos temas: queremos usar /line_segments y /line_markers se usan para mostrar en rviz y se pueden cerrar al iniciar.

configuración

        La lista de configuración es la siguiente, básicamente es fácil de entender, la he dividido en tres categorías para facilitar su comprensión.

frame_id (default: "laser")  # The frame in which the line segments are published.
scan_topic (default: "scan")  # The LaserScan topic.
publish_markers (default: false) # Whether or not markers are published.

-----------------------------------------------------------------------------------------------------

bearing_std_dev (default: 0.001)  # The standard deviation of bearing uncertainty in the laser scans (rad).
least_sq_angle_thresh (default: 0.0001) # Change in angle (rad) threshold to stop iterating least squares (least_sq_radius_thresh must also be met).
least_sq_radius_thresh (default: 0.0001) # Change in radius (m) threshold to stop iterating least squares (least_sq_angle_thresh must also be met).
range_std_dev (default: 0.02) # The standard deviation of range uncertainty in the laser scans (m).

---------------------------------------------------------------------------------------------------------

max_line_gap (default: 0.4) # The maximum distance between two points in the same line (m).
min_line_length (default: 0.5) # Lines shorter than this are not published (m).
min_line_points (default: 9) # Lines with fewer points than this are not published.
min_range (default: 0.4) # Points closer than this are ignored (m).
min_split_dist (default: 0.05) # When performing "split" step of split and merge, a split between two points results when the two points are at least this far apart (m).
# 线段split的阈值,过大时很多线段被合并成一条,过小时,出现很多碎短的线段
outlier_dist (default: 0.05) # Points who are at least this distance from all their neighbours are considered outliers (m).

información

Lo más importante es cómo analizar el mensaje /line_segments después de recibirlo.
El tipo de mensaje es LineSegmentsList, como se muestra a continuación. Esto no es importante.

El tipo de cada segmento, LineSegment, es el más importante:

El inicio y el final son fáciles de entender:

  1. inicio y fin son las coordenadas del punto inicial y del punto final de este segmento de línea, respectivamente.

  2. la covarianza es la matriz de covarianza 2x2 con respecto al radio y el ángulo  
  3. El radio y el ángulo son difíciles de entender, por lo que nos hacemos eco de su mensaje, de la siguiente manera

Se encontraron un total de dos líneas rectas en la imagen de arriba, la línea recta de abajo y la línea recta de la derecha , que corresponden al contenido del cuadro rojo y del cuadro amarillo en la imagen de arriba respectivamente .

Según el sistema de coordenadas en ros, la parte frontal del robot está a 0 grados, el sentido contrario a las agujas del reloj es positivo, los datos del láser están organizados de -90 a 90 grados (mi rango de escaneo láser es de 180 grados), luego los dos segmentos de línea de arriba son de la izquierda A la derecha están 1,2.

De esta manera podemos entender el significado de radio y ángulo. La explicación oficial son los parámetros en coordenadas polares, lo que podemos entender es:

Ángulo: El ángulo entre el origen del robot y la línea vertical de la línea recta. El ángulo se calcula utilizando el robot como sistema de coordenadas. El rango es -PI~PI.
Radio: La distancia entre el origen del robot y la línea recta.

Entonces el cuadro rojo corresponde a la línea recta debajo del robot:

radio = d1 = 1,82962930202;

ángulo = α1 = -0,780158817768;

El cuadro amarillo corresponde a la línea recta del lado derecho del robot:

radio = d1 = 1,37234580517;

ángulo = α1 = 0,789116859436;

referencia 

Supongo que te gusta

Origin blog.csdn.net/qq_34761779/article/details/129914295
Recomendado
Clasificación