Open3D 설치 및 확인
Open3D
LiDAR 같은 경우 point cloud 데이터를 처리
Point Cloud를 처리하는 대표적인 라이브러리는 PCL과 Open3D
OS : Ubuntu 23.10
GPU : NVIDIA GeForce RTX 4080 Laptop GPU
ROS version: ROS1 Noetic
Open3D 설치
1. 지원 환경 확인
- Python 3.7 이상
- Ubuntu 18.04 이상
- macOS 10.15 이상
- Windows 10 64 bit 이상
2. Open3D 설치
-
pip을 이용한 설치
pip install open3d
-
설치 확인
python -c "import open3d as o3d; print(o3d.__version__)"
3. Docker 이용한 설치
내가 가장 많이 사용하는 pytorch docker image를 이용하여 실습 진행
- 그냥 귀찮아서…
Error 해결
아래 예시를 진행하면서 open3d를 이용하여 시각화를 진행하는 과정 중에서 아래와 같은 에러가 발생
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
[Open3D WARNING] GLFW Error: GLX: Failed to create context: BadMatch (invalid parameter attributes)
[Open3D WARNING] Failed to create window
[Open3D WARNING] [DrawGeometries] Failed creating OpenGL window.
아무리 고치려고 해도 힘들었는데 공식 문서에서 제공해준 방법대로 docker run을 하여 해결함..
--gpus 'all,"capabilities=compute,utility,graphics"'
--gpus all
를 위와 같이 바꾸어 실행하였더니 해결됨
공식문서 잘 읽어야겠다..
docker run --gpus 'all,"capabilities=compute,utility,graphics"'\
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
--device=/dev/video0:/dev/video0 \
-e DISPLAY=$DISPLAY \
-v /workspace:/workspace \
--ipc=host --env QT_X11_NO_MITSHM=1 \
--name o3d_example -it \
pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel
Open3D 실습
설치 확인을 위한 실습
포인트 클라우드 불러오기
- Open3D에서 기본으로 제공하는 예제 또는 가지고 있는 ply 파일 통해 불러오기 가능
ply_point_cloud = o3d.data.PLYPointCloud() # PLYPointCloud 객체 생성
# o3d.id.read_point_cloud("test.ply") # 보통 이런 방식으로 불러옴
# 일단은 별도로 가지고 있지 않기 때문에 기본 제공 데이터 사용
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.array(pcd.points))
print(np.array(pcd.colors))
print(np.array(pcd.normals))
o3d.visualization.draw_geometries([pcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795], # camera front view에 대한 설정
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024])
Attribute error: module ‘open3d’ has no attribute ‘data’
라는 오류 발생
- open3d 0.15 이상 version 설치
다운샘플링
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795], # camera front view에 대한 설정
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024])
노말 벡터 추정
if downpcd.has_normals(): # Downsample 된 point가 normal을 가지고 있음을 의미
print("True")
else:
print("False")
downpcd.estimate_normals(
search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)
)
downpcd = pcd.voxel_down_sample(voxel_size=0.05)
o3d.visualization.draw_geometries([downpcd],
zoom=0.3412,
front=[0.4257, -0.2125, -0.8795], # camera front view에 대한 설정
lookat=[2.6172, 2.0475, 1.532],
up=[-0.0694, -0.9768, 0.2024],
point_show_normal=True)
참고