ACADO工具包入门使用教程

本文详细介绍了ACADO工具包的用途、安装步骤以及如何使用CMake构建个人项目。ACADO是一个开源的控制和优化软件,提供了一个通用框架,用于模型预测控制和状态估计。在Linux环境下,通过CMake进行编译安装,并展示了如何在C++项目中集成ACADO,包括简单和复杂两种方法。最后,通过一个火箭飞行时间最优控制问题的实例展示了ACADO的实际应用。
摘要由CSDN通过智能技术生成

什么是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 文档。

在这里插入图片描述
笔者这里已经安装过gcc/g++,cmake和git,只给出Gnuplot、Doxygen 和 Graphviz的安装过程。

2. 安装教程

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

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

在这里插入图片描述
进入 ACADOtoolkit 文件夹(下文会使用<ACADO_ROOT>表示),并创建一个编译文件夹build:

cd ACADOtoolkit
mkdir build
cd build

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

cmake ..
make

在这里插入图片描述
在这里插入图片描述
通过运行示例程序检查安装是否成功:

cd ..
cd examples/getting_started
./simple_ocp

在这里插入图片描述

返回的曲线结果图如下:
在这里插入图片描述
注意:如果想在调试模式下编译 ACADO,可以像这样运行 CMake:

cmake -DCMAKE_BUILD_TYPE=Debug ..

使用CMake实现自己的工程

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

1. 简单方法

将自己的 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 的可执行文件。

2. 复杂方法(推荐)

2.1 设置环境

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

source <ACADO_ROOT>/build/acado_env.sh

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

. ~/.bashrc

2.2 实现一个简单的工程

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

  1. 将 <ACADO_ROOT>/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 文件中需根据实际工程自行编辑 <EXEC_NAME> 和 <EXEC_SOURCES> 标签。

这里,笔者也用一个简单的最优控制问题来进行演示。也就是上一节测试安装成功的案例:火箭飞行时间最优控制问题,考虑了一个简单的火箭模型,它应该尽可能快地从空间中的一个点飞行到另一个点,同时满足飞行过程中的状态和控制约束。在火箭模型中,它具有三个状态 s、v 和 m,分别代表火箭的行进距离、速度和质量。 此外,我们假设火箭可以通过控制输入 u 加速。我们关心的燃料优化控制问题具有以下形式:

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

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

在这里插入图片描述
其中,main.cpp 文件内容:

#include <acado_toolkit.hpp>
#include <acado_gnuplot.hpp>

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

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
1. 共享资源查找 [为你查找网上的共享资源!] 2. 肉鸡查找 [查找一个网段NT,Win2000密码过于简单的主机,还加入了系统版本识别,使用更方便] 3. 远程服务查看 [你可以查看和修改远程的服务,如关闭和启动Telnet,更方便!] 4. 查看隐藏共享 [查看远程计算机的全部共享,包括隐藏的共享也可以查看的到,查看共享更方便] 5. 查看用户组信息 [Win介面的查看远程机子的用户和组的信息,便用更方便!] 6. 开远程的Telnet [直截开启微软自带的Telnet,开Telnet,原来也可以这么简单!] 3. NT消息发送 [向NT的机子发送消息,便用Win介面使用更方便!] 3. IP端口扫描 [有针对性的查看整个网段的某个端口,如冰河端口7626] 4. 端口扫描 [使你更加了解对方主机端口的打开状况] 5. 网卡MAC [快速获取一个网段的 用户名、工作组、对方的网卡MAC地址] 6. 网络状态查看 [想知道自己机子打开了什么端口吗?本程序可帮上你的忙!] 7. 主机查询 [想知道IP的的所在地?想知道某地有哪些IP,本程序可帮上你的忙!] 8. Ping [判断某IP是否和网络连接的好帮手!] 9. 域名<=>IP [想知道域名对应的IP,想知道IP对应的域名,本程序可以帮助你!] 10. 路由查看 [想知道某IP经过的路由?用本程序就可以给你答案!] 11. Finger [Finger能为你查询对方系统的用户信息!] 12. 进程查看 [查看正在运行的软件,查木马还是有一定的帮助的!] 13. 本机IP [在上网的时候,想知道自己的IP吗?本程序可以为你办到!] 14. 常用修改 [反恶意网页修改,恢复系统设置等] 19. 查错误代号说明 [不知道51这个代号表示什么错误,查一查就知道了
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值