의존성 정의

ROS2 패키지에서 의존성 관리란, 패키지가 정상적으로 작동하기 위해 필요한 다른 패키지들을 정의하고 이를 추적하는 과정을 의미한다. ROS2 패키지에서 의존성을 정의하는 가장 기본적인 방법은 package.xml 파일에 의존성을 명시하는 것이다. package.xml 파일은 패키지 메타데이터를 정의하는 파일로, 패키지의 이름, 버전, 라이센스 정보, 빌드 도구, 의존하는 패키지 등을 기술한다.

<build_depend>rclcpp</build_depend>
<exec_depend>sensor_msgs</exec_depend>
<test_depend>gtest</test_depend>

이러한 의존성 구분은 ROS2 패키지의 설치 및 실행을 명확하게 할 수 있도록 도움을 준다.

의존성 해결

ROS2는 의존성 해결을 위해 다양한 도구와 방식을 제공한다. colcon은 ROS2에서 주로 사용되는 빌드 도구로, 패키지 간의 의존성을 관리하고 빌드 순서를 결정한다. colcon을 사용하면 패키지가 의존하는 모든 패키지를 먼저 빌드한 후, 해당 패키지를 빌드하는 방식으로 의존성을 해결한다.

colcon build

의존성 문제로 인해 빌드가 실패할 경우, package.xml에 누락된 의존성이 없는지 확인하고 추가해야 한다.

의존성 수정

패키지의 의존성 수정은 주로 다음과 같은 경우에 이루어진다:

  1. 새로운 기능을 추가하면서 새로운 패키지에 의존해야 할 때
  2. 기존 의존성을 제거하거나 대체할 때
  3. 의존 패키지의 버전 변경에 따른 업데이트가 필요할 때

의존성을 수정할 때는 package.xml 파일과 CMakeLists.txt 파일을 함께 수정해야 한다. 의존하는 패키지를 추가하거나 제거하는 경우, package.xml에서 관련 의존성을 수정하고, CMakeLists.txt 파일에서도 관련 링크를 설정해야 한다.

find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)

이와 같이 find_package()를 통해 의존 패키지를 찾아오고, 빌드 과정에서 해당 패키지를 포함한다. 만약 의존성이 잘못되었거나 누락되었다면, 빌드 과정에서 에러가 발생할 수 있다.

CMakeLists.txt에서 의존성 관리

CMakeLists.txt 파일은 패키지를 빌드하는 방법을 정의하는 파일로, 패키지 의존성 또한 이 파일을 통해 관리된다. 이때 의존성을 정의하는 기본적인 방법은 find_package() 명령어를 사용하는 것이다. 예를 들어, rclcpp 패키지에 의존하는 패키지를 작성하는 경우, CMakeLists.txt 파일에는 다음과 같이 의존성을 명시한다:

find_package(rclcpp REQUIRED)

이 명령어는 빌드 시스템이 rclcpp 패키지를 찾고, 패키지를 빌드할 때 해당 라이브러리를 포함하게 한다. 또한 의존 패키지에서 제공하는 메시지, 서비스 등의 인터페이스를 사용할 때, CMakeLists.txt에 다음과 같은 추가 설정이 필요할 수 있다.

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

ament_target_dependencies()는 노드가 의존하는 패키지를 명시하는 함수로, 위 예제에서는 rclcppsensor_msgs 패키지에 의존하는 노드를 정의하고 있다.

ROS2에서 의존성 버전 관리

ROS2에서는 특정 버전의 패키지에 의존성을 설정할 수 있다. 이를 통해 패키지의 호환성을 유지하고, 특정 기능을 필요로 할 때 해당 버전 이상의 패키지로 제한할 수 있다. 예를 들어, package.xml 파일에서 의존하는 패키지의 버전을 명시할 수 있다.

<build_depend>rclcpp>=1.0.0</build_depend>
<exec_depend>sensor_msgs>=2.0.0</exec_depend>

위의 예에서 rclcpp 패키지는 버전 1.0.0 이상, sensor_msgs는 버전 2.0.0 이상을 요구한다. 이를 통해 버전 충돌이나 기능 불일치를 방지할 수 있다. 하지만, ROS2의 패키지 버전 관리는 주로 전체 ROS2 배포판의 일관성을 유지하는 방식으로 관리되기 때문에, ROS2 릴리즈마다 의존성 관리가 다소 달라질 수 있다.

의존성 문제 해결

의존성 문제를 해결하기 위한 일반적인 단계는 다음과 같다:

  1. 의존성 누락 확인: 패키지 의존성 파일인 package.xml이나 CMakeLists.txt에 필요한 의존성이 누락되었는지 확인한다. 예를 들어, 패키지에서 특정 메시지를 사용하는데 sensor_msgs와 같은 패키지 의존성이 누락되면 빌드 오류가 발생할 수 있다.

  2. 패키지 검색: 필요한 패키지가 설치되지 않은 경우, apt, rosdep 등의 도구를 사용해 설치할 수 있다. 예를 들어, ROS2의 경우 다음 명령어로 필요한 패키지를 설치할 수 있다.

sudo apt install ros-humble-sensor-msgs
  1. 의존성 충돌 해결: 여러 버전의 패키지가 설치되어 충돌하는 경우, 시스템에 설치된 패키지 버전을 확인하고, 불필요한 버전을 제거하거나 맞는 버전으로 업데이트한다.
sudo apt remove ros-humble-<package>
sudo apt install ros-humble-<package>
  1. 로컬 패키지 의존성 문제: 로컬에서 패키지를 개발하는 경우, 빌드 시스템이 패키지를 찾지 못하는 경우가 있을 수 있다. 이때는 source 명령어를 사용해 워크스페이스 설정 파일을 로드하거나, 패키지를 다시 빌드하여 빌드 경로를 재설정할 수 있다.
source install/setup.bash
colcon build --packages-select <package_name>

rosdep을 활용한 의존성 설치

rosdep은 ROS 패키지에서 의존성을 자동으로 해결하고 설치하는 도구이다. 특히 ROS2 패키지의 의존성을 설치할 때 매우 유용하게 사용된다. rosdep을 사용하면 package.xml 파일에 명시된 의존성을 자동으로 확인하고, 시스템에 설치된 패키지와 비교하여 설치되지 않은 의존 패키지를 설치할 수 있다.

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

위 명령어는 현재 워크스페이스의 src 디렉토리 안에 있는 모든 패키지의 의존성을 확인하고, 시스템에 설치되지 않은 의존 패키지를 자동으로 설치한다. rosdep은 ROS2 패키지의 개발 및 배포 과정에서 의존성 관리를 용이하게 한다.

의존성 확인 및 업데이트

ROS2 패키지는 지속적으로 업데이트되며, 이에 따라 의존성도 업데이트가 필요할 수 있다. 패키지의 의존성을 최신 상태로 유지하기 위해, 정기적으로 패키지 업데이트를 확인하고, 필요시 업데이트해야 한다.

ROS2 패키지의 의존성을 확인하거나 업데이트할 때는 apt 패키지 관리자를 사용할 수 있다.

sudo apt update
sudo apt upgrade ros-humble-<package_name>

이러한 과정을 통해 패키지의 의존성을 최신 상태로 유지하고, 의존성 충돌을 방지할 수 있다.

고급 의존성 관리

ROS2 프로젝트가 커짐에 따라, 여러 패키지 간의 의존성이 복잡해질 수 있다. 특히, 다양한 하드웨어 및 소프트웨어 환경에서 ROS2 패키지를 배포하거나 실행할 때 의존성 관리는 매우 중요하다. 이러한 경우, ROS2에서는 다양한 의존성 관리 전략을 제공한다. 예를 들어, 패키지의 플랫폼별 의존성이나 선택적 의존성 등을 설정할 수 있다.

<build_export_depend>geometry_msgs</build_export_depend>
<exec_depend condition="$ROS_DISTRO == 'humble'">sensor_msgs</exec_depend>

위 예제에서는 특정 ROS 배포판에서만 필요한 의존성을 조건부로 설정하고 있다. 이를 통해 ROS2 패키지가 다양한 환경에서 일관성 있게 작동하도록 보장할 수 있다.