ACADO工具包入门使用教程

ACADO工具包入门使用教程

  • 什么是ACADO工具包
  • ACADO工具包的安装
    • 1. 准备工作
    • 2. 安装教程
  • 使用CMake实现自己的工程
    • 1. 简单方法
    • 2. 复杂方法(推荐)
      • 2.1 设置环境
      • 2.2 实现一个简单的工程

什么是ACADO工具包

ACADO Toolkit 是一个用 C++ 编写的用于自动控制和动态优化的软件环境和算法集合。 它提供了一个通用框架,用于使用多种算法进行直接优化控制,包括模型预测控制以及状态和参数估计。ACADO 工具包是作为独立的 C++ 代码实现的,并带有用户友好的 MATLAB 界面。 面向对象的设计允许方便地耦合现有优化包并使用用户编写的优化例程对其进行扩展。它还提供(独立)高效实施的 Runge-Kutta 和 BDF 积分器,用于模拟 ODE 和 DAE。

ACADO Toolkit 旨在满足这四个关键属性:

  • 开源:该工具包可免费获得,最新版本以及文档和示例可以从 http://www.acadotoolkit.org 下载。
  • 用户友好性:ACADO Toolkit 的语法被设计为尽可能直观,以便允许用户以非常接近通常数学语法的方式制定控制问题。
  • 代码可扩展性:将现有算法链接到工具包应该很容易。这是通过 ACADO 工具包的面向对象软件设计风格来实现的。
  • 自包含:ACADO 是一个独立的工具包。 本身不需要外部包,但可以链接用于图形输出的外部求解器或包。

ACADO工具包的安装

这里解释了如何在 Linux 操作系统中下载并使用CMake编译ACADO 工具包。 以Ubuntu 发行版为例(也适用于任何基于 Debian 的发行版)。

1. 准备工作

我们需要通过 apt-get 包管理器下载一些包:

sudo apt-get install gcc g++ cmake git gnuplot doxygen graphviz

以下软件包是必需的:gcc、g++、cmake 和 git。 Gnuplot、Doxygen 和 Graphviz 是可选的,ACADO 可以在没有这些包的情况下工作,但不安装的话将无法可视化结果和/或生成 API 文档。

ACADO工具包入门使用教程_第1张图片
笔者这里已经安装过gcc/g++,cmake和git,只给出Gnuplot、Doxygen 和 Graphviz的安装过程。

2. 安装教程

在GitHub下载工具包代码。 官网的建议是下载稳定分支:

git clone https://github.com/acado/acado.git -b stable ACADOtoolkit

ACADO工具包入门使用教程_第2张图片
进入 ACADOtoolkit 文件夹(下文会使用表示),并创建一个编译文件夹build:

cd ACADOtoolkit
mkdir build
cd build

运行 CMake 以生成 makefile,并开始编译过程:

cmake ..
make

ACADO工具包入门使用教程_第3张图片
ACADO工具包入门使用教程_第4张图片
通过运行示例程序检查安装是否成功:

cd ..
cd examples/getting_started
./simple_ocp

ACADO工具包入门使用教程_第5张图片

返回的曲线结果图如下:
ACADO工具包入门使用教程_第6张图片
注意:如果想在调试模式下编译 ACADO,可以像这样运行 CMake:

cmake -DCMAKE_BUILD_TYPE=Debug ..

使用CMake实现自己的工程

这里将演示如何使用 ACADO 的实现自己的项目。 本文介绍在 Linux 和 OS X 操作系统上使用 C++ 工具包的用法。 基本上有两种设置项目的方法:一种简单的和一种更复杂但功能更强大的方法。

1. 简单方法

将自己的 C++ 文件放在 /examples/my_examples 文件夹中。 唯一的限制是一个可执行文件只能对应一个源 (.cpp) 文件。 将源文件放入 my_examples 文件夹后,转到/build,实行以下命令:

cmake ..
make

编译结束后,可执行文件会放在 /examples/my_examples。 举个例子,如果你的源文件的名称是 my_nice_code.cpp,在那里会生成一个名为 my_nice_code 的可执行文件。

2. 复杂方法(推荐)

2.1 设置环境

我们需要做的第一件事是让 Linux 环境识别 ACADO 工具包。 一种方法是将一个简单的 bash 脚本添加到环境文件中。
对于 Linux 系统,我们需要编辑 home 文件夹中的 .bashrc 文件。打开.bashrc文件时,将以下行附加到文件中:

source /build/acado_env.sh

其中 指的是 ACADO 工具包根文件夹,在安装说明中已提及。笔者是把工具包放在根目录,source ~/ACADOtoolkit/build/acado_env.sh
之后,通过在终端中实行如下命令来刷新环境:

. ~/.bashrc

2.2 实现一个简单的工程

我们将 MY_PROJECT 文件夹称为工程目录文件夹。大致包含以下几步:

  1. /cmake/FindACADO.cmake 复制到 MY_PROJECT 里的某个位置;
  2. 在 MY_PROJECT 文件夹中创建一个文件 CMakeLists.txt,并需要包含以下文本:
# 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 加速。我们关心的燃料优化控制问题具有以下形式:

ACADO工具包入门使用教程_第7张图片在这里,目标是在从 s(0) = 0 到 s(T ) = 10 的最短时间 T 内飞行,同时应满足对速度 v 和控制输入 u 的约束。 假设火箭以速度 v(0) = 0 开始,并需要在结束时间 T 停止,这可以用约束 v(T ) = 0 的形式表示。

接下来展示代码实现,下图是笔者工程的目录结构:

ACADO工具包入门使用教程_第8张图片
其中,main.cpp 文件内容:

#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 一样,这里不在赘述。

你可能感兴趣的:(其他,ACADOToolkit,最优控制)