es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo dividir los datos de escaneo láser de LIDAR en secciones y visualizarlos en RVIZ.

Estaba intentando dividir los datos del rango del escáner láser en subcategorías y me gustaría publicar cada categoría en diferentes temas de láser.

Para ser más específico, el script debería recibir un tema como entrada: /scan, y el script debería publicar tres temas de la siguiente manera: scan1, scan2, scan3.

¿Hay alguna forma de dividir el escaneo láser y publicarlos para poder verlos en rviz?

He intentado lo siguiente:

def callback(laser):
    current_time = rospy.Time.now()
    regions["l_f_fork"] = laser.ranges[0:288]
    regions["l_f_s"] = laser.ranges[289:576]
    regions["stand"] = laser.ranges[576:864]
    l.header.stamp = current_time
    l.header.frame_id = 'laser'
    l.angle_min = 0
    l.angle_max = 1.57
    l.angle_increment = 0
    l.time_increment = 0
    l.range_min = 0.0
    l.range_max = 100.0
    l.ranges = regions["l_f_fork"]
    l.intensities = [0]

    left_fork.publish(l)

    # l.ranges = regions["l_f_s"]
    # left_side.publish(l)

    # l.ranges = regions["stand"]
    # left_side.publish(l)

rospy.loginfo("publicando nueva información")

Puedo ver los diferentes temas en rviz, pero están en la misma línea.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Necesitas configurar el parámetro frame_id de los mensajes publicados con valores diferentes para cada tema. Esto permitirá que RVIZ los muestre como escaneos láser separados. Aquí tienes una versión modificada del código que proporcionaste:

    “`
    import rospy
    from sensor_msgs.msg import LaserScan

    regions = {}

    def callback(laser):
    current_time = rospy.Time.now()
    regions[“l_f_fork”] = laser.ranges[0:288]
    regions[“l_f_s”] = laser.ranges[289:576]
    regions[“stand”] = laser.ranges[576:864]

    # Publicar scan1
    l = LaserScan()
    l.header.stamp = current_time
    l.header.frame_id = "laser_scan1" # Cambia el frame_id para cada tema
    l.angle_min = 0
    l.angle_max = 1.57
    l.angle_increment = 0
    l.time_increment = 0
    l.range_min = 0.0
    l.range_max = 100.0
    l.ranges = regions["l_f_fork"]
    l.intensities = [0]
    scan1.publish(l)
    
    # Publicar scan2
    l = LaserScan()
    l.header.stamp = current_time
    l.header.frame_id = "laser_scan2"
    l.angle_min = 0
    l.angle_max = 1.57
    l.angle_increment = 0
    l.time_increment = 0
    l.range_min = 0.0
    l.range_max = 100.0
    l.ranges = regions["l_f_s"]
    l.intensities = [0]
    scan2.publish(l)
    
    # Publicar scan3
    l = LaserScan()
    l.header.stamp = current_time
    l.header.frame_id = "laser_scan3"
    l.angle_min = 0
    l.angle_max = 1.57
    l.angle_increment = 0
    l.time_increment = 0
    l.range_min = 0.0
    l.range_max = 100.0
    l.ranges = regions["stand"]
    l.intensities = [0]
    scan3.publish(l)
    
    rospy.loginfo("Publicando nuevos escaneos láser")
    

    rospy.init_node(“laser_splitter”)
    rospy.Subscriber(“/scan”, LaserScan, callback)

    Definir los tres temas para publicar

    scan1 = rospy.Publisher(“/scan1”, LaserScan, queue_size=1)
    scan2 = rospy.Publisher(“/scan2”, LaserScan, queue_size=1)
    scan3 = rospy.Publisher(“/scan3”, LaserScan, queue_size=1)

    rospy.spin()

Comments are closed.