C++ 总线错误(内核转储)

C++ 总线错误(内核转储),c++,ubuntu,ros,C++,Ubuntu,Ros,我正在尝试运行一个ROS节点,该节点订阅一个节点的数据,然后计算PID控制器输出,并将其发布到另一个主题上。但我在每10个周期后得到一个总线、内核转储错误…我不确定为什么…以下代码供参考: namespace youbot { PidController::PidController(double P, double I, double D, double I1, double I2) : p_gain_(P), i_gain_(I), d_gain_(D), i_max_(I1), i_mi

我正在尝试运行一个ROS节点,该节点订阅一个节点的数据,然后计算PID控制器输出,并将其发布到另一个主题上。但我在每10个周期后得到一个总线、内核转储错误…我不确定为什么…以下代码供参考:

namespace youbot {

PidController::PidController(double P, double I, double D, double I1, double I2) :
p_gain_(P), i_gain_(I), d_gain_(D), i_max_(I1), i_min_(I2)
{

   p_error_last_ = 0.0;
   p_error_ = 0.0;
   d_error_ = 0.0;

   i_error_ = 0.0;
   cmd_ = 0.0;
   last_i_error = 0.0;
}

double PidController::updatePid(double error, boost::posix_time::time_duration dt)
{
    double p_term, d_term, i_term;
    p_error_ = error; //this is pError = pState-pTarget
    double deltatime = (double)dt.total_microseconds()/1000.0; //in milli seconds


   if (deltatime == 0.0 || isnan(error) || isinf(error))
      return 0.0;
   p_term = p_gain_ * p_error_;
   i_error_ = last_i_error + deltatime * p_error_;
   last_i_error = deltatime * p_error_;
   i_term = i_gain_ * i_error_;
   if (i_term > i_max_)
   {  
     i_term = i_max_;
     i_error_=i_term/i_gain_;
   }
   else if (i_term < i_min_)
   {
     i_term = i_min_;
     i_error_=i_term/i_gain_;
   }


  if (deltatime != 0)
  {
     d_error_ = (p_error_ - p_error_last_) / deltatime;
     p_error_last_ = p_error_;
  }
  d_term = d_gain_ * d_error_;
  cmd_ = -p_term - i_term - d_term;

  p_error_, i_error_, p_term, i_term, deltatime, cmd_);

  return cmd_;
}
}

using namespace std;
using namespace youbot;

double currentPos[3];
void arrayCallback(const geometry_msgs::Point::ConstPtr& cord);
double calculateControllerOutput(double pos, double targetPos);


int main(int argc, char **argv)
{

ros::init(argc, argv, "coordinateSubscriber");
ros::NodeHandle n;
ros::Subscriber sub3 = n.subscribe("position", 100, arrayCallback);
ros::spin();

return 0;
}
名称空间youbot{
PidController::PidController(双P、双I、双D、双I1、双I2):
p_增益(p),i_增益(i),d_增益(d),i_最大值(I1),i_最小值(I2)
{
p_误差_最后一次_=0.0;
p_误差=0.0;
d_误差u=0.0;
i_误差u=0.0;
cmd=0.0;
最后一次误差=0.0;
}
双PID控制器::更新PID(双错误,boost::posix_time::time_duration dt)
{
双p_项,d_项,i_项;
p\u error\u=error;//这是peror=pState pTarget
double deltatime=(double)dt.total_microseconds()/1000.0;//以毫秒为单位
如果(deltatime==0.0 | | isnan(错误)| | isinf(错误))
返回0.0;
p_项=p_增益*p_误差;
i_error=最后一个i_error+deltatime*p_error;
last_i_error=deltatime*p_error;
i_项=i_增益*i_误差;
如果(i_项>i_最大值)
{  
i_项=i_最大值;
i_误差=i_项/i_增益;
}
否则如果(i_项

我猜不出是哪一部分导致了错误。任何帮助都将不胜感激。谢谢

一定少了什么东西。updatePid的最后第二行有语法错误。你知道崩溃到底发生在哪里吗?哦..那只是一个打字错误…那一行应该被忽略..我想删除它。我不确定它是否发生了…而且它只在我订阅了几秒钟后才发生。我不确定,但我认为错误不会发生在你发布的代码中。总线错误意味着内存对齐出现了一些问题(请参阅),这只能在执行指针魔术时发生,我在这段代码中没有看到。这是什么硬件?因为在x86上,总线错误非常罕见。