visual-studio-code - 通过 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()
吗?)
解决方案
我有一个类似的案例,我使用了一些独立于 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 控制器。
推荐阅读
- java - Java 字符串参数化 - 间接 toString 方法的性能损失
- postgresql - PostgreSQL:在完成之前通过 dblink 获取查询的 PID
- java - 两个日期和时区之间的差异
- java - 如何使用凭证详细信息导出 Tally 分类账期初和期末余额?
- sql - (PL)SQL:使用同一表中的现有字段更新字段
- swiftui - Xcode 11.3 / iOS 13.3 NavigationLink 仅推送一次
- python - 为什么在python中更新字典时
- python - nginx:[警告] 0.0.0.0:80 上的服务器名称“域”冲突,忽略
- javascript - 响应式数据表导致奇怪的选择框错误
- c# - 在 C# 中用构造函数赋值和用属性赋值有什么区别?