После завершения функции Почему вектор вызывает ошибку free ()? - PullRequest
0 голосов
/ 20 апреля 2019

Я пишу несколько кодов для расчета обратной динамики. Похоже, что функция IverseDynamicscalculation завершена и возвращает true. Затем происходит ошибка: free (): неверный следующий размер (быстро): я знаю, что у этой проблемы есть несколько возможных ответов, но ни один из них не является моим ответом.

Это работает в Ubuntu 16.04 и Qt4.8.0 с плагинами ros.

    class MyRobotSolver
    {
    public:
        MyRobotSolver();
        ~MyRobotSolver();
        void GetLengthofPlannedData();//get the length of the planned data;
        void model_initialization();//initialization of a model;
        bool IDynamicsCalculation();//Calculate the torque by inverse dynamics.
        const Model& getModel();
        const MatrixNd& getTau();
        const MatrixNd& getQPlanned();
        const MatrixNd& getQDotPlanned();
        void FDynamicsCalculation();//Calculate the forward dynamic with PD controller
        void FileStoreIntoTextFile(const char *filestoredlocation, const MatrixNd & Stored_data);


    private:
        unsigned int length_of_data;
        MatrixNd QPlanned, QDotPlanned, QDDotPlanned;
        MatrixNd TauofIDynamics;    
        MatrixNd QAcutal, QDotAcutal, QDDotAcutal;
        Model QuadrupedRobotModel;
        double Time_derta;
        VectorNd VecQAct, VecQDotAct, VecQDDotAct, VecTauAct;
        VectorNd VecTauerror, VecQerror, VecQDoterror;
};

А потом я инициализирую параметр:

    MyRobotSolver::MyRobotSolver()
      : length_of_data(10001),Time_derta(0.001)
    {

      QPlanned.resize(length_of_data,3);
      QDotPlanned.resize(length_of_data,3);
      QDDotPlanned.resize(length_of_data,3);
      QAcutal.resize(length_of_data,3);
      QDotAcutal.resize(length_of_data,3);
      QDDotAcutal.resize(length_of_data,3);
      TauofIDynamics.resize(length_of_data,3);

      VecTauerror.resize(3);
      VecQerror.resize(3);
      VecQDoterror.resize(3);
      VecQDDotAct.resize(3);
      VecQAct.resize(3);
      VecQDotAct.resize(3);
      VecQDDotAct.resize(3);
      model_initialization();
    }

Затем я использую расчет InveseDynamics, чтобы вычислить что-то:

    bool MyRobotSolver::IDynamicsCalculation()
    {
        VectorNd VecQ, VecQDot, VecQDDot;
        VectorNd VecTau;
        VecTau.resize(3);
        VecQ.resize(3);
        VecTau = Vector3d::Zero(3);//Initialize the VecTau;
        VecQDot.resize(3);
        VecQDDot.resize(3);
        for (unsigned int i = 0; i < length_of_data; i++)
        {
            VecQ = QPlanned.row(i).transpose();
            VecQDot = QDotPlanned.row(i).transpose();
            VecQDDot = QDDotPlanned.row(i).transpose();
            InverseDynamics(QuadrupedRobotModel, VecQ,VecQDot,VecQDDot,VecTau);
            TauofIDynamics.row(i) = VecTau.transpose();
        }
        cout <<"finish the Inverse Dynamics calculation" << endl;
        return true;
    }
  1. Эта ошибка возникает после возврата. Кажется, это вызвано выпуском памяти из VecTau. На следующих трех рисунках показан процесс отладки: Step1, выполните return true Шаг 2, прыгнуть в Векто Шаг 3, возникает ошибка

Но если я помещу Vectau в класс public, такая же ошибка произойдет, когда вернется основная функция. И эта функция может хорошо работать. Step1, выполнить return true Step2, перейти к VecQ И после VecQ ошибки нет, затем снова перейдите к значению true.

  1. Если я помещу VecTau в класс public, VecQ, VecQDot и VecQDDot не смогут вызвать эту ошибку. Различия между VecTau и VecQ, VecQDot, VecQDDot заключаются в использовании InverseDynamics. Эта функция из библиотеки: https://rbdl.bitbucket.io/d6/d63/group__dynamics__group.html#ga370188f52ca9e7f933f90a03adf5fa1e VecQ, VecQDot, VecQDDot являются постоянными &, а VecTau просто &. Поэтому я хочу знать причину.
...