Я пишу несколько кодов для расчета обратной динамики. Похоже, что функция 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;
}
- Эта ошибка возникает после возврата. Кажется, это вызвано выпуском памяти из VecTau. На следующих трех рисунках показан процесс отладки: Step1, выполните return true
Шаг 2, прыгнуть в Векто
Шаг 3, возникает ошибка
Но если я помещу Vectau в класс public, такая же ошибка произойдет, когда вернется основная функция. И эта функция может хорошо работать.
Step1, выполнить return true
Step2, перейти к VecQ
И после VecQ ошибки нет, затем снова перейдите к значению true.
- Если я помещу 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 просто &. Поэтому я хочу знать причину.