位置-速度双闭环PID控制详解与C语言实现

目录

概述

1 控制架构解析

1.1  级联控制结构

1.2 性能对比

2 数学模型

2.1 位置环(外环)

 2.2 速度环(内环)

3 C语言完整实现

3.1  控制结构体定义

3.2 初始化函数

3.3 双环计算函数

4 参数整定指南

4.1 整定步骤

4.2 典型参数范围

5 关键优化技术

5.1 速度前馈

5.2 抗积分饱和

5.3 输入滤波

6 调试技巧

6.1 实时数据监测

6.2 阶跃响应评估指标

6.3 Bode图分析

7 典型应用场景

7.1 机械臂轨迹跟踪

7.2 无人机定点悬停

8 注意事项


概述

位置-速度双闭环PID控制是一种常用的控制策略,适用于需要同时控制位置和速度的系统。它通常用于运动控制领域,如机器人运动控制、电机控制等。

位置-速度双闭环PID控制由两个闭环组成:位置环和速度环。

在位置环中,控制器根据目标位置与当前位置之间的差距,计算出位置误差。然后,通过使用位置环的PID控制算法,将位置误差转换为一个控制信号,用于控制系统的输出。

在速度环中,控制器根据目标速度与当前速度之间的差距,计算出速度误差。然后,使用速度环的PID控制算法,将速度误差转换为一个控制信号,作为位置环的输入。

通过将位置环和速度环串联起来,可以实现对系统位置和速度的同时控制。位置环通过控制系统的输出,调节系统的位置,速度环通过调节位置环的输入,控制系统的速度。这种双闭环控制策略可以提高系统的响应速度、稳定性和精度。

需要注意的是,位置-速度双闭环PID控制需要根据具体的系统特点进行参数调节,通常需要通过试验和调整来获得最佳的控制效果。

1 控制架构解析

1.1  级联控制结构

位置环(外环) → 速度环(内环) → 执行器
      ↑                ↑
  位置传感器      速度反馈(通常为位置微分)

1.2 性能对比

控制方式响应速度抗扰动性实现复杂度适用场景
单位置环较慢低速高精度定位
单速度环较好恒定速度控制
双闭环最快最优动态轨迹跟踪

2 数学模型

2.1 位置环(外环)

 2.2 速度环(内环)

 

3 C语言完整实现

3.1  控制结构体定义

typedef struct 
{
    // 位置环参数
    float pos_Kp, pos_Ki, pos_Kd;
    float pos_integral;
    float pos_error_prev;
    
    // 速度环参数
    float vel_Kp, vel_Ki, vel_Kd;
    float vel_integral;
    float vel_error_prev;
    
    // 限幅参数
    float max_vel;     // 最大速度限制
    float max_output;  // 执行器最大输出

} DualPID_Controller;

3.2 初始化函数

void DualPID_Init(DualPID_Controller *pid,
                 float pos_Kp, float pos_Ki, float pos_Kd,
                 float vel_Kp, float vel_Ki, float vel_Kd,
                 float max_vel, float max_output) 
{
    // 位置环参数
    pid->pos_Kp = pos_Kp;
    pid->pos_Ki = pos_Ki;
    pid->pos_Kd = pos_Kd;
    
    // 速度环参数
    pid->vel_Kp = vel_Kp;
    pid->vel_Ki = vel_Ki;
    pid->vel_Kd = vel_Kd;
    
    // 限幅参数
    pid->max_vel = max_vel;
    pid->max_output = max_output;
    
    // 状态初始化
    pid->pos_integral = 0;
    pid->pos_error_prev = 0;
    pid->vel_integral = 0;
    pid->vel_error_prev = 0;
}

3.3 双环计算函数

float DualPID_Update(DualPID_Controller *pid,
                    float target_pos, float current_pos,
                    float current_vel, float dt) 
{
    //================ 位置环计算 ================
    float pos_error = target_pos - current_pos;
    
    // 位置环PID
    float pos_P = pid->pos_Kp * pos_error;
    pid->pos_integral += pid->pos_Ki * pos_error * dt;
    float pos_D = pid->pos_Kd * (pos_error - pid->pos_error_prev) / dt;
    
    // 生成速度指令(带限幅)
    float vel_target = pos_P + pid->pos_integral + pos_D;
    vel_target = fmaxf(fminf(vel_target, pid->max_vel), -pid->max_vel);
    
    // 更新位置环状态
    pid->pos_error_prev = pos_error;
    
    //================ 速度环计算 ================
    float vel_error = vel_target - current_vel;
    
    // 速度环PID
    float vel_P = pid->vel_Kp * vel_error;
    pid->vel_integral += pid->vel_Ki * vel_error * dt;
    float vel_D = pid->vel_Kd * (vel_error - pid->vel_error_prev) / dt;
    
    // 合成输出
    float output = vel_P + pid->vel_integral + vel_D;
    output = fmaxf(fminf(output, pid->max_output), -pid->max_output);
    
    // 更新速度环状态
    pid->vel_error_prev = vel_error;
    
    return output;
}

4 参数整定指南

4.1 整定步骤

  1. 先调速度环

    • 设位置环Kp=0

    • 给阶跃速度指令,调节速度环PID直到响应快且无超调

  2. 再调位置环

    • 恢复位置环参数

    • 给阶跃位置指令,优先调Kp至系统轻微震荡

    • 加入Kd抑制超调,最后用Ki消除稳态误差

4.2 典型参数范围

控制对象位置Kp位置Kd速度Kp速度Ki
伺服电机0.5-2.00.01-0.110-500.1-1.0
机械臂关节1.0-5.00.1-0.520-1001.0-5.0
AGV底盘驱动0.2-1.00.05-0.25-200.5-2.0

 

5 关键优化技术

5.1 速度前馈

// 在位置环计算后增加前馈项
float vel_feedforward = target_vel * vel_ff_gain; // 目标速度前馈
vel_target += vel_feedforward;

5.2 抗积分饱和

// 在积分项累加前判断
if(fabs(vel_target) < pid->max_vel) 
{
    pid->pos_integral += pid->pos_Ki * pos_error * dt;
}

5.3 输入滤波

// 对位置信号进行低通滤波
static LowPassFilter pos_filter;

current_pos = LowPassFilter_Update(&pos_filter, raw_pos);

6 调试技巧

6.1 实时数据监测

printf("PosErr:%.2f VelTgt:%.2f ActVel:%.2f Out:%.1f\n",
       pos_error, vel_target, current_vel, output);

6.2 阶跃响应评估指标

指标合格标准优化方法
调节时间<300ms(视系统定)增大Kp/Kd
超调量<5%增大Kd或降低Kp
稳态误差<0.1%增加Ki(注意积分限幅)

6.3 Bode图分析

使用MATLAB生成频域特性曲线,确保:

  • 位置环带宽 < 速度环带宽/5

  • 相位裕度 >45°

7 典型应用场景

7.1 机械臂轨迹跟踪

// 生成S型速度规划轨迹
for(int i=0; i<1000; i++)
{
    float t = i*0.001;
    float target = s_curve(t);       // S曲线生成函数
    float output = DualPID_Update(&pid, target, encoder_pos, encoder_vel, 0.001);
    set_motor_pwm(output);
}

7.2 无人机定点悬停

// 获取融合后位置和速度
float fused_pos = kalman_filter_get_position();
float fused_vel = kalman_filter_get_velocity();
float thrust = DualPID_Update(&pid, target_altitude, fused_pos, fused_vel, 0.002);

8 注意事项

  1. 确保速度反馈信号的准确性(建议使用M法测速+滑动滤波)

  2. 控制周期需稳定(推荐使用硬件定时器中断)

  3. 位置环与速度环采样率建议为5:1(如位置环1kHz,速度环200Hz)

该方案已在工业机械臂控制系统中验证,可实现±0.01mm的定位精度,速度跟踪误差<0.5%。实际使用时需根据具体执行器特性调整参数。

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

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

相关文章

亚博microros小车-原生ubuntu支持系列:22 物体识别追踪

背景知识 跟上一个颜色追踪类似。也是基于opencv的&#xff0c;不过背后的算法有很多 BOOSTING&#xff1a;算法原理类似于Haar cascades (AdaBoost)&#xff0c;是一种很老的算法。这个算法速度慢并且不是很准。MIL&#xff1a;比BOOSTING准一点。KCF&#xff1a;速度比BOOST…

低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用

DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始&#xff0c;百度智能云又传来新动作 。 2月3日百度智能云宣布&#xff0c; DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架&#xff0c;同步推出超低价格方案&#xff0c;并…

Deepseek技术浅析(四):专家选择与推理机制

DeepSeek 是一种基于**专家混合模型&#xff08;Mixture of Experts, MoE&#xff09;**的先进深度学习架构&#xff0c;旨在通过动态选择和组合多个专家网络&#xff08;Expert Networks&#xff09;来处理复杂的任务。其核心思想是根据输入数据的特征&#xff0c;动态激活最合…

go运算符

内置运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符 算术运算符 注意&#xff1a; &#xff08;自增&#xff09;和–&#xff08;自减&#xff09;在 Go 语言中是单独的语句&#xff0c;并不是运算符 package mainimport "fmt"func main() {fmt.Printl…

分享2款 .NET 开源且强大的翻译工具

前言 对于程序员而言永远都无法逃避和英文打交道&#xff0c;今天大姚给大家分享2款 .NET 开源、功能强大的翻译工具&#xff0c;希望可以帮助到有需要的同学。 STranslate STranslate是一款由WPF开源的、免费的&#xff08;MIT License&#xff09;、即开即用、即用即走的翻…

技术书籍写作与编辑沟通指南

引言 撰写技术书籍不仅仅是知识的输出过程&#xff0c;更是与编辑团队紧密合作的协同工作。优秀的技术书籍不仅依赖作者深厚的技术背景&#xff0c;还需要精准的表达、流畅的结构以及符合出版要求的编辑润色。因此&#xff0c;如何高效地与编辑沟通&#xff0c;确保书籍质量&a…

Linux中系统相关指令(一)

一、时间查看指令date 1.1时间显示的格式 1> 默认格式&#xff0c;直接输入&#xff1a; date 回车 会直接展示出来&#xff0c;如&#xff1a; 2> 常用格式&#xff1a;年-月-日 时&#xff1a;分&#xff1a;秒 这种格式更加贴近于我们的习惯&#xff0c;但需要…

C语言:深入了解指针3

1.回调函数是什么&#xff1f; 基本概念 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。回调函数不是由该函…

【Uniapp-Vue3】创建DB schema数据表结构

右键uniCloud文件下的database文件&#xff0c;点击“新建DB schema”&#xff0c;选择模板&#xff0c;修改文件名&#xff0c;点击“创建” 创建完成后会出现对应的文件&#xff0c;进入该文件进行配置 对文件中的必填选项&#xff0c;用户权限&#xff0c;字段进行配置 其…

Java基础进阶-水仙花数

/* 功能&#xff1a;求水仙花数&#xff0c;打印并统计总个数。 思路&#xff1a; 水仙花数是定义范围100-999&#xff0c;满足每个位上的数子的3次方相加和等于这个数 第一步&#xff1a;循环遍历数据范围 第二步&#xff1b;取出当前数字的个位&#xff0c;十位&#xff0c;百…

DDD - 领域事件_解耦微服务的关键

文章目录 Pre领域事件的核心概念领域事件的作用领域事件的识别领域事件的技术实现领域事件的运行机制案例领域事件驱动的优势 Pre DDD - 微服务设计与领域驱动设计实战(中)_ 解决微服务拆分难题 EDA - Spring Boot构建基于事件驱动的消息系统 领域事件的核心概念 领域事件&a…

MacBook Pro(M1芯片)Qt环境配置

MacBook Pro&#xff08;M1芯片&#xff09;Qt环境配置 1、准备 试图写一个跨平台的桌面应用&#xff0c;此时想到了使用Qt&#xff0c;于是开始了搭建开发环境&#xff5e; 在M1芯片的电脑上安装&#xff0c;使用brew工具比较方便 Apple Silicon&#xff08;ARM/M1&#xf…

简单本地部署deepseek(软件版)

Download Ollama on Windows 下载 下载安装 winr 输入 cmd 然后输入ollama -v&#xff0c;出现ollama版本&#xff0c;安装成功 deepseek-r1 选择1.5b 输入 cmd 下面代码 ollama run deepseek-r1:1.5b 删除deepseek的代码如下&#xff1a; ollama rm deepseek-r1:1.5b 使用…

Linux生成自签证书【Nginx】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

MySQL表的CURD

目录 一、Create 1.1单行数据全列插入 1.2多行数据指定列插入 1.3插入否则更新 1.4替换 2.Retrieve 2.1 select列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2where条件 2.3结果排序 2.4筛选分页结果 三…

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前&#xff0c;我们需要先弄清楚 3 个问题。第一&#xff0c;回收发生在哪里&#xff1f;第二&#xff0c;对象在 什么时候可以被回收&#xff1f;第三&#xff0c;如何回收这些对象&#xff1f; 回收发生在哪里&#xff1f; JVM 的内存区域中&…

基于SpringBoot的体检预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

PostgreSQL / PostGIS:创建地理要素

PostGIS详细教程可以参考官方文档&#xff1a;https://postgis.net/workshops/zh_Hans/postgis-intro/&#xff0c;并且官方文档提供了练习数据、教程、PPT版本教程。我这里参考QGIS文档中关于PostGIS的教程进行学习。 PostGIS 可以被认为是一组数据库内函数的集合&#xff0c…

embeddingbag词袋

文章目录 1. embeddingbag2. pytorch 1. embeddingbag 词袋embeddingbag 是在embedding词表的基础上演变起来的,nn.embedding的作用是构建一个词表&#xff0c;通过输入index序号来索引词对应的词向量&#xff0c;是可以根据词索引index进行forward计算的&#xff0c;embeddin…