文章目录

    • 理论模型
    • 仿真窗口
    • 控制函数
    • 目标函数
    • 仿真

本文是刘金琨. 机器人控制系统的设计与MATLAB仿真的学习笔记。

理论模型

对于二关节机器人系统,其动力学模型为

D ( q ) q ¨ + C ( q , q ˙ ) q ˙ = r D(q)\ddot q+C(q,\dot q)\dot q = r D(q)q¨+C(q,q˙)q˙=r

式中, D ( q ) D(q) D(q) n × n n\times n n×n阶正定惯性矩阵, C ( q , q ˙ ) C(q, \dot q) C(q,q˙) n × n n\times n n×n阶离心和哥氏力项,在二关节机器人系统中,二者的表达式为

D ( q ) = [ p 1 + p 2 + 2 p 3 cos ⁡ q 2 p 2 + p 3 cos ⁡ q 2 p 2 + p 3 cos ⁡ q 2 p 2 ] , C ( q , q ˙ ) = [ − p 3 q ˙ 3 sin ⁡ q 2 − p 3 ( q ˙ 1 + q ˙ 2 ) sin ⁡ q 2 p 3 q ˙ 1 sin ⁡ q 2 0 ] D(q)=\begin{bmatrix} p_1+p_2+2p_3\cos q_2 & p_2+p_3\cos q_2\\ p_2+p_3\cos q_2&p_2\\ \end{bmatrix}, C(q, \dot q)=\begin{bmatrix} -p_3\dot q_3\sin q_2& -p_3(\dot q_1+\dot q_2)\sin q_2\\ p_3\dot q_1\sin q_2 & 0 \end{bmatrix} D(q)=[p1+p2+2p3cosq2p2+p3cosq2p2+p3cosq2p2],C(q,q˙)=[p3q˙3sinq2p3q˙1sinq2p3(q˙1+q˙2)sinq20]

该式推导过程见:二关节机器人系统模型推导

独立的PD控制率为

τ = K d e ˙ + K p e , e = q d − q \tau = K_d\dot e+K_p e, e=q_d-q τ=Kde˙+Kpe,e=qdq

接下来,取下列参数进行仿真

p = [ 2.90 0.76 0.87 3.04 0.87 ] , q 0 = [ 0.0 0.0 ] , q ˙ 0 = [ 0.0 0.0 ] , K p = [ 100 0 0 100 ] , K d = [ 100 0 0 100 ] p=\begin{bmatrix}2.90\\0.76\\0.87\\3.04\\0.87\end{bmatrix}, q_0=\begin{bmatrix}0.0\\0.0\end{bmatrix}, \dot q_0=\begin{bmatrix}0.0\\0.0\end{bmatrix}, K_p=\begin{bmatrix}100&0\\0&100\end{bmatrix}, K_d=\begin{bmatrix}100&0\\0&100\end{bmatrix} p= 2.900.760.873.040.87 ,q0=[0.00.0],q˙0=[0.00.0],Kp=[10000100],Kd=[10000100]

仿真窗口

首先,打开Matlab,点击Simulink按钮,双击新建空白模型,在弹出窗口中,点击库浏览器,在Simulink中选择下列模块

  • Commonly Used Blocks->Demux, Mux, Scope
  • Sources->Step, Clock
  • User-Defined Functions->S-Function
  • Sinks->To Workspace

绘制成如下形式

在这里插入图片描述

双击模块可更改其属性,除了变量名称之外,将t, x1, x2, tol的输出格式更改为结构体。

其中x1, x2即为两个关节所在位置,tol即 τ \tau τ

控制函数

双击左侧的S-Function,将其名称改为ctrlTest,点击【编辑】按钮->打开编辑器,将其保存为ctrlTest.m,确保和simulink文件在同一目录下。

S函数的输入参数为t,x,u,flag,其中t为当前仿真时间;x为状态变量;u为输入信号。flag为标志变量,与Simulink的状态有关,其值的含义如下

  • flag = 0:初始化阶段,在此阶段,S-Function 需要返回模块的参数信息。
  • flag = 1:计算导数,常用于连续时间系统的状态方程。
  • flag = 2:更新阶段,常用于离散时间系统的更新。
  • flag = 3:计算输出,通常用于计算模块的输出信号。
  • flag = 4:计算下一个采样时间,通常用于离散时间系统。
  • flag = 9:终止阶段,通常用于清理资源。

ctrlTest函数的完整内容如下

function [sys,x0,str,ts] = ctrlTest(t,x,u,flag)
switch flagcase 0, [sys,x0,str,ts]=mdlInitializeSizes;case 3,  sys=mdlOutputs(t,x,u);case {2,4,9}, sys=[];otherwise, error(['Unhandled flag = ',num2str(flag)]);
end%-------mdlInitializeSizes 函数-------------------%
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;         % 结构体模块的赋值
sizes.NumOutputs     = 2; % 输出参数为控制力矩, tol 为 2x1 的矩阵(2020.3.25 更新)
sizes.NumInputs      = 6; % 输入参数 6 个,两个 step,四个chap2_1plant的输出
sizes.DirFeedthrough = 1; % 输入直接控制输出
sizes.NumSampleTimes = 1; % 采样时间为 1
sys = simsizes(sizes);    % 确定参数赋值给 sysx0  = [];                 % 初始值为空
str = [];                 % 默认设置为空
ts  = [0 0];              % 采样时间与偏移量%-------mdlOutputs(t,x,u) 函数-------------------%
function sys=mdlOutputs(t,x,u)
e=[u(1)-u(3);u(2)-u(5)];        % 位置偏差
de=[0-u(4);0-u(6)]; % 角速度偏差Kp=[50 0;0 50]; 
Kd=[50 0;0 50];tol=Kp*e+Kd*de; % PD 控制,在sim中作为输出变量,输出到 workspacesys(1)=tol(1);  % 关节 1 的驱动力矩
sys(2)=tol(2);  % 关节 2 的驱动力矩

在【ctrlTest】中,根据系统状态来选择处理函数,当系统处于初始化状态,则调用【mdlInitializeSizes】函数,当系统计算暑促时,调用【mdlOutputs】,其他状态则输出空向量。

在初始化函数中,使用了simsizes函数,这是用于获取Simulink模块的参数,其返回的结构体中包含以下参数

  • NumInputs: 输入端口的数量
  • NumOutputs: 输出端口的数量
  • NumStates: 状态变量的数量
  • InitialState: 初始条件
  • ContStates: 连续状态变量的数量
  • DiscStates: 离散状态变量的数量
  • DirFeedthrough: 是否允许直接馈通
  • SampleTime: 采样时间

在【mdlOutputs】函数中,其输入的u即为simuTest图形中,ctrlTest的三个输入量,其中u(1), u(2)即为两个阶跃函数,u(3)到u(6)则为后面的目标函数plantTest输出的sys。

目标函数

右侧的S函数用同样的操作,命名为plantTest,同样根据系统状态执行不同的操作。

function [sys,x0,str,ts]=plantTest(t,x,u,flag)
switch flagcase 0, [sys,x0,str,ts]=mdlInitializeSizes;case 1, sys=mdlDerivatives(t,x,u);case 3, sys=mdlOutputs(t,x,u);case {2, 4, 9 },  sys = [];otherwise,  error(['Unhandled flag = ',num2str(flag)]);
end%-------mdlInitializeSizes 函数-------------------%
function [sys,x0,str,ts]=mdlInitializeSizes
global p g                  % 定义全局变量 p g 
sizes = simsizes;
sizes.NumContStates  = 4;   % 连续变量 4 个
sizes.NumDiscStates  = 0;   % 离散变量 0 个
sizes.NumOutputs     = 4;   % 输出 4 个
sizes.NumInputs      =2;    % 输入 2 个
sizes.DirFeedthrough = 0;   % 输入不控制输出
sizes.NumSampleTimes = 0;   % 采样时间为 0,被控对象,无需采样
sys=simsizes(sizes);
x0=[0 0 0 0];
str=[];
ts=[];p=[2.9 0.76 0.87 3.04 0.87];  % p 是D(q)正定惯性矩阵的各项系数
g=9.8;      % 重力系数 9.8%-------mdlDerivatives 函数-------------------%
function sys=mdlDerivatives(t,x,u)
global p g  
D0=[p(1)+p(2)+2*p(3)*cos(x(3)) p(2)+p(3)*cos(x(3));p(2)+p(3)*cos(x(3))        p(2)];  % 正定惯性矩阵
C0=[-p(3)*x(4)*sin(x(3)) -p(3)*(x(2)+x(4))*sin(x(3));p(3)*x(2)*sin(x(3))  0];          % 离心力和哥氏力tol=u(1:2);        
dq=[x(2);x(4)];    % x1的导数,x2的导数S=D0\(tol-C0*dq);  % 动力学方程的反向应用,用于求出角加速度
% 这里的sys 为中间变量,S(1),S(2)为关节角1,2的角加速度
sys = [x(2) S(1) x(4) S(2)];%-------mdlOutputs 函数-------------------%
function sys=mdlOutputs(t,x,u)
sys = x;

在【mdlDerivatives】函数中,实现了二关节机器人的动力学模型,其输出的sys,将被传递给ctrlTest函数中,作为u变量的后四个分量。

仿真

点击Simulink的运行按钮,即可开启仿真,双击示波器,即可查看波形

在这里插入图片描述

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

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

相关文章

【技术架构解析】国产化双复旦微FPGA+飞腾D2000核心板架构

本文就一款基于飞腾D2000核心板与两片高性能FPGA的国产化开发主板进行技术解析,包括系统架构、主要硬件模块、关键接口及软件环境,重点阐述各子系统间的数据路径与协同工作方式,旨在为行业内同类产品设计与应用提供参考。 随着国产化要求的加…

Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?

目录1 示例代码2 欢迎纠错3 论文写作/Python 学习智能体1 示例代码 直接上代码。 def grpby1():xls "book.xls"df pd.DataFrame(pd.read_excel(xls, engine"xlrd"))print(df)"""序号 分类 销量0 1 文学 51 2 计算机…

【解决“此扩展可能损坏”】Edge浏览器(chrome系列通杀))扩展损坏?一招保留数据快速修复

引言 如果你想保留你的数据,敲重点:不要点击修复,不要修复,不要修复 在使用 Microsoft Edge 浏览器时,您可能会遇到扩展程序显示“此扩展程序可能已损坏”的提示,且启用按钮无法点击。这一问题让许多用户感…

AI专业化应用加速落地,安全治理挑战同步凸显

7月2日,2025全球数字经济大会在北京国家会议中心开幕。本届大会以“建设数字友好城市”为主题,聚焦数字技术对城市发展的影响。开幕式上,一首完全由AI生成的MV成为焦点——从歌词、谱曲、演唱到视频制作全流程AI生成,展现人工智能…

Python统一调用多家大模型API指南

随着大模型技术的快速发展,市场上出现了越来越多的LLM服务提供商,包括OpenAI、Anthropic、Google、百度、阿里云等。作为开发者,我们经常需要在不同的模型之间切换,或者同时使用多个模型来满足不同的业务需求。本文将详细介绍如何…

【ESP32】1.编译、烧录、创建工程

标题打开一个Hello world工程并烧录 点击环境搭建链接 遇到的问题: 1.ESP32在VSCODE中烧录代码时,跳出窗口,OPenOCD is not running ,do you want to launch it? 可能是OCD没安装,重新安装 ESP-IDF试一下,在终端命令窗…

调参——optuna

它基于贝叶斯优化(Bayesian Optimization)思想,通过构建一个概率模型来预测超参数组合的性能,从而高效地探索超参数空间。相比传统网格搜索(Grid Search)或随机搜索(Random Search)&…

Redis的缓存击穿和缓存雪崩

Redis缓存击穿和缓存雪崩是两种常见的缓存问题,它们都可能导致系统性能下降甚至崩溃。以下是对它们的详细解释:一、缓存击穿定义缓存击穿是指一个特定的缓存数据失效(例如过期),而此时大量请求同时访问这个数据&#x…

Python训练营Day4

浙大疏锦行 Python训练营Day4 内容,pandas处理表格信息: 查看表格统计信息: data.mean()data.mode()data.median() 查看表格信息: data.info()data.describe()data.isnull()data.head() 填充空缺列: 数值型&#xff…

React 基本介绍与项目创建

为什么使用 React 以及前端框架 工作原理 React 通过构建虚拟 DOM(Virtual DOM)来高效管理界面。当组件的状态或属性发生变化时,React 会重新渲染生成新的虚拟 DOM,并通过 Diff 算法找出新旧虚拟 DOM 树之间的差异,最…

OpenCV CUDA模块设备层-----“小于阈值设为零” 的图像处理函数thresh_to_zero_func()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV CUDA 模块(cudev) 中的一个仿函数生成器,用于创建一个 “小于阈值设为零” 的图像处理函数对象。 这个函…

数字图像处理学习笔记

1-图像处理基础_哔哩哔哩_bilibili 输出图像像素点需要将图象值要作类型转换,转成Int 图像仿射变换 线性变换平移 线性变换: 1,变换前直线,变换后仍然直线 2,直线比例不变 3,直线到远点的距离不变 仿射变…

用systemd管理GreatSQL服务详解

用systemd管理GreatSQL服务详解 1.GreatSQL服务文件 官网 greatsql.service 文件 [Unit] DescriptionGreatSQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Aftersyslog.target [Install] …

【AIGC】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC 文章目录 🍊1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 🍊2 建构AIGC伦理观:实现人机共创的永…

WebSocket技术全面解析:从历史到实践

WebSocket技术全面解析:从历史到实践 WebSocket作为一种全双工通信协议,彻底改变了Web应用的实时交互模式。它于2011年被IETF正式标准化为RFC 6455,解决了传统HTTP协议在实时通信中的根本缺陷。本文将深入探讨WebSocket的发展历程、技术原理、…

单用户模式、紧急模式、救援模式有什么区别

文章目录 **一、单用户模式(Single User Mode)****功能与用途****启动特点****进入方式** **二、紧急模式(Emergency Mode)****功能与用途****启动特点****进入方式** **三、救援模式(Rescue Mode)****功能…

【大模型入门】访问GPT的API

目录 0 前言 免费访问GPT的API Windows下环境变量的设置 1 非流式输出 1.1 使用requests库 1.2 使用OpenAI库 2 流式输出 2.1 使用requests库 2.2 使用OpenAI库 3 使用OpenAI库与GPT聊天(存储对话历史版) 4 嵌入向量embeddings 4.1 创建嵌入向…

Jenkins 部署脚本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止旧进程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固态闪存NV196NV201

美光固态闪存技术深度解析:NV183、NV185、NV196与NV201系列 一、技术架构与核心参数对比 1. 制程工艺与容量布局 美光NV183/NV185/NV196/NV201系列采用176层3D NAND技术,通过垂直堆叠提升存储密度。其中: NV183:主打256GB容量段…

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子技术中,逆变电源的设计与应用占据了至关重要的位置。今天,我将为您介绍一个优秀的开源项目——基于单片…