OCS2 入门教程(三)- 最优控制模块

系列文章目录


前言

        在本页中,我们将为您提供如何定义 MPC 问题的一些提示。在 OCS2 中,OptimalControlProblem 结构定义了优化问题的主要组成部分,即动力学、成本和约束条件。

        除此之外,您可能还希望为 MPC 提供一些参考轨迹、预定义模式计划(用于切换系统)和其他外部信息,如模型参数的更新(如在自适应控制设置中)、环境地图(如用于避免碰撞的 SDF 地图)等。所有这些都可以借助参考管理器(ReferenceManager)和求解器同步模块(SolverSynchronizedModule)来实现。

        我们从最优控制问题的组成部分开始:成本函数、软约束、(硬)约束、动力学和预计算。一般来说,成本和(硬/软)约束条件是在三个不同的时间实例中定义的:

  • (1) 中间时间间隔,
  • (2) 切换(预跳跃)时间,
  • (3) 优化范围的最终时间。

        预跳变部分只在切换系统问题中有效,根据切换前的状态值(预跳变值)进行评估。

        优化控制问题(OptimalControlProblem)收集的是一组成本和约束条件,而不是单一的成本或约束条件。您可以将这些收集器想象成一个容器,在其中您可以使用唯一的名称添加术语,之后再以相同的名称将其请求回来。每个术语都可以通过覆盖术语的 isActive 方法来决定是否处于活动状态。这有助于改变 MPC 行为。例如,你可以使用外部触发信号在移动机械手的基础跟踪或末端执行器跟踪模式之间进行切换。此外,这些收集器还为您的代码引入了一定程度的模块化,并为在整个项目中扩展和修改 MPC 提供了方便的工具。例如,如果您决定在问题中添加新的约束或成本,您可以将新项添加到最优控制问题中,而无需修改其他项。


一、Costs - 成本

        如前所述,成本函数是为三个不同的时间实例定义的:中间、预跳和最终。中间成本项可以是时间、状态和输入(OptimalControlProblem::costPtr)的函数,也可以是时间和状态(OptimalControlProblem::stateCostPtr)的函数。不过,预跳跃和最终代价项应该只是时间和状态的函数。成本项应继承自 StateCost 或 StateInputCost 类。派生类应定义代价值及其二次近似值。对于复杂函数,可以使用这些类的自动微分版本,即 StateCostCppAd 或 StateInputCostCppAd,用户只需提供代价值即可。有关这些类的实现细节,请参阅 "ocs2_core/cost",有关简单示例,请查看 QuadraticStateCost 和 QuadraticStateInputCost。

        注:我们的所有最优控制求解器都假设,在每个中间时间,与输入相关的中间成本项的 Hession(黑塞)之和为正定值。此外,除 PISOC 外,其他求解器都要求在每个时间实例(中间、预跳和最终)中,所有与状态有关的项的 Hession(黑塞)总和也是正半定的。需要注意的是,虽然在线性搜索策略和信任区域全局化策略中使用 Hession(黑塞)修正在一定程度上可以处理非定义性问题,但如果能保证这种正半定义性,求解器的工作通常会更可靠。避免非定域性的一种方法是对 f 形式的成本函数使用高斯-牛顿近似技术,其中 f 的线性近似值将用于形成正定的 Hessian。更多详情,请参阅状态输入成本高斯-牛顿近似。

二、Constraints - 约束

        与成本类似,也为三个不同的时间实例定义了约束条件:中间、预跳和最终,其中中间约束条件是时间、状态、输入或时间、状态和预跳的函数,而最终约束条件仅是时间和状态的函数。

        约束条件应继承自 StateConstraint 或 StateInputConstraint 类。派生类应根据约束的顺序(ConstraintOrder)定义约束值及其线性或二次近似值。对于复杂函数,可以使用这些类的自动微分版本,即 StateConstraintCppAd 或 StateInputConstraintCppAd,其中只需提供约束值。有关这些类的实现细节,请参阅 "os2_core/constraint",有关简单示例,请查看 LinearStateConstraint 和 LinearStateInputConstraint。

        在 OCS2 中处理约束时,可以使用硬约束或软约束方法。软约束由 OptimalControlProblem 单独收集。软约束的处理基于惩罚方法,在这种方法中,约束被用户定义的惩罚函数包裹(关于这些惩罚函数的列表,请参阅 "ocs2_core/soft_constraint/penalties")。要从约束项创建软约束,可以使用 StateSoftConstraint 和 StateInputSoftConstraint 类。这些类可以获取约束项实例和选择的惩罚函数,并创建软约束收集器可以收集的代价项。在设置约束的同时设置惩罚函数,可以灵活地为每个约束使用不同的惩罚函数(不同类型和/或不同的超参数)。这使得违反约束条件的调整变得更加容易。

        硬约束条件(简称约束条件)根据其类型的不同,通过不同的技术以更高的精度进行处理。通过投影法处理状态输入相等约束。纯状态等式和不等式通过松弛壁垒法或增强拉格朗日技术处理(此功能暂时禁用,将在下一版本中添加)。

        注意:由于状态输入相等约束是通过投影法处理的,OCS2 假定约束的雅可比(Jacobin)相对于输入是全行列的。如果无法保证这一条件,则应使用软约束技术。

三、Dynamics - 动力学

        动力学由其流动图、跳跃图及其一阶近似值(参见 SystemDynamicsBase)定义。对于常规系统,跳跃映射是一个标识映射,但对于切换系统,该映射可以是状态的非线性函数。对于复杂函数,可以使用自动微分版动力学 SystemDynamicsBaseAD。

四、Pre-computation - 预计算

        OCS2 对缓存友好,这意味着可以在成本、约束条件、系统动力学及其近似值之间共享计算。为此,OCS2 使用了预计算(PreComputation)。在评估成本、约束条件和系统动力学之前,OCS2 求解器会调用 PreComputation::request (在切换时间调用 requestPreJump 或在最终时间调用 requestFinal),并发送请求消息,说明下一步将进行哪些操作。因此,您可以根据表示请求集的输入参数来实现 request() 方法。

        注意:一般情况下,应避免使用缓存,仅在以后实施缓存版本以提高性能。有关示例,请参阅 "ocs2_robotic_examples/ocs2_mobile_manipulator"。

五、Changing parameters of the Optimal Control Problem - 改变最优控制参数

        一旦您向求解器定义并设置了最优控制问题,求解器就会在内部创建一个副本(实际上是多个副本)。因此,如果您决定更改最优控制问题中的任何参数,如参考轨迹或模型参数,您就不能通过简单修改您可以访问的最优控制问题的参数来实现这一目的。此外,无论技术上如何,在任何时候都应避免任意更改这些参数。因为当您更改参数时,您的 MPC 求解器可能正处于迭代过程中,这将导致求解器出现未定义的行为。为了避免这个问题,OCS2 引入了参考管理器和求解器同步模块的概念。一般来说,这些都是同步概念,可确保在正确的时间(MPC 每次迭代之前和/或之后)更新参数。换句话说,它们使参数更新与 MPC 迭代同步。

        要访问最优控制组件(如成本、约束、动力学......)中的更新参数/信息,需要采取以下步骤: (1) 创建同步模块的共享指针。(2) 与成本、约束或动力学共享该实例的地址。(3) 通过 SolverBase::setReferenceManager、SolverBase::addSynchronizedModule 或 SolverBase::setSynchronizedModules 将其设置给求解器。

注意:在整个 MPC 问题中,每个同步模块应该只有一个实例。

六、Reference Manager Interface - 参考管理器接口

        ReferenceManagerInterface 创建了一个通用接口,用于定义目标轨迹和模式时间表(仅用于切换系统)。OCS2 的每个求解器在开始新的 MPC 迭代之前都会调用参考管理器的 preSolverRun()。关于该接口的实现,请参考 ReferenceManager 类。ReferenceManager 有两个装饰器类:ReferenceManagerRos(将 ROS 通信添加到 ReferenceManager 中)和 LoopshapingReferenceManager(将其扩展到环形最优控制问题中)。

        由于参考管理器是按照 MPC 主循环的顺序运行的,因此为了提高效率,应避免在 preSolverRun 中进行复杂操作。为此,应在不同的线程中处理这些参数,并将结果保存在缓冲存储器中。然后在 preSolverRun 中通过地址交换更新活动参数即可。OCS2 为此提供了一个名为 BufferedValue 的辅助类。

七、Solver Synchronized Modules - 求解器同步模块

         SolverSynchronizedModules 类似于 ReferenceManagerInterface,但适用于通用应用程序。它只有两个纯虚拟方法 preSolverRun 和 postSolverRun,顾名思义,这两个方法分别在每次 MPC 迭代之前和之后调用。preSolverRun 方法还可以访问最近更新的 ReferenceManagerInterface。相比之下,postSolverRun 方法可以访问 MPC 解决方案。

        与 ReferenceManagerInterface 类似,SolverSynchronizedModules 也是按照 MPC 主循环的顺序运行的。因此,为提高效率,应避免在 preSolverRun 和 postSolverRun 中进行复杂操作。为此,应在不同的线程中保存/计算这些参数,并将结果保存在缓冲区中。然后在 preSolverRun 或 postSolverRun 中,可以通过地址交换更新活动参数。为此,您可以使用 BufferedValue 类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Commons Email在邮件发送中的应用

第1章:简介 大家好,我是小黑,今天咱们聊聊Apache Commons Email这个库,它在发送邮件方面可谓是小而美的利器。Apache Commons Email基于JavaMail API,但它提供了更简洁、更易用的接口,让咱们在处理电子邮件…

MySQL-DCL

DCL是数据控制语言,用来管理数据库用户,控制数据库的访问权限。 管理用户:管理哪些用户可以访问哪些数据库 1.查询用户 USE mysql; SELECT * FROM user; 注意: MySQL中用户信息和用户的权限信息都是记录在mysql数据库的user表中的…

Python重温笔记番外篇

1. 写在前面 今天这篇文章是python重温笔记的番外,整理一些面试中的问题以及遇到过的一些坑, 正好借着这个机会把前面的知识进行一个串联, 要不然这些知识很容易就会遗忘, 毕竟知识多而又不太容易常用到。 涉及到的知识包括列表推…

ARCGIS PRO SDK 使用条件管理 Pro UI

ARCGIS PRO UI简单介绍以下&#xff1a; 第一步&#xff1a;在Config.daml中在</AddInfo>标签下加上条件<conditions>标签&#xff08;必须添加的&#xff09; <conditions><!-- 定义条件 &#xff0c;此处定义了两个--Tab 另一个为 group><insert…

Ubuntu 硬盘挂载问题

Ubuntu 重启硬盘问题 重启Ubuntu服务器进入紧急模式。出现报错 /nvme0n1 can not open blockdev查看/etc/fstab 发现写入的挂载设备名与当前系统设备名不符合&#xff1b;一开始以为是写fstab的时候写错设备号了&#xff0c;后来发现每次重启某些硬盘设备号会改变。 使用UUI…

【AI视野·今日Robot 机器人论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 31 Oct 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers DEFT: Dexterous Fine-Tuning for Real-World Hand Policies Authors Aditya Kannan, Kenneth Shaw, Shikhar Bahl, Pragna Ma…

Qt实现模拟操作系统系统

附演示视屏如下&#xff1a; 操作系统演示 使用Qt与C开发的模拟操作系统小程序&#xff0c;主要实现功能&#xff1a; 1.可以创建多个进程&#xff0c;并进行进程的创建、删除、执行等方式&#xff0c;同时可对读内存、写内存、输入、输出进行指令控制&#xff1b; 2.进程有…

算法第十一天-递增顺序搜索树

递增顺序搜索树 题目要求 解题思路 1.二叉搜索树&#xff08;BST&#xff09; 2.任意两个不同节点 遇到二叉搜索树&#xff0c;立即想到这句话&#xff1a;[二叉搜索树&#xff08;BST&#xff09;的中序遍历是有序的]。这是解决所有二叉搜索树问题的关键。 要求BST的任意两…

全排列结构范例_超实用

#include<bits/stdc.h> using namespace std;int n, a[110];void f(int x) { // 不仅作为一个参数&#xff0c;代表了当前的递归层数 if (x > n) { // x的值超过n的时候&#xff0c;说明已经递归了n次了&#xff0c;已经有n个循环了 // 如何判断方案合法性&#xff0c…

一网打尽所有主流平台的实时热榜

今日热榜 一网打尽所有主流平台的实时热榜https://tophub.today

LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

文章首发于公众号&#xff1a;机器感知 LLM增强LLM&#xff1b;通过预测上下文来提高文生图质量&#xff1b;Spikformer V2&#xff1b;同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expanding Capabilities through Composition 本文研究了如何高效地组…

从零开始的神经网络框架搭建

一、抽象化的神经网络 对于一个神经网络来的运算流程来说&#xff0c;基本可以分为两部分&#xff1a;训练与预测。而训练的基本流程又包括&#xff1a;输入数据、计算并激活、计算损失、优化等步骤。正对应神经网络架构的输入层、计算层、激活层、损失计算、优化器&#xff1…

C++简易线程池

原理说明&#xff1a; 1. 线程池创建时&#xff0c;指定线程池的大小thread_size。当有新的函数任务通过函数addFunction ()添加进来后&#xff0c;其中一个线程执行函数。一个线程一次执行一个函数。如果函数数量大与线程池数量&#xff0c;则后来的函数等待。 2. 线程池内部…

生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)

1实验 材料&#xff1a;大自然&#xff08;风&#xff09;、抽屉门松掉的抽屉 实验 1、找一个大风的日子&#xff0c;打开窗户&#xff08;不要找下雨天&#xff0c;不然你会被你亲爱的嫲嫲KO&#xff09; 2、让风在抽屉面前刮过 3、你发现了什么&#xff1f;&#xff1f;&…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机掉线自动重连&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的图像转换为OpenCV的Mat图像的技术背景在NEOAPI SDK里实现相机图像转换为Mat图像格式联合OpenCV实现相机图像转换为Mat图像格式测试演示图 工业相机…

【软件系统架构设计】期末复习题目汇总:简答+应用

电子科技大学软件系统架构设计2023年秋期末考试复习题目汇总 目录 系统分析与设计概述 面向对象建模语言 系统规划 系统需求分析 系统架构设计 软件建模详细设计 设计模式 用户界面设计 系统分析与设计概述 信息系统的 6 种类型&#xff0c;举例说明&#xff1f; 信息…

创建一个starter项目

创建一个starter项目&#xff0c;需要引入坐标 <!-- 自动配置 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId> </dependency>引入这个依赖后&#xff0c;可以使用…

出版实务 | 数字内容加工与产品制作

文章目录 数字内容加工纸质图书数字化加工流程和要求加工流程元数据加工内容结构化加工内容要素的加工成品数据的构成 数字内容图书的加工 数字内容标引数字出版产品制作数字产品制作流程专题数据库的制作流程 质量控制数字内容加工质量控制数字产品制作质量控制 本篇博文根据圣…

【Linux Shell】7. printf 命令

文章目录 【 1. printf 命令的使用方法 】【 2. 实例 】 【 1. printf 命令的使用方法 】 printf 命令模仿 C 程序库&#xff08;library&#xff09;里的 printf() 程序&#xff0c;printf 由 POSIX 标准所定义&#xff0c;因此使用 printf 的脚本比使用 echo 移植性好。prin…

docker容器启动etcd3.5

目录 环境&#xff1a;(window11) 1、配置本地docker镜像地址配置成国内源&#xff1a; 1.1 docker-Desktop里面&#xff0c;增加这个部分内容&#xff1a; 1.2 修改docker的daemon.json文件一个效果&#xff1a; 2、dockerfile文件内容&#xff1a; 1、提前下载etcd3.5的…