Лучше всего создать общую библиотеку, содержащую базовый код.Затем вы просто используете функции / классы из этой библиотеки в своих узлах.
В вашем CMakeLists.txt вы можете определить библиотеку следующим образом:
## LIBRARIES: libraries you create in this project that dependent projects also need
catkin_package(
INCLUDE_DIRS include
LIBRARIES <library name>
)
...
## Declare a C++ library
add_library(<library name>
src/${PROJECT_NAME}/<cpp file of your library>
< ... additional files ... >
)
Конечно, не забывайте, что вам нужно связать зависимости с библиотекой.
target_link_libraries(${PROJECT_NAME}
${catkin_LIBRARIES}
)
Я также предлагаю вам прочитать CMakeLists.txt, где у вас есть все инструкции по объявлениюбиблиотека.
Что касается структуры, то не имеет значения, как вы ее упаковываете.В вашем конкретном случае я бы предложил вам иметь один пакет catkin с библиотекой и два узла (вы можете иметь несколько узлов в пакете).Если вы считаете, что вам нужно иметь библиотеку в отдельном пакете, продолжайте.Вам нужно только включить, чтобы сообщить catkin, что вы хотите включить этот пакет в качестве зависимости для пакета, в котором вы хотите его использовать.Вы можете сделать это, написав
find_package(catkin REQUIRED COMPONENTS
...
<name of the package with the library>
...
)
Затем вы просто включаете заголовки из пакета в файлы вашего узла (или любого другого) (C ++).Если ваша библиотека НЕ является только заголовком, то не забудьте связать библиотеку с вашим узлом с помощью
target_link_libraries(
<node name>
${catkin_LIBRARIES}
<library name>
...
)
. Я также предлагаю прочитать подробнее об этой теме на ros wiki .