일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- C++
- GPS
- Gazebo
- QT
- 자율주행
- 자율탐사
- ROS
- Simulation
- 젯슨
- ZED2
- ubuntu
- 터틀심
- 티스토리챌린지
- ROS2
- Visual SLAM
- 강화학습
- Puck LITE
- turtlebot3
- 인공지능
- turtlesim
- RTK
- DevOps
- 오블완
- 로봇
- Jetson
- GUI
- SLAM
- WSL
- U-blox
- WSL2
- Today
- Total
직관적인느낌
Docker를 활용한 SLAMNAV2 환경 구축 및 이미지 관리 방법 본문
최근 로봇의 SLAM(동시 위치추정 및 지도작성)이나 Navigation과 같이 실시간성이 중요한 프로그램을 Docker 컨테이너에서 실행하는 경우가 늘어나고 있습니다. 이번 포스트에서는 Ubuntu 기반 Docker 이미지를 생성하고, 비루트 사용자(예: rainbow)로 실행하는 방법, USB 카메라 연결 및 실시간 영상 스트리밍 테스트, 컨테이너 상태를 이미지로 저장(커밋)하고 이를 Windows 환경으로 전송하는 방법까지 상세히 다루어 보겠습니다.
1. Ubuntu 22.04 기반 Docker 컨테이너 생성 및 설정
1.1 Ubuntu 22.04 이미지 다운로드
우선, Ubuntu 22.04 공식 이미지를 Docker Hub에서 내려받습니다.
sudo docker pull ubuntu:22.04
1.2 컨테이너 실행 및 사용자 변경
기본 컨테이너는 root로 실행되지만, 보안이나 운영상의 이유로 루트 계정이 아닌 일반 사용자(예: robot)로 실행하고자 할 때는 다음과 같이 진행합니다.
1. root 사용자로 컨테이너 실행
sudo docker run -it --name my_ubuntu --user root ubuntu:22.04 bash
2. 컨테이너 내부에서 새로운 사용자 생성
adduser robot
# 안내에 따라 비밀번호 및 기본 정보를 입력 (Enter를 눌러 기본값 선택 가능)
3. 필요 시 rainbow 사용자에게 sudo 권한 부여
apt update && apt install -y sudo
usermod -aG sudo robot
echo 'robot ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
4. rainbow 사용자로 전환
su - robot
5. 새로운 사용자를 기본 사용자로 설정하여 컨테이너 이미지 커밋
컨테이너 내에서 설정을 완료한 후, root 상태로 돌아가서 해당 상태를 새로운 이미지로 저장합니다.
exit # rainbow에서 나와 root로 복귀한 후 컨테이너 종료
sudo docker commit my_ubuntu ubuntu_robot
이제 ubuntu_robot 이미지는 robot 사용자가 포함된 Ubuntu 컨테이너 상태를 유지합니다.
2. USB 카메라 연결 및 실시간 영상 스트리밍 테스트
실시간 SLAM이나 Navigation 애플리케이션은 센서 데이터의 지연 없이 빠르게 처리되어야 합니다. 호스트 PC에 연결된 USB 카메라를 Docker 컨테이너에 연결하여 영상 데이터를 읽는 방법은 다음과 같습니다.
2.1 USB 카메라 장치 확인 (호스트)
호스트에서 아래 명령어로 연결된 카메라 장치를 확인합니다.
ls /dev/video*
예를 들어, /dev/video4와 /dev/video5가 표시된다면 해당 장치를 컨테이너에 전달할 수 있습니다.
2.2 컨테이너 실행 시 USB 장치 마운트
컨테이너를 실행할 때 --device 옵션을 사용하여 USB 카메라 장치를 전달합니다.
sudo docker run -it --name my_slamnav2 \
--device /dev/video4:/dev/video4 \
--device /dev/video5:/dev/video5 \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ubuntu_robot bash
2.3 영상 스트리밍 테스트
컨테이너 내부에서 ffmpeg, mplayer, VLC, 또는 GStreamer 등을 사용하여 실시간 영상 스트리밍을 확인할 수 있습니다.
예시 (ffmpeg를 이용한 스트리밍 테스트):
1. ffmpeg 설치 (필요 시)
sudo apt update
sudo apt install -y ffmpeg
2. 실시간 스트리밍 실행
ffmpeg -f v4l2 -i /dev/video0 -vf "scale=640:480" -f sdl "Live Camera"
> ※ 주의: 컨테이너 내부에서 GUI를 사용하려면 X11 포워딩이 올바르게 설정되어야 합니다.
또는 GStreamer를 사용할 수 있습니다.
sudo apt install -y gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink
이렇게 하면 컨테이너 내에서 USB 카메라의 실시간 영상을 확인할 수 있습니다.
3. Docker 컨테이너 이미지를 저장(커밋)하고 Windows로 전송하기
3.1 컨테이너 이미지 저장 (Commit)
현재 작업한 컨테이너 상태를 새로운 Docker 이미지로 저장할 수 있습니다.
1. 실행 중인 컨테이너 ID 확인
sudo docker ps -a
2. Docker 이미지로 저장
예를 들어, 컨테이너 ID가 975fc8b2e8d0라면:
sudo docker commit 975fc8b2e8d0 ubuntu_slamnav2_v2
3. 저장된 이미지 확인
sudo docker images
3.2 이미지 파일로 내보내기 (docker save)
이미지를 tar 파일로 저장하여 Windows로 전송할 수 있습니다.
sudo docker save -o ubuntu_slamnav2_v2.tar ubuntu_slamnav2_v2
참고: 생성된 tar 파일의 소유권이나 권한이 문제가 되면 sudo chown 등을 사용하여 수정합니다.
3.3 Windows로 이미지 전송
다양한 방법을 사용할 수 있습니다.
USB 드라이브: tar 파일을 USB에 복사한 후 Windows에 연결.
SCP/WinSCP: SSH를 통해 파일 전송.
클라우드 스토리지: Google Drive, OneDrive 등 이용.
예를 들어, USB 드라이브로 전송한 후 Windows의 적절한 경로(C:\Users\Documents)에 파일이 있다고 가정합니다.
3.4 Windows에서 이미지 로드 (docker load)
Windows의 Docker Desktop에서 PowerShell 또는 CMD를 열고 다음 명령어를 실행합니다.
docker load -i "C:\Users\Documents\ubuntu_slamnav2_v2.tar"
성공적으로 로드되면 다음과 같이 이미지 목록에서 확인할 수 있습니다.
docker images
이제 Windows에서도 동일한 Docker 이미지를 사용하여 컨테이너를 실행할 수 있습니다.
4. 실시간성 및 최적화 고려사항
4.1 Docker 오버헤드와 실시간 애플리케이션
Docker는 가상 머신에 비해 오버헤드가 매우 낮습니다. 실제로 호스트 커널을 공유하므로 SLAM이나 Navigation과 같은 실시간 애플리케이션에서 거의 네이티브 수준의 성능을 제공합니다.
4.2 최적화 방안
리소스 제한 및 CPU 할당:
--cpuset-cpus, --cpu-shares 옵션을 사용하여 컨테이너에 명시적으로 리소스를 할당할 수 있습니다.
docker run --cpuset-cpus="0,1" --cpu-shares=1024 ...
네트워크 최적화:
실시간성이 중요할 경우 --network host 옵션을 사용하여 네트워크 오버헤드를 줄일 수 있습니다.
실시간 스케줄링 및 커널:
극한의 실시간 성능이 필요한 경우, 호스트에 PREEMPT_RT 패치가 적용된 실시간 커널을 사용하거나 컨테이너 내부 프로세스에 실시간 스케줄링 정책을 적용할 수 있습니다.
저장소 I/O 최적화:
로그나 센서 데이터의 I/O 지연을 줄이기 위해, 호스트의 디렉토리를 마운트하여 사용합니다.
5. 결론
이번 포스트에서는 다음과 같은 내용을 다루었습니다.
Ubuntu 22.04 기반 Docker 컨테이너 생성 및 사용자 설정:
root 대신 일반 사용자(예: test)로 실행하여 보안을 강화하고 운영 환경에 맞게 설정하는 방법.
USB 카메라 연결 및 실시간 영상 스트리밍 테스트:
Docker 컨테이너에 USB 카메라 장치를 전달하고, ffmpeg, GStreamer 등을 사용하여 실시간 영상을 확인하는 방법.
컨테이너 상태 저장 및 이미지 내보내기:
Docker commit과 docker save 명령어를 사용하여 현재 컨테이너 상태를 이미지로 저장한 후, tar 파일로 내보내어 Windows로 전송하는 방법.
실시간 애플리케이션 성능 최적화:
Docker 오버헤드는 낮지만, 추가적인 리소스 할당, 네트워크 최적화, 실시간 스케줄링 옵션 등을 통해 성능을 더욱 향상시킬 수 있는 방법.
이와 같은 방법들을 통해, 로봇의 SLAM/Navigation과 같이 실시간성이 중요한 프로그램도 Docker 환경에서 효과적으로 운영할 수 있으며, 개발 및 배포 과정에서의 유연성을 확보할 수 있습니다.
이 글이 Docker 기반 SLAMNAV2 환경 구축과 이미지 관리, 그리고 실시간성 최적화에 도움이 되길 바랍니다. 질문이나 추가 논의가 필요하다면 댓글이나 문의를 부탁드립니다!
'공학 > 시스템 설치 및 설정' 카테고리의 다른 글
Docker 컨테이너에서 설치한 패키지 및 라이브러리 – 자세한 정리 (0) | 2025.02.21 |
---|---|
Docker 명령어 정리 – 실전 가이드 (0) | 2025.02.20 |
DevOps 로드맵 (feat. DevOps 어떻게 시작할까?) - 1편 (0) | 2025.02.20 |
Conan 설치 가이드 (0) | 2025.02.19 |
로봇환경에 DevOps 도입하기 (0) | 2025.02.18 |