Дублирование кода ROS;Каковы лучшие практики для этого? - PullRequest
0 голосов
/ 13 октября 2018

Мне было интересно, как лучше всего дублировать код между узлами.

Например:

Я сгруппировал два пакета с метапакетом под названием восприятие , а именно; обнаружение объекта и локализация .

обнаружение объекта пакет имеет узел -> ballDetection

локализация пакет имеет узел -> linesDetection

Как вы уже можете предположить, в этих узлах много дублирования кода.Например, если я хочу отобразить изображения в обоих узлах на экране, у меня будет одинаковый код в обоих узлах.

Должен ли я создать библиотеку, которую оба узла могут использовать для отображения изображений на экране?Или я должен использовать узлы для всего?Какова наилучшая практика для подобных ситуаций?

1 Ответ

0 голосов
/ 15 октября 2018

Лучше всего создать общую библиотеку, содержащую базовый код.Затем вы просто используете функции / классы из этой библиотеки в своих узлах.

В вашем 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 .

...