基于动力学模型的机械臂pid控制

参考资料:

一、如何实现机械臂的控制

  • 在最常见的对机械臂动力学实现控制的问题中,我们会有一段机械臂末端的期望轨迹S,希望通过对机械臂关节处电机转矩的控制实现末端沿期望轨迹的完美运动。
  • 控制问题主要分为镇定和跟踪两种,上面说的沿期望轨迹运动就是跟踪问题,目标点关于时间一直在变化。镇定问题就是目标点不变,只要快准稳的到达指定位置即可。后面的控制问题为了简化问题,都是讨论的镇定问题
  • 最常用的机械臂控制框架如下:
    在这里插入图片描述
    被控对象的数学形式就是动力徐模型,即输入力输出加速度,之后通过两次积分得到速度和轨迹,这里没有将两次积分画出,在求误差时根据控制器的需要给出轨迹、速度、加速度全部或者部分的误差
  • 关于上面这个图,让我比较疑惑的是工作空间期望轨迹通过逆运动学映射到关节空间期望轨迹这一步。因为这一步是离线的,无法规避运动学模型导致的误差,不知道有没有解决的办法。
  • 最常见的机械臂动力学模型形式如下:
    在这里插入图片描述

二、基础想法

  • 面对机械臂控制的问题,比较容易的想法有两种,一种是基于逆动力学模型的开环控制,另一种就是基于误差的反馈控制。

逆动力学控制器

  • 逆动力学可以通过关节的运动情况求出关节所需的力,如果我们的动力学模型和驱动器器都是完美的,就可以完成控制。但是,完美的模型和驱动器是不存在的,难免会出现误差。并且由于是开环控制系统,无法对产生的误差进行控制。

独立pid控制器

  • 基于误差反馈的控制思路最常见的就是pid,通过期望加速度和实际加速度的差值进行控制 在这里插入图片描述
  • 机械臂是非线性的时变系统,而pid是定常线性控制器。在pid进行独立控制时,将所有系统关于时间和非线性导致的变化全部认为是干扰,这些干扰的来源包括重力、其他关节速度导致的离心力和科氏力、角度变化导致模型参数的变化、摩擦力等,这导致固定参数的独立pid控制难以适应所有工况。
  • 在仿真中,如果假设环境中没有重力,并且其他干扰较小的情况下,独立pid还勉强可以完成工作。

三、基于前馈的pid控制器

  • 上面提到的两种方法都没办法很好的解决实际的控制问题,但如果将两种方法结合在一起就可以成为比较实用的方法了。
  • 开环无法控制误差,反馈没法适应所有工况,将二者结合前馈+反馈即可分别解决系统变化时所需的控制量和剩余误差

1、基于重力补偿的pid控制器

  • 上面提到在假设没有重力时,独立pd可以实现控制,这也说明机械臂姿态变化导致的重力受力情况的变化是较大的干扰量。如果在输出力之前,通过模型对重力进行补偿,则可以解决这一问题。
    在这里插入图片描述

2、基于模型补偿的pid控制器

  • 将重力补偿的思路继续扩展到整个动力学模型,就形成了基于模型补偿的pid控制器
    在这里插入图片描述

四、基于计算力矩法的pid控制器

1、设计思路

  • 前面的方法写出控制器后,都可以在结合被控对象模型后通过李雅普诺夫函数实现稳定判定。但是控制器设计和判定稳定之间没有联系,在设计控制器的过程中,主要源于简单直觉,不够“数学”。
  • 计算力矩法的核心就是通过设置控制器,进而将系统(控制器+受控对象)的数学模型变成一个必然稳定的闭环系统,即系统模型的数学形式如下:
    在这里插入图片描述
    这种数学形式是齐次二阶微分方程,在特定的参数情况下,误差e必然指数级快速趋于0

2、控制器设计

  • 不考虑模型参数误差
    在忽略力矩输出误差情况下,被控对象动力学模型:
    在这里插入图片描述
    在忽略动力学模型参数误差的情况下,控制率如下:
    在这里插入图片描述
    将控制率带入动力学模型:
    在这里插入图片描述
  • 考虑模型参数和控制输出误差
    被控对象动力学模型:
    在这里插入图片描述
    控制率如下:
    在这里插入图片描述
    将控制率带入动力学模型:
    在这里插入图片描述
  • 从上式可知,误差和扰动导致控制器性能下降。处理方式有很多,增加鲁棒项(滑模控制)、增加前馈项(rbf不确定性补偿)等

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【佳学基因检测】Node.js中如何读取并调用内容

【佳学基因检测】Node.js中如何读取并调用内容 先给出功能实现代码: var http require(http); var fs require(fs); http.createServer(function (req, res) {fs.readFile(jiaxuejiyin.html, function(err, data) {res.writeHead(200, {Content-Type: text/html…

使用php打印时间精确到毫秒及毫秒转成11位时间戳

在PHP中,可以使用microtime函数来获取当前时间,包括毫秒。以下是示例代码: // 获取当前时间戳(秒) $time microtime(true); // 将当前时间戳转换为毫秒 $milliseconds round($time * 1000); // 输出当前时间&#…

Android开发知识学习——Kotlin基础

函数声明 声明函数要用用 fun 关键字,就像声明类要用 class 关键字一样 「函数参数」的「参数类型」是在「参数名」的右边 函数的「返回值」在「函数参数」右边使用 : 分隔,没有返回值时可以省略 声明没有返回值的函数: fun main(){println…

怎么测量直线模组的精度?

直线模组是一款比较多变的一种产品,适合多种行业,同时它也适合比较多的环境,是一种比较全面的直线运动的装置。直线模组是非常精密的自动化机械设备,在实践中,应该要严格把握具体精度,并且在必要的时候&…

【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试

本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建,以及开发与工程调试的完整过程,帮助读者能够在实战中体会到Keil这个开发环境的使用方法,了解一个嵌入式工程从无到有的过程,并且具备快速搭建一个全新芯片对应最小软件…

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络,它可以像人类一样将新学到的词汇融入现有词汇,并在新环境中使用它们。与ChatGPT 相比,该神经网络在系统性泛化测试中表现得更好。 …

17、Flink 之Table API: Table API 支持的操作(1)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

【限制输入框值类型】自定义指令el-input输入类型限制,vue和html两个版本

前言 经常遇到输入框需要限制只能输入数字的, 因为用户很离谱,明显输入数字的地方他非要输入英文或者中文 但是用到UI框架或者自己写方法验证表单比较麻烦 为了一个输入框专门去弄一个验证很麻烦 所以这里就整合了两种自定义指令的方式,更加…

【位运算】XOR Construction—CF1895D

XOR Construction—CF1895D 参考文章 翻译 题目要求构造一个长度为 n n n 的数组 b b b,满足以下条件: 数组 b b b 中包含从 0 0 0 到 n − 1 n-1 n−1 的每个整数,且每个整数仅出现一次;对于 i i i 从 1 1 1 到 n − …

vite安装Tailwind CSS

安装 - Tailwind CSS 中文网 (nodejs.cn) 这是官网,平常我练习一般会用vite脚手架 我们选择这个vite模块 可选择React和Vue版本的,这里选择react的按照操作,没问题的话就要出问题了 1、在npm run dev的时候我是出现了这么个问题&#xff0c…

234. 回文链表、Leetcode的Python实现

博客主页:🏆看看是李XX还是李歘歘 🏆 🌺每天分享一些包括但不限于计算机基础、算法等相关的知识点🌺 💗点关注不迷路,总有一些📖知识点📖是你想要的💗 ⛽️今…

variant (C++ 模板元编程)

std::variant 可以理解为一个会自动清除空间的union,保证了赋值时内存的正确性,能够自动进行析构。 通过get可传入下标或者type来获取值,但是不安全,如果传入类型于当前类型不一致时会引发错误。 可以通过get_if传入下标或者值…

竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖,适合作为竞赛…

Linux mount 命令于的基本用法与 umount 的命令

1. 用 Linux mount/umount 能做什么? 不同的操作系统使用不同的文件系统格式。MS-DOS 支持 FAT16 文件系统,Windows98 支持 FAT16、FAT32 文件系 统,WindowsNT 支持 FAT16、NTFS 文件系统,Windows2000 则支持 FAT16、FAT32、NTFS…

【网络奇遇记】那年我与计算机网络的初相识

🌈个人主页:聆风吟 🔥系列专栏:《网络奇遇记》 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 信息时代的计算机网络二. 计算网络的定义和分类三. 计算机网络的特点四. 计算机网路在信息时代的应用五…

图解Linux进程优先级

目录 1.什么是进程优先级? 2.进程优先级原理 3.查看进程优先级 4.修改进程优先级 4.1 setpriority函数原型 4.2 getpriority函数原型 4.3 sched_setscheduler函数原型 4.4 sched_getscheduler函数原型 4.5 sched_setparam函数原型 4.6 sched_getparam函数…

Unity Perception合成数据生成、标注与ML模型训练

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 任何训练过机器学习模型的人都会告诉你,模型是从数据得到的,一般来说,更多的数据和标签会带来更好的性能。 …

限制LitstBox控件显示指定行数的最新数据(3/3)

实例需求:由于数据行数累加增加,控件加载的数据越来越多,每次用户都需要使用右侧滚动条拖动才能查看最新数据。 因此希望ListBox只加载最后10行数据(不含标题行),这样用户可以非常方便地选择数据&#xff…

JMeter组件

1.JMeter常用组件 必须组件:测试计划,线程组(包含多个线程),取样器 测试计划,JMeter默认创建且仅有一个 线程组: 添加步骤: 选择TestPlan并点击鼠标右键添加 分类以及使用&…

Spring Data Redis + RabbitMQ - 基于 string 实现缓存、计数功能(同步数据)

目录 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 1.1.2、案例实现 1.1.3、效果演示 1.2、计数功能(Redis RabbitMQ) 1.2.1、分析 1.2.2、案例实现 一、Spring Data Redis 1.1、缓存功能 1.1.1、分析 使用 redis 作为缓存, M…