Amazon Web Services 한국 블로그
AWS RoboMaker용 ROS 애플리케이션 빌드 및 번들링 기술 활용기
AWS는 클라우드 기반 로봇 서비스인 AWS RoboMaker 개발을 시작하면서, 어떻게 모든 오픈 소스 로봇 운영체제인 ROS 애플리케이션을 쉽게 실행할 수 있을지 고민하였습니다. 대부분 로봇 애플리케이션은 수많은 종속 관계로 서로 연관된 다양한 패키지의 거대한 결합체라고 할 수 있습니다. 시뮬레이션이 결합됨에 따라 이 종속 관계의 목록도 늘어납니다.
많은 조사와 검토를 통해 appimage, flatpak, snapcraft에서 영감을 얻어 로컬 개발 환경과 AWS 서비스에서 실행할 수 있는 단일 파일 형식을 만들어냈습니다. 이 형식을 번들이라고 합니다.어떤 종류의 패키징 아티팩트를 설계할지 결정되자, 아티팩트를 손쉽게 생성할 수 있는 명령줄 도구가 필요했습니다. 기존 ROS 생태계에 완벽하게 적용되는 도구라야 했습니다. 그래서 가장 뛰어난 최신 ROS 빌드 도구인 colcon을 기반으로 만들기로 결정했습니다.
Colcon을 사용하면 ROS1 및 ROS2 애플리케이션을 빌드할 수 있습니다. 또한 이 도구는 확장성이 매우 뛰어나고, 필요한 여러 가지 중요 기능을 기본적으로 제공합니다. 이 문서에서는 기존 ROS 빌드 도구에 대해 살펴보고, ROS2의 빌드 도구로 colcon
을 선택한 이유를 설명합니다. Colcon은 수많은 복잡한 작업을 자동으로 처리하기 때문에 개발자가 특정 기능에 집중할 수 있습니다. 또한 빌드하는 패키지를 수정하지 않고도 catkin_make
와 ament_make
를 colcon build
로 대체할 수 있습니다. 즉, colcon
을 기반으로 도구를 빌드하면 AWS RoboMaker 사용자가 단일 도구를 설치한 후 전체 워크플로우를 실행하여 AWS RoboMaker에서 사용할 번들을 생성할 수 있습니다.
이 게시물에서는 AWS RoboMaker에서 사용할 번들을 생성하는 일반적인 워크플로우를 단계별로 살펴보고, 자주 발생하는 문제의 해결 방법을 설명합니다. 두 번째 섹션에서는 ‘번들’ 파일 형식의 최신 버전을 자세히 살펴보고, colcon bundle
을 실행하여 번들을 생성할 때 어떤 식으로 작동하는지를 개략적으로 설명합니다.
번들을 사용한 이유
ROS 시뮬레이션 워크플로우를 실행하려면 ROS와 기타 애플리케이션의 런타임 종속 관계가 설치된 환경이 필요합니다. 일반적으로 이 요구 사항은 다양한 apt-get install
명령을 실행하여 구현합니다. 이 설치 작업에는 시간이 많이 걸릴 뿐만 아니라, 업스트림 패키지 업데이트가 언제든지 발생할 수 있기 때문에 안정적으로 복제할 수 없습니다. AWS 서비스의 경우, 실행하는 모든 시뮬레이션에 대해 apt
를 사용하여 새 환경을 설치해야 하는 것이 문제였습니다.
이 문제를 해결하기 위해 여러 가지 완전한 패키징 형식을 검토했습니다. 전체 ROS 애플리케이션에 적용할 가장 가망성이 높고 안정적인 배포 형식은 Debian 패키지였습니다. 이 형식은 ROS, 부스트 또는 기타 외부 라이브러리와 실제 애플리케이션 코드 등, 로봇을 실행하는 데 필요한 모든 구성 요소를 포함할 수 있습니다.
하지만 다운로드, 생성, 업데이트를 최적화할 수 있도록 유연성을 높이기 위해 기존 형식은 사용하지 않기로 결정했습니다. 그 결과로, ‘번들’ 형식과 이 형식을 지원할 도구가 탄생하게 되었습니다. 첫 번째 버전도 문제 없이 작동했지만, 몇 가지 한계가 있었습니다.
- workspace 업데이트만으로 번들을 업데이트하는 데 초기
colcon bundle
호출 시 만큼의 시간이 걸렸습니다. - 업데이트된 번들을 로봇에 배포하는 속도가 원하는 만큼 빠르지 않았습니다. 다운로드 속도와 번들 콘텐츠를 추출하는 속도가 모두 기대에 미치지 못했습니다.
그런 만큼, 최적화를 통해 이 같은 한계를 줄이거나 없앤 이 번들 형식의 두 번째 버전을 발표하게 된 것이 정말 기쁩니다. 이제 이 형식은 부분 다운로드와 부분 추출을 지원합니다. 이는 세 가지 측면에서 중대한 이점이 있습니다.
- 2G/3G를 사용하는 로봇과 같이 대역폭이 한정된 원격 디바이스에서 업데이트에 사용되는 대역폭이 감소했습니다.
- 꼭 필요한 부분만 추출합니다. 즉, 번들의 대부분이 변경되지 않은 경우 전체를 다운로드하거나 추출하느라 요금이 낭비되지 않습니다. 이 같은 이점은 로우엔드 디바이스에서 시간을 크게 단축해 줍니다. 일례로, TurtleBots에서 재배포 시간이 60분에서 1분으로 단축되기도 했습니다.
- 이제 외부 아카이브가 압축되지 않기 때문에 증분 방식으로 번들링할 수 있습니다. 그 결과, 간단한 workspace 업데이트의 경우 5분 이상 걸리던 재번들링 시간이 몇 초로 단축되었습니다.
AWS RoboMaker는 이 새로운 버전을 기본적으로 지원합니다. 새롭게 개선된 기능을 사용해보려면 개발 환경에서 sudo pip3 install -U colcon-bundle
을 실행하십시오. 이 블로그의 두 번째 부분에서는 이 새로운 형식의 구현 방식을 자세히 살펴보겠습니다. 궁금한 점, 아이디어 또는 문제가 있는 경우 언제든지 GitHub 알려 주시기 바랍니다.
colcon
을 사용하여 AWS RoboMaker용 번들 작성
colcon
을 사용하면 단 두 단계 만에 workspace를 번들링할 수 있습니다.
-
colcon build
로 workspace를 작성합니다. -
colcon bundle
로 workspace를 번들링합니다.
빌드
catkin_make
로 빌드할 수 있는 모든 ROS 패키지는 colcon build
로도 빌드할 수 있습니다. 수개월간 ROS 패키지 작업을 진행하면서 colcon build
를 사용하여 패키지를 빌드할 때에는 사소한 문제만 몇 가지 발생했습니다. catkin_make
로 빌드할 때는 문제가 없는데 colcon build
로 패키지를 빌드할 때 문제가 발생한다면, colcon-ros 문제에서 보고해 주시기 바랍니다.
참고: catkin_make
와 colcon build
간의 가장 큰 변화는 devel
디렉터리가 더 이상 사용되지 않는다는 점입니다. 이제 workspace를 로컬 환경에 추가하려면 source install/setup.sh
를 실행합니다.
번들링
colcon build
로 workspace를 빌드하고 나면 build
와 install
디렉터리가 생성됩니다. 번들링을 시작하려면 colcon bundle
을 실행합니다. 도구가 종속 관계를 검사하고 모두 다운로드한 다음, 빌드된 workspace와 함께 AWS RoboMaker에서 사용할 번들로 압축합니다. 빌드된 번들은 bundle/output.tar
에 있습니다.
자주 발생하는 빌드 문제
ROS1 개발용 표준 빌드 명령에는 catkin_make
가 사용됩니다. colcon
은 비교적 새로운 도구이기 때문에 익숙하지 않은 ROS1 개발자가 많겠지만 catkin
빌드와 완벽하게 호환됩니다. 저희가 이전에 catkin_make
를 사용하여 빌드한 기존 ROS 패키지를 colcon build
로 번들링하는 중에 몇 가지 사소한 문제가 발생했는데, 다른 개발자들이 시간과 수고를 아낄 수 있도록 여기서 그 문제에 대해 설명하려고 합니다.
중첩된 폴더의 CMAKElists.txt
빌드 시에 colcon
이 workspace의 모든 패키지를 제대로 열거하지 못하는 문제가 자주 발생했습니다. 그로 인해 colcon bundle
호출이 실패하고 비정상적인 설치 디렉터리 구조가 생성됩니다. 이 문제는 대개 CMakeLists.txt
가 있는 중간 디렉터리의 중첩된 폴더 구조로 인해 발생합니다. 이 같은 폴더 구조는 catkin_make
를 사용할 때 디렉터리 내에 중첩된 패키지를 빌드하는 데 필요하지만, colcon
을 사용할 경우에는 문제를 일으킵니다. Colcon
은 임의의 다단계 중첩 폴더 구조를 지원하며 자동으로 패키지를 찾습니다. 다음 다이어그램을 참조하십시오.
src/ ├── package_1/ │ ├── package.xml | └── CMakeLists.txt (OK) └── intermediate_directory/ ├── package_2 | ├── package.xml | └── CMakeLists.txt (OK) ├── package_3 | ├── package.xml | └── CMakeLists.txt (OK) └── CMakeLists.txt (REMOVE)
CMAKELists.txt의 설치 지시문 누락
파일이 누락되는 문제도 발생했습니다. catkin_make
를 사용할 때는 devel
디렉터리와 setup.sh
가 모든 로컬 패키지를 ROS 도구의 검색 경로에 추가합니다. Colcon은 이와 다른 방식으로 작동합니다. 즉, 사용자가 지정하는 모든 대상을 install
디렉터리에 설치합니다. 따라서 모든 CMake install()
지시문이 실행됩니다. [a_launchfile] is neither a launch file in package [a_package] nor is [a_package] a launch file name
또는 [rosrun] Couldn't find executable named my_node below /opt/ros/kinetic/share/my_package
같은 오류가 발생할 경우, install()
에 대한 호출을 CMakeLists.txt
에 추가하면 문제가 해결될 수 있습니다. ROS Wiki에 자세한 방법을 잘 보여주는 예제가 있습니다.
자주 발생하는 번들링 문제
AWS RoboMaker에서 애플리케이션 번들 작업을 할 때 가장 많이 발생한 문제는 다음과 같습니다.
[Package Name]의 rosdep 정의를 찾을 수 없음
사용할 패키지에 올바른 ROS 패키지 이름을 사용하고 있는지 확인해야 합니다. apt
에는 패키지 이름이 ros-kinetic-packagename
과 같은 형식으로 지정되지만, package.xml
에서는 packagename
형식이어야 합니다. ROS distro GitHub repo를 검색하여 패키지가 기존 rosdep
데이터베이스에 있는지 확인하십시오. 없다면 자습서 중 하나에서 설명하는 방법에 따라 rosdep에 종속 관계를 추가할 수 있습니다.
종속 관계 누락
다양한 오픈 소스 ROS 라이브러리를 번들링하면서 가장 많이 목격한 문제는 종속 관계가 누락되는 것이었습니다. 다른 패키지 때문에 빌드 환경에 종속 관계가 이미 설치되어 있고 아무 문제 없이 빌드되는 경우가 많지만, 패키지를 번들링하고 나면 그 종속 관계가 누락됩니다. 종속 관계가 누락된 경우에 일반적으로 나타나는 오류는 Could not load libxzy.so
, No such file or directory some_script.py
또는 Could not load module 'python_dependency'
입니다. 이 문제를 해결하려면 종속 관계를 필요로 하는 패키지의 package.xml
에 종속 관계를 추가하고 다시 번들링합니다.
자체 apt
또는 pip
리포지토리의 애플리케이션에 종속 관계를 사용하는 경우, colcon bundle
호출에 해당 리포지토리를 포함해야 합니다. 이 문제를 해결하려면 다음과 같이 해보십시오.
-
--apt-sources-list
인수를 사용하여,colcon bundle
의apt
설치 프로그램에 사용되는sources.list
를 재정의할 수 있습니다. 기본 OS 및 ROS 패키지의 확인 오류가 발생하지 않도록 현재 사용하는 모든 소스를 포함하는 것이 좋습니다. GitHub에서 이 examplesources.list를 참조하십시오. -
pip
또는pip3
소스를 재정의하려면--pip-args
인수와--pip3-args
인수를 사용합니다. 이 인수 뒤에 오는 문자열은pip
에 바로 전달됩니다. 예:--extra-index-url
https://my-custom-pip-repo/index
빌드 및 번들링 완료
이제 AWS RoboMaker에서 시뮬레이션할 애플리케이션을 빌드하고 번들링할 수 있습니다. 개발 환경에서 sudo pip3 install -U colcon-bundle colcon-ros-bundle
을 실행하여 패키지의 최신 버전으로 업그레이드합니다. 궁금한 점이 있거나 문제가 발생한 경우, 관련 GitHub repo를 게시해 주시면 언제든지 도와 드리겠습니다. 아래에서는 colcon bundle
을 실행할 때 실제로 어떤 일이 일어나는지를 살펴보겠습니다.
번들 심층 분석
이 섹션에서는 번들 형식의 내부 구조와 colcon bundle
의 구현 방식을 자세히 설명합니다. 이 섹션을 끝까지 읽으면 colcon bundle
을 실행했을 때 어떻게 되는지를 잘 알 수 있습니다. 얼마나 사용하기 쉬운지를 알게 되고 colcon
생태계의 기반 위에서 직접 도구를 빌드해보는 계기가 되었으면 합니다. 나아가 커뮤니티에 관련 글을 게시하게 된다면 더할 나위가 없겠죠.
번들 파일 형식
‘번들’이란 AWS RoboMaker가 전체 ROS 애플리케이션을 실행하는 데 사용하는 패키징 형식으로, 로봇 또는 해당 시뮬레이션 애플리케이션의 전체 전이 폐쇄가 포함되어 있습니다. ROS가 이미 종속 관계를 선언하는 방법과 빌드 도구에 사용할 항목을 지정하는 표준 패키징 형식을 정의한 상태입니다. colcon
을 사용하면 도구가 이 정보를 수집하고, 다양한 패키지 설치 프로그램(현재 pip 및 apt)을 호출하여 종속 관계를 가져오고, 가져온 종속 관계를 로컬 스테이징 영역에 설치한 후, 로컬로 빌드된 workspace와 함께 AWS RoboMaker가 사용할 수 있도록 번들로 패키징합니다.
이 워크플로우에서 ‘번들’이라는 것이 생성됩니다(‘번들’이 다소 진부한 이름이라는 점은 저희도 잘 알고 있습니다. 이 형식의 이름에 대한 아이디어가 있으면 리포지토리에서 문제를 제기해 주시기 바랍니다.) 번들 형식의 지정 내용은 colcon-bundle 리포지토리에 있습니다. 간단히 정리하면 다음과 같습니다.
이 다이어그램은 번들 형식의 V2를 보여 줍니다. 기록은 여기에서 확인할 수 있습니다. ‘번들’ 파일은 표준 GNU tar 형식을 따르며, 최소 3개의 구성 요소로 이루어집니다.
- 이전 버전과 호환되지 않는 변경 사항이 들어 있으며 번들 버전을 구분하는 데 사용되는 버전 파일
- 번들에 포함된 오버레이가 최소한으로 들어 있으며, 번들 소비자에게 유용할 수 있는 다른 메타데이터가 포함된 메타데이터 tarball
- 하나 이상의 오버레이. ROS workspace는 workspace 오버레이라는 개념을 지원합니다. 저희는 이 개념을 전체 애플리케이션에 적용했습니다. 따라서 AWS RoboMaker는 기반 OS를 수정하지 않고도 기반 Linux 운영 체제를 기반으로 ROS 애플리케이션을 실행할 수 있습니다.
이 형식의 최신 버전을 사용하는 데 따른 이점은 앞에서 설명했습니다. V1과 V2 간에 가장 크게 바뀐 점은 다음과 같습니다.
- 외부 형식이
.tar.gz
에서.tar
로 변경되었습니다. 따라서 파일 내에서 임의 액세스가 가능합니다. 이는 콘텐츠의 일부분을 이미 가지고 있는 소비자가 변경된 콘텐츠만 다운로드하도록 해준다는 점에서 매우 유용합니다.gzip
은 여러 개의 작은 파일을 압축하는 데 효과적이지 않기 때문에 여러 개의 개별 오버레이를 압축하면 전체 파일 크기가 커집니다. 이제 변경된 콘텐츠만 다운로드하면 되므로, 메이저 업데이트 사용 사례에서 이는 문제가 되지 않습니다. - 단일 오버레이에서 임의의 오버레이 수로 변경되었으며, 각 오버레이를
gzip
합니다. 이를 통해 번들 형식의 유연성이 크게 향상되었습니다. 간소화된tar
로 형식이 변경된 덕분에, 이제 각 오버레이를 개별적으로 액세스할 수 있습니다. 원하는 만큼 얼마든지 많은 오버레이를 만들어 업데이트 사용 사례에 최적화할 수 있는 유연성이 확보된 것입니다. 가장 세분화된 수준에서 살펴보면, 각 라이브러리를 별도의 오버레이에 구성하여, 단일 라이브러리가 변경될 경우 로봇이 해당 라이브러리만 다운로드하면 되도록 할 수 있습니다(다른 부분이 모두 최신 상태인 경우). 이 덕분에 원격 디바이스의 작업 시간과 대역폭이 크게 절감됩니다. - 메타데이터에
overlays.json
을 추가했습니다. 이 파일에는 workspace에 적용할 오버레이가 순서대로 표시된 목록과 여러 오버레이 버전을 서로 비교하는 데 사용되는 해시가 들어 있습니다. 이 메타데이터는 오버레이를 아무리 많이 만들어도 환경이 순서대로 올바르게 설정되도록 합니다. 변경된 해시를 통해 특정 오버레이가 변경되었음을 알 수 있으므로, 해시는 지능형 다운로드 및 추출을 지원합니다.
전반적으로 이 같은 개선 사항들은 매우 만족스럽습니다. 다른 아이디어가 있는 경우 언제든지 GitHub에서 문제를 제기해 주시기 바랍니다.
colcon bundle
실행 흐름
이 섹션에서는 colcon bundle
을 실행할 때 실제로 어떻게 되는지를 자세히 살펴보겠습니다. (colcon
을 기반으로 도구를 빌드한 것은 정말 멋진 경험이었습니다. 전문화된 빌드 도구를 만들려는 경우, 기반 프레임워크로서 colcon
의 가치를 한번 확인해 볼 것을 적극 추천합니다.)
colcon
생태계는 직접 종속 관계와 colcon-core만을 기반으로 하는 여러 개의 개별 Python 패키지로 이루어져 있습니다. colcon
의 거의 모든 기능은 기반 인프라에서 colcon-core에 정의되는 ExtensionPoint
로 모델링됩니다. colcon
은 setuptool 진입점을 플러그인 메커니즘으로 활용하여 모듈화와 느슨한 결합이라는 목표를 실현합니다.
명령줄 인터페이스를 확장할 수 있도록, colcon
은 VerbExtensionPoint
를 통해 명령을 추가하는 기능을 지원합니다. 기능을 빌드하기 위해 저희는 bundle
동사를 생성하고 setup.cfg
에 등록했습니다. 이 훌륭한 도구에 통합 명령을 구현하기 위해 필요한 작업은 그게 다였습니다. (이후 모든 작업은 저희 도메인에만 국한된 것이었습니다.) 그런 만큼 ROS 워크플로우와 관련하여 도구를 빌드하려면 colcon
을 사용하는 것이 현명합니다! 그 이점은 아무리 강조해도 지나치지 않습니다.
colcon bundle
을 호출한 후에는 일련의 작업이 실행되는데, 일부 작업은 colcon
인프라에서 제공되는 기능이고 일부는 저희가 직접 작성한 것입니다. 여기서도 설명하겠지만, 코드를 분석하여 각 작업이 어떻게 작동하는지를 자세히 살펴보시기 바랍니다.
- 저희가 만든
VerbExtensionPoint
인BundleVerb
를 호출합니다. 다른 확장 지점의 인수와 함께, 등록한 모든 인수가 포함된context
를 전달받습니다. - 그런 다음 일부
colcon-core
기능을 호출하여 workspace 파일 트리를 크롤링하고 패키지를 식별합니다. 그러면bundle
실행 시에 포함될 각 패키지의PackageDescriptor
가 생성됩니다. 패키지 식별에는 PackageIdentificationExtensionPoint가 사용됩니다. ROS 패키지를 식별하기 위해 등록된 확장은 colcon-ros에 정의되는 RosPackageIdentification입니다. 이 확장은 ROS 패키지를 식별할 때PackageDescriptor
의type
을ros.cmake
,ros.catkin
또는ros.ament
로 설정합니다. - 패키지가 모두 식별되고 나면
colcon
은 지정한 패키지 유형에 대해 등록된 모든PackageAugmentationExtensionPoint
를 실행합니다. 식별 기능 외에,RosPackageIdentification
은 패키지의package.xml
을 구문 분석하고 패키지 설명자 메타데이터에 빌드, 테스트 및 런타임 종속 관계를 추가하는 확장 기능도 제공합니다. - 다시 코드로 돌아와서, 각
PackageDescriptor
에 연결된 종속 관계 메타데이터를 검사하여 마지막 호출 후에 변경된 내용이 있는지 확인합니다. 변경된 내용이 없으면 종속 관계 분석을 추가로 하지 않고, 기존 종속 관계 오버레이를 사용하여, 빌드된 workspace의 번들링 작업을 계속 진행합니다. 종속 관계가 변경된 것으로 확인되면 전체 종속 관계 분석 작업을 계속 실행합니다. - 전체 종속 관계 분석 작업을 실행하는 동안 각
PackageDescriptor
마다 해당 번들링 작업을 호출합니다. 현재ros.catkin
,ros.cmake
및python
패키지 유형이 지원됩니다. 이 지원 기능은colcon-bundle/setup.cfg
및colcon-ros-bundle/setup.cfg
에 등록되어 있습니다. 해당 번들링 작업을 추가하면 새로운 패키지 유형을 지원할 수 있습니다. 각 패키지 유형별로, 해당 번들링 작업을 통해 종속 관계가 수집되고 각 종속 관계에 해당하는BundleInstallerExtensionPoint
가 호출됩니다. 저희의 ROS 작업에서는rosdep
를 사용하여 ROS 종속 관계 이름을 해당하는 시스템 패키지 이름으로 변환합니다. - 종속 관계가 설치 프로그램에 모두 등록되고 전체 전이 폐쇄가 결정된 후에는
libc*
,gazebo*
등 인프라에서 제공하는 다른 패키지가 설치되지 않도록 시스템 패키지 목록에 블랙리스트를 적용합니다.--apt-package-blacklist
인수를 사용하면 사용자가 자체 블랙리스트를 제공하여 블랙리스트 동작을 재정의할 수 있습니다. - 블랙리스트를 적용한 후에는 종속 관계 등록 단계에서 사용된 모든 등록된
BundleInstallerExtensionPoint
에 대해install()
을 호출합니다. 설치 프로그램이 모든 구성 요소를--bundle-base
(기본값: bundle)에 있는 디렉터리에 설치합니다. 다운로드와 설치가 완료되면 오버레이를 지원하는setup.sh
를 복사한 후 폴더에tar
및gzip
을 적용하여dependencies.tar.gz
로 압축합니다. - 종속 관계가 아카이빙된 후에는 빌드된 최신
install
폴더를 아카이빙합니다. 오버레이가 가능하도록, 전체--install-base
(기본값: install) 디렉터리에tar
및gzip
을 적용하여setup.sh
를 사용한 별도의 오버레이로 압축합니다. - 2개의 아카이브를 모두 생성한 후에는 빌드 프로세스에서 생성된 모든 메타데이터를 수집하고, 오버레이의 크기, 오프셋, 순서를 설명하는 메타데이터를 추가합니다. 그런 다음 해당 메타데이터에
tar
을 적용하여metadata.tar.gz
로 압축합니다. - 그리고
tar
로 여러 아카이브를 하나로 압축하여 ‘번들’을 만들고 디스크의bundle/output.tar
에 씁니다. 이제 이 번들을 AWS RoboMaker에서 로컬로 사용할 수 있습니다.
번들을 사용하여 애플리케이션 실행
번들 형식은 AWS RoboMaker에서 사용하는 것과 마찬가지로 로컬로도 사용할 수 있습니다. 이 기능은 애플리케이션에서 또는 디버깅 도구로 유용하게 활용할 수 있습니다. colcon bundle
아카이브를 사용하도록 빌드한 GoLang 라이브러리를 서비스에 곧 계시할 예정입니다. 여기서는 현재 colcon bundle
아카이브를 읽고 사용하는 방법을 단계별로 설명하겠습니다.
-
- 아카이브에서
version
및metadata.tar.gz
를 추출합니다. -
version
에서 사용해야 할 호환성 모드를 확인합니다(이 단계부터는 번들이 버전 2라고 가정함). -
metadata.tar.gz
에서overlays.json
을 추출합니다. -
overlays.json
을 구문 분석하여 디스크에 추출할 아카이브의 목록을 수집합니다.overlays.json
에는 오버레이의sha256
해시가 들어 있습니다. 이 해시는 오버레이가 변경되었는지를 확인하는 데 사용되며, 다시 추출해야 합니다. 또한 오버레이의 무결성을 확인하는 데에도 이 해시를 사용할 수 있습니다. - 오버레이를 디스크에 추출한 후에는
overlays.json
에 나열되도록 환경으로 소싱해야 합니다. 오버레이를 환경에 추가하려면BUNDLE_CURRENT_PREFIX=<path_to overlay_folder> source <path_to_overlay_folder>/setup.sh
를 실행합니다. 파일을 소싱할 때 파일의 위치를 확인할 수 없기 때문에BUNDLE_CURRENT_PREFIX
환경 변수가 필요합니다. - 이제 번들의 ROS workspace 및 종속 관계가 로컬에 설치된 것처럼 실행하도록 환경이 설정되었습니다.
- 아카이브에서
마무리
저희는 이 형식의 최신 버전에 매우 만족하고 있으며, 앞으로도 계속 개선해나갈 계획입니다. colcon bundle
은 더 많은 패키지 유형과 설치 프로그램을 지원하도록 구현 범위를 확장할 수 있습니다. 이 도구의 기능을 확장하는 데 관심이 있는 분은 colcon-bundle
및 colcon-ros-bundle
에 대한 문제를 제기하고 도구 제작에 참여해 주시기 바랍니다. colcon
을 기반으로 직접 도구를 빌드하려면 colcon 제작 설명서를 참조하십시오.