При попытке использовать библиотеку динамической кинематики Orocos c (KDL) я получил сообщение об ошибке free (): неверный следующий размер (быстрый) - PullRequest
0 голосов
/ 09 января 2020

Я использую qt creator для отладки моей программы и получаю ошибки выделения / освобождения памяти. Кажется, что в программе происходит сбой в деструкторе при попытке удалить указанный указатель c в векторе. Я ссылался на другой подобный пост (ссылка ниже кода), но не могу определить, является ли это проблемой, которую я делаю, или это библиотека Orocos KDL, пытающаяся освободить эту память.

#include "plog/Appenders/ColorConsoleAppender.h"
#include <kdl/frames.hpp>
#include <kdl_parser/kdl_parser.hpp>
#include <urdf/model.h>
#include <iostream>
#include <kdl/chain.hpp>
#include <kdl/chainfksolverpos_recursive.hpp>
#include <kdl/chainiksolverpos_lma.hpp>
#include <kdl/chainjnttojacsolver.hpp>
#include <kdl/tree.hpp>
#include <map>
#include <string>
#include <vector>

class ComputeKinematics
{
    public:
        ComputeKinematics(const std::string &file);
        ~ComputeKinematics();
    private:
        KDL::Tree urdfTree;
        std::vector<KDL::Chain> KinematicChains;
        std::vector<KDL::ChainFkSolverPos_recursive*> ForwardKinematicsSolvers;
        std::vector<KDL::ChainIkSolverPos_LMA*> InverseKinematicsSolvers;
        std::vector<KDL::ChainJntToJacSolver*> JacobianSolvers;
};

ComputeKinematics::ComputeKinematics(const std::string &file)
{
    if(!kdl_parser::treeFromFile(file, urdfTree))
    {
        return;
    }
    const KDL::SegmentMap &segmentMap = urdfTree.getSegments();
    std::vector<std::string> leafSegmentNames;
    for (KDL::SegmentMap::const_iterator it = segmentMap.begin(); it != segmentMap.end(); it++)
    {
        if (0 == it->second.children.size())
        {
            leafSegmentNames.push_back(it->second.segment.getName());
        }
    }
    for (unsigned long index = 0; index < leafSegmentNames.size(); index++)
    {
        KDL::Chain tempChain;
        if (!urdfTree.getChain(urdfTree.getRootSegment()->first, leafSegmentNames[index], tempChain))
        {
            return;
        }
        KinematicChains.push_back(tempChain);
        ForwardKinematicsSolvers.push_back(
                  new KDL::ChainFkSolverPos_recursive(KinematicChains[KinematicChains.size()-1]));
        InverseKinematicsSolvers.push_back(
                  new KDL::ChainIkSolverPos_LMA(KinematicChains[KinematicChains.size()-1]));
        JacobianSolvers.push_back(
                  new KDL::ChainJntToJacSolver(KinematicChains[KinematicChains.size()-1]));
    }
        return;
}

ComputeKinematics::~ComputeKinematics()
{
    for (unsigned long index = 0; index < ForwardKinematicsSolvers.size(); index++)
    {
        if (nullptr != ForwardKinematicsSolvers[index])
        {
            delete ForwardKinematicsSolvers[index];
            ForwardKinematicsSolvers[index] = nullptr;
        }
    }

    for (unsigned long index = 0; index < InverseKinematicsSolvers.size(); index++)
    {
        if (nullptr != InverseKinematicsSolvers[index])
        {
            delete InverseKinematicsSolvers[index];
            InverseKinematicsSolvers[index] = nullptr;
        }
    }

    for (unsigned long index = 0; index < JacobianSolvers.size(); index++)
    {
        if (nullptr != JacobianSolvers[index])
        {
            delete JacobianSolvers[index];
            JacobianSolvers[index] = nullptr;

        }
    }
}

int main()
{
    std::string xmlFile = "robot.urdf";
    ComputeKinematics(xmlFile.c_str());
    return 0;
}
...