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