Robotics/ROS2

[ROS2] package header file include

화이팅입미다 2021. 3. 27. 18:06

ros1에서 ros2로 마이그레이션을 시작하면서... 이전에 핵심 라이브러리들은 ros에 대한 의존성을 다 떼어내고 사용했기 때문에 sensor interface쪽만 바꾸면 되서 큰 어려움은 없을 것 같다고 생각했다. 하지만 catkin에서 ament로 바꾸는 과정에서 난관1에 부딪힘. ament 패키지로 빌드 자체는 쉬웠는데, 다른 패키지에서 헤더파일 #include가 안됐다.

 

 

기존의 CMakeLists.txt

catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)

catkin_package() : catkin이 제공하는 CMake의 매크로. 빌드시스템에 대한 catkin-specific 정보를 명시하고, pkg-config와 CMake 파일을 생성하는데 사용됨. 타겟의 add_library() 또는 add_executable()을 선언하기 전에 반드시 호출되야 하는 함수다.

- INCLUDE_DIRS : 패키지에 대해 내보내는 경로

- LIBRARIES : 프로젝트에서 내보낼 라이브러리

- CATKIN_DEPENDS : 다른 의존성 catkin 프로젝트

- DEPENDS : 다른 의존성 프로젝트

 

 

 

 

바뀐 CMakeLists.txt

ament_export_targets(export_my_library HAS_LIBRARY_TARGET)
ament_export_dependencies(some_dependency)

install(
  DIRECTORY include/
  DESTINATION include
)

install(
  TARGETS my_library
  EXPORT export_my_library
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)

 

재사용 가능한 라이브러리를 빌드할때, downstram 패키지(?)를 쉽게 하려면 일부 정보를 export해야한다.

 

ament_export_targets 매크로가 CMake의 대상을 대보낸다. 이 패키지의 클라이언트가 target_link_libraries에 사용할 수 있음.

ament_export_dependencies는 의존성 프로젝트을 내보낸다. 이 패키지의 클라이언트가 따로 find_package()를 할 필요가 없음.

 

첫번째 install 함수는 이 패키지의 클라이언트가 사용할 수 있는 헤더파일을 설치한다.

마지막 install 함수는 라이브러리를 설치한다. Archive 와 Library 파일은 lib폴더에 내보내지고, Runtime 바이너리는 bin폴더에 설치되고 설치된 헤더의 경로 또한 포함된다.

 

 

 

 

따라서 밑의 4개의 함수를 꼭 입력해야 클라이언트 패키지에서 #include를 할 수 있다.

'Robotics > ROS2' 카테고리의 다른 글

[ROS2] ros2에서 stage돌려보기  (0) 2021.04.01
[ROS2] logging and logger configuration  (0) 2021.04.01