점의 목록 앞에 프레임과 단위가 있다
점군(point cloud)은 같은 해석 계약으로 읽는 여러 공간 점의 집합이다. XYZ만 있을 수도 있고 반사 강도·색·법선 같은 속성이 더 있을 수도 있다. 점 수가 많다고 실제 표면이 완전하게 관측된 것은 아니다. 가림·측정 실패·센서 시야 밖에는 점이 없을 수 있다. 점이 없다는 사실과 빈 공간을 확인했다는 주장은 구분한다.
좌표는 프레임에 대한 값이다. 이 단위의 sensor 프레임은 x 앞·y 왼쪽·z 위, 길이는 m라고 명시한다. REP103 원문의 일반 body 축과 camera optical의 x 오른쪽·y 아래·z 앞은 다르다. M12.02의 optical Z>0 조건을 모든 점군에 그대로 옮기지 않는다. 예를 들어 sensor 좌표의 z=-0.05m는 센서보다 아래라는 뜻일 수 있으며 그 자체로 무효가 아니다.
다른 프레임의 점을 합치려면 같은 시각 기준의 적절한 변환을 적용해야 한다. 좌표의 frame 이름만 바꿔 붙이는 것은 변환이 아니다. mm 자료를 m라고 해석하면 거리·관심영역·voxel 크기를 모두 잘못 적용한다. 또한 실제 회전형 LiDAR의 여러 점이 한 메시지에 담겼다고 모두 같은 순간의 관측인 것은 아니다. 여기서는 모든 점이 같은 합성 시각·프레임에 있다고 가정하고 스캔 중 움직임 보정은 다루지 않는다.
Jazzy PointCloud2 공식 정의는 header의 시각/프레임, fields와 binary data의 배치를 구분한다. organized 점군은 영상처럼 2차원 구조일 수 있고, unorganized 점군의 행 순서가 공간 이웃을 뜻하지는 않는다. 실제 자료에서는 field offset/자료형, point_step/row_step·endian·배열 구조를 확인한다. “XYZ니까 항상 점마다12byte”라고 추측하지 않는다. XYZ 길이 단위의 전용 필드가 자동으로 붙는 것은 아니므로 발행자/센서 인터페이스의 단위 계약도 확인한다. is_dense도 정의된 유효점 표시이지 좌표계·보정·물체 의미가 정확하다는 증명은 아니다.
유효값 검사와 관심영역은 다른 질문이다
먼저 XYZ가 유한한 수인지 확인한다. NaN은 특정한 위치0이 아니라 유효한 수치 좌표가 없음을 나타낼 수 있는 값이다. 이를 원점으로 치환하면 측정 실패를 센서 바로 앞의 점처럼 만들 수 있다. 무효값의 개수와 처리 이유를 남긴다. 영상/픽셀과의 대응을 유지해야 하는 organized 자료를 압축하면 원래 인덱스와의 매핑도 관리한다.
관심영역(ROI, region of interest) 필터는 유효한 좌표 중 이번 과제에서 분석할 범위를 고르는 조건이다. 아래에서는 x만 0≤x<1m로 고르고 y/z는 추가로 자르지 않는다. x=1.00m는 밖이고 x=0은 안이다. 이 선택 밖의 점은 좌표가 틀린 것이 아니라 이번 ROI에서 제외된 것이다. 다른 과제의 범위나 실제 센서 탐지 한계를 이 숫자로 일반화하지 않는다.
이웃이 적은 점을 골라 제외하는 필터는 또 다른 기준이다. 유한값·ROI·공간 밀도의 제외 이유를 모두 “노이즈 삭제”로 뭉치면 원인을 설명하기 어렵다. 특히 가늘거나 먼 물체는 정상 관측이어도 이웃이 적을 수 있다. 필터가 점을 없앴다는 사실로 그 위치에 장애물이 없었다고 결론 내리지 않는다.
작은 합성 점군을 단계별로 남긴다
다음12개는 실제 센서 기록이 아닌 교육용 점이다. 모든 y=z=0.02m이고 x만 다르다. p10의 x는 NaN이다. 이 단순 배치는 3차원 거리 계산이 x 차이의 절댓값과 같아지게 만들며, 일반 점군이 한 줄이라는 뜻은 아니다.
그림 M13.01-1. 각 칸은 서로 다른 역할/근거다. 아래 방향은 자료/처리의 연결이며 실제 성공을 자동으로 보장하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
| ID | x (m) | 유한값/ROI 판정 |
|---|---|---|
| p1 | 0.02 | 유지 |
| p2 | 0.04 | 유지 |
| p3 | 0.12 | 유지 |
| p4 | 0.22 | 유지 |
| p5 | 0.62 | 유지 |
| p6 | 0.64 | 유지 |
| p7 | 0.72 | 유지 |
| p8 | 0.95 | 유지 |
| p9 | 1.50 | 유효 좌표지만 ROI 밖 |
| p10 | NaN | 유효한 수치 좌표 없음 |
| p11 | -0.01 | 유효 좌표지만 이번 ROI 밖 |
| p12 | 1.00 | 유효 좌표지만 ROI 상한 밖 |
유한값 검사 뒤11점, ROI 뒤8점이다. 원래12점은 ROI 유지8·ROI 제외3·무효1로 설명된다. 파일명만 남기지 말고 frame/시각·단위·입력 식별자와 단계별 남긴/제외한 ID·조건을 기록한다. 같은 입력에서 조건을 하나씩 바꿔야 왜 달라졌는지 비교하기 쉽다.
Voxel은 공간을 묶으며 대표점은 관측 요약이다
voxel은 공간을 나누는 작은 3차원 셀이다. 이 예제는 원점 o=(0,0,0)m, 각 축 크기 h=0.1m를 고정하고 key를 아래처럼 정의한다. floor는 그 수보다 크지 않은 가장 큰 정수다. 각 셀은 하한을 포함하고 상한을 제외한다. 식의 j는 x,y,z 각 축을 뜻한다.
x=0.10은 key1, x=0.099는 key0이다. ROI를 적용하기 전 별도 예로 x=-0.01이면 floor(-0.1)=-1이며 정수 변환으로0에 잘라 붙이면 다른 셀이 된다. 격자 원점/경계 규약과 부동소수 표현은 실제 구현에서 확인해야 한다. 이 key 식을 모든 라이브러리의 내부 인덱스 번호와 동일하다고 가정하지 않는다.
PCL VoxelGrid 설명은 셀 안의 점들을 centroid로 요약한다. centroid는 점 좌표의 산술평균이며 셀의 기하학적 중심과 다르다. p1/p2의 대표 x는(0.02+0.04)/2=0.03m다. 이 셀의 중심 x=0.05m를 쓴 것이 아니다. 색·강도·법선 같은 다른 속성은 어떤 방식으로 집계할지 별도로 정한다.
| 대표점 | x key | 원래 ID | 대표 x (m) |
|---|---|---|---|
| A | 0 | p1,p2 | 0.03 |
| B | 1 | p3 | 0.12 |
| C | 2 | p4 | 0.22 |
| D | 6 | p5,p6 | 0.63 |
| E | 7 | p7 | 0.72 |
| F | 9 | p8 | 0.95 |
여기서는 모든 y/z key가0, 대표 y/z도0.02m다. ROI8점이6개 대표점으로 줄었다. 대표점은 두 관측의 요약일 수 있으며 새로 측정한 표면점이라고 단정하지 않는다. 한 셀에 서로 다른 표면이 들어오면 그 사이에 원래 없던 평균점이 생길 수도 있다. 다운샘플링은 계산량을 줄이지만 얇은 물체·경계·표본 수 정보를 잃을 수 있다.
그림 M13.01-2. 3D voxel의 아이디어를 보여 주는 별도 xy 단면도다. 파란 점들을 같은 셀끼리 묶어 주황 평균점으로 요약했다. 대표점은 센서가 그 위치를 직접 측정했다는 뜻이 아니며 본문 계산 표의 원본 점 집합과는 별개다. 직접 제작.
반경 이웃은 어떤 단계의 점을 세는지 명시한다
두 점 p/q의 유클리드 거리는 sqrt((p_x-q_x)²+(p_y-q_y)²+(p_z-q_z)²)다. PCL 반경 이웃 필터 소개는 주변 이웃 수를 사용하는 방법을 설명한다. 여기서는 라이브러리를 실행하는 대신 voxel 뒤 대표점에서, 자기 자신을 제외하고, 거리≤0.11m인 다른 대표점이1개 이상이면 유지라는 교육용 규칙을 정한다. API의 자기 포함 여부·검색 경계·파라미터 기본값과 자동으로 같다고 읽지 않는다.
A-B는0.09m, B-C는0.10m, A-C는0.19m다. D-E는0.09m이고 C-D는0.41m, E-F는0.23m다. 따라서 이웃 수는 A1/B2/C1/D1/E1/F0이다. F만 제외되어5개 대표점이 남는다. F의 원본 p8은 유효하고 ROI 안이었지만 이 밀도 기준에 의해 제외되었다. 이 세 이유를 구별한다.
같은 기준을 바꿔 자기 제외 이웃을2개 이상 요구하면 B만 남는다. 원래 점을 셌을 때와 대표점을 셌을 때도 밀도가 다르다. 예를 들어 p1은 원본의 p2와0.02m 떨어져 있지만 voxel 뒤에는 A 하나로 요약되어 둘을 다시 이웃2개로 세지 않는다. 따라서 필터 순서를 바꾸고 같은 숫자를 썼다고 같은 결과가 나와야 하는 것은 아니다. 같은 좌표의 중복 표본도 새로운 독립 관측을 보장하지 않는다.
군집은 가까움의 연결이며 물체 이름이 아니다
이제 남은5점에서 거리≤tau=0.11m일 때 간선을 잇는다고 하자. 연결 군집은 이 간선을 여러 번 따라가 도달할 수 있는 점들의 묶음이다. PCL Euclidean cluster 소개의 공간 이웃을 확장하는 생각을 작은 그래프로 계산한다. 최소 군집 크기는 대표점2개로 정한다. 이 경계/크기는 이번 과제의 규칙이다.
A-B-C는 A에서 B, B에서 C로 이어져 하나의3점 군집이고 D-E는2점 군집이다. A-C 거리는0.19m로 이번 tau=0.11m보다 커도 같은 군집에 속한다. 군집의 모든 두 점 거리가 tau 이하라는 조건이 아니다. 출력은 {A,B,C}와 {D,E} 두 묶음이다. 센서가 실제 물체 두 개를 정확히 검출했다는 결론은 아직 없다.
별도의 반례로 x=0.30/0.40/0.50m 세 점과 tau=0.11m를 두면 양끝 거리는0.20m여도 중간 점을 거쳐 한 군집이다. 이 중간 점이 두 물체 사이의 잡음이었다면 원하지 않는 합침이 생긴다. 반대로 같은 물체도 가림·희소성으로 간격이 커지면 여러 군집으로 갈라질 수 있다. tau를 크게 한다고 항상 좋아지는 것이 아니다. 평면/바닥 같은 구조를 그대로 두면 물체와 연결될 수 있지만 평면 모델을 맞춰 바닥을 분리하는 일은 거리 군집과 다른 문제이며 여기서는 수행하지 않는다.
점 수가 줄거나 군집2개가 나왔다는 사실만 보고 끝내지 않는다. 입력/frame/시각/단위, 유한/ROI 제외 이유, voxel 원점·크기·원본 매핑, 이웃 규칙/단계, tau/최소크기, 합침/분할·미확인 범위를 남긴다. 다음 M13.02의 정합에서는 이 전처리가 대응점과 잔차에 어떤 영향을 주는지 이어 본다. 현재 필터·군집을 수행했다고 학습 기반 3D 검출이나 실제 주행 안전을 검증한 것은 아니다.