平面机械臂运动学分析

平面机械臂运动学分析

  • 一 整体概述
    • 1 研究步骤:
  • 二 正向
    • 1 几何分析
    • 2 matlab 仿真模拟
      • (1)实现效果
      • (2)matlab代码:
    • 3 DH矩阵计算法
      • (1)计算公式
      • (2)计算结果验证
      • (3)Tend矩阵末端位姿数据提取
      • (4)matlab计算代码
  • 三 逆向

一 整体概述

1 研究步骤:

1 正向:根据所读取的关节处角度,立刻计算出末端坐标,可随时计算得出当前末端坐标值,方便用于计算。

2 逆向:根据末端坐标,计算出关节角度的值,已知终点坐标,计算出各关节角度写入,以到达指定位置。

3 规划路径曲线点,设置曲线路径,使各关节移动丝滑,稳定、快速的到达指定位置。

4 误差补偿,通过PID等算法,补偿摩擦力重力等环境因素带来的影响,优化精度。


二 正向

1 简介:根据已知角度杆长,计算得出机械臂末端位置的位置变化,角度可由传感器采集。

2 效果:输入各个关节的角度值,可以计算出机械臂末端执行器的位置和姿态。

1 几何分析

(1)一种简单几何计方法:

在这里插入图片描述

(2) 计算公式

在这里插入图片描述

【X,Y】末端坐标
【l1 l2 l3】 连杆长
【θ1 θ2 θ3 】关节角度


2 matlab 仿真模拟

本节使用matlab制作一个方便查看视觉效果的:简易平面三连杠机械臂模型

(1)实现效果

可修改臂长参数,输入关节角度值,快速查看末端坐标,并支持滑块实时测试效果:

在这里插入图片描述

(2)matlab代码:

function forward_direction
%----------------------1 初始参数设置---------------------------l1=50; l2=50; l3=50; %已知信息:臂长degree1 = deg2rad(0);%各关节角度degree2 = deg2rad(0);degree3 = deg2rad(0);%求出4个点坐标bx = l1*sin(degree1); % B点坐标,A为(0,0)by = l1*cos(degree1);cx = bx+l2*sin(degree1+degree2);% C点坐标cy = by+l2*cos(degree1+degree2);dx = cx+l3*sin(degree1+degree2+degree3);% D点坐标dy = cy+l3*cos(degree1+degree2+degree3);
%-----------------------2初始图像设置---------------------------x = linspace(0, 150, 1500);  % X轴范围包含所有分段y = zeros(size(x));         % 初始化Y数组figure('Position', [0 0 600 600]);axe = axes('Position', [0.1 0.3 0.8 0.6]);sport_plot = plot(x,y,'.', 'LineWidth', 2);update();%计算初始参数点,设置分段函数set(sport_plot, 'YData', y);axis('equal',[0 200 -150 150]); % 设置坐标轴范围 [x1,x2],[y1,y2]title('正向运动学分析'); % 标题xlabel('X坐标'); % x轴标签ylabel('Y坐标'); % y轴标签grid on; % 显示网格
%-------------------------3 更新参数点,设置分段函数----------------function [] =update()bx = l1*sin(degree1); % B点坐标,A为(0,0)by = l1*cos(degree1);cx = bx+l2*sin(degree1+degree2);% C点坐标cy = by+l2*cos(degree1+degree2);dx = cx+l3*sin(degree1+degree2+degree3);% D点坐标dy = cy+l3*cos(degree1+degree2+degree3);y = zeros(size(x));%x = linspace(0, dx, 1500);idx1 = (x >= 0 ) & (x <= bx);idx2 = (x >= bx) & (x <=cx); idx3 = (x >= cx) & (x <=dx);idx4 = x >dx;y(idx1) = tan(pi/2-degree1)*x(idx1);         % 注意使用 .^y(idx2) = tan(pi/2-degree1-degree2)*(x(idx2)-bx)+by;    % 线性计算y(idx3) = tan(pi/2-degree1-degree2-degree3)*(x(idx3)-cx)+cy;y(idx4) = 999;title(axe, ['末端坐标(x,y)=(', num2str(dx), ',', num2str(dy), ')']);end
%--------------------------4 滑块-----------------------------------------% 添加degree1滑块uicontrol('Style', 'slider', ...'Position', [190 110 200 20], ...'Min', 0, 'Max', 180, 'Value', degree1, ...'Callback', @updatedegree1);uicontrol('Style', 'text', ...'Position', [140 110 42 15], ...'String', 'degree1');% 回调函数1function updatedegree1(hObj, ~)tem = hObj.Value; degree1=deg2rad(hObj.Value);%更新角度update();set(sport_plot, 'YData', y);uicontrol('Style','text','String',num2str(tem),'Position',[400 110 40 15]);end% 添加degree2滑块uicontrol('Style', 'slider', ...'Position', [190 60 200 20], ...'Min', 0, 'Max', 180, 'Value', degree2, ...'Callback', @updatedegree2);uicontrol('Style', 'text', ...'Position', [140 60 42 15], ...'String', 'degree2');% 回调函数1function updatedegree2(hObj, ~)tem = hObj.Value; degree2=deg2rad(hObj.Value);%更新角度update();set(sport_plot, 'YData', y);uicontrol('Style','text','String',num2str(tem),'Position',[400 60 40 15]);end% 添加degree3滑块uicontrol('Style', 'slider', ...'Position', [190 13 200 20], ...'Min', 0, 'Max', 180, 'Value', degree3, ...'Callback', @updatedegree3);uicontrol('Style', 'text', ...'Position', [140 13 42 15], ...'String', 'degree3');% 回调函数1function updatedegree3(hObj, ~)tem = hObj.Value; degree3=deg2rad(hObj.Value);%更新角度update();set(sport_plot, 'YData', y);uicontrol('Style','text','String',num2str(tem),'Position',[400 13 40 15]);end
%------------------------------5 文本框输入------------------------------uicontrol('Style', 'text', ...'Position', [450 430 100 20], ...'String', 'set 1:');uicontrol('Style', 'edit', ...'Position', [450 400 100 30], ...'String', '0', ...'Callback', @setdegree1);% 定义回调函数function setdegree1(src, ~)% 获取输入值input_str = get(src, 'String');input_num = str2double(input_str);% 验证输入if isnan(input_num)errordlg('请输入有效数字!', '输入错误');return;end% 更新全局变量degree1 = deg2rad(input_num);update();set(sport_plot, 'YData', y);enduicontrol('Style', 'text', ...'Position', [450 370 100 20], ...'String', 'set 2:');uicontrol('Style', 'edit', ...'Position', [450 340 100 30], ...'String', '0', ...'Callback', @setdegree2);% 定义回调函数function setdegree2(src, ~)% 获取输入值input_str = get(src, 'String');input_num = str2double(input_str);% 验证输入if isnan(input_num)errordlg('请输入有效数字!', '输入错误');return;end% 更新全局变量degree2 = deg2rad(input_num);update();set(sport_plot, 'YData', y);enduicontrol('Style', 'text', ...'Position', [450 310 100 20], ...'String', 'set 3:');uicontrol('Style', 'edit', ...'Position', [450 280 100 30], ...'String', '0', ...'Callback', @setdegree3);% 定义回调函数function setdegree3(src, ~)% 获取输入值input_str = get(src, 'String');input_num = str2double(input_str);% 验证输入if isnan(input_num)errordlg('请输入有效数字!', '输入错误');return;end% 更新全局变量degree3 = deg2rad(input_num);update();set(sport_plot, 'YData', y);endend

几何法正向分析比较简单,且此处仅以二维为例


3 DH矩阵计算法

DH参数:

  • 连杆长度(a)、 【连杆长度】
  • 连杆转角(alpha)【连杆转角】
  • 连杆偏移(d) 【关节偏移】
  • 关节角(theta) 【关节角】

1 对于旋转关节,theta是变量,而d是固定的;
2 对于移动关节,d是变量,theta固定。平面机械臂通常是【旋转关节】,所以theta会是变量。
3 平面二维机械臂只需考虑:连杆长度(a)与 关节角(theta)


(1)计算公式

  • <1> 每个关节的坐标系变换可通过 齐次变换矩阵 表示,通用形式为:
    在这里插入图片描述

  • <2> 正运动学末端执行器的位置姿态计算公式为:
    在这里插入图片描述
    Ti 每一项分别对应关节的变换矩阵,各连杆长度与角度参数带入公式<1>即可,如下图:

在这里插入图片描述

(2)计算结果验证

角度为:30,50,15
臂长:60,50,40

矩阵计算结果:Tend=T1 *T2 *T3:
在这里插入图片描述

几何法对比
在这里插入图片描述

如图可知,结果验证无误
xy坐标颠倒原因是:所用几何法、与齐次矩阵变换中关节角度的选取方式不同,即θ设置不同,但计算数值大小一致。

(3)Tend矩阵末端位姿数据提取

  • 最终的4x4齐次矩阵Tend可分解为:3x3旋转矩阵R和 3x1位置向量P
    在这里插入图片描述
  • 以上一步计算出的最终其次矩阵Tend为例:
    在这里插入图片描述

从Tend矩阵中可提取对应位置信息,与旋转信息

(4)matlab计算代码

l1=60; l2=50; l3=40;  %已知信息:臂长
degree1 = deg2rad(30);%各关节角度设置
degree2 = deg2rad(50);
degree3 = deg2rad(15);
%DH参数:
%a=L   臂长  
%α=0  连杆转角
%d=0   连杆偏移
%sitar=degree 关节角
T1=[cos(degree1)  -sin(degree1)*cos(0)    sin(degree1)*sin(0)   l1*cos(degree1)sin(degree1)  cos(degree1)*cos(0)     -cos(degree1)*sin(0)  l1*sin(degree1)0     sin(0)            cos(0)       00      0               0            1];
T2=[cos(degree2)  -sin(degree2)*cos(0)    sin(degree2)*sin(0)  l2*cos(degree2)sin(degree2)  cos(degree2)*cos(0)     -cos(degree2)*sin(0) l2*sin(degree2)0     sin(0)            cos(0)       00      0               0            1];
T3=[cos(degree3)  -sin(degree3)*cos(0)    sin(degree3)*sin(0)   l3*cos(degree3)sin(degree3)   cos(degree3)*cos(0)     -cos(degree3)*sin(0)  l3*sin(degree3)0     sin(0)            cos(0)       00      0               0            1];Tend = T1*T2*T3   %齐次变换矩阵计算公式,末位位姿

三 逆向

DH参数模型:
在这里插入图片描述
公式为:
在这里插入图片描述+

(x,y)为已知末端坐标, 求解三个关节角度

(待补充)


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

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

相关文章

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面&#xff0c;通过JUnit和Mockito等工具&#xff0c;结合SpringBootTest注解&#xff0c;可以模拟真实环境对应用组件进行独立测试&#xff0c;验证逻辑正确性&#xff0c;提升代码质量。具体演示了HelloWorld01和H…

thinkphp+mysql+cast解决text类型字段的文本型数字排序错误的方法 - 数据库文本字段排序ASC、DESC的失效问题

TP中使用cast order $lists AmdCommonTable::where(..............) ->field(*,CAST(w6 AS UNSIGNED) as sort) ->order(sort, asc) ->select() ->toArray(); 先转换为数字&#xff0c;再order by 效果对比 (1/2) 不ok - 直接order by 某字段 asc - 只能按照文本…

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式

Excel 格式转换是我们工作过程当中非常常见的一个需求&#xff0c;我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难&#xff0c;因为我们通过 Office 都…

C语言每日一练——day_3(快速上手C语言)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第三天。&#xff08;会连续更新&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

RSA的理解运用与Pycharm组装Cryptodome库

1、RSA的来源 RSA通常指基于RSA算法的密码系统&#xff0c;令我没想到的是&#xff0c;其名字的来源竟然不是某个含有特别意义的单词缩写而成&#xff08;比如PHP&#xff1a;Hypertext Preprocessor(超文本预处理器)&#xff09;&#xff0c;而是由1977年提出该算法的三个歪果…

聊一聊 Android 的消息机制

聊一聊 Android 的消息机制 侯 亮 1 概述 在 Android 平台上&#xff0c;主要用到两种通信机制&#xff0c;即 Binder 机制和消息机制&#xff0c;前者用于跨进程通信&#xff0c;后者用于进程内部通信。 从技术实现上来说&#xff0c;消息机制还是比较简单的。从大的方面讲…

数据结构第八节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

CI/CD—Jenkins配置一次完整的jar自动化发布流程

背景&#xff1a; 实现设想&#xff1a; 要创建自动化发布&#xff0c;需要准备一台测试服务器提前安装好java运行所需的环境&#xff0c;JDK版本最好和Windows开发机器上的版本一致&#xff0c;在Jenkins上配置将构建好的jar上传到测试服务器上&#xff0c;测试服务器自动启动…

我的两个医学数据分析技术思路

我的两个医学数据分析技术思路 从临床上获得的或者公共数据库数据这种属于观察性研究&#xff0c;是对临床诊疗过程中自然产生的数据进行分析而获得疾病发生发展的规律等研究成果。再细分&#xff0c;可以分为独立危险因素鉴定和预测模型构建两种。 独立危险因素鉴定是一直以…

时序数据库TimescaleDB基本操作示例

好的&#xff01;以下是使用 TimescaleDB 的 Java 示例&#xff08;基于 JDBC&#xff0c;因为 TimescaleDB 是 PostgreSQL 的扩展&#xff0c;官方未提供独立的 Java SDK&#xff09;&#xff1a; 1. 添加依赖&#xff08;Maven&#xff09; <dependency><groupId&g…

HTML-网页介绍

一、网页 1.什么是网页&#xff1a; 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML 等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML 格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素&#xf…

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了&#xff0c;mybatis 的基本用法&#xff0c;动态SQL&#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中&#xff0c;对数据库的操作&#xff0c;常常涉及多张表。 因此本篇博客的目标&#xff1a;通过my…

vue3通过render函数实现一个菜单下拉框

背景说明 鼠标移动到产品服务上时&#xff0c;出现标红的下拉框。 使用纯css的方案实现最简单&#xff0c;但是没什么技术含量&#xff0c;弃之&#xff1b;使用第三方组件库&#xff0c;样式定制麻烦弃之。因此&#xff0c;我们使用vue3直接在页面创建一个dom作为下拉框吧。…

Docker介绍和安装

跨平台快速运行应用快速构建应用快速分享应用 docker是用来加速,构建,分享,运行的容器 在 Docker 的架构中&#xff0c;Client、Docker Host 和 Registry 是三个核心组成部分&#xff0c;它们各自承担不同的功能和作用。以下是对这三部分的详细描述&#xff1a; Docker的基本…

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型&#xff08;SSMs&#xff09;的创新架构——nnMamba&#xff0c;用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力与SSMs的全局上下文建…

elasticsearch商业产品

Elasticsearch商业产品介绍 在当今数字化时代&#xff0c;数据如同石油一样珍贵。而要从海量的数据中提取有价值的信息&#xff0c;则需要强大的工具。这就是Elasticsearch商业产品的用武之地。Elasticsearch是一款开源的搜索引擎&#xff0c;它能够快速地存储、搜索和分析大规…

git安装,配置SSH公钥(查看版本、安装路径,更新版本)git常用指令

目录 一、git下载安装 1、下载git 2、安装Git‌&#xff1a; 二、配置SSH公钥 三、查看安装路径、查看版本、更新版本 四、git常用指令 1、仓库初始化与管理 2、配置 3、工作区与暂存区管理 4、提交 5、分支管理 6、远程仓库管理 7、版本控制 8、其他高级操作 一…

c++的基础排序算法

一、快速排序 1. 选择基准值&#xff08;Pivot&#xff09; 作用 &#xff1a;从数组中选择一个元素作为基准&#xff08;Pivot&#xff09;&#xff0c;用于划分数组。常见选择方式 &#xff1a; 固定选择最后一个元素&#xff08;如示例代码&#xff09;。随机选择&#xf…

kali linux 漏洞扫描

Kali Linux是一款专为渗透测试和网络安全领域而设计的操作系统&#xff0c;它集成了大量的安全测试工具&#xff0c;可以帮助安全专家和黑客发现网络中的漏洞并加以修补。在Kali Linux中&#xff0c;漏洞扫描是一个非常重要的功能&#xff0c;它可以帮助用户快速、准确地发现系…