ACADO Toolkit 是一个用 C++ 编写的用于自动控制和动态优化的软件环境和算法集合。 它提供了一个通用框架,用于使用多种算法进行直接优化控制,包括模型预测控制以及状态和参数估计。ACADO 工具包是作为独立的 C++ 代码实现的,并带有用户友好的 MATLAB 界面。 面向对象的设计允许方便地耦合现有优化包并使用用户编写的优化例程对其进行扩展。它还提供(独立)高效实施的 Runge-Kutta 和 BDF 积分器,用于模拟 ODE 和 DAE。
ACADO Toolkit 旨在满足这四个关键属性:
这里解释了如何在 Linux 操作系统中下载并使用CMake编译ACADO 工具包。 以Ubuntu 发行版为例(也适用于任何基于 Debian 的发行版)。
我们需要通过 apt-get 包管理器下载一些包:
sudo apt-get install gcc g++ cmake git gnuplot doxygen graphviz
以下软件包是必需的:gcc、g++、cmake 和 git。 Gnuplot、Doxygen 和 Graphviz 是可选的,ACADO 可以在没有这些包的情况下工作,但不安装的话将无法可视化结果和/或生成 API 文档。
笔者这里已经安装过gcc/g++,cmake和git,只给出Gnuplot、Doxygen 和 Graphviz的安装过程。
在GitHub下载工具包代码。 官网的建议是下载稳定分支:
git clone https://github.com/acado/acado.git -b stable ACADOtoolkit
进入 ACADOtoolkit 文件夹(下文会使用
cd ACADOtoolkit
mkdir build
cd build
运行 CMake 以生成 makefile,并开始编译过程:
cmake ..
make
cd ..
cd examples/getting_started
./simple_ocp
返回的曲线结果图如下:
注意:如果想在调试模式下编译 ACADO,可以像这样运行 CMake:
cmake -DCMAKE_BUILD_TYPE=Debug ..
这里将演示如何使用 ACADO 的实现自己的项目。 本文介绍在 Linux 和 OS X 操作系统上使用 C++ 工具包的用法。 基本上有两种设置项目的方法:一种简单的和一种更复杂但功能更强大的方法。
将自己的 C++ 文件放在
cmake ..
make
编译结束后,可执行文件会放在
我们需要做的第一件事是让 Linux 环境识别 ACADO 工具包。 一种方法是将一个简单的 bash 脚本添加到环境文件中。
对于 Linux 系统,我们需要编辑 home 文件夹中的 .bashrc 文件。打开.bashrc文件时,将以下行附加到文件中:
source /build/acado_env.sh
其中 source ~/ACADOtoolkit/build/acado_env.sh
之后,通过在终端中实行如下命令来刷新环境:
. ~/.bashrc
我们将 MY_PROJECT 文件夹称为工程目录文件夹。大致包含以下几步:
# Minimum required version of cmake
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
# Project name and programming languages used
PROJECT( MY_COOL_PROJECT CXX )
# CMake module(s) path
SET( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR} )
# Prerequisites
FIND_PACKAGE( ACADO REQUIRED )
# Include directories
INCLUDE_DIRECTORIES( . ${ACADO_INCLUDE_DIRS} )
# Build an executable
ADD_EXECUTABLE( <EXEC_NAME> <EXEC_SOURCES> )
# Linux and OS X
TARGET_LINK_LIBRARIES( <EXEC_NAME> ${ACADO_SHARED_LIBRARIES} )
上述 CMakeList.txt 文件中需根据实际工程自行编辑
这里,笔者也用一个简单的最优控制问题来进行演示。也就是上一节测试安装成功的案例:火箭飞行时间最优控制问题,考虑了一个简单的火箭模型,它应该尽可能快地从空间中的一个点飞行到另一个点,同时满足飞行过程中的状态和控制约束。在火箭模型中,它具有三个状态 s、v 和 m,分别代表火箭的行进距离、速度和质量。 此外,我们假设火箭可以通过控制输入 u 加速。我们关心的燃料优化控制问题具有以下形式:
在这里,目标是在从 s(0) = 0 到 s(T ) = 10 的最短时间 T 内飞行,同时应满足对速度 v 和控制输入 u 的约束。 假设火箭以速度 v(0) = 0 开始,并需要在结束时间 T 停止,这可以用约束 v(T ) = 0 的形式表示。
接下来展示代码实现,下图是笔者工程的目录结构:
#include
#include
int main()
{
USING_NAMESPACE_ACADO
DifferentialState 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;
}
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})
转到终端,进入 MY_PROJECT 文件夹。 然后输入:
cmake ..
make
cd ../bin
./result
结果与之前展示的 simple_ocp 一样,这里不在赘述。