Velodyne LiDAR를 활용한 물체 감지 및 추적 기술

선우진·2023년 11월 17일
0
post-custom-banner

LiDAR 데이터 수신 및 변환

  • '/velodyne_points' 토픽에서 LiDAR 데이터를 받습니다.
  • pc2.read_points 함수를 사용하여 PointCloud2 메시지를 NumPy 배열로 변환합니다.
rospy.Subscriber("/velodyne_points", PointCloud2, self.lidar_callback)

def lidar_callback(self, msg):
    pc_data = pc2.read_points(msg, field_names=("x", "y", "z"), skip_nans=True)
    points = np.array(list(pc_data))

LiDAR 데이터의 범위 설정

수평 각도 범위 내의 포인트 추출

  • Lidar 데이터 중 원하는 수평 방향 각도 범위 내의 포인트를 추출합니다.
horizontal_angles = np.arctan2(points[:, 1], points[:, 0])
angle_filtered_points = points[(horizontal_angles >= self.min_horizontal_angle) & (horizontal_angles <= self.max_horizontal_angle)]

거리 기반 필터링

  • 추출한 포인트들 중에서 원하는 거리 범위 내의 포인트를 필터링합니다.
distances = np.sqrt(angle_filtered_points[:, 0]**2 + angle_filtered_points[:, 1]**2)
desired_distance_min, desired_distance_max = 2.0, 4.0
filtered_points = angle_filtered_points[(distances >= desired_distance_min) & (distances <= desired_distance_max), :]

클러스터링

  • 물체의 형상을 식별하고 추적하기 위해 클러스터링을 진행합니다.
  • HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) 알고리즘을 사용하여 클러스터링을 수행합니다.
clustered_points = self.cluster_points(filtered_points)

def cluster_points(self, points):
    clusterer = hdbscan.HDBSCAN(min_cluster_size=25, min_samples=1, allow_single_cluster=True)
    labels = clusterer.fit_predict(points)
    unique_labels = np.unique(labels)
    clustered_points = [points[labels == label] for label in unique_labels]
    return clustered_points

Clustering의 종류

  1. Distance-based (ex. K-means)
  2. Density-based and grid-based (ex. DBSCAN, HDBSCAN)
  3. Probabilistic and generative (ex. Mixture Distributed)

HDBSCAN은 "Hierarchical Density-Based Spatial Clustering of Applications with Noise"의 약자로, 밀도 기반 공간 클러스터링 알고리즘의 한 종류입니다. HDBSCAN은 주어진 데이터에서 밀도가 높은 클러스터를 식별하는 데 사용되며, 클러스터의 모양과 크기에 덜 민감하게 작동합니다.

-추가자료-
https://godongyoung.github.io/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/2019/07/15/HDBSCAN-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-(with-python).html


바운딩 박스 생성

  • 클러스터된 포인트를 기반으로 각 물체에 대한 3D 바운딩 박스를 생성합니다.
  • 바운딩 박스는 물체의 위치와 크기를 나타냅니다.
bounding_boxes, self.bounding_box_info = self.generate_bounding_boxes(clustered_points, header)

def generate_bounding_boxes(self, clusters, header):
    marker = Marker()
    # 중간 생략
    object_positions = []
    for i, cluster in enumerate(clusters):
        # 중간 생략
        object_positions.append({
            'center': center,
            'extent': extent
        })
    return marker, object_positions

profile
공부하고 있어요!
post-custom-banner

0개의 댓글