colcon이란?

colcon은 ROS2 패키지의 빌드를 관리하는 도구로, ROS1에서 사용하던 catkin을 대체한다. colcon은 여러 패키지를 병렬로 빌드할 수 있으며, 각 패키지 간의 의존성을 자동으로 처리한다. 또한, 다양한 빌드 도구를 지원하며, 사용자 정의가 용이하다는 장점이 있다.

colcon 설치

colcon은 ROS2 환경을 설정할 때 자동으로 설치되기도 하지만, 수동으로 설치할 수도 있다. 다음은 colcon을 수동으로 설치하는 방법이다.

sudo apt install python3-colcon-common-extensions

이 명령어를 통해 colcon의 기본 확장 기능을 함께 설치할 수 있다.

기본 사용법

colcon을 사용하여 패키지를 빌드하려면 ROS2 워크스페이스의 루트 디렉토리에서 colcon build 명령어를 실행한다. 워크스페이스는 보통 src 디렉토리를 포함하는데, 이 디렉토리 안에 패키지들이 위치한다.

colcon build

이 명령어는 워크스페이스 내 모든 패키지를 빌드한다. 빌드 결과물은 기본적으로 install 디렉토리에 저장된다.

특정 패키지만 빌드하기

특정 패키지만 빌드하려면 --packages-select 옵션을 사용한다. 예를 들어, my_package라는 패키지만 빌드하고 싶다면 다음과 같이 명령어를 입력한다.

colcon build --packages-select my_package

빌드 옵션

빌드 과정에서 다양한 옵션을 사용할 수 있다. 그중 중요한 옵션 몇 가지를 설명하겠다.

bash colcon build --symlink-install

bash colcon build --packages-up-to my_package

빌드 후 환경 설정

빌드가 완료된 후에는 install 디렉토리에서 환경 설정을 해야 한다. 이는 ROS2 노드를 실행하거나 ROS2 명령어를 사용하기 위해 필요한 단계이다.

source install/setup.bash

이 명령어는 현재 터미널 세션에서만 적용된다. 매번 새로운 터미널을 열 때마다 이 명령어를 실행해야 한다. 이를 자동화하기 위해서는 ~/.bashrc 파일에 이 명령어를 추가할 수 있다.

echo "source ~/your_workspace/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

패키지 의존성 관리

colcon은 패키지 간의 의존성을 자동으로 처리한다. 각 패키지의 package.xml 파일에서 의존성을 명시하면, colcon은 이를 기반으로 빌드 순서를 결정한다.

패키지 간의 의존성을 명시하는 방법은 다음과 같다.

<depend>example_interfaces</depend>
<build_depend>rclcpp</build_depend>
<exec_depend>rclpy</exec_depend>

위 예시에서 depend는 빌드와 실행 모두에 필요한 의존성을, build_depend는 빌드 시에만 필요한 의존성을, exec_depend는 실행 시에만 필요한 의존성을 나타낸다.

의존성 해결

만약 의존 패키지가 설치되지 않았을 경우, colcon은 빌드 도중 오류를 발생시킨다. 이때는 다음과 같은 명령어로 의존성을 설치할 수 있다.

rosdep install --from-paths src --ignore-src -r -y

이 명령어는 src 디렉토리 안의 모든 패키지에 대한 의존성을 확인하고, 아직 설치되지 않은 패키지를 설치한다.

colcon 빌드 로그 및 오류 해결

빌드 도중 발생하는 오류나 경고를 확인하고 문제를 해결하는 것은 매우 중요하다. colcon은 기본적으로 빌드 로그를 출력하지 않지만, 옵션을 사용하여 빌드 로그를 확인할 수 있다.

빌드 로그 확인

빌드 도중 출력되는 모든 로그를 확인하고 싶다면 --event-handlers 옵션을 사용할 수 있다. 예를 들어, 다음과 같이 명령어를 입력하면 빌드 로그를 실시간으로 확인할 수 있다.

colcon build --event-handlers console_cohesion+

이 옵션을 사용하면 빌드 중 발생하는 모든 로그가 터미널에 출력된다.

빌드 오류 해결

빌드 도중 오류가 발생하면, colcon은 관련된 패키지에서의 빌드를 중단하고 오류 메시지를 출력한다. 오류 메시지는 빌드 과정에서의 문제를 진단하는 데 매우 중요한 정보를 제공한다.

만약 빌드 오류를 해결하려면 오류 메시지를 확인하고, 문제의 원인을 분석해야 한다. 일반적인 빌드 오류는 다음과 같은 원인에서 발생한다.

이런 경우, colcon은 문제가 발생한 패키지를 명시하고, 그 패키지에 대한 상세한 로그 파일을 제공한다. 로그 파일은 기본적으로 워크스페이스 내의 log 디렉토리에 저장된다.

cat log/latest_build/my_package/stdout_stderr.log

위 명령어로 특정 패키지의 빌드 로그를 확인할 수 있다.

패키지 빌드 재시도

특정 패키지가 빌드에 실패했을 경우, 실패한 패키지부터 빌드를 다시 시도할 수 있다. 다음과 같은 명령어를 사용하여 실패한 패키지만 재빌드할 수 있다.

colcon build --packages-select my_package --continue-on-error

이 명령어는 오류를 무시하고 빌드를 계속하며, 실패한 패키지를 선택적으로 빌드할 수 있다.

빌드 시스템 최적화

대규모 ROS2 프로젝트에서는 빌드 시간을 최적화하는 것이 매우 중요하다. colcon은 다양한 빌드 최적화 옵션을 제공하여 빌드 시간을 줄일 수 있다.

병렬 빌드

colcon은 기본적으로 패키지를 병렬로 빌드한다. 하지만 시스템 리소스에 따라 병렬 빌드를 제어할 수 있다. --parallel-workers 옵션을 사용하여 빌드에 사용할 CPU 코어 수를 제한할 수 있다.

colcon build --parallel-workers 4

위 명령어는 4개의 CPU 코어만을 사용하여 병렬로 빌드를 수행한다. 이 옵션은 빌드 시간이 길거나 시스템 리소스를 절약해야 할 때 유용하다.

점진적 빌드

대규모 프로젝트에서 모든 패키지를 다시 빌드하는 것은 시간이 많이 걸린다. 이를 해결하기 위해 colcon은 점진적 빌드를 지원한다. --merge-install 옵션을 사용하면 설치 디렉토리를 병합하여 변경된 패키지만을 다시 빌드할 수 있다.

colcon build --merge-install

이 옵션을 사용하면 이전에 빌드된 패키지들을 다시 빌드하지 않고, 변경된 패키지만 빌드할 수 있다.

캐시 사용

빌드 속도를 더욱 향상시키기 위해 colcon은 빌드 캐시를 사용할 수 있다. colcon은 패키지 간의 의존성을 기반으로 캐시된 빌드 아티팩트를 재사용하여 빌드 시간을 줄일 수 있다.

colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

이 명령어는 최적화된 Release 모드로 빌드를 수행하여 실행 속도와 빌드 속도를 모두 향상시킨다.