colcon은 ROS2 빌드 시스템에서 주로 사용하는 도구로, 멀티패키지 프로젝트를 빌드하고 관리하는 데 최적화된 빌드 도구이다. ROS2는 catkin 대신 colcon을 사용하는데, 이는 catkin의 제한을 개선하고 복잡한 의존성 트리와 멀티 패키지 빌드의 성능을 향상시키기 위함이다.

colcon 설치

colcon을 사용하기 위해 먼저 설치가 필요하다. 일반적으로 ROS2를 설치할 때 colcon도 함께 설치되지만, 만약 별도로 설치하고자 한다면 다음 명령어를 사용할 수 있다:

sudo apt install python3-colcon-common-extensions

설치 후, colcon 명령어가 정상적으로 동작하는지 확인하기 위해 다음 명령어를 실행한다:

colcon --help

이 명령어는 colcon의 다양한 옵션과 명령을 출력한다.

colcon 기본 명령어

colcon의 기본적인 빌드 흐름은 다음과 같다:

  1. 빌드: 워크스페이스 내의 패키지들을 빌드
  2. 테스트: 빌드된 패키지들의 유닛 테스트 실행
  3. 패키징: 패키지를 배포할 수 있도록 패키징
  4. 설치: 빌드한 패키지를 설치할 경로로 이동

colcon build

colcon build 명령어는 워크스페이스 내의 모든 패키지를 빌드한다. 기본적인 사용 방법은 아래와 같다:

colcon build

이 명령어는 현재 워크스페이스의 src 디렉터리에 있는 모든 패키지를 찾아 빌드한다. 빌드 시 종속성 순서에 따라 패키지들이 빌드되며, CMakeLists.txt와 package.xml을 기반으로 빌드 프로세스가 수행된다.

빌드 결과물은 기본적으로 install 디렉터리에 저장되며, 각 패키지별로 독립된 환경으로 설치된다.

colcon build 옵션

빌드 과정에서 다양한 옵션을 제공하여 빌드를 제어할 수 있다.

  1. 패키지 선택: 특정 패키지만 빌드하려면 --packages-select 옵션을 사용할 수 있다.
colcon build --packages-select <패키지명>
  1. 병렬 빌드: 빌드 속도를 높이기 위해 --parallel-workers 옵션을 사용하여 병렬 작업 수를 지정할 수 있다.
colcon build --parallel-workers 4

이 명령어는 동시에 4개의 작업을 수행하여 빌드 속도를 높인다.

  1. 빌드 출력 제어: 빌드 중 발생하는 로그를 표시하는 방법을 제어하기 위해 --event-handlers 옵션을 사용할 수 있다.
colcon build --event-handlers console_cohesion+

이 옵션은 빌드 로그를 더 보기 쉽게 만들어 준다.

빌드 시스템과 의존성 관리

colcon은 빌드할 때 패키지 간의 의존성을 자동으로 관리한다. 패키지 의존성 정보는 package.xml 파일에 명시되며, colcon은 이 정보를 기반으로 패키지 빌드 순서를 결정한다.

빌드 의존성 예시

여러 패키지가 있을 때, 각 패키지 간의 의존성은 다음과 같이 정의할 수 있다.

<package format="3">
  <name>my_package</name>
  <version>0.1.0</version>
  <description>My ROS2 Package</description>
  <maintainer email="me@example.com">My Name</maintainer>
  <license>Apache 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>
  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
</package>

위 예시에서 my_packagerclcppstd_msgs 패키지에 의존하며, 이러한 의존성을 colcon이 자동으로 인식하고 빌드 순서를 조정한다.

의존성이 잘못 설정된 경우 빌드 실패가 발생할 수 있으며, colcon은 이러한 상황을 명확한 로그를 통해 알려준다.

colcon 빌드 출력 및 로그 관리

빌드 도구에서 가장 중요한 기능 중 하나는 빌드 과정에서 발생하는 로그와 출력을 적절하게 관리하는 것이다. colcon은 이를 돕기 위한 다양한 기능을 제공한다.

빌드 로그 저장

기본적으로 colcon은 빌드 과정에서 발생한 모든 로그를 워크스페이스 내의 log 디렉터리에 저장한다. 이 로그 파일은 빌드가 실패하거나 성공했을 때 문제를 추적하는 데 유용하다.

로그 파일을 수동으로 확인할 수 있으며, 다음과 같은 명령어로 log 디렉터리로 이동할 수 있다:

cd log/latest_build/

해당 디렉터리에서 각 패키지별 로그 파일을 확인할 수 있다.

이벤트 핸들러

colcon은 이벤트 핸들러를 통해 빌드 과정 중 발생하는 이벤트를 제어할 수 있다. 이는 빌드 결과를 더 직관적으로 보여줄 수 있도록 해주는 옵션이다.

예를 들어, --event-handlers 옵션을 사용하면 빌드 출력 방식을 지정할 수 있다:

colcon build --event-handlers console_cohesion+

이 명령어는 빌드 출력이 더 간결하게 표시되도록 한다.

실패한 빌드 다시 시도

때때로 빌드 도중 일부 패키지가 실패할 수 있다. 이때, 빌드에 실패한 패키지만 다시 빌드하는 기능을 사용할 수 있다.

colcon build --continue-on-error

이 옵션을 사용하면 빌드 도중 오류가 발생해도 전체 빌드가 중단되지 않고 가능한 패키지들을 계속 빌드한다. 나중에 실패한 패키지를 개별적으로 다시 빌드할 수 있다.

colcon의 병렬 빌드

colcon은 멀티코어 프로세서에서 병렬로 빌드를 수행할 수 있는 기능을 제공한다. 이 기능은 빌드 시간을 크게 단축시킬 수 있다.

colcon build --parallel-workers 8

위 명령어는 8개의 병렬 작업을 수행하여 빌드를 더 빠르게 완료할 수 있다. 작업 수는 시스템의 CPU 코어 수에 따라 다르게 설정할 수 있으며, 적절한 수를 설정하는 것이 중요하다. 너무 많은 병렬 작업은 빌드 성능을 저하시킬 수 있다.

colcon 빌드 캐시

colcon은 패키지의 빌드 상태를 캐싱하여, 변경된 패키지만 다시 빌드한다. 예를 들어, 특정 패키지만 코드가 수정된 경우 전체 워크스페이스를 다시 빌드할 필요 없이 해당 패키지만 빌드하면 된다.

빌드 캐시 무효화

때로는 패키지 캐시가 손상되거나 의존성 문제가 발생할 수 있다. 이때는 빌드 캐시를 무효화하고 새로 빌드할 수 있다.

colcon build --force-cmake

이 명령어는 모든 패키지를 강제로 다시 빌드하게 한다. 특히 의존성 변화가 발생했을 때 유용하다.

colcon의 교차 컴파일

교차 컴파일은 ROS2를 다른 아키텍처의 플랫폼에서 실행할 수 있도록 빌드하는 과정이다. 예를 들어, ARM 기반의 임베디드 시스템이나 Jetson 같은 장치에서 ROS2를 실행하기 위해 colcon을 사용하여 교차 컴파일을 할 수 있다.

교차 컴파일 설정

교차 컴파일 환경을 설정하려면 다음과 같은 추가 도구가 필요하다. 예를 들어, ros2 소스 빌드의 경우 sysroottoolchain 파일이 필요하다. 다음은 기본적인 교차 컴파일의 단계이다:

  1. sysroot 설정: 타겟 플랫폼의 라이브러리 및 헤더 파일을 복사하여 sysroot를 구성한다.
  2. toolchain 파일 생성: 타겟 플랫폼에 맞는 빌드 도구 체인을 정의한다.
  3. 빌드 환경 설정: colcon을 사용하여 sysroot와 toolchain 파일을 참조하여 빌드를 수행한다.

교차 컴파일을 할 때는 CMake 옵션을 활용하여 타겟 아키텍처에 맞게 빌드 설정을 변경한다.

colcon build --cmake-args -DCMAKE_TOOLCHAIN_FILE=<toolchain 파일 경로>

이 명령어는 지정된 toolchain 파일을 사용하여 교차 컴파일을 수행한다.

colcon 빌드 환경 변수 설정

빌드 프로세스에서 환경 변수를 설정하는 것은 필수적인 작업이다. colcon은 다양한 환경 변수를 설정하고 관리할 수 있는 방법을 제공한다.

환경 변수 설정

빌드 과정에서 자주 사용하는 환경 변수는 다음과 같다:

다음과 같이 환경 변수를 설정할 수 있다:

export CMAKE_PREFIX_PATH=/path/to/external/package
export AMENT_PREFIX_PATH=/path/to/ament/package

이 변수들은 colcon 빌드 프로세스에서 패키지를 적절하게 찾고 빌드하도록 도와준다.

로컬 개발 환경 설정

colcon을 사용하여 빌드한 후에는 로컬 환경에서 빌드된 패키지를 사용하기 위해 환경 설정을 해야 한다. ROS2에서 이는 setup.* 파일을 이용하여 설정된다. bash, zsh, sh 등 다양한 셸에 맞는 환경 설정 파일이 있다.

다음 명령어를 사용하여 현재 세션에 빌드된 패키지를 로드할 수 있다:

source install/setup.bash

이 명령어는 install 디렉터리에 있는 모든 패키지를 환경에 설정하여, ROS2 노드와 패키지를 사용할 수 있게 한다. 이 설정 파일은 패키지가 설치된 모든 경로를 설정하며, 노드, 토픽, 서비스 등을 실행할 수 있도록 해준다.

colcon 빌드 시 주의 사항

colcon을 사용할 때 몇 가지 주의해야 할 사항이 있다:

  1. 빌드 순서: 패키지 간의 의존성이 정확하게 설정되지 않으면 빌드 순서가 잘못될 수 있다. package.xml 파일에 명확한 의존성 정의가 필요하다.
  2. 빌드 캐시: 빌드 캐시가 손상되었을 경우, --force-cmake 옵션을 사용하여 캐시를 무효화한 후 빌드하는 것이 좋다.
  3. 빌드 환경 변수: 외부 라이브러리나 패키지가 있는 경우, CMAKE_PREFIX_PATHAMENT_PREFIX_PATH 등의 환경 변수를 적절히 설정해야 빌드 오류를 방지할 수 있다.

colcon과 비동기 빌드

비동기 빌드는 colcon의 강력한 기능 중 하나로, 여러 패키지를 병렬로 빌드하여 빌드 시간을 줄일 수 있다. 비동기 빌드는 기본적으로 colcon에서 지원되며, 빌드 과정에서 별도의 설정 없이 자동으로 처리된다. 단, 멀티코어 환경에서는 --parallel-workers 옵션을 사용하여 병렬 빌드의 최적화가 가능한다.

비동기 빌드의 작업 흐름은 다음과 같이 mermaid로 표현할 수 있다:

graph TD A[패키지 빌드 시작] --> B[의존성 확인] B --> C{의존성 만족 여부} C -->|만족| D[병렬 빌드 진행] C -->|불만족| E[빌드 대기] D --> F[패키지 빌드 완료] E --> B

이 구조는 의존성을 만족하는 패키지들부터 병렬로 빌드를 시작하고, 나머지 패키지들은 대기한 후 의존성이 해결되면 빌드를 진행하는 방식이다.

colcon으로 패키지 관리

colcon은 패키지를 로컬 및 원격으로 관리할 수 있는 기능을 제공한다. 빌드된 패키지를 다른 시스템에 배포하거나 공유할 때, colcon을 사용하여 패키지를 압축하고 배포할 수 있다.

패키지 배포

패키지를 압축하여 배포하려면 다음 명령어를 사용할 수 있다:

colcon build --merge-install

이 명령어는 모든 빌드된 패키지를 하나의 install 디렉터리에 통합한다. 이렇게 통합된 패키지는 쉽게 압축하여 다른 시스템으로 전송하거나 배포할 수 있다.

배포 후 해당 시스템에서 압축을 풀고 install/setup.bash 파일을 소스로 불러오면 패키지가 설치된 것과 동일하게 사용할 수 있다.