Booil Jung

ROS 2 Humble package.xml 완벽 안내서

ROS 2 패키지를 다루다 보면 package.xml 파일을 마주하게 된다. 많은 개발자들이 이를 단순히 패키지 이름, 버전, 작성자 정보 등을 담는 메타데이터 파일로 취급하곤 한다. 하지만 이는 package.xml의 역할을 과소평가하는 것이다. 이 파일은 단순한 정보의 나열이 아니라, ROS 2 생태계 전체와 소통하는 패키지의 공식 명세서(public API)이자 계약서다.

package.xml은 패키지의 정체성을 정의하고, 시스템의 다른 부분들과 어떻게 상호작용할지를 명시하는 핵심적인 역할을 수행한다. 예를 들어, 빌드 도구인 colcon은 이 파일을 읽어 패키지 간의 빌드 순서를 결정한다. 의존성 관리 도구인 rosdep은 이 파일을 참조하여 필요한 시스템 라이브러리를 설치한다. ros2 launchros2 run 같은 커맨드 라인 도구들 역시 이 파일을 통해 패키지의 위치와 실행에 필요한 정보를 파악한다.1

이처럼 package.xml은 ROS 2의 다양한 도구들이 각자의 역할을 수행할 수 있도록 표준화된 인터페이스를 제공하는 중심축이다. colconCMakeLists.txtsetup.py의 복잡한 문법을 직접 해석할 필요 없이 빌드 순서를 알 수 있는 것도, rosdep이 C++ 코드의 내용을 몰라도 필요한 라이브러리를 설치할 수 있는 것도 모두 package.xml이라는 잘 정의된 계약서 덕분이다. 이러한 설계는 ROS 2 생태계의 각 도구들이 서로 느슨하게 결합(decoupled)되어 독립적으로 발전할 수 있게 만드는 핵심 원리다.4

이 안내서는 package.xml의 모든 것을 다룬다. 기본적인 파일 구조와 필수 태그부터 시작하여, 복잡한 의존성 관계를 정의하는 방법, 빌드 시스템과의 연동, 고급 기능 활용법, 그리고 실제 프로젝트에서 적용할 수 있는 모범 사례와 흔히 발생하는 문제들의 해결책까지 깊이 있게 파고들 것이다. 이 문서를 끝까지 읽고 나면, package.xml을 단순한 설정 파일이 아닌, ROS 2 패키지의 잠재력을 최대한으로 이끌어내는 강력한 도구로 활용할 수 있게 될 것이다.

ROS 2 Humble은 package.xml 포맷 3을 표준으로 사용한다. 이 포맷은 REP-149에 명시되어 있으며, 이전 포맷에 비해 조건부 의존성 선언과 같은 강력한 기능들이 추가되었다.7 패키지를 생성하면 다음과 같은 기본 구조를 가진 package.xml 파일이 만들어진다.1

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>my_package</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="user@todo.todo">user</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

파일의 가장 첫 두 줄은 XML 문서의 표준 선언과 스키마 정의를 담고 있다.

모든 내용은 <package> 루트 태그 안에 위치한다. 여기서 format="3" 속성은 이 파일이 REP-149에 명시된 포맷 3 사양을 따른다는 것을 명확히 한다.7 이 속성이 있어야만 <group_depend>condition 속성 같은 포맷 3의 새로운 기능들을 올바르게 사용할 수 있다. ROS 2는 이전 버전인 포맷 2도 지원하지만, 특별한 이유가 없다면 Humble에서는 포맷 3을 사용하는 것이 표준이다.13

모든 ROS 2 패키지는 자신의 정체성을 나타내는 최소한의 정보를 반드시 포함해야 한다. 이 정보들은 패키지의 “신분증”과 같은 역할을 한다.7

필수 태그 외에도 패키지에 대한 추가 정보를 제공하여 사용자의 이해를 돕고 커뮤니티 참여를 유도하는 여러 선택적 태그가 있다.

package.xml의 가장 중요하고 핵심적인 기능은 바로 의존성 관리다. 패키지가 올바르게 빌드되고 실행되기 위해 필요한 다른 패키지나 시스템 라이브러리가 무엇인지 명시하는 역할을 한다.

ROS 개발을 처음 접하는 사람들이 가장 흔하게 던지는 질문 중 하나는 “왜 package.xmlCMakeLists.txt에 의존성을 두 번씩이나 선언해야 하는가?”이다. 이는 중복 작업처럼 보일 수 있지만, 실제로는 두 파일이 서로 다른 대상과 목적을 위해 의존성을 선언하기 때문에 발생하는 의도된 설계다.4

이러한 이중 선언 구조는 ROS 2의 유연성과 확장성의 핵심이다. colconrosdeppackage.xml이라는 표준화된 명세만 이해하면 되므로, 내부적으로 CMake를 쓰든, Python setuptools를 쓰든, 혹은 미래에 나올 새로운 빌드 시스템을 쓰든 상관없이 일관되게 동작할 수 있다. 이 설계 덕분에 ROS 2는 ROS 1의 catkin이 CMake에 강하게 종속되었던 한계를 극복하고 다양한 빌드 시스템을 포용하는 현대적인 빌드 환경을 구축할 수 있었다.20

package.xml에는 여러 종류의 의존성 태그가 있으며, 각 태그는 의존성이 필요한 시점과 범위에 따라 명확히 구분된다. 올바른 태그를 사용하는 것은 패키지의 의도를 명확히 하고, 불필요한 의존성 전파를 막으며, 효율적인 패키징을 위해 매우 중요하다.6

다음 표는 다양한 상황에서 어떤 의존성 태그를 선택해야 하는지에 대한 빠른 참조 가이드다.

태그 목적 (언제 사용하는가?) C++ 패키지 예시 Python 패키지 예시
<buildtool_depend> 패키지를 빌드하는 데 필요한 도구 자체 ament_cmake (사용 안 함)
<build_depend> 소스코드(.cpp)나 비공개 헤더에서만 필요한 의존성 Boost (내부 구현용) (거의 사용 안 함)
<build_export_depend> 공개 헤더(.hpp)에서 #include하는 의존성 (전이 의존성) geometry_msgs (공개 API에 사용) (거의 사용 안 함)
<exec_depend> 노드나 스크립트를 실행할 때만 필요한 의존성 런치 파일에서 실행하는 다른 패키지 rclpy, numpy
<depend> 빌드, 링크, 실행 전반에 걸쳐 모두 필요한 의존성 rclcpp, std_msgs (사용 안 함, exec_depend 선호)
<test_depend> 테스트를 빌드하고 실행할 때만 필요한 의존성 ament_cmake_gtest ament_flake8, pytest

포맷 3에서는 의존성을 더욱 정교하게 제어할 수 있는 속성들을 제공한다.

<export> 태그는 패키지가 자신의 정보를 ROS 생태계의 다른 부분(빌드 시스템, 툴 등)에 “수출(export)”하는 데 사용된다. 이 태그 안에 포함된 정보는 패키지가 어떻게 빌드되어야 하는지, 어떤 특별한 속성을 가지고 있는지 등을 알려주는 중요한 메타데이터다.19

<export> 섹션에서 가장 중요하고 필수적인 태그는 <build_type>이다. 이 태그는 colcon에게 이 패키지를 어떤 빌드 시스템을 사용하여 빌드해야 하는지를 명시적으로 알려준다.3

만약 C++과 Python 코드가 함께 있는 하이브리드 패키지를 만들고 싶다면, 기본 빌드 타입은 ament_cmake로 설정해야 한다. 그리고 CMakeLists.txt 안에서 ament_cmake_python 패키지가 제공하는 함수들을 사용하여 Python 코드를 처리하도록 설정한다. 이 경우 package.xml에는 <buildtool_depend>ament_cmake_python</buildtool_depend> 의존성을 추가해야 한다.26

이는 package.xml 포맷 3에서 도입된 고급 기능으로, 여러 패키지를 논리적인 그룹으로 묶어 관리할 수 있게 해준다. 개별 패키지 이름을 일일이 나열하는 대신, 특정 “그룹”에 대한 의존성을 선언하는 방식이다.7

가장 대표적인 사용 사례는 ROS 인터페이스(메시지, 서비스, 액션) 패키지들이다.

  1. std_msgs, geometry_msgs와 같이 .msg, .srv, .action 파일을 포함하는 모든 인터페이스 패키지들은 자신의 package.xml에 다음과 같이 선언한다:

    <export>
      <member_of_group>rosidl_interface_packages</member_of_group>
    </export>
    
  2. ros1_bridgerosidl_default_generators와 같이 워크스페이스에 있는 모든 인터페이스 정의를 알아야 하는 패키지들은 개별 인터페이스 패키지 이름을 나열하는 대신, 다음과 같이 그룹 전체에 대한 의존성을 선언한다:

    <group_depend>rosidl_interface_packages</group_depend>
    

이 메커니즘을 통해 colconrosidl_interface_packages 그룹의 멤버인 모든 패키지들을 먼저 빌드한 후, 이 그룹에 의존하는 ros1_bridge 같은 패키지를 빌드하도록 순서를 보장할 수 있다. 이는 워크스페이스에 어떤 인터페이스 패키지가 추가되거나 제거되더라도 ros1_bridgepackage.xml을 수정할 필요가 없게 만들어주므로, 시스템의 모듈성과 확장성을 크게 향상시킨다.7

이론적인 설명을 넘어, 실제 프로젝트에서 사용되는 package.xml 예제를 통해 각 태그가 어떻게 활용되는지 살펴보자.

간단한 rclcpp 기반의 퍼블리셔 노드를 포함하는 C++ 패키지의 package.xml 예제다.

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>cpp_pubsub</name>
  <version>1.0.0</version>
  <description>A simple C++ publisher and subscriber example.</description>
  <maintainer email="dev@example.com">Jane Doe</maintainer>
  <license>Apache-2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>

  <test_depend>ament_cmake_gtest</test_depend>
  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

해설:

간단한 rclpy 기반의 노드를 포함하는 순수 Python 패키지의 package.xml 예제다.

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>py_pubsub</name>
  <version>1.0.0</version>
  <description>A simple Python publisher and subscriber example.</description>
  <maintainer email="dev@example.com">John Doe</maintainer>
  <license>Apache-2.0</license>

  <exec_depend>rclpy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>

해설:

ROS 2에서 메타패키지는 여러 관련 패키지를 하나의 논리적 단위로 묶어 사용자가 편리하게 설치하고 관리할 수 있도록 돕는 역할을 한다. ROS 1에서는 <metapackage/>라는 전용 태그가 있었지만, ROS 2에서는 이 태그가 사라졌다. 대신, 실제 코드나 빌드 로직 없이 오직 다른 패키지에 대한 실행 시점 의존성(exec_depend)만을 포함하는 일반 패키지로 메타패키지를 구성한다.13

ros_gz 메타패키지의 package.xml 예제를 살펴보자. 이 패키지는 ROS 2와 Gazebo 시뮬레이터를 연동하는 데 필요한 핵심 패키지들을 묶어준다.40

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2"> <name>ros_gz</name>
  <version>2.1.6</version>
  <description>Meta-package containing interfaces for using ROS 2 with Gazebo simulation.</description>
  <maintainer email="adityapande@intrinsic.ai">Aditya Pande</maintainer>
  <license>Apache 2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <exec_depend>ros_gz_bridge</exec_depend>
  <exec_depend>ros_gz_sim</exec_depend>
  <exec_depend>ros_gz_sim_demos</exec_depend>
  <exec_depend>ros_gz_image</exec_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

해설:

잘 작성된 package.xml은 프로젝트의 유지보수성, 재사용성, 협업 효율성을 크게 향상시킨다. 다음은 다년간의 ROS 개발 경험을 통해 정립된 모범 사례와 초보자들이 흔히 저지르는 실수들이다.

효과적인 package.xml 작성은 올바른 패키지 구성에서부터 시작된다.

개발 과정에서 package.xml과 관련된 다양한 문제에 직면할 수 있다. 다음은 가장 흔하게 발생하는 오류들과 그 원인 및 해결 방법이다.

이 오류는 rosdeppackage.xml에 명시된 의존성 키에 해당하는 시스템 패키지를 rosdistro 데이터베이스에서 찾지 못할 때 발생한다.49

colcon이 워크스페이스 내에서 특정 패키지를 인식하지 못할 때 발생하는 오류다.

빌드 과정 자체에서 발생하는 오류로, package.xml과 빌드 스크립트 간의 불일치로 인해 발생하는 경우가 많다.

지금까지 ROS 2 Humble의 package.xml에 대해 깊이 있게 탐구했다. 이 파일이 단순한 메타데이터의 집합이 아니라, ROS 2 생태계의 모든 도구와 소통하며 패키지의 빌드, 테스트, 배포, 실행의 모든 과정을 관장하는 핵심적인 “계약서”임을 확인했다.

정확하고 명료하게 작성된 package.xml은 다음과 같은 가치를 제공한다.

결론적으로, package.xml을 능숙하게 다루는 능력은 ROS 2 개발자의 핵심 역량 중 하나다. 이 안내서에서 다룬 원칙과 모범 사례들을 꾸준히 적용한다면, 더 안정적이고, 유지보수하기 쉬우며, 확장 가능한 로봇 소프트웨어를 개발하는 데 큰 도움이 될 것이다. package.xml은 사소한 설정 파일이 아니라, 훌륭한 로봇 공학 프로젝트를 지탱하는 견고한 초석이다.

  1. Creating a package - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html
  2. Creating a package - ROS 2 Documentation: Foxy documentation, accessed July 27, 2025, https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Creating-Your-First-ROS2-Package.html
  3. The build system - ROS 2 Documentation: Iron documentation, accessed July 27, 2025, https://docs.ros.org/en/iron/Concepts/Advanced/About-Build-System.html
  4. ros - Dependency management in ROS2: CMakeLists.txt, package …, accessed July 27, 2025, https://robotics.stackexchange.com/questions/96942/dependency-management-in-ros2-cmakelists-txt-package-xml-colcon-build-make
  5. The build system - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Concepts/Advanced/About-Build-System.html
  6. Managing Dependencies with rosdep - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Rosdep.html
  7. REP 149 – Package Manifest Format Three Specification (ROS.org), accessed July 27, 2025, https://ros.org/reps/rep-0149.html
  8. ROS Cheat Sheet Clearpath Robotics Documentation, accessed July 27, 2025, https://docs.clearpathrobotics.com/docs/ros/tutorials/cheat_sheet
  9. https://ros2-tutorial.readthedocs.io/en/latest/_downloads/d105360c187244c8f4ad65b892cff4c1/package.xml, accessed July 27, 2025, https://ros2-tutorial.readthedocs.io/en/latest/_downloads/d105360c187244c8f4ad65b892cff4c1/package.xml
  10. ros1_bridge/package.xml at master - GitHub, accessed July 27, 2025, https://github.com/ros2/ros1_bridge/blob/master/package.xml
  11. How do you validate your package.xmls in ROS2? - General - ROS Discourse, accessed July 27, 2025, https://discourse.ros.org/t/how-do-you-validate-your-package-xmls-in-ros2/23875
  12. ROS2 C++ Package Creation Guide ROS2 Tutorial - The Construct, accessed July 27, 2025, https://www.theconstruct.ai/ros2-cpp-package-creation-guide-ros2-tutorial/
  13. Migrating Packages - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/How-To-Guides/Migrating-from-ROS1/Migrating-Packages.html
  14. Semantic Versioning 2.0.0 Semantic Versioning, accessed July 27, 2025, https://semver.org/
  15. How to release a ROS 2 binary package - Part 3 - The Construct, accessed July 27, 2025, https://www.theconstruct.ai/how-to-release-a-ros-2-binary-package-part-3/
  16. nav2_behavior_tree/package.xml / main / undefined / GitLab, accessed July 27, 2025, https://git.tu-berlin.de/ecschuetz/navigation2/-/blob/main/nav2_behavior_tree/package.xml?ref_type=heads
  17. example_interfaces/package.xml at rolling / ros2 … - GitHub, accessed July 27, 2025, https://github.com/ros2/example_interfaces/blob/rolling/package.xml
  18. pluginlib - ROS Wiki, accessed July 27, 2025, http://wiki.ros.org/pluginlib
  19. Package manifest XML tags reference - ROS, accessed July 27, 2025, http://ros.org/doc/independent/api/rospkg/html/manifest_xml.html
  20. The build system “ament_cmake” and the meta build tool “ament_tools” - ROS2 Design, accessed July 27, 2025, https://design.ros2.org/articles/ament.html
  21. Managing Dependencies with rosdep - ROS 2 Documentation: Foxy documentation, accessed July 27, 2025, https://docs.ros.org/en/foxy/Tutorials/Intermediate/Rosdep.html
  22. catkin/package.xml - ROS Wiki, accessed July 27, 2025, http://wiki.ros.org/catkin/package.xml
  23. Migration guide from ROS 1 - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://ftp.udx.icscoe.jp/ros/ros_docs_mirror/en/humble/Contributing/Migration-Guide.html
  24. ROS2 XML Launch File Example - The Robotics Back-End, accessed July 27, 2025, https://roboticsbackend.com/ros2-xml-launch-file/
  25. Guidelines and Best Practices, accessed July 27, 2025, https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/contributor-guidelines.html
  26. ament_cmake_python user documentation - the official ROS docs, accessed July 27, 2025, https://docs.ros.org/en/humble/How-To-Guides/Ament-CMake-Python-Documentation.html
  27. Ability to query build or exec dependencies only / Issue #587 / ros-infrastructure/rosdep, accessed July 27, 2025, https://github.com/ros-infrastructure/rosdep/issues/587
  28. Use identical package.xml for ROS1 and ROS2 pkgs - Robotics Stack Exchange, accessed July 27, 2025, https://robotics.stackexchange.com/questions/86231/use-identical-package-xml-for-ros1-and-ros2-pkgs
  29. Support for format three package.xml conditions / Issue #653 / ros-infrastructure/rosdep - GitHub, accessed July 27, 2025, https://github.com/ros-infrastructure/rosdep/issues/653
  30. About the build system - ROS 2 Documentation: Foxy documentation, accessed July 27, 2025, https://docs.ros.org/en/foxy/Concepts/About-Build-System.html
  31. Migrating a Python Package Example - ROS 2 Documentation …, accessed July 27, 2025, https://docs.ros.org/en/humble/How-To-Guides/Migrating-from-ROS1/Migrating-Python-Package-Example.html
  32. Create a ROS2 package for Both Python and Cpp Nodes - The Robotics Back-End, accessed July 27, 2025, https://roboticsbackend.com/ros2-package-for-both-python-and-cpp-nodes/
  33. ament_cmake_python user documentation - ROS 2 Documentation, accessed July 27, 2025, https://ftp.udx.icscoe.jp/ros/ros_docs_mirror/en/humble/How-To-Guides/Ament-CMake-Python-Documentation.html
  34. Dependency from rmw_cyclonedds_cpp on fastrtps via rmw_dds_common #16 - GitHub, accessed July 27, 2025, https://github.com/ros2/rmw_dds_common/issues/16
  35. Creating and Using Plugins (C++) - ROS 2 Documentation: Xin 文档, accessed July 27, 2025, https://daobook.github.io/ros2-docs/xin/Tutorials/Pluginlib.html
  36. Question about how to export plugin.xml files / Issue #198 / ros/pluginlib - GitHub, accessed July 27, 2025, https://github.com/ros/pluginlib/issues/198
  37. Creating and using plugins (C++) - ROS 2 Documentation: Foxy documentation, accessed July 27, 2025, https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Pluginlib.html
  38. ament_cmake user documentation - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/How-To-Guides/Ament-CMake-Documentation.html
  39. ROS 2 metapackages/variants support / Issue #408 - GitHub, accessed July 27, 2025, https://github.com/ros2/ros2/issues/408
  40. package.xml - gazebosim/ros_gz - GitHub, accessed July 27, 2025, https://github.com/gazebosim/ros_gz/blob/ros2/ros_gz/package.xml
  41. Using variants - Galactic documentation - the official ROS docs, accessed July 27, 2025, https://docs.ros.org/en/galactic/How-To-Guides/Using-Variants.html
  42. Package Organization For a ROS Stack [Best Practices] - The Robotics Back-End, accessed July 27, 2025, https://roboticsbackend.com/package-organization-for-a-ros-stack-best-practices/
  43. ROS2 Part 9 - ROS2 Launch Files - RoboticsUnveiled, accessed July 27, 2025, https://www.roboticsunveiled.com/ros2-launch-files/
  44. REP 140 – Package Manifest Format Two Specification (ROS.org), accessed July 27, 2025, https://www.ros.org/reps/rep-0140.html
  45. Using Git Tags for Semantic Versioning (Step-by-Step Guide) - Medium, accessed July 27, 2025, https://medium.com/@wealthiscertain/using-git-tags-for-semantic-versioning-step-by-step-guide-02b18d73a7b9
  46. Managing Releases with Semantic Versioning and Git Tags - GitKraken, accessed July 27, 2025, https://www.gitkraken.com/gitkon/semantic-versioning-git-tags
  47. Bloom release from a specific tag in a specific branch - ROS Discourse, accessed July 27, 2025, https://discourse.ros.org/t/bloom-release-from-a-specific-tag-in-a-specific-branch/37922
  48. Invalid package.xml suppresses error and silently succeeds if setup.py present / Issue #146, accessed July 27, 2025, https://github.com/colcon/colcon-ros/issues/146
  49. How to solve the ERROR Cannot locate rosdep definition for [PCL] in ROS2 Humble?, accessed July 27, 2025, https://robotics.stackexchange.com/questions/107920/how-to-solve-the-error-cannot-locate-rosdep-definition-for-pcl-in-ros2-humble
  50. ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies: I’m using Ubuntu 18.04; ROS Melodic - Reddit, accessed July 27, 2025, https://www.reddit.com/r/ROS/comments/1ac4t7f/error_the_following_packagesstacks_could_not_have/
  51. Cannot locate rosdep definition - ROS Answers archive, accessed July 27, 2025, http://answers.ros.org/question/320734/
  52. Managing Dependencies with rosdep - ROS 2 Documentation: Rolling documentation, accessed July 27, 2025, https://docs.ros.org/en/rolling/Tutorials/Intermediate/Rosdep.html
  53. Managing Dependencies with rosdep - documentación de ROS 2 Documentation, accessed July 27, 2025, https://ros-spanish-users-group.github.io/ros2_documentation/humble/Tutorials/Intermediate/Rosdep.html
  54. rosdistro/REVIEW_GUIDELINES.md at master - GitHub, accessed July 27, 2025, https://github.com/ros/rosdistro/blob/master/REVIEW_GUIDELINES.md
  55. rostooling/cc-rosdep - Docker Image, accessed July 27, 2025, https://hub.docker.com/r/rostooling/cc-rosdep
  56. Generate deb from dependent res package locally - Robotics Stack Exchange, accessed July 27, 2025, https://robotics.stackexchange.com/questions/84788/generate-deb-from-dependent-res-package-locally
  57. Cannot locate rosdep definition for [ament_lint_common] - ROS Answers archive, accessed July 27, 2025, https://answers.ros.org/question/371969/
  58. colcon can not find my package - ROS Answers archive, accessed July 27, 2025, https://answers.ros.org/question/364278/
  59. [feature] CI job to verify dependencies package.xml / Issue #29685 / ros/rosdistro - GitHub, accessed July 27, 2025, https://github.com/ros/rosdistro/issues/29685