使用 CMake 在 catkin 工作场所外使用 ROS 自定义消息

Use ROS custom messages outside catkin workplace with CMake

问题:将生成的 ros messages/services 包含在 CMakeLists.txt 的 catkin workplace 之外的代码中的最佳实践是什么?

上下文: 因此,在我开始从事的当前项目中,构建系统基于 CMake,但 codes/executable 中的 some 使用 ROS。我决定遵循相同的模式,并在 ROS catkin workplace 之外创建大部分可执行文件。现在由于一些新要求,我需要创建自己的 ROS message/services,并将它们作为包添加到 catkin 工作区,并使用 catkin_make 生成它们。目录树如下

root
|-CMakeLists.txt
|-src
|-|--myExecutable.cpp
|-catkin_ws
|--|--src
|--|--|--myPackage
|--|--|---|--srv
|--|--|---|--msg
|--|--|---|--package.xml
|--|--|---|--CMakeLists.txt
|-otherLibraries
|--|--CMakeLists.txt

现在,为了我自己的使用,我只 运行 catkin_make 一次生成 msg/srv 和 source catkin_ws/devel/setup.bash 的头文件(实际上添加到我的 ~/.bashrc) 用于构建项目,顶部 CMakeLists.txt。在顶部 CMakeLists.txt 我有 find_package(myPackage) 这对我的使用来说很好,myExecutable.cpp 它使用 myPackage 中定义的 message/service 和其他人在 otherLibraries 编译并且 运行 就好了。

现在该项目的另一个成员使用 Visual Studio 代码 抱怨 find_package(myPackage) 在他的 IDE CMake 工具上出错。我知道这是由于 source catkin_ws/devel/setup.bash 在 IDE 上不是 运行 造成的。

我的 CMake 知识充其量只是拼凑而成,但我知道项目中的人更喜欢 Modern CMake,我不确定解决此问题的最佳做法是什么。 (我应该 运行 顶部 CMakeLists.txt 中的 setup.bash 脚本吗?我应该使用 set() 手动添加生成的 header/lib 的位置吗?)

我有过类似的情况,我使用了一些独立于 ROS 的 C++ 库,然后我需要使用 ROS。

我最后做的是在我的 catkin_ws 中为我的软件创建一个 catkin 包,并根据非 ROS 需求更改 CMakeLists.txt。这样我使用 catkin_make 构建整个项目,包括 ROS 相关的东西和非 ROS 相关的东西。其实我说的这个案例是开源的here,大家可以看看

然后您可以让您的 IDE 知道去哪里找,它应该会找到所有内容。就个人而言,我在 CLion IDE 中打开了我的 catkin 包,CLion 拾取了所有东西。我能够毫不费力地在同一个 IDE 中构建、编译、运行 和调试,这确实是满足我需求的一个很好的设置(桥接 ROS 和非 ROS 代码,功能齐全 IDE 使用调试工具!)。

锦上添花的是我在 Singularity 容器中完成了上述所有操作。将所有这些都放在一个单一的奇点容器中非常 便携 可共享 。您 take/share Singularity 配方甚至是预建的 Singularity 图像,任何人都可以在他们的计算机上使用它并且具有与您的完全相同的配置!我们在 GitHub here 上有一个这样的 Singularity 配置示例,为 OpenRAVE 提供功能齐全且包含的 UR5 控制器。