acaods-mpc建模(一)

引言

这一节将使用acados进行运动学建模和优化求解,在运动学建模的过程中,使用casadi进行符号表示辅助建模。

运动学建模

在前面的博客中,我们介绍了车辆运动学模型,在这一部分,我们将使用casadi对车辆运动学模型进行建模。

casadi简介

https://web.casadi.org/

以上是casadi的官网,从上面可以看到casadi是一个求解优化问题的工具库,其可以用来定义动态系统,求解微分方程,也可以通过SQP(即将非线性约束线性化,然后进行序列二次规划逐步到达最优点)求解非线性优化问题等。在这里我们使用其符号系统的特性,使用python构建车辆的运动学模型。

casadi多用来求解非线性优化问题,下面这个博客,博主介绍了使用casadi求解非线性优化的一半结构

acados简介

可以具有针对不同 CPU 架构的手动优化内核,可以部署到树莓派等

acados python接口文档:https://docs.acados.org/python_interface/index.html

acados与casadi的区别:https://docs.acados.org/faq/index.html

acados使用最优控制问题ocp的结构定义优化问题

casadi运动学建模

casadi部分

首先定义状态量x,其中的SX是casadi中的最常用的符号,他定义了由一系列符号表示的矩阵,如果不定义矩阵形状默认为标量符号,可以将以下代码看作构建了四个SX.sym对象,构建完成后,就可以用来进行符号运算了。

x_ego = SX.sym('x_ego')
y_ego = SX.sym('y_ego')
psi_ego = SX.sym('psi_ego')
alpha_ego = SX.sym('alpha_ego')

以下代码定义了模型的输入量u

psi_accel_ego = SX.sym('psi_accel_ego')

接下来定义了状态的微分$\dot x$

x_ego_dot = SX.sym('x_ego_dot')
y_ego_dot = SX.sym('y_ego_dot')
psi_ego_dot = SX.sym('psi_ego_dot')
alpha_ego_dot = SX.sym('alpha_ego_dot')

状态微分对应的表达式如下所示。和之前运动学模型那一片博客中不同的是:1)这里我们固定了速度v,也就导致状态的可行域比之前小了;2)没有使用车辆的前轮转角作为输入,而是采用了前轮转速作为控制输入,然后通过积分得到前轮转角,因此这里在优化时,可能会出现滞后效应。

其中vertcat实现的是将这些符号拼接成一行。

f_expl = vertcat(v_ego * cos(psi_ego),
                 v_ego * sin(psi_ego),
                 v_ego * tan(alpha_ego) / L,
                 alpha_rate
                 )
acados部分

由于我们采用acados构建优化问题,因此虽然我们可以使用casadi进行运动学建模,但是建模后还是需要将模型传入acados的模型中的。

首先定义acados模型

model = AcadosModel()
model.name = MODEL_NAME

然后将casadi定义的状态量传入acados模型

model.x = vertcat(x_ego, y_ego, psi_ego, alpha_ego)

由于我们前面设置了固定速度,同时轴距L也是固定不变的,对于固定不变的量,acados模型中使用p这个属性进行定义

L = SX.sym('L')
v_ego = SX.sym('v_ego')
model.p = vertcat(v_ego, L)

定义输入量

model.u = vertcat(alpha_rate)

定义状态微分

model.xdot = vertcat(x_ego_dot, y_ego_dot, psi_ego_dot, alpha_ego_dot)

然后将状态微分符号的距离表达式进行对应,而这句话的作用:1)定义了状态方程的具体形式;2)将状态方程以约束的形式传入acados。

model.f_impl_expr = model.xdot - f_expl

结语

以上我们介绍了如何使用casadi进行运动学建模,后面将基于acados讲解如何建模优化问题,并求解

May the force be with you!