我想知道在节点之间重复代码的最佳实践是什么。
例如:
我将两个包与名为 perception 的元包分组在一起; 对象检测和本地化。
对象检测程序包具有一个节点-> ballDetection
本地化程序包具有一个节点-> linesDetection
您已经可以假设,这些节点中有很多代码重复。例如,如果要在屏幕的两个节点中显示图像,则两个节点中的代码完全相同。
是否应该创建一个库,两个节点都可以使用该库来将图像显示到屏幕上?还是应该将节点用于所有内容?对于这种情况,最佳做法是什么?
答案 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上阅读有关此主题的更多信息。