ROS代码重复;最佳做法是什么?

时间:2018-10-13 15:48:28

标签: libraries ros code-duplication

我想知道在节点之间重复代码的最佳实践是什么。

例如:

我将两个包与名为 perception 的元包分组在一起; 对象检测本地化

对象检测程序包具有一个节点-> ballDetection

本地化程序包具有一个节点-> linesDetection

您已经可以假设,这些节点中有很多代码重复。例如,如果要在屏幕的两个节点中显示图像,则两个节点中的代码完全相同。

是否应该创建一个库,两个节点都可以使用该库来将图像显示到屏幕上?还是应该将节点用于所有内容?对于这种情况,最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

最佳做法是创建一个包含基本代码的共享库。然后,您只需在节点中使用该库中的函数/类即可。

在您的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上阅读有关此主题的更多信息。