Docker container 내에서 open3d를 이용한 geometry visualization할 경우, 다음과 같은 오류가 뜰 수 있다.
No protocol specified
[Open3D WARNING] GLFW Error: X11: Failed to open display unix:1
[Open3D WARNING] Failed to initialize GLFW
[Open3D WARNING] [DrawGeometries] Failed creating OpenGL window.
OpenCV를 이용한 image visualization을 할 때 비슷한 에러가 날 경우, 다음 argument를 추가함으로써 간단히 해결했지만 Open3D는 몇가지가 더 있다.
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY
http://www.open3d.org/docs/release/docker.html
위 홈페이지에 친절하게 적혀있는 내용인데 요약하자면, Rendering을 사용하기 때문에 GPU에 대한 명시를 추가해야 한다.
1) 컨테이너 생성 전, local X11 connection을 허용할 것.
xhost local:root
위와 같이 커맨드를 입력해주면 된다.
non-network local connections being added to access control list
그러면 위와 같은 안내가 나온다. (무슨 뜻인지 나도 잘 모른다.)
2) GPU 정보를 추가할 것.
만약 Intel(Mesa DRiviers) GPU, 흔히 내장 그래픽 카드를 쓸 경우에는 다음과 같이 추가해야 한다.
--device=/dev/dri:/dev/dri
--device=/dev/dri/card0:/dev/dri/card0
--device=/dev/dri/renderD128:/dev/dri/renderD128
셋 중 하나를 고르면 되는데 이건 자세히 모르겠다면 각자 사용하는 PC에서 위 경로를 들어갔을 때 존재하는 것들을 보고 고르면 된다.
만약 NVIDIA GPU를 쓸 경우에는 다음과 같이 추가해야 한다. (대부분 이 경우이지 않을까 싶다. 요즘은)
--gpus 'all,"capabilities=compute,utility,graphics"'
보통 all만 자주 써서 헷갈렸는데 '와 ''을 포함해서 다 적어주어야 한다.
마지막으로 만약 GPU가 전혀 없고 CPU만 쓸 경우에는 다음과 같이 추가해야 한다.
-env OPEN3D_CPU_RENDERING=true
Document에서 말하길, Ubuntu 18.04 이하에서만 입력하면 되고 이상 버전에서는 GPU가 없으면 자동으로 CPU를 선택하기 때문에 입력할 필요가 없다고 한다. 근데 그냥 다 적어주는게 좋은 것 같다.
주의할 점은 여전히 다음 argument는 추가해주어야 한다.
-v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY