[ROS] snap과 ROS

HY K·2024년 8월 17일

ROS1

목록 보기
31/34

이번에는 ROS에서 snap을 공부하고, 사용하는 법에 대해서 익혀보자.
참고한 링크는 다음과 같다.
https://wiki.ros.org/ROS/Tutorials/Packaging%20your%20ROS%20project%20as%20a%20snap


snap이란?

💡 snap이란?
snap은 소프트웨어 패키지를 배포하고, 설치할 수 있는 패키징 형식이다. snap 패키지는 독립적으로 실행이 가능하며, 필요한 모든 종속성(의존성)이 함께 제공된다는 장점을 가지고 있다. 이를 통해 다양한 리눅스 배포판에서 소프트웨어를 손쉽게 설치하고 사용할 수 있다.

snap을 사용하는 장점을 정리하면 다음과 같다.

  • 쉬운 배포 : 모든 종속성을 포함하고 있어서, 특정 리눅스 배포판에 구애받지 않고 다양한 환경에서 실행이 가능하다.
  • 자동 업데이트 : sanp은 배포 후 자동으로 업데이트 가능한 특징을 가지고 있어서, 최신 버젼을 유지할 수 있다.
  • 격리된 환경 : 각 패키지를 독립적으로 실행하므로 다른 소프트웨어와의 충돌을 피할 수 있다.
  • 보안 : 강력한 권한 관리를 통해서 보안을 강화할 수 있다.

ROS에서 snap 쓰기

$ sudo apt install snapcraft

위 명령어를 통해서 snap 패키지를 만들기 위한 snapcraft라는 프로그램을 설치할 수 있다.

그리고, snap을 만들기 위해선 프로젝트 디렉토리 내에 snap 폴더를 만들고 그 안에 snapcraft.yaml라는 파일을 생성해야 한다. 이 파일은 snap 패키지의 메타데이터와 빌드 지침을 정의하는데 사용된다.

예를 들면 다음과 같다.

$ cd roscpp_tutorials
$ mkdir ~/roscpp_tutorials_snap
$ cd ~/roscpp_tutorials_snap
$ snapcraft init

이 명령어들을 통해서 yaml 파일을 생성할 수 있다.

snap.yaml 파일 작성하기

snapcraft.yaml 파일을 연 이후에 다음 내용을 작성하자.

name: ros-talker-listener
version: '0.1'
summary: ROS Talker/Listener Example
description: |
 This example launches a ROS talker and listener.
 
confinement: devmode
base: core20
 
parts:
 ros-tutorials:
   plugin: catkin
   source: https://github.com/ros/ros_tutorials.git
   source-branch: noetic-devel
   source-subdir: roscpp_tutorials
   stage-packages:
       - ros-noetic-roslaunch
 
apps:
 ros-talker-listener:
   command: opt/ros/noetic/bin/roslaunch roscpp_tutorials talker_listener.launch
   extensions: [ros1-noetic]

각 부분에 대한 설명은 다음과 같다.

  • metadata : sanp 패키지에 대한 기본적인 메타데이터를 다루고 있다. 특기할 점은, 이름은 항상 모든 snap패키지에 대해 고유하게 설정되어야 한다는 점이다. 위 예시에서는 name부터 description까지를 메타 데이터라고 한다.
  • base : base는 최소로 요구되는 snap의 빌드 환경을 기술한 것이다. Ubuntu 20.04 LTS에서 core20이 snap의 표준 빌드 시스템이다.
  • confinement

snap 패키지가 시스템 리소스에 접근할 수 있는 범위를 정의하며, 보안과 밀접하게 연관이 된다. 옵션들은 다음과 같다.

1) devmode : 개발 모드로, 아무런 제약없이 실행이 가능하다. 다만, 보안이 보장되지 않는다.
2) strict : 기본 제약 모드로, 제한된 리소스만 접근 가능하다. 높은 보안성을 가지고 있기에 권한이 없는 경우 특정 시스템 리소스에 접근할 수 없다.
3) classic : 일부 제약만 적용되며, devmode와 strict의 중간 정도의 제약만 적용된다.

  • parts

snap 패키지를 구성하는 빌드 블록이다. 패키지의 빌드, 설치, 실행에 필요한 구성 요소들을 정의하는 섹션으로, 특정 소스코드 혹은 리소를 가져와 빌드하고, 패키지의 최종 이미지에 포함될 파일들을 생성한다.

1) plugin : snap에서 사용하는 플러그인들을 정의한다.
2) source : 빌드할 소스 코드의 위치를 지정한다.
3) source-branch : 소스 코드를 가져올 브랜치를 지정한다.
4) source-subdir : 소스 코드에서 빌드할 서브 디렉토리를 지정한다.
5) stage-packags : 빌드 및 실행에 필요한 추가 패키지들을 지정한다.

  • apps

snap 패키지가 제공하는 실행 가능한 프로그램을 정의한다.

1) command : 해당 프로그램(어플)이 실행될 때 호출되는 명령어를 정의한다.
2) extensions : snap에서 사용할 확장을 지정한다.

Snap 빌드 및 설치하기

$ cd ~/roscpp_tutorials_snap
$ snapcraft --enable-experimental-extensions

위 명령어를 통해서 snap을 빌드할 수 있다.
빌드가 완료되면 .snap 패키지가 생성된다.

이후에는 다음과 같이 설치할 수 있다.

$ sudo snap install <my_snap_pkg_name>.snap --dangerous

그리고 실행은 다음 명령어를 통해서 사용한다.

$ <my_sanp_pkg_name>.<node_in_snap_pkg>
profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글