五分钟入门控制算法:MPC(模型预测控制)算法

五分钟入门控制算法:MPC(模型预测控制)算法

什么是控制算法?

        比如我现在的无人机悬浮在空中的某个位置,我想要让他以最短时间抬升悬浮到上方10m的位置,那我要具体如何去调整输入(如电流、油门、功率),以最好的性能(时间最短)来达到预期的目标呢?那就需要控制算法来求解,来调整这些输入。

        控制算法(Control Algorithm)本质上是一套控制机械系统运作的“数学指挥指令”。它告诉机器(如无人机、恒温空调、机械臂)如何根据目前的状态,通过调整输入(如电流、油门、功率)来达到预期的目标。

        不同的算法有不同的使用场景与特性,有些适用于动态系统,有些适用于静态。有些适用于低阶系统,有些适用于高阶系统。有些计算量小,有些计算量大。所以衍生出了很多种控制算法。

        如何根据不同的场景选择合适的控制算法,创造更厉害的控制算法,调整控制算法的参数使得任务完成的效果更好;如何让实时波形图(如 rqt_plot)更加贴合跟踪曲线;如何对机械系统编写“保护逻辑” ;如何处理传感器噪声与延迟,用一些滤波算法(卡尔曼滤波)做更好的状态估计。如何增加前馈(Feedforward)**或优化阻尼比来让动作丝滑 就是控制算法工程师的工作。

MPC控制算法:

MPC是一类控制算法。

如果 PID 是根据“现在的误差”在做反应,那么 MPC 就是在**“预测未来”并做决策。你可以把它想象成一个会推算未来几秒钟走势的驾驶员**。

MPC控制算法的几大特性:

(1)预测模型:模型是 MPC 的灵魂,它是对物理世界规律的数学表达。

(2)预测:根据预测模型推算出未来N个步长里系统的状态

(3)滚动优化:虽然我算出了未来 10 步的完美计划,但我只走第 1 步,然后扔掉剩下的,重新计算。走一步,看十步。每一个采样周期都在解一个最优问题。虽然计算量大,但它能保证在任何时刻,输出的操作都是基于当前最新状态的最优选择。

PID vs. LQR vs. MPC 核心对比表

特性PID (比例-积分-微分)LQR (线性二次调节器)MPC (模型预测控制)
核心思想消除误差:根据过去和现在的误差来调整输出。能量最优:在无限时间内寻找系统状态与控制能量的最佳平衡。预测未来:在有限时间内通过滚动优化寻找满足约束的最优解。
对模型的依赖无需模型强依赖:需要精确的线性状态空间模型强依赖:需要系统模型,但要求不高
处理约束的能力几乎没有:设计时考虑了能量权衡,但不能直接加入硬约束。极强
多变量系统 (MIMO)困难:多个回路之间存在严重的耦合干扰。擅长:天然支持多输入多输出系统,通过矩阵统一计算。最擅长:能同时处理多个目标和复杂的变量耦合。
计算复杂度极低:简单的代数运算,单片机轻松跑。:设计阶段解代数黎卡提方程,   运行时仅为矩阵乘法。极高:每个采样周期都要解一个带约束的最优化问题(QP)。
主要应用场景电机转速、恒温控制、简单平衡。航天器姿态控制、精密工业伺服。自动驾驶避障、无人机轨迹规划、化工过程。

普适的MPC算法推导流程:

如果针对某一个问题不好简历数学模型,我们可以不构造数学模型,可以通过一些手段直接跳过数学建模获得预测模型:



总结:

根据原始问题满足的数学物理原理,状态变量,输入,去建立连续动力学模型

根据连续动力学模型构建连续状态空间方程

将状态空间方程离散化

通过离散状态空间方程预测未来N步的状态,并整理为矩阵形式预测方程

构造代价函数,将预测方程代入得到一个QP问题,再通过QP求解器求解

所以本质上是在求解一个受约束的优化问题(如果实在处理线性系统那就是是 QP问题)。输入是表征位置,速度的预测方程跟期望的轨迹。输出是N的步长的控制量。

控制序列 u 是有物理单位的实际物理量(力、扭矩、电流、流速,加速度等等)。

假如u=2.5,那就让pwm占空比为50%,就可以控制机器人踩下一半的油门了。

以一维小车位置控制(多大力从A走到B)为例使用MPC控制:

MPC算法调参:

调节 MPC(模型预测控制)参数的过程,就像是在“计算性能”、“控制精度”和“运行稳定性”之间找平衡。根据不同的场景,有不同的性能需求,自然需要调节不同的参数

1. 时域参数 (Horizon Parameters)

Np:预测步长。     Nc:控制步长


什么是状态空间方程:

状态空间方程是描述系统动态特性的核心工具。传递函数也能表征系统动态特性,但传递函数是“黑盒”,只关注输入输出;状态空间是“白盒”,可以实时观测机器人的每一个关节状态。

1. 核心直觉:什么是“状态”?

想象你在开一辆车(或者控制你的仓库机器人):

  • 如果你只知道机器人现在的位置,你没法预判它下一秒在哪,因为你不知道它的速度
  • 如果你知道位置 + 速度,你就掌握了它的完整“状态”。
2. 数学定义

一个线性定常系统的状态空间模型由两个方程组成:状态方程输出方程状态空间方程的核心思想: 只要知道了现在的状态和接下来的动作,就能算出未来的状态。

Read more

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系 前言 在 OpenHarmony 鸿蒙应用追求“万物互联、全场景覆盖”的伟大进程中,屏幕尺寸的多样性(从 6 英寸手机到 12 英寸平板,再到 2D/3D 模式切换的折叠屏)是每一位 UI 开发者必须正面迎接的挑战。如何在不为每种设备重写 UI 的前提下,实现导航栏自动从“底部”平滑流转到“侧边”?如何在宽屏模式下自动开启“双栏(Master-Detail)”布局?flutter_adaptive_scaffold 作为一个由 Flutter

By Ne0inhk
在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程 什么是 OpenClaw?—— 你的本地 AI 智能体执行框架 OpenClaw 不仅仅是一个聊天机器人,而是一个功能强大的 AI 智能体执行框架。你可以把它想象成一个能自主思考、调用工具、并替你完成复杂任务的数字员工。 🧠 核心概念 * 智能体:OpenClaw 的核心大脑。它能理解你的自然语言指令,拆解任务,并决定调用哪些工具来执行。 * 网关:所有外部访问的入口。它负责处理 WebSocket 连接、管理设备配对、路由消息,是你与智能体交互的桥梁。 * 技能:智能体可调用的具体工具,比如访问文件、操作浏览器、发送消息、查询数据库等。你可以根据需要扩展技能库。 * 记忆:OpenClaw 可以存储对话历史和重要信息,实现长期记忆和上下文理解,让交互更连贯。 * 通道:连接外部聊天平台的渠道,如

By Ne0inhk
HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

文章目录 * 前言 * 项目简介 * 核心特性 * 开源计划 * rchoui官网 * 文档概述 * 第一章: 基础用法实战 * 1.1 三种符号引用方式 * 1.2 应用场景 - 工具栏快速导航 * 第二章: 尺寸系统实战 * 2.1 响应式尺寸配置 * 2.2 应用场景 - 统一设计系统尺寸规范 * 第三章: 颜色系统实战 * 3.1 多彩色系配置 * 3.2 应用场景 - 状态指示系统 * 第四章: 双风格系统实战 * 4.1 线型与实底风格对比 * 4.2 应用场景 - 底部导航栏 * 第五章: 圆角系统实战 * 5.

By Ne0inhk
Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及海量离线资源标识、蓝牙广播载荷(BLE Payload)及二维码数据极限压缩的背景下,如何生成既能保留 UUID 强随机性、又能极大缩减字符长度的唯一标识符,已成为优化存储与通讯效率的“空间必修课”。在鸿蒙设备这类强调分布式软总线传输与每一字节功耗敏感的环境下,如果应用依然直接传输长度达 36 字符的标准 UUID,由于由于有效载荷溢出,极易由于由于传输协议限制导致数据截断或多次分包带来的延迟。 我们需要一种能够实现高进制转换、支持双向编解码且具备低碰撞概率的短 ID 生成方案。 short_uuids 为 Flutter 开发者引入了将标准 UUID 转化为短格式字符串的高性能算法。它利用

By Ne0inhk