Knowhow/ROS2

[ROS2 Foxy Tutorial 한글 번역] 11. Using colcon to build packages

침닦는수건 2023. 2. 3. 15:30
반응형

Link

https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Colcon-Tutorial.html

 

Background

colcon은 catkin_make, catkin_make_isolated, catkin_tool, ament_tools을 모아둔 build 도구 모음라고 생각하면 된다. (catkin이나 ament는 버드나무라는 뜻인데 ROS 개발자가 뒷뜰에 있는 버드나무를 보고 build 도구에 이름을 붙인 것일 뿐 특별한 뜻은 없다. 그냥 cmake, make 같은 build 도구라고 보면 되겠다.)

 

Prerequisites

Install colcon

sudo apt install python3-colcon-common-extensions

Install ROS2

여기까지 읽어보았다면 ROS2는 당연히 깔려있을테니 생략. 홈페이지 추천 방식에 따라 설치하면 된다.

 

Basics

ROS workspace는 정해진 구조를 갖고 있다. 일반적으로 "src"라는 하위 폴더 1개 안에 모든 것이 들어있는 형태고 그 안에는 ROS 패키지들의 source code가 들어있다. 

 

colcon이 source build를 하게 되면 기본적으로 src 와 나란하게 build, install, log 총 3개의 폴더가 생성된다.

  • build : 중간 산물들이 저장되는 폴더, 각 패키지마다 하위 폴더가 생성되고 CMake 같은 파일들이 만들어진다.
  • install : 패키지들이 설치된 결과들이 저장되어 있다. 기본적으로 패키지마다 하위 폴더가 나뉘어 설치된다.
  • log : colcon 동작 과정에서 생긴 잡다한 log 정보들이 다 들어있다

(devel 폴더가 언급될 때가 있는데 이건 catkin으로 빌드했을 때 생기는 결과물이다. 과거 버전 ROS에서 등장한다.)

 

Create a workspace

workspace로 쓸 폴더 하나를 만들어 둔다. 예제에서는 이름을 ros2_ws라고 하겠다.

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
.
└── src

1 directory, 0 files

 

Add some sources

github으로부터 examples 프로젝트를 clone받아 src 하위에 넣는다. 

git clone https://github.com/ros2/examples src/examples -b foxy
.
└── src
    └── examples
        ├── CONTRIBUTING.md
        ├── LICENSE
        ├── rclcpp
        ├── rclpy
        └── README.md

4 directories, 3 files

 

Source an underlay

workspace에서 패키지들을 이것저것 붙여가며 개발을 시작하기 전에 그 패키지들의 의존성을 만족하는 ROS2 환경을 미리 sourcing해두는 것이 매우 중요하다. 다행히도 이것은 binary installation을 했을 시 setup script를 sourcing하는 것 (매번 터미널을 켤 때 했던 것이나 bashrc에 넣어두었던 것)으로 끝나는 것이기 때문에 크게 할 일은 없다. workspace보다 아래에 먼저 sourcing되어 준비된 환경을 underlay라고 부른다.

 

workspace (예제에서는 ros2_ws)는 존재하는 ROS2 환경(underlay) 위에 올라가는 overlay이다. 일반적으로 하나의 workspace에 모든 패키지를 다 넣는 식으로 overlay하지 않고 소수의 패키지를 overlay하는 것이 권장된다. (모듈 별로 workspace를 구분해서 깔끔하게 구현하라는 뜻 같다.)

 

Build the workspace

workspace 폴더에서 "colcon build"를 실행한다. ament_cmake같은 빌드 타입은 devel 공간 (catkin 시 만들어지는 폴더)를 지원하지 않아서 별도의 패키지 설치를 필요로 하기 때문에, --symlink-install 이라는 옵션을 추가해서 빌드하는 것이 좋다. 이 옵션은 source 파일을 알아서 정리해서 설치 파일이 잘 설치되도록 도와주고 더 빠른 동작을 돕는다.

colcon build --symlink-install

 위 커맨드가 종료되면 다음과 같은 결과가 생기는 것을 볼 수 있다.

.
├── build
├── install
├── log
└── src

4 directories, 0 files

 

Run tests

잘 build 되었다면 테스트도 통과할 것이다.

colcon test

 

Source the environment

colcon build가 끝났으면 install 폴더 안에 결과들이 있을 것이다. 각종 executable 혹은 library들을 사용하기 전에 경로에 이들을 추가해주는 작업이 필요한데 이를 해결해주는 bash/bat file 또한 install 폴더 안에 들어있다. 이 파일을 실행해주면 모든 파일들의 경로가 매 터미널마다 따로 bash나 shell 커맨드로 해주는 것과 같이 영구적으로 잘 등록이 된다. 

. install/setup.bash

 

Try a demo

앞선 작업들이 다 잘 마쳐졌으면 subscriber 노드를 실행시켜보자.

ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function

또 다른 터미널에서는 publisher 노드를 실행한다. 

ros2 run examples_rclcpp_minimal_publisher publisher_member_function

제대로 동작한다면 숫자를 세는 출력이 나올 것이다.

 

Create your own package

colcon은 REP149로 정의된 package.xml 파일을 이용한다. colcon은 다수의 빌드 타입을 지원하지만 ament_cmake와 ament_python을 추천한다. cmake를 쓰는 것도 괜찮다.

 

ament_python 빌드의 에시는 ament_index_python package (홈페이지 링크 참고) 이고, ament_cmake 빌드의 예시는 demo_nodes_cpp (홈페이지 링크 참고) 이다. 

 

편의를 위해서 "ros2 pkg create"와 같은 템플릿화된 도구를 쓸 수도 있다.

 

Setup colcon_cd

cd라는 이름에서 짐작할 수 있듯이 colcon_cd는 working directory로 한 번에 이동할 수 있게 해주는 커맨드다. 예를 들어, "colcon_cd some_ros_package"라고 치면 ~/ros2_install/src/some_ros_package로 바로 이동한다.

echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=/opt/ros/foxy/" >> ~/.bashrc

colcon_cd를 어떻게 설치했냐와 workspace가 어디냐에 따라 살짝 커맨드가 다를 순 있다. colcon_cd를 쓰는게 오히려 헷갈리고 방해된다고 하면 위 작업을 하지 말고 그냥 쓰고 만약 했는데 되돌리고 싶으면 bashrc에서 지우면 된다.

 

Setup colcon tab completion

colcon은 colcon-argcomplete를 설치하면 tab 자동 완성도 지원해준다. (이건 꽤나 좋은 듯 하다.)

echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc

역시나 경로는 살짝 다를 수 있으니 확인하고 만약 되돌리고 싶다면 bashrc를 수정하면 된다.

 

Tips

  • 만약 특정 패키지만 제외하고 빌드하고 싶다면 COLCON_IGNORE이라는 이름이 빈 파일을 만들어 두면 된다.
  • CMake 패키지의 configure랑 build 과정에서 테스트를 없애고 싶으면 --cmake-args -DBUILD_TESTING=0 추가하면 된다.
  • 패키지에서 1개의 소규모 테스트만 하고 싶으면 다음 커맨드를 쓰면 된다.
colcon test --packages-select YOUR_PKG_NAME --ctest-args -R YOUR_TEST_IN_PKG
반응형