ROS2

[ROS2] Tutorial Intermediate - Managing Dependencies with rosdep

씨주 2024. 11. 16. 13:15

Managing Dependencies with rosdep

What is rosdep?

rosdep은 패키지와 외부 라이브러리가 함께 작동되도록 dependency를 관리하는 유틸리티이다. 패키지를 build하거나 install하는 dependency를 구분하고 설치하기 위한 유틸리티이다.

rosdep은 그 자체로 패키지를 관리하지 않는다. 특정 플랫폼을 설치하기 위한 적절한 패키지를 찾기 위해 자신이 가지고 있는 dependency를 사용하는 meta  패키지 관리인이다.

실제 설치는 시스템 패키지 관리인(apt, dnf 등)을 사용한다.

워크스페이스를 빌딩하기 전에 가장 많이 호출되며, 워크스페이스 안에 있는 패키지에 대한 dependency를 설치하는데 사용된다.

하나 또는 여러개의 패키지가 있는 디렉토리에서 사용할 수 있다.

 

A little about package.xml files

package.xml은 rosdep이 dependency를 찾는 파일이다. 모든 tooling이 package dependency를 설정할 수 있도록 package.xml에 있는 dependency 리스트는 정확하고 완벽한 것이 중요하다. 부정확한 dependency는 user가 패키지를 사용하지 못하게 하고 워크스페이스 패키지의 순서가 맞지 않으며, package를 release할 수 없게 한다.

package.xml의 dependency는 일반적으로 rosdep keys를 참고한다. dependency는 패키지 작성자에 의해 수동적으로 package.xml에 작성되며, 패키지와 빌트인되지 않은 라이브러리의 리스트 전체여야 한다.

 

<depend>

build time과 run time 모두 제공되어야 하는 dependecny이다. C++에서는 해당 태그를 사용한다. python package는 일반적으로 build 단계를 가지지 않기 때문에 exec_depende를 대신 사용한다. 

 

<build_depend>

실행시점이 아닌 package 빌딩을 위해 특정 dependency를 사용한다면, build_depend 태그를 사용할 수 있다. 

즉, dependency pacakge가 build과정에는 필요하지만 install할 때는 필요하지 않다.

그러나 package header를 포함하는 dependency를 export한다면 문제가 발생할 수 있다. 이 경우에는 build_export_depend가 필요하다.

 

<build_export_depend>

header를 포함한 dependency를 export한다면 build_depend에 의존하는 package에 build_export_depend가 필요하다. 이는 주로 header와 CMake configuration파일에 적용된다. execution time에도 필요하기 때문에 export한 library에서 참조한 library package는 <depend>로 보통 정의한다.

 

<exec_depend>

이는 package를 running 할 때 필요한 공유 library, python module, launch scripts 등에 대한 dependency를 정의한다.

 

<test_depend>

test에 필요한 dependency를 정의한다. 이 dependency는 <build_depnd>, <exec_depend>, <depend>와 겹치면 안된다.

 

How does rosdep work?

rosdep은 path, package에 있는 package.xml파일을 확인하고 저장된 rosdep을 찾아야 한다. 이 key들은 package 관리자에서 찾은  ROS package나 software 라이브러리와 central index와 상호 참고한다. 최종적으로 package를 찾으면, install하고 사용할 준비를 한다.

rosdep은 central index를 검색하여 실행할 때마다 network에 접근하는 것을 방지한다.

central index는 rosdistro로 알려져있으며, online에서 찾을 수 있다.

 

How do I know what keys to put in my package.xml/

의존하기 바라는 pacakge가 ROS베이스이고 ROS ecosystem(nav2_by_navigator 등)에서 release했다면, 해당 pacakge 이름으로 사용하면 된다. release된 ROS package는 https://github.com/ros/rosdistro에 있는 <distro>/distribution.yaml (humble/distribution.yaml)에서 찾을 수 있다.

ROS package가 아니라 'system dependency'라면 특정 라이브러리에서 찾을 수 있다. 일반적으로 2가지 파일이 있는데 apy system에 의존하는 rosdep/base.yaml, python에 의존하는 rosdep/python.yaml이 있다.

key를 찾기 위해 해당 파일에서 라이브러리를 검색하고 이름을 찾아보면 된다. 해당 key는 package.xml에 넣을 수 있다.

 

예를 들어 doxygen에 의존하는 package가 있다고 가정하면, rosdep/base.yaml의 doxygen을 찾아보면 된다.

doxygen:
  arch: [doxygen]
  debian: [doxygen]
  fedora: [doxygen]
  freebsd: [doxygen]
  gentoo: [app-doc/doxygen]
  macports: [doxygen]
  nixos: [doxygen]
  openembedded: [doxygen@meta-oe]
  opensuse: [doxygen]
  rhel: [doxygen]
  ubuntu: [doxygen]

rosdep key는 doxygen이고, installation을 위해 여러 system package manager에 있는 다양한 이름을 해결할 수 있다.

 

What if my library isn't in rosdistro?

라이브러리에 rosdistro가 없다면, 추가하고 rosdistro에 request하면 일주일 내로 merge될 것이다.

 

How do I use the rosdep tool?

ROS내에서 rosdep을 아래의 코드로 설치가능하다.

apt-get install python3-rosdep

 

ROS외에서 rosdep을 사용하고 싶다면 아래의 코드로 설치가능하다.

pip install rosdep

 

이제 rosdep을 사용하기 위해 initialize 후 update해야 한다.

sudo rosdep init
rosdep update

 

 

마지막으로 rosdep install로 dependency를 설치할 수 있다. 워크스페이스의 directory src에 source 코드가 있다면 아래의 코드로 실행할 수 있다.

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

 

--from-paths src : package.xml이 있는 경로

-y : prompt없이 설치할 package manager의 모든 prompt의 설정을 yes가 default값

--ignore-src : 워크스페이스 안에 package 자체 rosdep key가 존재하면 dependency 설치를 무시한다.

 

 

 

ROS2_Humble Documentation : https://docs.ros.org/en/humble/Tutorials/Intermediate.html