【问题标题】:ROS code duplication; what are the best practices for this?ROS代码重复;对此的最佳做法是什么?
【发布时间】:2018-10-13 15:48:28
【问题描述】:

我想知道在节点之间复制代码的最佳做法是什么。

例如:

我将两个包与一个名为 perception 的元包组合在一起,即; 对象检测定位

object detection 包有一个节点 -> ballDetection

localization 包有一个节点 -> linesDetection

正如您已经假设的那样,这些节点中有很多代码重复。例如,如果我想在屏幕上显示两个节点中的图像,我在两个节点中都有完全相同的代码。

我应该创建一个两个节点都可以用来在屏幕上显示图像的库吗?还是我应该对所有事情都使用节点?这种情况的最佳做法是什么?

【问题讨论】:

    标签: libraries ros code-duplication


    【解决方案1】:

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

    在您的 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 包(一个包中可以有多个节点)。如果您认为需要将库放在单独的包中,那就继续吧。你只需要 include 告诉 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 阅读有关此主题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多