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

Posted

技术标签:

【中文标题】通过 CMake 在 catkin 工作场所外使用 ROS 自定义消息【英文标题】:Use ROS custom messages outside catkin workplace with CMake 【发布时间】:2020-04-15 04:40:25 【问题描述】:

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

上下文: 因此,在我开始从事的当前项目中,构建系统基于 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,我不确定解决此问题的最佳做法是什么。 (我应该在顶部 CMakeLists.txt 中运行setup.bash 脚本吗?我应该使用set() 手动添加生成的头文件/库的位置吗?)

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

嗨拉斐尔!非常感谢您的反馈!澄清一下:当您说对您的软件使用 catkin_ws 并更改 CMakeLists.txt 时,您的意思是您基本上向上移动(在上述结构中)myExecutable.cppotherLibrariescatkin_ws as一个新的包,并从那里的根目录添加了 CMakeLists.txt 内容? 如果 myPackage 与 myExecutable 和 otherLibraries 合并有意义,则将 myPackage 和 otherLibraries 的 src 中的 myExecutable 移动到 myPackage 中,并将 myPackage 之外的 CMakeLists 合并到 myPackage 中。或者,如果将所有内容放在 myPackage 中没有意义,请保持 myPackage 原样,并创建一个仅包含 myExecutable 和 otherLibraries 的新 catkin 包,然后再次将外部的 CmakeLists 合并到新包的 CMakeLists 中。 我在 GitHub 上有一个例子,我已经更新了我的答案。 你好拉斐尔!感谢您的澄清:) 我会将答案视为已接受。 :) 我想我可能会采用你提到的方式,第二种选择。 (我将保留myPackageSeparate,并使用它自己的修订控制系统和回购)。现在,通过一些丑陋的修补,打破了现代 cmake 方式,我让 IDE 在上述条件下工作,但你的方式绝对更易于维护。谢谢! :D 很高兴您解决了这个问题!祝你好运!

以上是关于通过 CMake 在 catkin 工作场所外使用 ROS 自定义消息的主要内容,如果未能解决你的问题,请参考以下文章

“CMake 错误:CMake 无法确定目标的链接器语言” 当我 catkin_make ROS 工作空间时出现错误

Catkin_ws CMake 错误构建 package.xml 为空

在 ROS 工作空间中使用 catkin_make 时 Qt 出现的问题

CMake 错误:catkin_make :::Running 命令运行命令:“/ws/build”中的“make -j4 -l4”

命令行无法在 Ubuntu 14.04 中为 ROS 创建 catkin 工作区

catkin_make 中的 cmake 版本与全局 cmake 版本不同?