이번 포스팅에서는 ROS2의 파일 시스템과 빌드 시스템에 관한 이야기를 해보겠다.
참고한 링크는 다음과 같다.
https://cafe.naver.com/openrt/24322
https://cafe.naver.com/openrt/24411
💡 파일 시스템?
파일 시스템은 ROS2 패키지 및 소스코드 검색, 메시지 파일 / 실행 파일 / 파라미터 설정 및 환경설정 파일에 대한 탐색, 수정, 읽기, 관리 등을 담당하기 위한 시스템
💡 바이너리 설치
- 이미 컴파일이 된 바이너리 파일을 받아서 설치
- 패키지의 이름을 통해서 설치 가능
$ sudo apt install ros-foxy-teleop-twist-joy
💡 소스에서 빌드
- 컴파일이 아직 되지 않은 순수 소스코드를 받아서 컴파일을 통해 설치 및 실행
- 보통 git clone을 통해 리포지터리를 받은 후, 빌드 툴을 활용해서 빌드를 진행
$ cd robot_ws/src $ git clone ~~ $ cd .. $ colcon build --symlink-install --packages-select ~
/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 ..
좀 더 상세한 설명에 대해서 알아보자.
💡 빌드 시스템
- 단일 패키지를 대상으로 수행
- 단일 패키지는 가장 간단하게는 RCL부터 많게는 수십개 패키지에 대해 의존성을 가지고 있을 수 있음
- 단일 패키지가 가지고 있는 의존성(dependencies)을 해결하고 빌드하여 실행 가능한 파일을 생서하게 됨
- ROS1의 경우 cmake를, ROS2의 경우 ament_cmake(C++), Python setuptools(파이썬)을 사용
💡 빌드 툴
- 시스템 전체를 대상으로 함
- 수많은 패키지들 사이의 의존성 그래프를 해석하고, 토폴로지 순서에 따라 각 패키지에 대한 특정 빌드 시스템을 호출 -> 개발환경을 설정하고, 실행 환경까지 구성하게 됨
- ROS1에서는 catkin_make, catkin_build, ROS2에서는 colcon을 사용
이 중 더 간단하고 쉬운 것은 CLI 명령어를 통해서 하는 것이다.
패키지를 생성하는 방법은 다음과 같다.
$ ros2 pkg creat <pkg_name> --build-type <build_type> --dependencies <의존성_패키지1> <의존성_패키지2>
위 명령어를 입력하면 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
vcs는 Version Control System의 약어로 각 리포지터리들을 소스로 설치하고 빌드할 때 이를 간편하게 만들어주도록 하는 툴이다.
💡 rosdep
빌드 툴들은 각 패키지의 의존성을 고려해 빌드는 해주나, 의존성 자체를 해결해주지는 않는다. ROS에서는 이를 해결하기 위해서 rosdep이라는 의존성 해결 툴을 사용하고 있는데, package.xml 파일에 기술된 의존성 정보를 가지고 의존성 패키지들을 자동으로 설치해주는 역할을 한다.
rosdep을 사용하기 위해서는 먼저 데이터베이스를 최신화 해줘야 한다.$ sudo rosdep init $ rosdep update
💡 bloom
바이너리 패키지 관리 툴로, 바이너리 패키지를 관리하기 위한 메타 데이터를 생성하고, dpkg와 같은 플랫폼 종속 도구가 바이너리 패키지를 빌드하는데 사용한다.