워크스페이스 구조 이해
ROS2에서 워크스페이스는 여러 패키지의 빌드, 실행 및 관리를 효율적으로 수행하기 위한 디렉토리 구조이다. 일반적으로 ROS2 프로젝트에서는 다양한 패키지들이 독립적으로 존재하며, 이 패키지들은 공통의 워크스페이스에서 관리된다.
워크스페이스를 설정하기 위해서는 다음과 같은 디렉토리 구조를 유지하는 것이 권장된다:
workspace/
├── src/
└── install/
└── log/
└── build/
- 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
명령어는 다양한 옵션을 지원한다. 그 중 대표적인 옵션 몇 가지를 살펴보면 다음과 같다:
- --packages-select: 특정 패키지만 빌드할 때 사용한다.
bash colcon build --packages-select <package_name>
- --symlink-install: 빌드 후 설치된 파일을 심볼릭 링크로 관리하여 빠른 업데이트가 가능하게 한다.
bash colcon build --symlink-install
이 외에도 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_depend
와 exec_depend
를 명확하게 구분하여 빌드 과정에서만 필요한 패키지와 실행 중에만 필요한 패키지를 정확히 정의해야 한다. 이렇게 하면 빌드 시간과 실행 환경 설정에서의 불필요한 작업을 줄일 수 있다.
3. 중복 종속성 제거
여러 패키지가 동일한 종속성을 가질 경우, 이를 관리하는 방법을 최적화할 수 있다. find_package
나 ament_target_dependencies
에서 중복된 항목을 제거하여 컴파일 시간과 링크 시간을 줄일 수 있다.
빌드 오류 해결
ROS2 환경에서 발생할 수 있는 다양한 빌드 오류를 해결하기 위해서는 다음과 같은 일반적인 접근 방식을 사용할 수 있다:
1. 종속 패키지 확인
빌드 오류가 발생했을 때, 가장 먼저 확인해야 할 것은 종속 패키지의 설치 여부이다. 다음 명령어로 누락된 패키지를 확인할 수 있다:
rosdep install --from-paths src --ignore-src -r -y
이 명령어는 현재 워크스페이스의 src
디렉토리에 있는 모든 패키지의 종속성을 자동으로 설치한다.
2. 빌드 로그 분석
빌드가 실패할 경우, log/latest_build.log
파일을 확인하여 오류 메시지를 분석하는 것이 중요하다. 오류 메시지의 내용에 따라 빌드 오류의 원인을 정확히 파악할 수 있다.