catkin / ROS:如何在使用子模块时正确指定包含路径

     2023-02-16     49

关键词:

【中文标题】catkin / ROS:如何在使用子模块时正确指定包含路径【英文标题】:catkin / ROS: How-to specify include path correctly when using submodules 【发布时间】:2018-04-24 19:05:09 【问题描述】:

我正在使用 ROS 构建一个项目,因此 catkin_make 来构建我的 ROS 节点和库。

我面临的问题是: 我在一个包(包 A)中使用了一个 git 子模块(因此,我有一个分层的包含文件夹结构),并且我在引用该子模块中的头文件时遇到了困难。

为了构建依赖包A的包B,我在包A的catkin_package命令中添加了INCLUDE_DIRS语句:

catkin_package(
  INCLUDE_DIRS my-submodule/include
  ...
)

那个目录的内容是:

my-submodule/my-header.h

(我将头文件放在一个文件夹下,以子模块命名,正如许多教程所说,在 ROS 中你应该使用这个约定)。

package-B 文件中的 include 语句如下所示:

...
#include <my-submodule/my-header.h>
...

这工作正常 - 正在构建包 B(因为我正在使用一个组合工作区来构建它)。

但是:当我切换到目标系统时,我只安装包 A,然后尝试构建包 B(在该目标系统上),它不会构建,因为包含路径是设置不正确。

包 A 的 INSTALL 语句如下所示

install(DIRECTORY my-submodule/include
  DESTINATION $CATKIN_PACKAGE_INCLUDE_DESTINATION
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

这主要是因为目标系统上安装的文件夹结构是这样的:

.../ros/include/my-package-A/include/my-submodule/my-header.h

因此,安装过程实际上将该子模块的包含路径放在 package-A-include 路径下(与我直接在一个组合工作区中构建包时相比,这是一种不同的路径结构)。

而编译用的CFLAGS只设置了include目录到文件夹:

.../ros/include

因此,在我的 package-B 文件中破坏了我的 include 语句:

#include <my-submodule/my-header.h>

你知道如何解决这个问题吗? 我相信有比我更多的人,试图从包中的子模块引用头文件。

【问题讨论】:

【参考方案1】:

假设您的包 A 中有一个文件 my-submodule/include/my-submodule/my-header.h,那么您的 install() 语句的两个小改动应该可以解决这个问题:

install(DIRECTORY my-submodule/include/
  DESTINATION $CATKIN_GLOBAL_INCLUDE_DESTINATION
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

首先,在路径中添加一个斜杠(.../include/ 而不是.../include),这会导致安装include 文件夹的内容 而不是include 文件夹本身(否则你会得到../ros/install/include/include/my-submodule/my-header.h

其次,使用$CATKIN_GLOBAL_INCLUDE_DESTINATION(指向.../ros/install/include/)而不是$CATKIN_PACKAGE_INCLUDE_DESTINATION(指向.../ros/install/my-package-A/include/)作为目的地。


另一种方法是修复catkin,因为

catkin_package(
  INCLUDE_DIRS my-submodule/include
  ...
)

理论上应该已经导出my-submodule/include,所以你可以在包B中用

find_package(catkin REQUIRED DEPENDS my-package-A)
catkin_package(
    CATKIN_DEPENDS my-package-A
)
include_directories($catkin_INCLUDE_DIRS)

不幸的是,由于某种原因,这在使用catkin config --install 时显然是不可能的。见https://answers.ros.org/question/335846/install_dirs-not-working-as-expected-when-using-install/。

【讨论】:

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

】在ROS工作空间中使用catkin_make时Qt出现的问题【英文标题】:ProblemswithQtwhenusingcatkin_makeinROSworkspace【发布时间】:2019-01-1709:49:43【问题描述】:我目前正在编写一个QtGUI来远程控制ROS控制的机器人。在catkin_ws中使用catkin_make时出... 查看详情

在 Windows 10 的 ROS 中使用 catkin_make 时出现问题

】在Windows10的ROS中使用catkin_make时出现问题【英文标题】:Problemusingcatkin_makeinROSwithwindows10【发布时间】:2021-05-0821:11:40【问题描述】:我已经在Windows10上安装了rosNoetic。当我执行catkin_make时,我收到需要Ninja的cmake错误。尽管我... 查看详情

如何使用qt插件在qt中进行ros开发

...和节点、launch文件、urdf文件等现在我们来创建一个新的catkin工作空间,并且在里面创建一个package1、新建项目“文件”——“新建文件或项目”,选择”ImportROSWorkspace”——“choose”如上图然后填写catkin工作空间的名字和位置,... 查看详情

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

】通过CMake在catkin工作场所外使用ROS自定义消息【英文标题】:UseROScustommessagesoutsidecatkinworkplacewithCMake【发布时间】:2020-04-1504:40:25【问题描述】:问题:将生成的ros消息/服务包含在catkin工作场所之外的代码中的CMakeLists.txt中的... 查看详情

使用 pcl::ExtractIndices (pcl, ROS, catkin) 在 main 之前出现分段错误

】使用pcl::ExtractIndices(pcl,ROS,catkin)在main之前出现分段错误【英文标题】:Segmentationfaultbeforemainwithpcl::ExtractIndices(pcl,ROS,catkin)【发布时间】:2015-04-0822:10:45【问题描述】:我正在尝试在C++中运行以下命令:#include<pcl_ros/point_cloud.h... 查看详情

如何创建使用ros的service

如何创建使用ros的service1创建工程cd~/catkin_ws/srccatkin_create_pkgactionstd_msgsrospy2设计action定义文件,内容有goalfeedbackresult这个和service的srv文件很像,放置再工程目录的action目录下durationtime_to_wait#goal,客户端发送的等待总时间---duration... 查看详情

如何创建使用ros的service

参考技术A如何创建使用ros的service1创建工程cd~/catkin_ws/srccatkin_create_pkgactionstd_msgsrospy2设计action定义文件,内容有goalfeedbackresult这个和service的srv文件很像,放置再工程目录的action目录下durationtime_to_wait#goal,客户端发送的等待总时... 查看详情

如何安装 CMake 在 find_package 中包含 catkin/ROS 的项目?

】如何安装CMake在find_package中包含catkin/ROS的项目?【英文标题】:HowtoinstallaprojectforwhichCMakecontainscatkin/ROSinfind_package?【发布时间】:2020-01-1722:02:11【问题描述】:我有一个这样开始的项目:cmake_minimum_required(VERSION2.8.3)project(quanerg... 查看详情

设置 ROS catkin/rosbuild

】设置ROScatkin/rosbuild【英文标题】:SettingupROScatkin/rosbuild【发布时间】:2015-07-2008:39:34【问题描述】:我有catkin_ws和rosbuild_ws。但是,当我使用命令roscd时,我只能转到我最后找到的那个,即:当我执行source~/rosbuild_ws/setup.bash时... 查看详情

构建 Catkin (ROS) 失败

】构建Catkin(ROS)失败【英文标题】:BuildingCatkin(ROS)failed【发布时间】:2018-10-1423:38:10【问题描述】:我正在尝试在我的Ubuntu16.04上安装ROS以使用模拟器Gazebo。首先,我尝试运行一个安装所有内容的脚本,然后在它的末尾出现错误... 查看详情

在 ROS catkin 工作区中定义和使用 Python 类

】在ROScatkin工作区中定义和使用Python类【英文标题】:DefiningandusingaPythonclasswithinaROScatkinworkspace【发布时间】:2017-01-0619:35:46【问题描述】:我正在运行ROSIndigo。我有一个应该很简单的问题:我的包中有一个实用程序类,我希望... 查看详情

创建一个catkin工作空间

先确定自己的环境变量是否设置正确export | grep ROS若出现如下的,说明是正确的declare -x ROSLISP_PACKAGE_DIRECTORIES=""declare -x ROS_DISTRO="indigo"declare -x ROS_ETC_DIR="/opt/ros/indig 查看详情

如何将 git 子模块与 Bitbucket 管道一起使用?

】如何将git子模块与Bitbucket管道一起使用?【英文标题】:HowtousegitsubmoduleswithBitbucketpipelines?【发布时间】:2019-04-0621:32:58【问题描述】:如何在Bitbucket管道中使用git子模块?我正在使用Bitbucket管道构建我的项目,但在拉入我的... 查看详情

ros工作空间、package及catkin编译系统

...最好都放在一个workspace中,便于统一管理、编译和调用。catkin是目前ROS的编译系统,自ROSGroovy版本开始使用,取代了之前的rosbuild编译系统。ROSworkspace中可以包含若干ROSpackage,每个package内部包含实现某些特定功能的文件。其中... 查看详情

ROS旋律catkin_make失败

】ROS旋律catkin_make失败【英文标题】:ROSMelodiccatkin_makefail【发布时间】:2019-03-1906:58:16【问题描述】:所以我的catkin_make失败并出现错误AttributeError:\'module\'objecthasnoattribute\'Interpreter\'当我搜索解决方案时,我发现问题在于em和empy... 查看详情

在ros中使用qt界面

在终端可以直接用catkin_create_qt_pkg命令创建带Qt界面的ROSpackage,再按照前面说的方法导入到Qt即可这里参考的是qt_createTutorialsQtAppTemplates(1)要使用catkin_create_qt_pkg命令需要安装一个包,执行如下命令:$sudoapt-getinstallros-indigo-qt-ros这... 查看详情

ROS ImportError:没有名为 asyncio 的模块

...误图片我最近在Windows中安装了ROS(Melodic)。但是使用任何catkin_tools命令都会显示以下错误:ImportError:Nomodulenamedasyncio。我正在使用Python2.7。我已经搜索过它 查看详情

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

】命令行无法在Ubuntu14.04中为ROS创建catkin工作区【英文标题】:CommanlineisnotworkingtocreateacatkinworkplaceinUbuntu14.04forROS【发布时间】:2018-08-1207:15:52【问题描述】:我实际上是ROS和Linux的新手。为此,我在所有这些事情上都有些挣扎。... 查看详情