模型预测控制工具包——ACADO:通过Cmake构建自己的优化问题

server/2024/10/18 15:57:45/

模型预测控制工具包——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.ppmy.cn/server/130451.html

相关文章

【云从】三、计算机网络基础

文章目录 1、网络2、网络通信2.1 IP地址2.2 子网掩码2.3 网关2.4 私有地址和公有地址2.5 NAT网络地址转换 3、网络架构及设备 1、网络 网络&#xff0c;即通过通信线路&#xff08;如光纤、网线&#xff09;和通信设备&#xff08;如路由器、光猫&#xff09;&#xff0c;将各…

抖音新版abogus184位 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

鸿蒙NEXT开发-页面路由(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

Spring 依赖注入(Dependency Injection)

先说结论&#xff1a; 实际开发时尽量选择 构造器注入 而不是 字段注入。 设值注入 和 方法注入 适用的场景较少&#xff0c;较特殊。 原因&#xff1a; ● 官方推荐使用&#xff01; ● 代码更简洁&#xff1a;配合 Lombok 的 RequiredArgsConstructor&#xff0c;可以自动生成…

mybatisplus整合springboot3出错(springboot多模块开发)

1.mybatisplus版本太低或者maven导入没用如下的 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version></dependency>2.maven导入冲突了&#xf…

CSDN 的 GIt 是没东西吗

虽然说吧 CSDN 的博客也就那样&#xff0c;记得去年的时候 CSDN 出了一个 Git 代码库&#xff0c;被骂得要死&#xff0c;基本上是从外面搬了一堆代码回来。 这回 CSDN 又玩了个新东西&#xff0c;干脆你可以把你的博客文章同步到你在 CSDN 开的代码库上了。 如何同步 在 CS…

使用GPG学习非对称加密 信任公钥

非对称加密需要公钥和私钥&#xff1a; 你的公钥的作用&#xff1a;别人用来给你发加密的信息&#xff06;别人验证你的签名&#xff0c;即加密&验证&#xff08;别人来做&#xff09; 你的私钥的作用&#xff1a;你用来创建签名&#xff06;解密别人发给你的信息的&#x…

QD1-P16 HTML 按钮标签(button)

本节学习 HTML 常用标签&#xff1a;button ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p16 ‍ ​<button>​ 标签在 HTML 中用于创建按钮&#xff0c;它是一个交互式元素&#xff0c;通常用于提交表单或触发某个脚本。以下是 <button>​ 标签的一些基本…