02. docker 기반 px4 개발환경 설정 - pineland/px4 GitHub Wiki

1. Prerequisites

1.1 docker 설치 및 환경설정 : 참조

1.2 nvidia-docker2 설치 : 참조

2. docker 이미지 만들기

2.1 적당한 docker 이미지 다운로드

$ docker pull <Container name>
  • Candidate Container 리스트
Container Description
px4-dev-base Base setup common to all containers
px4-dev-nuttx NuttX toolchain
px4-dev-simulation NuttX toolchain + simulation (jMAVSim, Gazebo)
px4-dev-ros NuttX toolchain, simulation + ROS (incl. MAVROS)
px4-dev-raspi Raspberry Pi toolchain
px4-dev-snapdragon Qualcomm Snapdragon Flight toolchain
px4-dev-clang Clang tools
px4-dev-nuttx-clang Clang and NuttX tools
  • 위의 컨테이너 리스트는 변경될 수 있으므로 PX4 docker list를 확인 필요 : https://hub.docker.com/u/px4io/
    -> 나의 선택 : px4io/px4-dev-ros-melodic

2.2 이미지(컨테이너) 내 그래픽카드 설정

Gazebo와 같은 3D 그래픽 프로그램을 실행시키려면, 호스트 컴퓨터와 이미지(컨테이너) 내 그래픽카드 드라이버(버전)을 맞춰 줘야한다. 그렇지 않으면, gazebo 실행시 다음과 같은 에러 메시지가 발생한다.
       libGL error: failed to load driver: swrast

2.2.1(옵션1) 실행하고자하는 이미지를 H/W accelerated OPENGL을 지원하도록 추가 빌드

이 방법이 가장 우선적으로 추천되는 이유는 도커 컨테이너 내에서 Gazebo를 일반 유저로 실행(예. make px4_sitl_default gazebo)할 수 있다.

2.2.1.1 build & run 모듈 다운로드

$ mkdir ~/Downloads && cd ~/Downloads
$ git clone https://github.com/gklingler/docker3d

2.2.1.2 그래픽 드라이버 다운로드

그래픽 카드가 nvidia인 경우, nvidia 공식 드라이버 홈페이지에서 호스트에 설치된 버전과 같은 버전을 다운로드
* 호스트에 nvidia 카드 이외의 그래픽 카드가 설치된 경우에는 위 참고 사이트 참조할 것

2.2.1.3 드라이버를 작업디렉토리로 이동하고 빌드관련 스크립트 수정

$ mv ./NVIDIA-Linux-x86_64-410.104.run ./docker3d/ubuntuWithNvidiaDriver/.
$ cd ./docker3d/ubuntuWithNvidiaDriver
$ vi ./build.sh                     # 빌드되는 이미지명 수정 및 다운로드 받은 Driver 명으로 수정
  IMAGE_NAME=ubuntu_with_nvidia_driver   ->   IMAGE_NAME=px4-dev-ros:shao 
  NVIDIA-Linux-x86_64-337.12.run   ->   NVIDIA-Linux-x86_64-410.104.run
$ vi ./Dockerfile                 # 2.1번에서 다운로드 받은 이미지 명으로 수정, NVIDIA 드라이버 실행 전 kmod 설치명령어 추가
  FROM ubuntu   ->    FROM px4io/px4-dev-ros:latest
                ->    RUN apt-get install -y kmod
$ ./build.sh         # px4-dev-ros:latest 기반 H/W accelerated OPENGL 지원을 위한 이미지를 빌드
$ docker images      # px4-dev-ros:shao 이 생성된 것을 확인할 수 있다.

2.2.2(옵션2) 실행 이미지(컨테이너) 내에서 그래픽 드라이버 설치(설정)

2.2.2.1 apt를 이용한 설치

$ apt install nvidia-driver-xxx  ;root인 경우. 도커 이미지를 root로 실행하려면, -u 0 옵션을 추가
$ sudo apt install nvidia-driver-435  ;일반유저로 버전이 435인 nvidia 그래픽카드 드라이버를 설치하는 경우. 
  * 참고 : 컨테이너 내에서 root로 passwd를 이용하여 사용자 패스워드 변경가능 

2.2.3(옵션3) 그래픽 드라이버 파일을 이용한 설치

2.2.3.1 그래픽 드라이버 파일 다운로드

호스트에서 다운받아 호스트와 컨테이너가 공유하는 디렉토리(예. /src)에 놓는다.

2.2.3.2 설치(컨테이너 내에서 다운받은 디렉토리에 가서 root로 실행)

./NVIDIA-DRIVER.run -a -N --ui=none --no-kernel-module

3. 추후 생성되는 Docker container 내에서 빌드할 PX4 source code 다운로드

$ mkdir src
$ cd src
$ git clone https://github.com/PX4/Firmware.git
$ cd Firmware 

위와 같이 해서 docker 실행 시 -v 옵션을 통해 매핑할 수도 있고, 이미지를 통해 생성된 컨테이너 내에서 위의 명령어들을 실행할 수도 있다.

4. docker 이미지 실행

아래의 여러가지 옵션을 조합하여 사용할 수 있다.

$ ./run.sh             # 실제로 run.sh보다 아래의 명령어 라인이 더 구체적이다.

또는

$ xhost +              # enable access to xhost from the container
$ docker run --runtime=nvidia --privileged -e "DISPLAY=unix:0.0" \
  -v="/tmp/.X11-unix:/tmp/.X11-unix:rw" -p 14556:14556/udp \
  --name container_name1 -it px4-dev-ros:shao /bin/bash

또는

$ docker run -it --privileged --env=LOCAL_USER_ID="$(id -u)" \
  -v /home/pineland/src:/src:rw -v /tmp/.X11-unix:/tmp/.X11-unix:ro \
  -e DISPLAY=:0 -p 14556:14556/udp --name=px4-dev-simulation-bionic_shao \
  px4-dev-simulation-bionic:shao /bin/bash

5. Container 내에서 SITL 실행

$ cd /src/Firmware        <-- 위 3번에서 Host 디렉토리와 매핑되었을 경우는 매핑된 디렉토리
$ make px4_sitl_default gazebo

기타

  • Error response from daemon: OCI runtime create failed 에러 발생 시
    nvidia-driver 버전을 시스템 지원 사양에 맞춰 업그레이드 하여야 한다. 예)384 버전 -> 41X 버전
  • docker 이미지 컨테이너 안에서 ros 작업하기 위한 초기 환경 설정은 여기를 참고하기 바란다.
  • gazebo에 의한 시뮬레이션 예제는 여기를 참고하기 바란다.
  • px4 Hardware 연결을 통한 예제는 여기를 참고하기 바란다.