[ROS2] 파일 시스템과 빌드 시스템

HY K·2024년 9월 18일
0

ROS2

목록 보기
8/18

이번 포스팅에서는 ROS2의 파일 시스템과 빌드 시스템에 관한 이야기를 해보겠다.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/24322
https://cafe.naver.com/openrt/24411


파일 시스템(File System)

💡 파일 시스템?
파일 시스템은 ROS2 패키지 및 소스코드 검색, 메시지 파일 / 실행 파일 / 파라미터 설정 및 환경설정 파일에 대한 탐색, 수정, 읽기, 관리 등을 담당하기 위한 시스템

패키지와 메타패키지

  • ROS2에서는 기본적인 소프트웨어 구성 단위로 패키지(Package)를 사용함
  • 패키지는 공통된 목적을 지닌 패키지들을 모아놓은 메타패키지(meta-package) 단위로 관리될 때도 있음
  • 각 패키지들은 패키지의 정보를 담은 package.xml 파일과, 패키지 빌드와 관련된 각종 내용을 담은 CMakeLists.txt 파일을 가지고 있음

바이너리 설치와 소스에서 빌드

💡 바이너리 설치

  • 이미 컴파일이 된 바이너리 파일을 받아서 설치
  • 패키지의 이름을 통해서 설치 가능
$ sudo apt install ros-foxy-teleop-twist-joy

💡 소스에서 빌드

  • 컴파일이 아직 되지 않은 순수 소스코드를 받아서 컴파일을 통해 설치 및 실행
  • 보통 git clone을 통해 리포지터리를 받은 후, 빌드 툴을 활용해서 빌드를 진행
$ cd robot_ws/src
$ git clone ~~
$ cd ..
$ colcon build --symlink-install --packages-select ~

기본 설치 폴더와 사용자 작업 폴더

  • ROS2 파일 시스템은 설치 폴더와 사용자 작업 폴더로 구분됨

기본 설치 폴더

  • 설치 폴더는 /opt 폴더 내에 ros 폴더 내 버젼 따라 구분됨
  • 경로는 예를 들면 다음과 같음
/opt/ros/foxy

기본 설치 폴더 내에 존재하는 하위 내용들

  • /bin : 실행 가능한 바이너리 파일
  • /cmake : 빌드 설정 파일
  • /include : 헤더 파일
  • /lib : 라이브러리 파일
  • /opt : 기타 의존 패키지
  • /share : 패키지의 빌드, 환경설정 파일
  • local_setup.* : 환경설정 파일
  • setup.* : 환경설정 파일

사용자 작업 폴더

  • 사용자가 원하는 곳에 생성해 각종 사용자가 작성하거나 필요한 패키지들을 모아놓고 사용하는 폴더
  • 경로를 예로 들면 다음과 같음
/home/user_name/robot_ws

사용자 작업 폴더 내에 들어가 있는 하위 내용들

  • /build : 빌드 설정 파일용 폴더
  • /install : msg/srv/action 헤더 파일과 사용자 패키지 라이브러리, 실행 파일들의 폴더
  • /log : 빌드 로깅 파일용 폴더
  • /src : 사용자 패키지용 폴더

사용자 패키지 내에는 다음 내용들이 포함될 수 있다.

  • /src : C/C++ 코드 파일
  • /include : C/C++ 헤더 파일용 폴더
  • /param : 파라미터 파일 폴더
  • /launch : ros2 launch에 사용할 launch 파일 폴더
  • /pkg폴더 : 파이썬 코드용 폴더
  • /test : 테스트 코드 및 테스트 데이터용 폴더
  • /msg : 메시지 파일용 폴더
  • /srv : 서비스 파일용 폴더
  • /action : 액션 파일용 폴더
  • /doc : 문서용 폴더
  • package.xml : 패키지 설정 파일
  • CMakeLists.txt : C/C++ 빌드 설정 파일
  • setup.py : 파이썬 코드 환경 설정 파일
  • README.md : 패키지 설명 파일
  • etc ..

빌드 시스템과 빌드 툴

  • 빌드 툴(build tool) : 시스템 전체를 대상으로 함
  • 빌드 시스템(build system) : 단일 패키지를 대상으로 함

좀 더 상세한 설명에 대해서 알아보자.

💡 빌드 시스템

  • 단일 패키지를 대상으로 수행
  • 단일 패키지는 가장 간단하게는 RCL부터 많게는 수십개 패키지에 대해 의존성을 가지고 있을 수 있음
  • 단일 패키지가 가지고 있는 의존성(dependencies)을 해결하고 빌드하여 실행 가능한 파일을 생서하게 됨
  • ROS1의 경우 cmake를, ROS2의 경우 ament_cmake(C++), Python setuptools(파이썬)을 사용

💡 빌드 툴

  • 시스템 전체를 대상으로 함
  • 수많은 패키지들 사이의 의존성 그래프를 해석하고, 토폴로지 순서에 따라 각 패키지에 대한 특정 빌드 시스템을 호출 -> 개발환경을 설정하고, 실행 환경까지 구성하게 됨
  • ROS1에서는 catkin_make, catkin_build, ROS2에서는 colcon을 사용

빌드 시스템

  • ROS1에서는 기본적으로 CMake 기반의 catkin을 사용함
  • 이를 위해 CMakeLists.txt 파일을 작성
  • ROS2에서는 ament를 사용함
  • C++의 경우 ament_cmake를 사용하며, catkin의 발전 버젼으로 CMakeLists.txt를 사용하는 것까지 동일함
  • 파이썬의 경우 ament_python을 통해서 파이썬 Setuptools를 활용해 파이썬을 순수한 파이썬 모듈과 동일한 수준으로 다룰 수 있게 되었음

빌드 툴

  • ROS1의 경우 catkin_make, catkin_tools 등 다양한 빌드 툳릉리 지원되었음
  • ROS2의 경우 현재 colcon(Collective Construction)을 사용하고 있음
  • colcon은 ROS1과 ROS2 모두를 지원하기 위해 만들어진 통합 빌드 툴

ROS2의 패키지 생성

  • 패키지 폴더를 만들고, 각종 필수 파일 및 폴더들 직접 생성
  • CLI 명령어를 통해서 사용

이 중 더 간단하고 쉬운 것은 CLI 명령어를 통해서 하는 것이다.
패키지를 생성하는 방법은 다음과 같다.

$ ros2 pkg creat <pkg_name> --build-type <build_type> --dependencies <의존성_패키지1> <의존성_패키지2>
  • C++의 경우 ament_cmake를 빌드 타입으로 설정
  • 파이썬의 경우 ament_python을 빌드 타입으로 설정
  • GUI 프로그래묭 파이썬의 경우 ament_cmake를 설정해야함

위 명령어를 입력하면 package.xml 파일과 CMakeLists.txt 파일을 자동으로 생성하게 된다.

예를 들어 패키지를 하나 생성해보면 다음과 같다.

$ cd robot_ws/src
$ ros2 pkg create my_first_ros_rclcpp_pkg --build-type ament_cmake --dependencies rclcpp std_msgs
// 혹은
$ ros2 pkg create my_first_ros_rclpy_pkg --build-type ament_python --dependencies rclpy std_msgs

의존성 패키지 설정은 package.xml 파일에 가서도 할 수 있다.

패키지 빌드

ROS2에서 특정 패키지 혹은 전체 패키지를 빌드하기 위해서는 colcon 빌드 툴을 사용한다. 예시를 통해 알아보면 다음과 같다.

$ cd robot_ws
$ colcon build --symlink-install // 전체 패키지들 빌드
$ colcon build --symlink-install --packages-select <pkg_name>
// 특정 패키지만 빌드
$ colcon build --symlink-install --packages-up-to <pkg_name>
// 특정 패키지의 의존성 패키지들까지 한꺼번에 빌드

빌드 시스템 부가 기능

vcstool

💡 vcstool
vcs는 Version Control System의 약어로 각 리포지터리들을 소스로 설치하고 빌드할 때 이를 간편하게 만들어주도록 하는 툴이다.

rosdep

💡 rosdep
빌드 툴들은 각 패키지의 의존성을 고려해 빌드는 해주나, 의존성 자체를 해결해주지는 않는다. ROS에서는 이를 해결하기 위해서 rosdep이라는 의존성 해결 툴을 사용하고 있는데, package.xml 파일에 기술된 의존성 정보를 가지고 의존성 패키지들을 자동으로 설치해주는 역할을 한다.
rosdep을 사용하기 위해서는 먼저 데이터베이스를 최신화 해줘야 한다.

$ sudo rosdep init
$ rosdep update

bloom

💡 bloom
바이너리 패키지 관리 툴로, 바이너리 패키지를 관리하기 위한 메타 데이터를 생성하고, dpkg와 같은 플랫폼 종속 도구가 바이너리 패키지를 빌드하는데 사용한다.


profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글