워크스페이스 구조 이해

ROS2에서 워크스페이스는 여러 패키지의 빌드, 실행 및 관리를 효율적으로 수행하기 위한 디렉토리 구조이다. 일반적으로 ROS2 프로젝트에서는 다양한 패키지들이 독립적으로 존재하며, 이 패키지들은 공통의 워크스페이스에서 관리된다.

워크스페이스를 설정하기 위해서는 다음과 같은 디렉토리 구조를 유지하는 것이 권장된다:

workspace/
  ├── src/
  └── install/
  └── log/
  └── build/

워크스페이스 생성

다음 명령어를 통해 새로운 워크스페이스를 생성할 수 있다:

mkdir -p ~/ros2_ws/src

여기서 ~/ros2_ws는 워크스페이스의 루트 디렉토리이며, src는 패키지들이 저장되는 소스 디렉토리이다.

colcon을 이용한 빌드

ROS2에서는 colcon이라는 빌드 도구를 사용하여 패키지를 빌드한다. colcon은 CMake 및 Python 기반의 빌드 시스템을 모두 지원하며, 종속성 관리 및 병렬 빌드를 자동으로 처리한다.

빌드를 하기 전에 반드시 현재 워크스페이스 경로로 이동한 후 실행해야 한다:

cd ~/ros2_ws
colcon build

이 명령어는 src 디렉토리 내의 모든 패키지를 탐색하여 빌드를 수행한다.

빌드 설정

colcon build 명령어는 다양한 옵션을 지원한다. 그 중 대표적인 옵션 몇 가지를 살펴보면 다음과 같다:

이 외에도 colcon은 빌드 프로세스의 출력을 보다 직관적으로 관리하기 위한 다양한 옵션을 제공한다.

종속성 관리

ROS2에서는 패키지 간의 종속성을 정의하기 위해 package.xml 파일을 사용한다. 이 파일은 각 패키지의 종속성과 버전 정보를 담고 있어, 다른 패키지에서 이 패키지를 의존하거나 함께 빌드할 수 있다.

package.xml에서 종속성을 정의하는 방법은 다음과 같다:

<build_depend>package_name</build_depend>
<exec_depend>package_name</exec_depend>

<build_depend>는 빌드 중에 필요한 패키지를, <exec_depend>는 실행 시 필요한 패키지를 정의한다.

CMakeLists.txt 파일의 설정

ROS2 패키지는 CMake 빌드 시스템을 사용하는데, 이를 위한 설정 파일이 CMakeLists.txt이다. CMakeLists.txt 파일에서는 패키지의 빌드 방법 및 종속성 등을 설정한다.

대표적인 설정은 다음과 같다:

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp std_msgs)

위 설정에서 find_package는 종속 패키지를 탐색하고, ament_target_dependencies는 타겟 실행 파일이 어떤 패키지에 의존하는지를 명시한다.

빌드 후 환경 설정

빌드가 완료된 후에는, 환경 변수를 설정해야 ROS2 노드 및 기타 실행 파일을 올바르게 실행할 수 있다. 이를 위해 다음 명령어를 사용하여 환경을 설정한다:

source ~/ros2_ws/install/setup.bash

이 명령어는 빌드된 ROS2 패키지의 경로를 시스템 환경 변수에 추가하여 ROS2 시스템 내에서 사용될 수 있도록 한다.

빌드 시스템의 최적화

ROS2의 빌드 시스템에서는 소스 코드의 크기 및 복잡도에 따라 빌드 시간이 오래 걸릴 수 있다. 이를 해결하기 위한 최적화 방법을 살펴보자.

1. 병렬 빌드

colcon build 명령어는 병렬로 빌드를 진행할 수 있으며, 기본적으로 시스템의 모든 코어를 사용하여 빌드를 수행한다. 하지만 수동으로 코어 수를 조정하여 빌드 속도를 제어할 수도 있다:

colcon build --parallel-workers <worker_count>

이 명령어는 <worker_count> 개수만큼의 병렬 작업을 수행한다. 일반적으로 시스템의 CPU 코어 수보다 1~2개 적은 수로 설정하는 것이 좋다.

2. 빌드 캐시 활용

빌드 과정에서 반복되는 작업을 줄이기 위해 빌드 캐시를 활용할 수 있다. 캐시는 이전 빌드에서 사용된 파일이나 중간 파일들을 저장하여 불필요한 작업을 피할 수 있게 해준다. colcon은 기본적으로 빌드 캐시를 자동으로 관리하지만, 빌드 캐시를 수동으로 관리하고 싶다면 다음 명령어를 사용할 수 있다:

colcon build --no-clean

이 명령어는 빌드를 다시 수행할 때 이전 빌드 결과를 삭제하지 않고 캐시를 재사용한다.

3. 선택적 패키지 빌드

모든 패키지를 빌드하는 대신, 특정 패키지만 빌드하는 것이 빌드 시간을 크게 단축시킬 수 있다. 이를 위해서는 --packages-select 옵션을 사용하여 원하는 패키지들만 선택적으로 빌드할 수 있다:

colcon build --packages-select <package1> <package2>

4. 빌드 로그 분석

colcon은 빌드 과정에서 발생하는 로그를 상세하게 제공하며, 이를 통해 어떤 부분에서 성능 저하가 발생하는지 파악할 수 있다. 빌드 로그는 log 디렉토리에 저장되며, 문제를 해결하거나 최적화를 수행하는 데 매우 유용하다.

cat ~/ros2_ws/log/latest_build.log

이 명령어로 최신 빌드 로그를 확인할 수 있으며, 빌드 중 발생한 경고나 오류 메시지를 분석하여 빌드 최적화에 도움이 될 수 있다.

패키지 의존성 최적화

복잡한 프로젝트에서는 패키지 간의 의존성이 매우 중요하다. 잘못된 종속성 관리는 빌드 시간뿐만 아니라 실행 성능에도 큰 영향을 미친다. 다음은 패키지 의존성을 최적화하기 위한 몇 가지 방법이다.

1. 종속성 최소화

package.xml에서 정의된 종속성을 최소화함으로써 불필요한 패키지 빌드를 방지할 수 있다. 필요하지 않은 종속 패키지는 제거하고, 가능하다면 공통 라이브러리를 활용하는 것이 좋다.

2. 빌드 종속성과 실행 종속성 구분

build_dependexec_depend를 명확하게 구분하여 빌드 과정에서만 필요한 패키지와 실행 중에만 필요한 패키지를 정확히 정의해야 한다. 이렇게 하면 빌드 시간과 실행 환경 설정에서의 불필요한 작업을 줄일 수 있다.

3. 중복 종속성 제거

여러 패키지가 동일한 종속성을 가질 경우, 이를 관리하는 방법을 최적화할 수 있다. find_packageament_target_dependencies에서 중복된 항목을 제거하여 컴파일 시간과 링크 시간을 줄일 수 있다.

빌드 오류 해결

ROS2 환경에서 발생할 수 있는 다양한 빌드 오류를 해결하기 위해서는 다음과 같은 일반적인 접근 방식을 사용할 수 있다:

1. 종속 패키지 확인

빌드 오류가 발생했을 때, 가장 먼저 확인해야 할 것은 종속 패키지의 설치 여부이다. 다음 명령어로 누락된 패키지를 확인할 수 있다:

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

이 명령어는 현재 워크스페이스의 src 디렉토리에 있는 모든 패키지의 종속성을 자동으로 설치한다.

2. 빌드 로그 분석

빌드가 실패할 경우, log/latest_build.log 파일을 확인하여 오류 메시지를 분석하는 것이 중요하다. 오류 메시지의 내용에 따라 빌드 오류의 원인을 정확히 파악할 수 있다.