728x90
๋ฐ์ํ
๐๏ธ ์ค์ LiDAR ๋ฐ์ดํฐ ๋ค์ด๋ก๋ ๋ฐ ์๊ฐํ ๋ฐฉ๋ฒ
๐ 1. ๋ฐ์ดํฐ ๋ค์ด๋ก๋
๐ ์ถ์ฒ ๊ณต๊ฐ LiDAR ๋ฐ์ดํฐ์ :
- KITTI Vision Benchmark Suite (์์จ์ฃผํ์ฉ ๋ฐ์ดํฐ)
- ์น์ฌ์ดํธ: KITTI Dataset
- ๐ ๋ฐ์ดํฐ ํ์: .bin (์ ๊ตฌ๋ฆ), .png (์ด๋ฏธ์ง)
- ๐ ํน์ง: ์์จ์ฃผํ ์ฐจ๋ ์ผ์ ๋ฐ์ดํฐ (LiDAR, ์นด๋ฉ๋ผ ํฌํจ)
- SemanticKITTI (KITTI ํ์ฅ ๋ฒ์ - ํฌ์ธํธ ํด๋ผ์ฐ๋ ๋ผ๋ฒจ ํฌํจ)
- ์น์ฌ์ดํธ: SemanticKITTI
- ๐ ๋ฐ์ดํฐ ํ์: .bin + .label
- Ford LiDAR Dataset
- ์น์ฌ์ดํธ: Ford Campus Dataset
- ๐ข ํน์ง: ๋์ฌ ์ฃผํ LiDAR ๋ฐ์ดํฐ
- Open3D ์ํ ๋ฐ์ดํฐ (๊ฐ๋ณ๊ฒ ์์ํ๊ธฐ์ ์ถ์ฒ)
- GitHub: Open3D Sample Data
- ๐ ํ์ผ ์์: fragment.pcd, sample.ply ๋ฑ
๐ KITTI Dataset ๋ค์ด๋ก๋ (์์จ์ฃผํ ๋ฐ์ดํฐ)
๐ KITTI ํํ์ด์ง: KITTI Vision Benchmark
๐ป ๋ค์ด๋ก๋ ๋ฐ ์์ถ ํด์ :
bash
wget http://www.cvlibs.net/download.php?file=data_odometry_velodyne.zip unzip data_odometry_velodyne.zip
โ
๋ค์ด๋ก๋ ์๋ฃ ํ:
data_odometry_velodyne/dataset/sequences/00/velodyne/ ๊ฒฝ๋ก์ .bin ํฌ์ธํธ ํด๋ผ์ฐ๋ ํ์ผ ์กด์ฌ
โ KITTI .bin ๋ฐ์ดํฐ ์๊ฐํ ์ฝ๋
import open3d as o3d
import numpy as np
def load_kitti_bin(file_path):
data = np.fromfile(file_path, dtype=np.float32).reshape(-1, 4)
points = data[:, :3] # XYZ ์ขํ๋ง ์ฌ์ฉ
return points
# ๐ .bin ํ์ผ ๊ฒฝ๋ก
bin_file = "data_odometry_velodyne/dataset/sequences/00/velodyne/0000000000.bin"
# ๋ฐ์ดํฐ ๋ก๋
points = load_kitti_bin(bin_file)
# ํฌ์ธํธ ํด๋ผ์ฐ๋ ์์ฑ ๋ฐ ์๊ฐํ
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
o3d.visualization.draw_geometries([pcd], window_name="KITTI LiDAR Point Cloud")
โ ์คํ ์: KITTI ์์จ์ฃผํ ๋ฐ์ดํฐ์ ํฌ์ธํธ ํด๋ผ์ฐ๋ ํ์ ๐๐ก
๐ฅ Open3D ์ํ ๋ฐ์ดํฐ ๋ค์ด๋ก๋ (๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ)
๐ป ํฐ๋ฏธ๋ ์ฌ์ฉ ์ (Linux/macOS/Windows WSL):
bash
wget https://github.com/isl-org/Open3D/releases/download/20220201-test_data/fragment.pcd
๋๋ ์ง์ ๋ค์ด๋ก๋
fragment.pcd ๋ค์ด๋ก๋ ๋งํฌ
๐ 2. ๋ค์ด๋ก๋ํ LiDAR ๋ฐ์ดํฐ ์๊ฐํ ์ฝ๋
๐ฅ Open3D๋ก .pcd ํ์ผ ์๊ฐํ
python
import open3d as o3d
# ๐ ๋ค์ด๋ก๋ํ .pcd ํ์ผ ๊ฒฝ๋ก
pcd_file = "fragment.pcd"
# ๐๏ธ ํฌ์ธํธ ํด๋ผ์ฐ๋ ๋ก๋
pcd = o3d.io.read_point_cloud(pcd_file)
# ๐ ์๊ฐํ ์คํ
o3d.visualization.draw_geometries([pcd], window_name="LiDAR Point Cloud", width=800, height=600, point_show_normal=False)
๐ ๊ธฐ๋ฅ:
โ
ํ์ : ๋ง์ฐ์ค ์ขํด๋ฆญ
โ
์ด๋: ๋ง์ฐ์ค ์ฐํด๋ฆญ
โ
ํ๋/์ถ์: ๋ง์ฐ์ค ํ
๐จ 3. ์ปฌ๋ฌ ํฌ์ธํธ ํด๋ผ์ฐ๋ ์๊ฐํ (์ต์ )
python
import open3d as o3d
import numpy as np
# PCD ํ์ผ ๋ก๋
pcd = o3d.io.read_point_cloud("fragment.pcd")
# ๋ฌด์์ ์ปฌ๋ฌ ์ถ๊ฐ
colors = np.random.rand(np.asarray(pcd.points).shape[0], 3) pcd.colors = o3d.utility.Vector3dVector(colors)
# ์๊ฐํ
o3d.visualization.draw_geometries([pcd], window_name="Colored LiDAR Point Cloud", width=800, height=600)
โ ๊ฐ ์ ์ ๋ฌด์์ ์์์ด ์ ์ฉ๋์ด ์๊ฐ์ ์ผ๋ก ๋ ์ง๊ด์ ์ ๋๋ค.
๐ 4. ๊ณ ๊ธ ๊ธฐ๋ฅ (์ต์ )
โ ๋ ธ์ด์ฆ ์ ๊ฑฐ:
# ํต๊ณ์ ๋
ธ์ด์ฆ ์ ๊ฑฐ
pcd, ind = pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) o3d.visualization.draw_geometries([pcd])
โ Voxel Downsampling (๋ฐ์ดํฐ ๊ฒฝ๋ํ)
pcd_down = pcd.voxel_down_sample(voxel_size=0.05) o3d.visualization.draw_geometries([pcd_down])
โ ๋ ธ๋ฉ ๋ฒกํฐ ์๊ฐํ
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) o3d.visualization.draw_geometries([pcd], point_show_normal=True)
๐ ๋ง๋ฌด๋ฆฌ ๋ฐ ์ถ์ฒ ํ๋ฆ:
- ๊ฐ๋จํ ์๊ฐํ: Open3D ์ํ ๋ฐ์ดํฐ๋ก ๋น ๋ฅด๊ฒ ํ์ธ
- ์์จ์ฃผํ ๋ฐ์ดํฐ ์ฐ์ต: KITTI๋ SemanticKITTI๋ก ์ค์ ๋ฐ์ดํฐ ๋ค๋ฃจ๊ธฐ
- ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ ์ต์ ํ: ๋ ธ์ด์ฆ ์ ๊ฑฐ, ๋ค์ด์ํ๋ง ์ ์ฉ
- SLAM์ด๋ ๊ฐ์ฒด ์ธ์์ ํ์ฅ: LiDAR ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉ
๋ฌธ์ ๋ฐ์ ์:
- ๊ทธ๋ํฝ ๋๋ผ์ด๋ฒ ์ ๋ฐ์ดํธ
- Python 3.8~3.10 ๊ถ์ฅ
728x90
๋ฐ์ํ