ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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는 켜지지만 카메라가 작동하지 않았다. 

     

    댓글

Designed by Tistory.