TinyMPC - CMU (卡耐基梅隆大学)开源的机器人 MPC 控制器

系列文章目录

CasADi - 最优控制开源 Python/MATLAB 库


文章目录

  • 系列文章目录
  • 前言
  • 一、机器人硬件对比
    • 1.1 Teensy 上的微控制器基准测试
    • 1.2 机器人硬件
    • 1.3 BibTeX
  • 二、求解器
  • 三、功能(预期)
    • 3.1 高效
    • 3.2 鲁棒
    • 3.3 可嵌入式
    • 3.4 最小依赖性
    • 3.5 高效热启动
    • 3.6 接口
  • 四、在 Ubuntu 安装
    • 4.1 在终端克隆此 repo
    • 4.2 导航至根目录并运行
    • 4.3 执行 CMake 配置步骤
    • 4.4 构建 TinyMPC
  • 五、示例
    • 5.1 运行四旋翼飞行器悬停示例
    • 5.2 运行 codegen 示例,然后在该目录下按照相同的构建步骤进行操作


前言

TinyMPC: 资源受限微控制器上的模型预测控制

作者:Anoushka Alavilli*, Khai Nguyen*, Sam Schoedel*, Brian Plancher, Zachary Manchester

Carnegie Mellon University, Barnard College


模型预测控制(Model-predictive control,MPC)是控制受复杂约束条件(complex constraints)影响的高动态机器人系统(highly dynamic robotic systems)的有力工具。然而,MPC 的计算要求很高,在资源有限的小型机器人平台上实施往往不切实际。我们推出的 TinyMPC 是一种高速 MPC 求解器,内存占用少,适用于小型机器人上常见的微控制器。我们的方法基于交替方向乘子法(ADMM),并利用 MPC 问题的结构来提高效率。我们以最先进的求解器 OSQP 为基准,对 TinyMPC 进行了演示,速度提高了近一个数量级,同时还在一个重达 27 克的四旋翼机器人上进行了硬件实验,演示了高速轨迹跟踪(high-speed trajectory tracking)和动态避障(dynamic obstacle avoidance)。

一、机器人硬件对比

在这里插入图片描述

在这里插入图片描述

1.1 Teensy 上的微控制器基准测试

在这里插入图片描述

1.2 机器人硬件

在这里插入图片描述

1.3 BibTeX

@misc{tinympc,
      title={TinyMPC: Model-Predictive Control on Resource-Constrained Microcontrollers}, 
      author={Anoushka Alavilli and Khai Nguyen and Sam Schoedel and Brian Plancher and Zachary Manchester},
      year={2023},
      eprint={2310.16985},
      archivePrefix={arXiv},
      primaryClass={cs.RO}
}

二、求解器

TinyMPC 求解器是一个数值优化软件包,用于求解默认形式的凸二次规划型模型预测控制(convex quadratic model-predictive control)
minimize: ⁡ 1 2 ( x N − x ˉ N ) T Q f ( x N − x ˉ N ) + ∑ k = 0 N ( 1 2 ( x k − x ˉ k ) T Q ( x k − x ˉ k ) + 1 2 ( u k − u ˉ k ) T R ( u k − u ˉ k ) ) subject  to: ⁡ x k + 1 = A x k + B u k u ‾   ≤   u k   ≤ u ‾ x ‾   ≤   x k   ≤ x ‾ \begin{array}{l l}{\operatorname*{minimize:}}&{\dfrac{1}{2}(x_{N}-\bar{x}_{N})^{T}Q_{f}(x_{N}-\bar{x}_{N})+{{\sum_{k=0}^{N}\bigl(\frac{1}{2}(x_{k}-\bar{x}_{k})^{T}Q(x_{k}-\bar{x}_{k})+\frac{1}{2}\bigl(u_{k}-\bar{u}_{k}\bigr)^{T}R(u_{k}-\bar{u}_{k})\bigr)}}} \\ {\operatorname*{subject\;to:}}&x_{k+1}=A x_{k}+B u_{k} \\ & \overline{{{u}}}\,\leq\,u_{k}\,\leq\underline{{u}} \\ & \overline{{{x}}}\,\leq\,x_{k}\,\leq\underline{{x}} \end{array} minimize:subjectto:21(xNxˉN)TQf(xNxˉN)+k=0N(21(xkxˉk)TQ(xkxˉk)+21(ukuˉk)TR(ukuˉk))xk+1=Axk+Bukuukuxxkx

其中, x k ∈ R n x_{k}\in\mathbb{R}^{n} xkRn u k ∈ R m u_{k}\in\mathbb{R}^{m} ukRm 分别为时间步长为 k 时的状态和控制输入,N 为时间步长(也称为视平线), A ∈ R n × n A\in\mathbb{R}^{n\times n} ARn×n B ∈ R n × m B\in\mathbb{R}^{n\times m} BRn×m 定义了系统动力学, Q ≥ 0 Q\geq0 Q0 R ≻ 0 R\succ0 R0 Q f ≥ 0 Q_{f}\geq0 Qf0 为对称成本权重矩阵, x ~ k {\tilde{x}}_{k} x~k u ˉ k {\bar{u}}_{k} uˉk 是状态和输入参考轨迹。

三、功能(预期)

3.1 高效

它采用基于 ADMM 的定制一阶方法,无需矩阵因式分解。所有其他操作都非常简单。它还利用 MPC 问题中的结构,为基元更新实现了黎卡提递归(Riccati recursion)。

3.2 鲁棒

该算法完全 free,而且不需要对问题数据做任何假设(问题只需要是凸的)。它就是这么简单!

3.3 可嵌入式

它有一个简单的接口,无需内存管理器即可生成定制的可嵌入 C 代码。

3.4 最小依赖性

它只需要 Eigen 就能运行。

3.5 高效热启动

它可以轻松热启动,并且可以缓存矩阵因式分解,从而极其高效地解决参数化问题。

3.6 接口

它为 C、C++、Julia、Matlab 和 Python 提供了接口。

四、在 Ubuntu 安装

4.1 在终端克隆此 repo

git clone git@github.com:TinyMPC/TinyMPC.git

4.2 导航至根目录并运行

cd TinyMPC
mkdir build && cd build

4.3 执行 CMake 配置步骤

cmake ../

4.4 构建 TinyMPC

make 

五、示例

5.1 运行四旋翼飞行器悬停示例

./examples/example_quadrotor_hovering
tracking error at step  0: 2.2472
tracking error at step  1: 2.9549
tracking error at step  2: 2.5478
tracking error at step  3: 2.6331
tracking error at step  4: 3.1375
tracking error at step  5: 3.6413
tracking error at step  6: 4.0214
tracking error at step  7: 4.2898
tracking error at step  8: 4.5070
tracking error at step  9: 4.6282
tracking error at step 10: 4.3689
tracking error at step 11: 3.8895
tracking error at step 12: 3.3699
tracking error at step 13: 2.8681
tracking error at step 14: 2.3877
tracking error at step 15: 1.9336
tracking error at step 16: 1.5516
tracking error at step 17: 1.2588
tracking error at step 18: 1.0420
tracking error at step 19: 0.8844
tracking error at step 20: 0.7680
tracking error at step 21: 0.6773
tracking error at step 22: 0.6009
tracking error at step 23: 0.5316
tracking error at step 24: 0.4658
tracking error at step 25: 0.4024
tracking error at step 26: 0.3416
tracking error at step 27: 0.2839
tracking error at step 28: 0.2305
tracking error at step 29: 0.1822
tracking error at step 30: 0.1393
tracking error at step 31: 0.1023
tracking error at step 32: 0.0715
tracking error at step 33: 0.0472
tracking error at step 34: 0.0301
tracking error at step 35: 0.0217
tracking error at step 36: 0.0218
tracking error at step 37: 0.0251
tracking error at step 38: 0.0279
tracking error at step 39: 0.0291
tracking error at step 40: 0.0290
tracking error at step 41: 0.0277
tracking error at step 42: 0.0254
tracking error at step 43: 0.0227
tracking error at step 44: 0.0197
tracking error at step 45: 0.0167
tracking error at step 46: 0.0140
tracking error at step 47: 0.0116
tracking error at step 48: 0.0097
tracking error at step 49: 0.0082
tracking error at step 50: 0.0072
tracking error at step 51: 0.0067
tracking error at step 52: 0.0065
tracking error at step 53: 0.0065
tracking error at step 54: 0.0065
tracking error at step 55: 0.0064
tracking error at step 56: 0.0063
tracking error at step 57: 0.0062
tracking error at step 58: 0.0061
tracking error at step 59: 0.0059
tracking error at step 60: 0.0058
tracking error at step 61: 0.0056
tracking error at step 62: 0.0055
tracking error at step 63: 0.0054
tracking error at step 64: 0.0053
tracking error at step 65: 0.0052
tracking error at step 66: 0.0052
tracking error at step 67: 0.0052
tracking error at step 68: 0.0052
tracking error at step 69: 0.0052

5.2 运行 codegen 示例,然后在该目录下按照相同的构建步骤进行操作

./examples/example_codegen
A = [1, 1]
[5, 2]
B = [3, 4]
[3, 1]
Q = [1.1,   0]
[  0, 1.1]
R = [2.1,   0]
[  0, 2.1]
rho = 0.1
Kinf converged after 5 iterations
Precomputing finished
Kinf = [   1.36,  0.5335]
[-0.6323, -0.1066]
Pinf = [8.899, 2.664]
[2.664, 2.046]
Quu_inv = [  0.1076, -0.09799]
[-0.09799,  0.09522]
AmBKt = [-0.5502,   1.553]
[-0.1739,  0.5062]
coeff_d2p = [7.438e-06, 8.381e-06]
[2.127e-06, 2.398e-06]
Creating generated code directory at /home/khai/SSD/Code/TinyMPC/generated_code
ERROR OPENING DATA WORKSPACE FILE
Segmentation fault

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Geoserver发布2000坐标系遇到的问题总结

在Geoserver上发布2000坐标系的服务时,要想正常发布服务,不仅仅是要涉及2000坐标系,还需要在发布的时候选择对坐标系。具体问题描述如下: 1.问题描述: 在发布好2000坐标系的服务后,在超图的平台加载服务时&…

回溯算法:复原IP地址 子集 子集II

93.复原IP地址 思路: 与分割回文串相似,复原ip地址是将给定字符串分割成点分十进制的四段,切割问题就可以使用回溯搜索法把所有可能性搜出来。回溯三部曲: 递归参数:除了传入的需要分割的字符串,仍然需要…

每天五分钟计算机视觉:VGG网络相对于AlexNet网络有哪些不同?

本文重点 在前面的课程中,我们已经学习了VGG网络模型,也学习了AlexNet网络模型,AlexNet模型先于VGG网络模型产生,所以VGG在一定程度上要优于AlexNet模型,二者来看一下,二者究竟有什么不同? 深度…

数据湖和中央数据仓库的设计

设计数据湖或中央数据仓库是许多大型组织的主要职能,这些组织每天处理数百万笔交易,并对这些交易进行进一步的报告、预测或机器学习项目分析。 为了将所有来自源系统(我们称之为“上游”)到其他业务应用(所谓“下游”&…

基于ssm vue技术的品牌银饰售卖平台源码和论文737

摘 要 本论文主要是针对品牌银饰售卖而开发进行概述,主要包括对研究的背景和研究现状,以及研究目的等的阐述,也对该系统的各种功能要求,对系统结构,数据库的设计等进行讨论。随着科技与技术的发展,利用计…

【Intel/Altera】 全系列FPGA最新汇总说明,持续更新中

前言 2023年11月14日英特尔 FPGA中国技术日,Intel刚发布了新的FPGA系列,官网信息太多,我这里结合以前的信息,简单汇总更新一下,方便大家快速了解Intel/Altera FPGA家族。 目录 前言 Altera和Intel 型号汇总 1. Agi…

Pycharm的字体缩放设置

法1 法2 放大操作 increase 缩小操作 decrease 保存操作,点击OK结束

数学建模-基于机器学习的家政行业整体素质提升因素分析

基于机器学习的家政行业整体素质提升因素分析 整体求解过程概述(摘要) 家政服务业即为家庭提供多种类服务的专门行业,在第三产业中占有重要地位。但近年来,由于人工智能家居产业的发展与客户对家政从业者的要求水平不断提高,家政行业仍面对较…

Token 和 N-Gram、Bag-of-Words 模型释义

ChatGPT(GPT-3.5)和其他大型语言模型(Pi、Claude、Bard 等)凭何火爆全球?这些语言模型的运作原理是什么?为什么它们在所训练的任务上表现如此出色? 虽然没有人可以给出完整的答案,但…

基于Java SSM框架实现社区疫情防控管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现社区疫情防控管理系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,社区疫情防控管理信息系统当然也不能排除在外。社区疫情防控管理信息系…

记录:Unity脚本的编写9.0

目录 射线一些准备工作编写代码 突然发现好像没有写过关于射线的内容,我就说怎么总感觉好像少了什么东西(心虚 那就在这里写一下关于射线的内容吧,将在这里实现射线检测鼠标点击的功能 射线 射线是一种在Unity中检测碰撞器或触发器的方法&am…

vivado如何进行增量编译

情况1 如果是根据 placement 或者 routing 进行增量编译,直接右键点击要跑的 implement,,选择set incremental implement , 然后选第二项,指定 要参考的 routing.dcp 或者 placement.dcp 的路径即可 情况2 如果只参考 synthesis …

网络层之IPv6

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

2023年【危险化学品经营单位主要负责人】及危险化学品经营单位主要负责人模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位主要负责人根据新危险化学品经营单位主要负责人考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位主要负责人模拟考试试题进行汇编,组成一套危险化学品经营单位主要…

linux无法打开M4a格式音频的解决方法

linux是开源系统,之所以打不开,是因为部分linux系统为了避免版权问题,没有m4a的解码插件。所以,解决的办法是安装如下两个非常小的转换器,我们一般用不到转换器的功能,而是反向应用,通过两个几十…

jenkins搭建文档

jenkins搭建文档 简介一、安装运行环境1、安装JDK环境1)查询自带的JDK2)卸载自带的JDK3)创建java文件夹并将jdk上传到该文件夹4)解压5)配置环境变量6)配置生效7)验证是否成功 2、安装maven环境1…

第四代可燃气体监测仪监测场景有哪些?

随着城市化进程的加速,燃气作为一种重要的能源在每个城市都得到了广泛的应用。然而燃气泄漏所引发的安全问题也日益增加,为了保障燃气安全并防止泄漏事故的发生,可燃气体监测仪在其中发挥着重要的作用。可燃气体监测仪适用于甲烷气体浓度监测…

解决(error) ERR Errors trying to SHUTDOWN. Check logs.问题~

该问题出现在我在使用shutdown关闭redis服务器时,出现该问题的原因是由于配置文件的日志文件位置未配置或者缺少日志文件 我自己出现该问题是因为缺少日志文件,解决步骤如下所示: 第一步:在该目录下使用touch命令创建日志文件 第…

免费分享一套Springboot+Vue前后端分离的学生网上请假系统,挺漂亮的

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue前后端分离的学生网上请假系统,分享下哈。 项目视频演示 【免费】springbootvue学生网上请假系统毕业设计 Java毕业设计_哔哩哔哩_bilibili【免费】springbootvue学生网上请假系统…

Java_ArrayList顺序表详解

目录 前言 顺序表 ​编辑 顺序表和数组 ArrayList简介 说明 ArrayList使用​编辑 ArrayList常见操作 ArrayList实现二维数组 ArrayList的遍历 ArrayList的扩容机制 总结 前言 一个高端的程序员,往往都是数据结构学的很好,判断一个程序的优劣也是看数据结构学的好与坏.…