PID与MPC控制方法

2023-05-16

记录udacity–无人驾驶工程师课程中控制部分。
MPC代码和实践链接https://github.com/udacity/CarND-MPC-Quizzes

  • 本文按照对udacity课程的理解和翻译而来

1、PID

P:Proportional 比例项, 用比例项乘以误差;快速缩小误差;
I:积分单元(Integral) 积分单元乘以一定时间内误差的和,用来消除稳态误差;
D:微分单元(Derivative) 微分项乘以误差的差分,防止震荡;
P控制:存在震荡情况;
PD控制:缩小震荡,快速缩小误差,但是不能消除系统误差;system bias.零位不能够达到实际的直行;
PID:在PD的控制基础上,用以消除稳态误差。

在这里插入图片描述

调参方法

讲师介绍到一种自动调参数的方法twiddle,即在开始控制前用以标定参数。
在这里插入图片描述
代码如下:

def twiddle(tol=0.2): 
    p = [0, 0, 0]
    dp = [1, 1, 1]
    robot = make_robot()
    x_trajectory, y_trajectory, best_err = run(robot, p)

    it = 0
    while sum(dp) > tol:
        print("Iteration {}, best error = {}".format(it, best_err))
        for i in range(len(p)):
            p[i] += dp[i]
            robot = make_robot()
            x_trajectory, y_trajectory, err = run(robot, p)

            if err < best_err:
                best_err = err
                dp[i] *= 1.1
            else:
                p[i] -= 2 * dp[i]
                robot = make_robot()
                x_trajectory, y_trajectory, err = run(robot, p)

                if err < best_err:
                    best_err = err
                    dp[i] *= 1.1
                else:
                    p[i] += dp[i]
                    dp[i] *= 0.9
        it += 1
return p

使用动态的PID参数能够使快速接近,但是容易造成初始的摆震;

首先使用上述方式确定一个PID参数,再进行控制,会使得控制收敛很快。

对各种组合方法的收敛效果示意:
在这里插入图片描述

2、MPC

2.1 MPC的主要组成

MPC需要设置的主要参数包括N, dt, and T。

N, dt, and T are hyperparameters you will need to tune for each model predictive controller you build. However, there are some general guidelines. T should be as large as possible, while dt should be as small as possible.
N Dt T(总步数、时间步长、总时域:T=N*Dt)是需要调整的超参数,一般的调整方式T越大越好,dt越小越好。

一般对超参数的设置按照如下原则:

  • HORIZON:

用在车上的时域,至少是数秒的级别,在这段时域以内,得到环境的变化,否则预测是毫无意义的。

  • Number of timesteps:

MPC的优化目标是优化控制的输入量,通过调整输入,直到找到在这些输入下最低的cost vector。这个向量的长度为N,N就是决定了MPC需要优化的变量,同时也是计算cost的major driver。

  • Time Duration时间间隔

MPC是想要通过动作额离散路径的平均来逼近一个连续的参考线,大的时间间隔会导致低频的actuations,难以连续逼近曲线,这种误差被叫做离散误差"discretization error".

基于车辆自行车模型的MPC方法,其中:
初始状态包含车辆的位置、速度、航向;
优化过程中的状态更新是根据自行车模型推算的位置,车辆速度,cte(位置偏差),航向偏差;优化方程不定,主要包含误差变小、速度转角的平滑度;
约束:对转角约束在±25°,纵向约束在±1(表示油门到极限和刹车到极限)
在这里插入图片描述

3、方法优劣讨论

对PID和MPC的讨论除了是否运用被控制物体的物理模型外,主要集中在系统延迟能否处理好的问题。
在实际的车辆中,一个动作并不会被立马响应,而是会经过100ms的量级的延迟(主要指线控车辆的执行延迟)。这个延迟会对不同的控制器来讲都是一个挑战。比如PID:会造成overcome(超调);但是MPC能够较好地处理这种延迟,因为其将延迟考虑在模型中了。

  • PID controller

PID算法一般不依赖于未来的误差,这是不对的。如果依赖未来的误差,也没有考虑车辆的模型,必然不准确的控制;

  • Model predictive controller

延迟的一个重要因素就是执行器的动态特性。例如,从转向角指令下发到实际到达该转向角度的时间。这个可以通过简单的动态系统进行建模,并且整合到车辆模型中去。一种方法就是将使用车辆模型,根据延迟时间推算延迟时间后的车辆状态,这个车辆状态就是MPC计算的新初始状态;

相比之下,MPC能够比PID算法更优地处理延迟问题;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PID与MPC控制方法 的相关文章

  • PID参数解析+调参经验笔记(经验法)

    在最前面推荐一个大佬的讲解 真的很浅显易懂 建议先看了解大概PID 链接 ps 2022 1 2更新pid通俗理解 out speed p err d now speed pid最核心算法 运动员参加100米跑步 假设这个人可以瞬间提速 但
  • PID简介

    一 基本定义 Sv 用户设定值 给定信号 Pv 控制对象当前状态值 反馈信号 E 偏差值 偏差信号 所以 E Sv Pv 二 PID各个控制基本分析 1 P控制 比例控制 Pout Kp Ek 假定从早上开机上电 我们每隔一秒钟就通过传感器
  • FPGA实现电机转速PID控制

    通过纯RTL实现电机转速PID控制 包括电机编码器值读取 电机速度 正反转控制 PID算法 卡尔曼滤波 最终实现对电机速度进行控制 使其能够渐近设定的编码器目标值 一 设计思路 前面通过SOPC之NIOS 实现电机转速PID控制 调用中断函
  • 深入浅出PID控制算法(二)————PID算法离散化和增量式PID算法原理及Matlab实现

    引言 上篇介绍了连续系统的PID算法 但是计算机控制是一种采样控制 他只能根据采样时刻的偏差来计算控制量 因此计算机控制系统中 必须对公式进行离散化 具体就是用求和代替积分 用向后差分来代替微分 使模拟PID离散化为数字形式的差分方程 准备
  • Android : 通过pid获取app包名

    方法一 这个方法用在app主线程的activity或service里 因为要有context获取am private String getAppName int pid String pkgName ActivityManager am A
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • TSI系统测量参数之:轴向振动

    一 TSI系统测量参数 1 轴向位移 2 盖振或瓦振 3 偏心 4 键相 5 零转速 6 轴向振动 7 相对热膨胀 胀差 8 绝对热膨胀 缸胀 二 各参数作用 2 轴向振动 测量的是大轴相对于轴瓦的X向振动和Y向振动 反馈电压量程为 4V至
  • 如何以编程方式获取 OS X 上给定 PID 的打开文件描述符列表?

    我所看到的一切都说要使用lsof p 但我正在寻找不需要 fork exec 的东西 例如 在 Linux 上 人们可以简单地步行 proc pid fd You can use proc pidinfo与PROC PIDLISTFDS枚举
  • 如何在Python中检查是否存在给定pid的进程?

    有没有办法检查 pid 是否对应于有效进程 我从其他来源获取 pid 而不是os getpid 我需要检查机器上是否不存在具有该 pid 的进程 我需要它在 Unix 和 Windows 中可用 我还在检查 PID 是否未被使用 如果 pi
  • 如何获取生成的 java 进程的 PID

    我正在编写几个 java 程序 在完成我想做的任何事情后 需要在单独的 JVM 中杀死 清理 为此 我需要获取我正在创建的 java 进程的 PID jps l可在 Windows 和 Unix 上运行 您可以使用 java 程序调用此命令
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?

    有人能解释一下 Erlang 中 Pid 的结构吗 Pids 看起来像这样
  • 有没有办法确定 Linux PID 是否暂停?

    我有一个 python 脚本 它使用 SIGSTOP 和 SIGCONT 命令与 os kill 来暂停或恢复进程 有没有办法判断相关PID是处于暂停状态还是恢复状态 您可以从进程的 proc 目录 proc
  • 如何确定 Linux 上是否使用 Java 或 JRuby 运行不同的进程 ID?

    我需要查看给定的进程 ID 是否正在运行 并且它必须在 Java 或 JRuby 中工作 最好是 Ruby 解决方案 它可能取决于 Linux 系统 特别是 Debian 和 或 Ubuntu 我已经有了我要找的PID 只需要看看它当前是否
  • Ubuntu Java:查找特定程序的 pid 并终止该程序

    我正在尝试创建一个应用程序来检查此特定应用程序是否正在运行 然后在指定的时间后终止该应用程序 我打算获取应用程序的 pid 如何获取应用程序的 pid Thanks 你可以尝试ps aux grep foobar获取 pid 然后发出kil
  • 如何在shell脚本中从fork子进程获取PID

    我相信我可以从父进程派生出 10 个子进程 下面是我的代码 bin sh fpfunction n 1 while n lt 20 do echo Hello World n times sleep 2 echo Hello World2
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • Process.start() 启动的进程返回错误的进程 ID?

    我正在使用以下代码启动可执行文件 Process proc new Process proc StartInfo FileName executablePath proc Start proc WaitForInputIdle 在这次通话之
  • AppleScript:从应用程序隐藏/获取进程名称

    我想隐藏最前面的应用程序 我知道您可以使用以下语法隐藏进程 tell application System Events set visible of process to false end tell 我知道如何获取最前面的应用程序 pa
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

    如何获取运行 VBA 代码的当前 Excel 实例的进程 ID 我不想通过标题中的名称来请求它 当我有两个或多个具有相同标题的 Excel 实例时 这会导致问题 您可以使用此方法来获取当前进程ID Declare Function GetC

随机推荐

  • Boost型Ladrc控制双闭环电路 双闭环控制

    Boost型Ladrc控制双闭环电路 双闭环控制 xff08 1 xff09 电压外环采用简化Ladrc控制器 xff0c 简化线性自抗扰控制 xff0c 采用PD控制 43 三阶LESO状态观测器 xff0c xff08 2 xff09
  • 【STM32】HAL库——串口中断通信(二)

    由于调试过程中发现Proteus 8有些许bug xff0c 串口中断采用STM32F103RCT6开发板进行讲解 前期准备 xff1a STM32CubeMXSTM32F103RCT6开发板IDE Keil xff08 MDK ARM x
  • Detected problems with API compatibility...修复

    Detected problems with API compatibility 修复 一 xff0c Detected problems with API 问题产生 博主接手年代过于老旧项目 xff0c 在最新安卓版本P等都会出现该弹窗提
  • docker 标记(Tag),推送(push),拉取(pull)你自己的镜像

    链接 https blog csdn net jpiverson article details 50731568 里面的有很详细的步骤和见解 1 输入docker images命令来查看当前的镜像列表 2 找到镜像的id 3 使用IMAG
  • ASSERT: "false" in file qasciikey.cpp, line 501

    pycharm利用moba xterm的x server远程开发 xff0c 在用cv2显示图片时报错 xff1a ASSERT 34 false 34 in file qasciikey cpp line 501 代码 xff1a cv2
  • nvidia-smi命令输出结果缓慢

    可能的原因和解决办法 xff1a 当前已经打开了节能模式 xff08 需要关闭节能模式 xff0c 切换到持久模式 xff09 如何关闭节能模式 xff1a span class token comment 修改或创建配置文件 span s
  • ESP8266深度学习之一初识设备

    一 ESP8266是什么 xff1f 总的来说ESP8266是一款单片机 xff0c 而且是一款自带WIFI功能的单片机 它是安信可公司众多单片机中的一种 xff0c 同时它也有很多种型号可以供我们选择使用 二 ESP8266有什么特点 x
  • 什么是RTK?

    国内习惯把GNSS接收机叫成RTK这倒是真的 xff0c 因为RTK技术的普及 xff0c 让大家对接收机的作用就 限定 在了RTK xff0c 在之前没有RTK时 xff0c 接收机就是接收机 目前 xff0c GNSSj接收机约99 的
  • STM32F103VCT6 高级定时器的PWM输出

    要求得到下列波形 xff0c 死区时间1us CH1和CH1之间的相位差事3us 频率50HZ 1 xff0c To get TIM1 counter clock at 72MHz the prescaler is computer as
  • 计算机视觉(相机标定;内参;外参;畸变系数)

    目录 一 预备知识 1 坐标系变换过程 xff08 相机成像过程 xff09 xff08 1 xff09 相机坐标系转换为图像坐标系 xff08 透视投影变换遵循的是针孔成像原理 xff09 xff08 2 xff09 齐次坐标的引入原因
  • ROS基础(2)——工作空间

    一 工作空间 1 工作空间的概念 ros工作空间简单来说相当于工程或者项目 xff0c 编写ros程序之前 xff0c 首先需要创建ros工作空间 2 创建工作空间 span class token function mkdir span
  • Ubuntu18.04完整新手安装教程和分区设置

    作者PS xff1a 好久没关注blog了 xff0c 居然这么多同学看了这篇文章 xff1a xff09 注意注意 xff1a 以下是关键总结 xff1a 分区 xff1a 这三个就够了 xff1a xff0c home xff0c sw
  • ROS基础(4)——安装ROS相关软件包

    一 ROS的两种安装方式 本章将会通过两种安装方式安装ROS相关软件包 分别是 xff1a 通过apt方式安装RoboWare Studio 通过下载源码编译的方式安装安装ROS Academy for Beginners教学包 这是两种常
  • arm与51单片机之间串口通信实验

    这几天弄arm的串口通信 xff0c 因为以前有点单片机的基础 xff0c 于是 就选了块51单片机与其实验 实验内容是在linux下编写好串口通信程序 xff0c 编译后下载到arm板上运行 xff0c 验证其可行性 linux下串口程序
  • ROS源代码阅读(8)——定位

    2021SC 64 SDUSC ROS源代码阅读 xff08 8 xff09 SLAM定位 xff1a 机器人定位的方法可以分为非自主定位与自主定位两大类 非自主定位是在定位的过程中机器人需要借助机器人本身以外的装置如 xff1a 全球定位
  • 博途V15

    西门子 博途V15仿真报错 WIN10虚拟机安装博途V15 xff0c 仿真时出现如下报错 无法找到STEP 7 V15许可证 开始以为是许可证问题 xff0c 找了18和19的Sim EKB Install进行激活 xff0c 但是并没有
  • Jetson TX2入门之开箱刷机跑demo

    Jetson TX2 开箱配置 43 刷机 43 跑demo xff08 常见坑总结 xff09 简介 JetSon系列是Nvidia公司推出的面向无人智能化领域的嵌入式平台 xff0c 这块嵌入式板子的出现使得我们可以在边缘设备上处理复杂
  • 集成显卡安装pytorch

    Inter集成显卡安装pytorch 安装pytorch 计算机右键 管理 gt 设备显示器 gt 显示适配器 xff0c 查看显卡 我的电脑只有Inter的集成显卡 xff0c 没有独显 刚开始接触 xff0c 对GPU不懂 xff0c
  • ROS可视化动态查看所有topic的频率/带宽/消息类型/数值

    在程序运行或者回放数据包时 xff0c 希望实时查看到所有的正在向外发送的topic名字 类型 带宽 频率 数值等 除了rostopic list以外还可使用rqt辅助包 打开rqt rqt 选择Plugins插件 Topics信息 top
  • PID与MPC控制方法

    记录udacity 无人驾驶工程师课程中控制部分 MPC代码和实践链接https github com udacity CarND MPC Quizzes 本文按照对udacity课程的理解和翻译而来 1 PID P xff1a Propo