通过 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.cpp
和 otherLibraries
到 catkin_ws
as一个新的包,并从那里的根目录添加了 CMakeLists.txt 内容?
如果 myPackage 与 myExecutable 和 otherLibraries 合并有意义,则将 myPackage 和 otherLibraries 的 src 中的 myExecutable 移动到 myPackage 中,并将 myPackage 之外的 CMakeLists 合并到 myPackage 中。或者,如果将所有内容放在 myPackage 中没有意义,请保持 myPackage 原样,并创建一个仅包含 myExecutable 和 otherLibraries 的新 catkin 包,然后再次将外部的 CmakeLists 合并到新包的 CMakeLists 中。
我在 GitHub 上有一个例子,我已经更新了我的答案。
你好拉斐尔!感谢您的澄清:) 我会将答案视为已接受。 :) 我想我可能会采用你提到的方式,第二种选择。 (我将保留myPackage
Separate,并使用它自己的修订控制系统和回购)。现在,通过一些丑陋的修补,打破了现代 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”