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 |