我写了一些代码来计算逆动力学。似乎函数IverseDynamicscalculation已完成并返回true。然后发生错误:free():下一个大小(快速)无效:我知道这个问题有一些可能的答案,但我的答案全都不是。
这是通过ros插件在ubuntu 16.04和Qt4.8.0中运行的。
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();
}
然后我使用InveseDynamicscalculation来计算某些内容:
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放在public类中,则当主函数返回时也会发生相同的错误。并且此功能可以很好地工作。 Step1, execute return true Step2, Jump to VecQ VecQ之后没有错误,然后跳转以再次返回true。