模型预测控制工具包——ACADO:通过Cmake构建自己的优化问题
模型预测控制工具包——ACADO:通过Cmake构建自己的优化问题
- ACADO 工具包简介
- 通过Cmake构建自己的优化问题
- 简单方法
- 复杂方法
ACADO 工具包简介
ACADO Toolkit 是一个用 C++ 编写的用于自动控制和动态优化的软件环境和算法集合。 它提供了一个通用框架,用于使用多种算法进行直接优化控制,包括模型预测控制以及状态和参数估计。ACADO 工具包是作为独立的 C++ 代码实现的,并带有用户友好的 MATLAB 界面。 面向对象的设计允许方便地耦合现有优化包并使用用户编写的优化例程对其进行扩展。它还提供(独立)高效实施的 Runge-Kutta 和 BDF 积分器,用于模拟 ODE 和 DAE。
ACADO Toolkit 旨在满足这四个关键属性:
- 开源:该工具包可免费获得,最新版本以及文档和示例可以从 http://www.acadotoolkit.org 下载。
- 用户友好性:ACADO Toolkit 的语法被设计为尽可能直观,以便允许用户以非常接近通常数学语法的方式制定控制问题。
- 代码可扩展性:将现有算法链接到工具包应该很容易。这是通过 ACADO 工具包的面向对象软件设计风格来实现的。
- 自包含:ACADO 是一个独立的工具包。 本身不需要外部包,但可以链接用于图形输出的外部求解器或包。
通过Cmake构建自己的优化问题
基本上有两种设置项目的方法:一种简单的和一种更复杂但功能更强大的方法。
简单方法
将自己的 C++ 文件放在 <ACADO_ROOT>/examples/my_examples 文件夹中。 即这个地方
唯一的限制是一个可执行文件只能对应一个源 (.cpp) 文件。 将源文件放入 my_examples 文件夹后,转到<ACADO_ROOT>/build,实行以下命令:
cmake ..
make
编译结束后,可执行文件会放在 <ACADO_ROOT>/examples/my_examples。 举个例子,如果你的源文件的名称是 my_nice_code.cpp,在那里会生成一个名为 my_nice_code 的可执行文件。
复杂方法
第一步:设置环境
我们需要做的第一件事是让 Linux 环境识别 ACADO 工具包。 一种方法是将一个 bash 脚本添加到环境文件中。
对于 Linux 系统,我们需要编辑 home 文件夹中的 .bashrc 文件。打开.bashrc文件时,将以下行附加到文件中:
source <ACADO_ROOT>/build/acado_env.sh
其中 <ACADO_ROOT> 指的是 ACADO 工具包根文件夹,如果是把工具包放在根目录,则指令为:
source ~/ACADOtoolkit/build/acado_env.sh
第二步:实现一个简单的工程
将 ACADO_MY_PROJECT 文件夹称为工程目录文件夹。大致包含以下几步:
1、首先建立一个文件夹,可以在任意地方,命名为 ACADO_MY_PROJECT
2、在该文件夹里新建 cmake文件夹,并将 ACADO 的 FindACADO.cmake 拷入其中,FindACADO.cmake文件在ACADOtoolkit/cmake/FindACADO.cmake
3、新建src文件夹,在里面新建main.cpp文件。 里面为优化问题的数学模型转换的代码,例如如下的优化问题:
其代码为:
#include <acado_toolkit.hpp>
#include <acado_gnuplot.hpp>int main()
{USING_NAMESPACE_ACADODifferentialState s, v, m; // 微分状态量Control u;Parameter T;DifferentialEquation f(0.0, T);// ----------------------------OCP ocp(0.0, T);ocp.minimizeMayerTerm(T);f << dot(s) == v;f << dot(v) == (u - 0.2 * v * v) / m;f << dot(m) == -0.01 * u * u;ocp.subjectTo(f);// 状态初始化ocp.subjectTo(AT_START, s == 0.0);ocp.subjectTo(AT_START, v == 0.0);ocp.subjectTo(AT_START, m == 1.0);// 终止条件约束ocp.subjectTo(AT_END, s == 10.0);ocp.subjectTo(AT_END, v == 0.0);// 其他条件约束ocp.subjectTo(-0.1 <= v <= 1.7);ocp.subjectTo(-1.1 <= u <= 1.1);ocp.subjectTo(5.0 <= T <= 15.0);//------------------------------GnuplotWindow window; // 在窗口中结果可视化window.addSubplot(s, "DISTANCE s");window.addSubplot(v, "VELOCITY v");window.addSubplot(m, "MASS m");window.addSubplot(u, "CONTROL u");OptimizationAlgorithm algorithm(ocp); // 构建优化算法algorithm << window;algorithm.solve();return 0;
}
4、在 ACADO_MY_PROJECT 文件夹下,新建一个CMakeLists.txt文件,内容如下:
# cmake版本最低要求
cmake_minimum_required(VERSION 3.5)
# 工程名字
project(ACADO_TEST CXX)
# 添加编译选项
# set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
add_compile_options(-std=c++11 -o0 -g)
# 生成compile_commands.json文件
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 设置可执行文件存放位置
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 增加cmake模块的检索路径
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
# Prerequisites
find_package(ACADO REQUIRED)
# 头文件路径
include_directories(src ${ACADO_INCLUDE_DIRS})
# 管理源文件
set(SRC_LIST src/main.cpp)
# 生成可执行文件,名字为result
add_executable(result ${SRC_LIST})
target_link_libraries(result ${ACADO_SHARED_LIBRARIES})
5、 转到终端,进入 ACADO_MY_PROJECT 文件夹。 然后输入:
cmake ..
make
cd ../bin
./result
即可得到数学模型的优化结果:
sqp it | qp its | kkt tol | obj val | merit val | ls param |
1 | 11 | 4.015966e+01 | 9.950000e+00 | 5.419249e+01 | 1.000000e+00 |
2 | 1 | 1.306070e-01 | 9.931631e+00 | 1.006632e+01 | 1.000000e+00 |
3 | 1 | 2.549335e-02 | 9.906147e+00 | 9.906158e+00 | 1.000000e+00 |
4 | 1 | 7.484607e-02 | 9.831350e+00 | 9.831410e+00 | 1.000000e+00 |
5 | 2 | 3.457549e-01 | 9.487488e+00 | 9.489759e+00 | 1.000000e+00 |
6 | 12 | 3.045474e-01 | 9.190947e+00 | 9.200555e+00 | 1.000000e+00 |
7 | 19 | 5.194080e-01 | 8.691541e+00 | 8.715543e+00 | 1.000000e+00 |
8 | 14 | 4.739167e-01 | 8.248118e+00 | 8.284711e+00 | 1.000000e+00 |
9 | 17 | 3.334551e-01 | 7.927619e+00 | 7.943166e+00 | 1.000000e+00 |
sqp it | qp its | kkt tol | obj val | merit val | ls param |
10 | 18 | 4.999093e-01 | 7.457878e+00 | 7.494079e+00 | 1.000000e+00 |
11 | 19 | 1.652661e-02 | 7.441887e+00 | 7.442529e+00 | 1.000000e+00 |
12 | 19 | 1.460624e-04 | 7.441741e+00 | 7.441741e+00 | 1.000000e+00 |
13 | 19 | 1.190096e-07 | 7.441741e+00 | 7.441741e+00 | 1.000000e+00 |
Covergence achieved. Demanded KKT tolerance is 1.000000e-06.