我必须找到机器人的下一个状态,该状态可以通过求解微分方程来找到。在MATLAB中,我使用ode45函数,在c++上,我在互联网上发现我必须使用诸如stepper runga kutta dopri5之类的方法。我试图了解它的实现并以某种方式有了一个主意。现在我的状态是X,Y和theta,要找到下一个状态,我的微分方程是

Xdot=v*cos(theta)
Ydot=v*sin(theta)
thetadot=w

现在有一个公共(public)函数stepper.do_step_impl(System,state,... etc),据我了解,系统代表一个函数,其参数可以是&state,dstate和t。现在这是我的问题。我的微分方程具有系统函数中需要的变量v和w,但是据我了解,系统函数只能具有固定的参数,即State,dstate和t。如何在其中放入v和w?我希望有人能理解我的问题。请帮助。下面是我的代码
using namespace boost::numeric::odeint;
typedef std::vector< double > state_type;

void pdot_w( const state_type &state, state_type &dstate, const double t )
{
    double p_robot_xdot = v*cos(state[2]);
    double p_robot_ydot = v*sin(state[2]);
    double thetadot = w;
    dstate[0] = p_robot_xdot;
    dstate[1] = p_robot_ydot;
    dstate[2] = thetadot;
}

runge_kutta_dopri5<state_type> stepper;
stepper.do_step(pdot_w, state , 0, 0.01 );

最佳答案

答案取决于您要如何将参数vw传递给积分器。

C++ 11中的一种方法是使用lambda。您的函数和对步进器的调用将如下所示(取决于上下文,捕获的[]可能需要更明确):

void pdot_w(const state_type &state,
            state_type & dstate,
            const double t,
            const double v,
            const double w) {
    dstate[0] = v * cos(state[2]);
    dstate[1] = v * sin(state[2]);
    dstate[2] = w;
}


runge_kutta_dopri5<state_type> stepper;
/* v = 4 and w = 5 example */
stepper.do_step([](const state_type & state, state_type & d_state, const double t) {
                    return pdot_w(state, d_state, t, 4, 5);
                }, state,
                0,  0.01);

关于c++ - 使用BOOST库求解微分方程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58036187/

10-09 19:17