psr_21-22 icon indicating copy to clipboard operation
psr_21-22 copied to clipboard

Lidar clustering

Open josepedropinto-pt opened this issue 2 years ago • 1 comments

Boa tarde professor,

Basicamente estamos a tentar fazer o clustering dos pontos do lidar, o objetivo é criar markers apenas para as paredes e excluir os clusters dos robôs. Fizemos isso através do numero de pontos de cada marker. O problema é que ele não está a publicar apenas os que são maiores que o thresh, está a publicar tudo. Já tentamos com o count=30, =300, ou até mesmo =10 000 000. Por isso parece que o problema só pode estar no código. Quando vejo no rviz estão todos os clusters com a mesma cor. Alguma ideia de como resolver isto?

aqui está a função do clustering:

Clustering function

    thresh = 0.8
    marker_array = MarkerArray()
    marker = self.createMarker(0)
    marker_array.markers.append(marker)

    for idx, (range1, range2) in enumerate(zip(msgScan.ranges[:-1], msgScan.ranges[1:])):
        if range1 < 0.1 or range2 < 0.1:
            continue

        diff = abs(range2 - range1)

        if range1 > 3.5 or range2 > 3.5:
            marker = self.createMarker(idx + 1)
            marker_array.markers.append(marker)
            continue

        if diff > thresh:
            marker = self.createMarker(idx + 1)

        theta = msgScan.angle_min + idx * msgScan.angle_increment
        x = range1 * cos(theta)
        y = range1 * sin(theta)

        point = Point(x=x, y=y, z=0)
        
        last_marker = marker
        last_marker.points.append(point)
        count = len(last_marker.points)

        if count > 2000:
            marker_array.markers.append(last_marker)

    rospy.loginfo(f'publishing a marker array with {len(marker_array.markers)} markers')

    # for marker in marker_array.markers:
    #     if len(marker.points) == 0:
    #         marker_array.markers.remove(marker)

    self.clustering_lidar.publish(marker_array) '

e aqui a função para criar o marker:

def createMarker(self, id): marker = Marker() marker.id = id marker.header.frame_id = self.name + '/base_scan' marker.type = marker.CUBE_LIST marker.action = marker.ADD marker.scale.x = 0.05 marker.scale.y = 0.05 marker.scale.z = 0.05 marker.color.r = random.random() marker.color.g = random.random() marker.color.b = random.random() marker.color.a = 1.0 marker.pose.orientation.w = 1.0 marker.pose.position.x = 0 marker.pose.position.y = 0 marker.pose.position.z = 0

    return marker`

josepedropinto-pt avatar Feb 28 '22 19:02 josepedropinto-pt

Olá @josepedropinto-pt ,

Basicamente estamos a tentar fazer o clustering dos pontos do lidar, o objetivo é criar markers apenas para as paredes e excluir os clusters dos robôs. Fizemos isso através do numero de pontos de cada marker.

Este método pode falhar porque o robô pode estar numa posição tal que só vê um bocado pequeno da parede, o que seria um cluster do tamanho de um robô. Na maioria das vezes deve funcionar ...

Mais vale enviar link para o código. Se for privado primeiro convide-me como colaborador.

Nós fizemos isto numa das aulas. Não consegue apenas adaptar esse código de clustering da aula? Deve precisar de poucas alterações ...

miguelriemoliveira avatar Mar 02 '22 14:03 miguelriemoliveira