最初我在运行QT时,点击某个功能的按钮时,界面一下就消失了。我找到这个按钮相关的函数,设置断点,分步调试:
在下面这个程序处显示:Signal name: SIGSEGV - Signal meaning: Segmentation Fault。
谷歌查找之后说是This usually happens when accessing a pointer that was not initialized or was set to 0.
void ProRobotics::MeasurementModel(Mat &delta_z, Point3f obs, Point3f xPred, Mat *Ht, Point2f *estLm)
{//delta_z用来存储对landmarks的真是观测和预测的差值向量
float dst,theta; //用来存储范数,就是两点之间的距离
Point2f z, zp; //用来存储真实观测值(与后者差值)和预测的观测值
Point2f delta; //用来存储landmarks与预测的机器人位姿的差值向量]
if(!estLm)//如果Landmark的估计值是空,则调用者非SLAM
{//将estLm指定为Landmark的真实值
estLm = landmarks.at(obs.z);
}
......
调试到if语句时出现错误了,修改为:estLm = reinterpret_cast<Point2f*>(&(landmarks.at(obs.z)));
运行就成功了。
出现这个原因的地方会很多,但是原因都差不多是访问不存在或者不正确的地方造成的。
下面这个程序是我再一次遇到这种错误的程序。当这里的double是float时有时候也会出现这种错误。
//计算Vt(3*2) at<float>时会出现segfault的错误。
Vt.at<double>(0,0)=(sin(xLast.z+Wd*T)-sin(xLast.z))/Wd; Vt.at<double>(0,1)=Vd*(sin(xLast.z)-sin(xLast.z+Wd*T))/Wd/Wd+Vd*cos(xLast.z+Wd*T)*T/Wd;
Vt.at<double>(1,0)=(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd; Vt.at<double>(1,1)=-Vd*(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd/Wd+Vd*sin(xLast.z+Wd*T)*T/Wd;
Vt.at<double>(2,0)=0; Vt.at<double>(2,1)=T;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)