双环PID控制详细讲解

2024-03-13 00:52
文章标签 讲解 详细 控制 双环 pid

本文主要是介绍双环PID控制详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考博客:
(1)PID双环控制(速度环和位置环)
(2)PID控制(四)(单环与双环PID)
(3)内外双环pid算法

0 单环PID

目标位置→系统→速度→当前位置
输入目标位置,得到输出的位置是当前位置作为反馈量,而这个输出结果的位置量是我们通过控制中间过程量速度来控制的
单环控制的是速度量

1 PID双环控制

在这里插入图片描述
位置环做为外环,速度环作为内环。外环的输出值作为内环的目标值,外环计算一次pid,根据pid公式可以知道,当离位置目标越来越近时,第一个误差(外环误差)就越来越小,以至于输出的内环目标值就越来越小,所以最终达到的效果就是,离目标值越近,速度越小。(理想情况下,要调节好pid参数,不然系统也会崩溃)

双环控制的时候,外环PID参数调节幅度不要太大,这对于整个曲线的影响很大

代码实现步骤:
PID参数结构体:定义位置、速度闭环的PID参数结构体变量

初始化PID参数:把目标值、期望值、累计偏差清零,配置PID系数
在这里插入图片描述

设置目标位置:只要设置外环的,内环的不用设置,因为内环的目标值,就是外环的输出值。

PID双环控制
在定时器中断(1ms)里,每50ms计算一次当前编码器的总计数值,并通过这个值进行外环PID
(位置环)计算,得到目标速度,要经过速度限幅(防止速度过快),然后存放到g_motor_data.motor_pwm变量(临时存放而已),根据目标速度,再进行速度环PID计算,最终得出要输出的pwm比较值,存放g_motor_data.motor_pwm变量(最终存放),然后再限制pwm比较值输出
在这里插入图片描述

3 PID双环控制详细解析

如果采用PID双环控制,控制的其实就是加速度。如果直接输入目标位置,输出当前位置,控制直接是用加速度来控制这个位置显然是不稳定的。所以我们采用双环,用外环来输出目标速度,用内环来控制加速度从而来控制位置
总体流程:目标位置→系统1→目标速度→系统2→加速度→当前位置和速度→反馈回系统1和2

外环:目标位置→系统1→目标速度→反馈给系统1

外环控制的是速度,也就是通过输入目标位置,来控制速度,从而反馈给系统,当我们把目标速度调的比较稳定后,再把此输出的目标速度当作内环的目标值传进内环中

内环:目标速度→系统2→加速度→当前位置→反馈给系统2

内环是把外环的目标速度作为目标值,根据当前的速度控制加速度从而向目标加速度靠近,最后再把输出值作为反馈值

4 双环PID控制器的C++代码实现

float outer_pid_controller(float setpoint, float input, float kp, float ki, float kd, float dt) {static float integral = 0;static float prev_error = 0;float error = setpoint - input;// 计算积分项integral += error * dt;// 计算微分项float derivative = (error - prev_error) / dt;// 计算输出float output = kp * error + ki * integral + kd * derivative;// 更新上一个误差prev_error = error;return output;
}float inner_pid_controller(float setpoint, float input, float kp, float ki, float kd, float dt) {static float integral = 0;static float prev_error = 0;float error = setpoint - input;// 计算积分项integral += error * dt;// 计算微分项float derivative = (error - prev_error) / dt;// 计算输出float output = kp * error + ki * integral + kd * derivative;// 更新上一个误差prev_error = error;return output;
}float double_pid_controller(float setpoint, float input, float outer_kp, float outer_ki, float outer_kd, float inner_kp, float inner_ki, float inner_kd, float dt) {// 计算外环控制器输出float outer_output = outer_pid_controller(setpoint, input, outer_kp, outer_ki, outer_kd, dt);// 计算内环控制器输出float inner_output = inner_pid_controller(outer_output, input, inner_kp, inner_ki, inner_kd, dt);return inner_output;
}

outer_pid_controllerinner_pid_controller分别是外环和内环PID控制器的实现函数。double_pid_controller函数则是将两个PID控制器串联起来,实现双环PID控制器。其中,setpoint是设定值,input是输入值,outer_kpouter_kiouter_kd是外环控制器的比例、积分和微分系数,inner_kpinner_kiinner_kd是内环控制器的比例、积分和微分系数,dt是采样时间。该函数返回内环PID控制器的输出值。

百度Apollo纵向控制原理如下所示,该图可以为纵向控制器的设置提供参考:
百度Apollo纵向控制框架

可以看出纵向控制是基于Frenet坐标系的,位置跟踪控制器采用P控制器实现车辆位置闭环控制,速度跟踪控制器实现速度闭环控制,根据车辆的俯仰角得出坡道加速度补偿,以及预览点的加速度实现加速度开环控制。基于加速度和定位反馈纵向速度查找油门制动标定表得到油门和刹车的控制量,从而实现车辆的纵向控制。

6 油门刹车标定表

纵向控制逻辑:油门 --> 功率 --> 转速 / 扭矩 --> 车速 / 车加速度 --> 车加速

找到油门和v,a对应的关系
在这里插入图片描述
做实验,踩不同的油门,得到不同的v,a曲线
在这里插入图片描述
对于一个throttle,不同的时间 t 得到一系列v、a点,v,a可以合并,得到v,a曲线
在这里插入图片描述
不同的throttle会得到不同的v、a曲线
在这里插入图片描述
使用不同的throttle做实验,可以得到一个三维曲面
在这里插入图片描述
通过做实验,得到大量的(v,a,throttle)的三维点,从而拟合出throttle = f(v,a)

这篇关于双环PID控制详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803136

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Springboot 中使用Sentinel的详细步骤

《Springboot中使用Sentinel的详细步骤》文章介绍了如何在SpringBoot中使用Sentinel进行限流和熔断降级,首先添加依赖,配置Sentinel控制台地址,定义受保护的资源,... 目录步骤 1: 添加 Sentinel 依赖步骤 2: 配置 Sentinel步骤 3: 定义受保护的

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑