psr_21-22
psr_21-22 copied to clipboard
Lidar clustering
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`
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 ...