当前位置: 首页 > news >正文

模型预测控制工具包——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.
在这里插入图片描述


http://www.mrgr.cn/news/48075.html

相关文章:

  • undefined reference to `vtable for错误
  • Python跨年烟花
  • 学习记录2024/12/25;用C语言实现通讯录功能
  • 汇编程序设计常见题目
  • 消息队列(一)消息队列的工作流程
  • [WASAPI]从Qt MultipleMedia来看WASAPI
  • lnmp - RBAC方案设计与实现
  • 使用阿里云盘将服务器上的文件上传/下载到云盘/服务器
  • MySQL数据库详细学习要点
  • 纯干货!详解Java并发之线程中断机制
  • Docker理念
  • Android Studio 安装和认识
  • SpringBoot集成Redis
  • 牛上脑和各类牛排的叫法,不要土老帽了~
  • v-html里面的标签设置样式没有用怎么办?
  • 【Linux调试工具】gdb/cgdb
  • 文件之间的输入输出
  • 在python中如何判断回文串(一)?
  • Linux内核 --内存管理之 Slab 分配器介绍
  • 太速科技-628-基于VU3P的双路100G光纤加速计算卡
  • Docker 入门篇
  • 【前端碎片记录】大文件分片上传
  • 【selenium】webdriver测试脚本
  • 常用的web服务器简述
  • ubuntu24 finalshell 无法连接ubuntu服务器, 客户端无法连接ubuntu, 无法远程连接ubuntu。
  • go开发环境设置-安装与交叉编译