首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GTSAM分段故障-可能的对准问题?

GTSAM分段故障-可能的对准问题?
EN

Stack Overflow用户
提问于 2020-08-27 15:35:47
回答 1查看 202关注 0票数 0

我正在尝试使用GTSAM。我有以下示例类:

GraphManager.h

代码语言:javascript
复制
#pragma once

#include <gtsam/navigation/CombinedImuFactor.h>

using namespace gtsam;

class GraphManager
{
public:
    GraphManager();


private:
    std::shared_ptr<PreintegratedCombinedMeasurements> preint;
};

GraphManager.cpp

代码语言:javascript
复制
#include <gtsam_fusion/GraphTest.h>

GraphTest::GraphTest()
{
    auto imuParams = PreintegratedCombinedMeasurements::Params::MakeSharedD();
    preint = std::make_shared<PreintegratedCombinedMeasurements>(imuParams);
}

以下是最伤脑筋的案件:

代码语言:javascript
复制
#include <gtsam_fusion/GraphManager.h>

#include <gtest/gtest.h>
#include <iostream>


TEST(GraphManagerTest, test1)
{
    VILFusion::GraphManager manager;

    EXPECT_TRUE(false) << "1"; // This is just here to prove that `manager` was constructed.
}

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

当我运行测试时,我确实得到了"1“消息,因此我知道GraphManager对象已经成功初始化。但是,在此之后,测试用例出现了分段错误。通过调试,我认为这发生在preint共享指针的析构函数中,但我没有足够的调试经验来确定。

让我感到奇怪的是:如果我将GraphManager的构造函数的实现移到头文件中,它就不再是分段错误了。当我删除代码以达到这个最小可行的示例时,它有时会工作,看起来是随机的,尽管我要删除的代码与preint共享指针无关。

我在GTSAM文档中找到了函数,这似乎表明对齐可能是一个问题。这也符合我的观察,改变不相关的代码可能会使分段错误出现并消失。但是,在来自GTSAM的此示例代码中,特殊的gtsam::make_shared函数并不用于PreintegratedCombinedMeasurements。这个例子是否不正确,只是偶然地运行?还是这里没有必要使用gtsam::make_shared函数,而对齐实际上不是问题所在?是否有更多关于何时以及如何使用特殊gtsam::make_shared函数的文档?

如果这很重要:我是在ROS节点的上下文中这样做的,所以我使用catkin作为我的构建系统。但是,在没有引用ROS或在代码中使用任何ROS库的情况下,就会出现此问题。

Update:如果我完全放弃共享指针,而只创建类型为PreintegratedCombinedMeasurementspreint,问题仍然存在。

EN

回答 1

Stack Overflow用户

发布于 2020-09-02 15:54:51

经过更多的测试后,我发现这个问题在我放弃Catkin并且只做了一个基本的CMake测试项目时并不存在,所以这个问题必须与Catkin或者我的Catkin配置有关。

Catkin的默认CMakeLists包括针对每个目标的以下行:

代码语言:javascript
复制
add_dependencies(${PROJECT_NAME}_lib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

我删除了这一行,也从target_link_libraries(...)中删除了target_link_libraries(...)。这解决了问题。

我不知道这为什么解决了这个问题,所以我不会把这个答案标记为接受,除非有人能给出解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63619467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档