我必须找到机器人的下一个状态,该状态可以通过求解微分方程来找到。在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 );
最佳答案
答案取决于您要如何将参数v
和w
传递给积分器。
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/