-
jetson orin nano에 azure kinect dk SDK + ROS2 humble 설치하기SLAM 2024. 8. 14. 01:31
jetson orin nano에 jetpack6를 설치한 후에 azure kinect dk를 사용하고자 했다. 설치과정이 꽤나 까다로워서 도커파일을 작성했다.
우선 host pc에도 도커파일 내용과 비슷한 방법으로 libk4a1.4, k4a-tools 패키지를 설치해뒀다.
그리고 , sudo 명령어를 사용하지 않고 k4aviewer를 사용하기 위해 아래와 같이 rules 파일을 복사하는 과정을 수행했다.
https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/usage.md#linux-device-setup
그 뒤에 아래 도커파일을 빌드하여 도커 개발환경을 구성한 것이기 때문에 위의 과정이 있었음을 참고하길 바란다.
docker image를 찾다보니 nvidia에서 jetson용으로 이미지를 만들어 둔 것을 찾을 수 있었다.
아래에서 L4T를 키워드로 검색하면 jetson용 이미지를 찾아볼 수 있다.
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-cuda
FROM nvcr.io/nvidia/l4t-cuda:12.2.12-runtime ARG DEBIAN_FRONTEND=noninteractive WORKDIR /root RUN apt-get update && \ apt-get install -y --no-install-recommends \ debconf-utils \ nano \ curl \ git \ build-essential ## install ROS2:humble # Set locale RUN apt-get install -y locales && \ locale-gen en_US en_US.UTF-8 && \ update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 ENV LANG=en_US.UTF-8 # Setup Sources RUN apt-get update && \ apt-get install -y software-properties-common && \ add-apt-repository universe && \ apt-get update && \ curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg && \ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | tee /etc/apt/sources.list.d/ros2.list > /dev/null # Install ROS 2 packages RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y ros-humble-desktop && \ rm -rf /var/lib/apt/lists/* && \ apt-get clean # Add Microsoft package key and repository RUN curl -sSL -O https://packages.microsoft.com/keys/microsoft.asc && \ curl -sSL -O https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb && \ dpkg -i packages-microsoft-prod.deb && \ curl -sSL -O https://packages.microsoft.com/ubuntu/18.04/multiarch/prod/pool/main/libk/libk4a1.4/libk4a1.4_1.4.2_arm64.deb && \ curl -sSL -O https://packages.microsoft.com/ubuntu/18.04/multiarch/prod/pool/main/libk/libk4a1.4-dev/libk4a1.4-dev_1.4.2_arm64.deb && \ curl -sSL -O https://packages.microsoft.com/ubuntu/18.04/multiarch/prod/pool/main/k/k4a-tools/k4a-tools_1.4.2_arm64.deb && \ apt-get update ## The EULA acceptance is done using Debconf ## you can manually set entries in the debconf database to accept the EULA before installing the debian package. ## Refernce : https://github.com/microsoft/Azure-Kinect-Sensor-SDK/issues/1190 RUN echo 'libk4a1.4 libk4a1.4/accepted-eula-hash string 0f5d5c5de396e4fee4c0753a21fee0c1ed726cf0316204edda484f08cb266d76' | debconf-set-selections && \ find /etc/apt/ -name "sources.list" -exec sed -i "s/jammy/focal/g" {} \; && \ apt-get update && \ dpkg -i libk4a1.4_1.4.2_arm64.deb && \ dpkg -i libk4a1.4-dev_1.4.2_arm64.deb && \ apt-get install libsoundio1 && \ dpkg -i k4a-tools_1.4.2_arm64.deb && \ apt-get update && \ find /etc/apt/ -name "sources.list" -exec sed -i "s/focal/jammy/g" {} \; && \ apt-get update WORKDIR /workspace RUN git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
jetpack6는 우분투 22.04버전인데, azure kinect dk SDK는 공식적으로는 18.04만 지원한다. 그래서 편법으로 위와같이 libsoundio1등의 패키지를 설치할 때만 20.04로(18.04가 아닌 20.04이다) 변경해서 설치해주었다.
아래 글을 참고하였다.
https://medium.com/@asandy520/how-to-use-python-to-run-kinect-azure-dk-on-ubuntu-22-04-7c323442c84b
docker run --runtime=nvidia --gpus all --net=host --privileged -it -d -v /dev/bus/usb:/dev/bus/usb -v /dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --device=/dev/snd:/dev/snd -e="QT_X11_NO_MITSHM=1" -v /etc/localtime:/etc/localtime:ro -v <로컬주소>:/data --name <컨테이너 이름> <이미지> /bin/bash
각 옵션에 대한 설명
더보기--runtime=nvidia --gpus all 두 옵션은 gpu를 사용할 수 있게 해주는 옵션이고, all은 gpu 개수를 말한다. host pc의 모든 gpu를 사용할 수 있게 한다는 뜻이다.
--net=host 는 host pc의 네트워크를 사용할 수 있게 해준다.
--privileged 는 host의 하드웨어에 대한 추가 접근 권한을 부여한다. 보안상 주의가 필요하다.
-it 는i는 interactive로 컨테이너와 상호작용(입력)하기 위한 옵션이고, t는 "pseudo-TTY" 또는 "pseudo-terminal"이다. 가상 터미널로서 입출력을 보여주기 위함이다.
-d 컨테이너를 백그라운드에서 실행하게 해주는 옵션이다.(터미널을 꺼도 프로세스가 종료되지 않는다.)
-v /dev/bus/usb:/dev/bus/usb 는 디렉토리를 이어주는 볼륨 설정으로, host의 usb 장치에 접근할 수 있게 해준다.
-v /dev/video0:/dev/video0 는 video 0번째 장치에 접근하게 해준다.
-v /tmp/.X11-unix:/tmp/.X11-unix 는 X11 서버의 소켓 파일을 컨테이너와 공유하여 GUI 애플리케이션이 호스트의 X11 서버를 사용할 수 있게 한다. (컨테이너에서 GUI 애플리케이션인 viewer를 열려고 할 때 필요하다)
-e DISPLAY=unix$DISPLAY 는 DISPLAY 환경 변수를 설정하여 X11 GUI 애플리케이션이 호스트 시스템의 디스플레이를 사용할 수 있게 한다.
--device=/dev/snd:/dev/snd 는 호스트 시스템의 사운드 장치를 공유한다. 컨테이너에서 사운드를 사용할 수 있게 한다.
-e="QT_X11_NO_MITSHM=1" 는 Qt 기반 애플리케이션에서 MIT-SHM (Shared Memory) 확장을 사용하지 않도록 설정한다. 일부 X11 서버와의 호환성 문제를 해결할 수 있다.
-v /etc/localtime:/etc/localtime:ro 는 호스트 시스템의 /etc/localtime 파일을 컨테이너의 /etc/localtime과 읽기 전용(:ro)으로 공유하여 컨테이너에서 호스트와 동일한 시간대를 사용하도록 한다.
-v <로컬주소>:/data 는 host의 폴더와 도커 내부의 /data 폴더를 연결하여 컨테이너와 손쉽게 파일을 공유하기 위함이다.
--name <컨테이너 이름> 는 컨테이너에 이름을 부여한다.
<이미지> 실행할 이미지를 지정해준다.
/bin/bash 컨테이너가 시작될 때 실행할 기본 명령어를 지정한다. bash 셸을 실행하여 대화형 세션을 시작한다.
참고로 도커 내부의 우분투 버전을 확인하는 명령어는 아래와 같다.
cat /etc/lsb-release
jetson orin nano에 azure kinect dk SDK와 ros2 humble이 잘 작동하는 것을 확인했다. (각각 k4aviewer와 tutlesim이 잘 작동했다.)
데스크톱은 20.04버전인데, 위와 비슷한 과정을 수행했지만(amd64를 고려하여 수정했다.) depth 관련한 에러가 발생하여 k4aviewer는 켜지지만 카메라가 작동하지 않았다.
'SLAM' 카테고리의 다른 글
jetson orin nano - jetpack6 to jetpack5 다운그레이드 (0) 2024.11.29 jetson orin nano ubuntu 22.04 설치 (JetPack 6) (0) 2024.08.05