首页 > 解决方案 > 通过 CMake 在 catkin 工作场所外使用 ROS 自定义消息

问题描述

问题:在 CMakeLists.txt 中的 catkin 工作场所之外的代码中包含生成的 ros 消息/服务的最佳做法是什么?

背景:所以在我开始工作的当前项目中,构建系统基于 CMake,但一些代码/可执行文件使用 ROS。我决定遵循相同的模式,并在 ROS catkin 工作场所之外创建大多数可执行文件。现在由于一些新的需求,我需要创建自己的 ROS 消息/服务,并将它们作为包添加到 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和其他人制作的库。otherLibraries

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

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

标签: visual-studio-codecmakerosbuild-system

解决方案


我有一个类似的案例,我使用了一些独立于 ROS 的 C++ 库,然后我需要使用 ROS。

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

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

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


推荐阅读