1

对于模拟,我正在使用 boost::numeric::odeint 但我遇到了问题。我在我的一个类的方法中使用了集成函数,我遇到了“没有匹配的函数来调用集成”的错误。更清楚地说,这是我的代码的压缩版本:

#include "MotionGeneration.h"
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>

typedef boost::array< double , 10 > state_type;

MotionGeneration::MotionGeneration(some_data) {
     //My constructor.
     //some_data assignment.
}

MotionGeneration::~MotionGeneration() {

}

double MotionGeneration::getError(double time) {
   //error calculation.
}

void MotionGeneration::execute(){
    state_type init_conf = { 0, -1.5708, 0, 0, 0, -1.5708, 0, -1.5708, 0, 0.5};
    boost::numeric::odeint::integrate(motionScheme, init_conf, 0.0, 1.0, 0.05, plot);
}

void MotionGeneration::motionScheme(const state_type &q, state_type &q_dot, double t){
     //Some long code goes here. Also I have some calls to some methods of this class. for example:
     double err = getError(t);          
}

void MotionGeneration::plot(const state_type &q , const double t){
    //some data pfintf here.
}

请注意,我的方法都不是静态的,事实上,我不能使用静态方法。构建项目时,出现以下错误:

error: no matching function for call to `integrate(<unknown type>, state_type&, double, double, double, <unknown type>)'

我认为将系统函数作为类方法是一个问题,但我不知道如何处理这种情况。

4

1 回答 1

4

odeint 需要一个 operator()( const state_type &x , state_type &dxdt , double dt )

在您的情况下, MotionGenerator 没有此运算符,但您可以绑定方法 motionScheme

#include <functional>
namespace pl = std::placeholders;

// ...

// not tested
void MotionGeneration::execute()
{
    state_type init_conf = { 0, -1.5708, 0, 0, 0, -1.5708, 0, -1.5708, 0, 0.5};
    boost::numeric::odeint::integrate(
        std::bind(&MotionGenerator::motionScheme, *this , pl::_1 , pl::_2 , pl::_3 ) , init_conf, 0.0, 1.0, 0.05, plot);
}

```

但是,很容易将您的方法重命名motionSchemeoperator(),然后简单地传递*this给集成。

编辑:您还可以std::ref用来避免复制您的 MotionGenerator 实例:

void MotionGeneration::execute()
{
    state_type init_conf = { 0, -1.5708, 0, 0, 0, -1.5708, 0, -1.5708, 0, 0.5};
    boost::numeric::odeint::integrate(
        std::bind(&MotionGenerator::motionScheme, std::ref(*this) , pl::_1 , pl::_2 , pl::_3 ) , init_conf, 0.0, 1.0, 0.05, plot);
}
于 2012-06-13T21:27:27.493 回答