【机器人学】7-2.六自由度机器人自干涉检测-计算圆柱体的上下圆心坐标【附MATLAB代码】

news2025/1/18 4:49:12

目录

前言

机械臂几何参数

机器等效圆柱体坐标确定

MATLAB代码


前言

        上一章介绍了机器人自干涉检测的总体算法,提出了算法的三个核心:

                一  根据机械臂的几何数据以及DH参数,确定机械臂等效的圆柱体的上下圆心坐标。

                二  将一个圆柱体旋转到与坐标Z轴对齐,另一个圆柱体圆转到,上下圆在XoY平面的

                     投影形成的椭圆在y方向上长轴为2r,这一个旋转流程的数学表达。

                三  原点与椭圆的关系,求原点是否在椭圆内部,原点到椭圆的最短距离,线段与

                     线段的最短距离。

               【机器人学】7-1.六自由度机器人自干涉检测-总体算法介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/y12345655/article/details/141167918?spm=1001.2014.3001.5502

        这一章博客将解决第一个问题,根据机械臂的几何数据以及DH参数,确定机械臂等效的圆柱体的上下圆心坐标。

机械臂几何参数

        我们需要机器人的几何结构数据,才能求得等效圆柱体的上下坐标。其中DH参数可以表示绝大多数几何特征。刚好昨天在公园散步的时候,无意中捡到了一张机器人图纸,且包含了机器人DH参数,就以它为例吧。

        DH参数为:

关节1关节2关节3关节4关节5关节6
\alpha09000-9090
a0042539300
d160.700113.39993.6
\theta0900-9000
\beta000000

改进型的DH参数定义为:

机器人结构图纸为:

        我们把这个机器人分为9个圆柱体,标号1~9如上图所示。

机器等效圆柱体坐标确定

        将机器人的基座坐标定义为坐标系原点。那么第一个圆柱的上下坐标直接就可以求出来:

      机器人可以加高基座,因此预留一个length参数,当没有加高基座时,length为0。

        从第二个圆柱开始,就无法直接看出来了,因为圆柱上下底面圆心的坐标,会随机器人关节转角不同而变化。因此结合DH参数的概念辅助求解会好得多。

        由于关节越往后数据量越大,并且方法都是一样,因此后面将只提供DH参数的数据,以及方法,不在详细计算。

至此该机械臂等效的9个圆柱体的底面圆心坐标以全部得到,涉及到三角函数的代换,表达式会比较长,可以用MATLAB的simplify函数化简,比如:

        此时输出的位置信息要简化得多,如果你的机器人包含夹爪,按照同样的方法进行模块叠加。

MATLAB代码

        解析表达式计算圆心坐标

function lineModelP = RobotLineModel(dhPara,exDhPara,jointPose)
a2=dhPara(3,2);
a3=dhPara(4,2);
d1=dhPara(1,3);
d4=dhPara(4,3);
d5=dhPara(5,3);
d6=dhPara(6,3);

d2 = exDhPara(1);
d3 = exDhPara(2);
len6 = exDhPara(3);
e1 = exDhPara(4);
e2 = exDhPara(5);
e3 = exDhPara(6);

for i=1:6
   jointPose(i)=jointPose(i)+dhPara(i,4);
end
q1 = jointPose(1);
q2 = jointPose(2);
q3 = jointPose(3);
q4 = jointPose(4);
q5 = jointPose(5);


c1=cos(q1);
s1=sin(q1);
c2=cos(q2);
s2=sin(q2);
c5=cos(q5);
s5=sin(q5);

s23=sin(q2+q3);
c23=cos(q2+q3);
s234=sin(q2+q3+q4);
c234=cos(q2+q3+q4);

s1c2=s1*c2;
c1c2=c1*c2;
s1c5=s1*c5;
c1c5=c1*c5;
s1c23=s1*c23;
c1c23=c1*c23;
s1s234=s1*s234;
s1c234=s1*c234;
c1s234=c1*s234;
c1c234=c1*c234;
s234s5=s234*s5;

s1c234s5=s1c234*s5;
c1c234s5=c1c234*s5;
d2s1=d2*s1;
d2c1=d2*c1;
d2_d3=d2-d3;
d2_d3s1=(d2-d3)*s1;
d2_d3c1=(d2-d3)*c1;
a2s2=a2*s2;
a2s1c2=a2*s1c2;
a2c1c2=a2*c1c2;
a3s1c23=a3*s1c23;
a3c1c23=a3*c1c23;
a3s23=a3*s23;
d4s1=d4*s1;
d4c1=d4*c1;
d5c234=d5*c234;
d5s1s234=d5*s1s234;
d5c1s234=d5*c1s234;
d6s1c5=d6*s1c5;
d6c1c5=d6*c1c5;
d6s234s5=d6*s234s5;
d6s1c234s5=d6*s1c234s5;
d6c1c234s5=d6*c1c234s5;

d6__l = d6 + len6;
lineModelP(1,1:5) = zeros(1,5);
lineModelP(1,6) = 1.5*d1;
lineModelP(2,1) = d2s1;
lineModelP(2,2) = -d2c1;
lineModelP(2,3) = d1;
lineModelP(2,4) = a2c1c2 + d2s1;
lineModelP(2,5) = a2s1c2 - d2c1;
lineModelP(2,6) = a2s2 + d1;

lineModelP(3,1) = a2c1c2 + d2_d3s1;
lineModelP(3,2) = a2s1c2 - d2_d3c1;
lineModelP(3,3) = a2s2 + d1;
lineModelP(3,4) = a2c1c2 + d2_d3s1 + a3c1c23;
lineModelP(3,5) = a2s1c2 - d2_d3c1 + a3s1c23;
lineModelP(3,6) = a2s2 + a3s23 + d1;

lineModelP(4,1) = e3*c1s234 + a3c1c23 + d4s1 + a2c1c2;
lineModelP(4,2) = e3*s1s234 + a3s1c23 - d4c1 + a2s1c2;
lineModelP(4,3) = -e3*c234 + a3s23 + a2s2 + d1;
lineModelP(4,4) = -e3*c1s234 + a3c1c23 + d4s1 + a2c1c2;
lineModelP(4,5) = -e3*s1s234 + a3s1c23 - d4c1 + a2s1c2;
lineModelP(4,6) = e3*c234 + a3s23 + a2s2 + d1;

lineModelP(5,1) = -d5c1s234 + d4s1 - e3*c1c234s5 + a2c1c2 - e3*s1c5 + a3c1c23;
lineModelP(5,2) = -d5s1s234 - d4c1 - e3*s1c234s5 + a2s1c2 + e3*c1c5 + a3s1c23;
lineModelP(5,3) = -e3*s234s5 + a3s23 + a2s2 + d5c234 + d1;
lineModelP(5,4) = -d5c1s234 + d4s1 + d6c1c234s5 + a2c1c2 + d6s1c5 + a3c1c23;
lineModelP(5,5) = -d5s1s234 - d4c1 + d6s1c234s5 + a2s1c2 - d6c1c5 + a3s1c23;
lineModelP(5,6) = d6s234s5 + a3s23 + a2s2 + d5c234 + d1;

lineModelP(6,1) = lineModelP(5,4);
lineModelP(6,2) = lineModelP(5,5);
lineModelP(6,3) = lineModelP(5,6);
lineModelP(6,4) = -d5c1s234 + d4s1 + d6__l*c1c234s5 + a2c1c2 + d6__l*s1c5 + a3c1c23;
lineModelP(6,5) = -d5s1s234 - d4c1 + d6__l*s1c234s5 + a2s1c2 - d6__l*c1c5 + a3s1c23;
lineModelP(6,6) = d6__l*s234s5 + a3s23 + a2s2 + d5c234 + d1;

lineModelP(7,1) = a2c1c2 + (d2+e2)*s1;
lineModelP(7,2) = a2s1c2 - (d2+e2)*c1;
lineModelP(7,3) = a2s2 + d1;
lineModelP(7,4) = lineModelP(2,4);
lineModelP(7,5) = lineModelP(2,5);
lineModelP(7,6) = lineModelP(2,6);

lineModelP(8,1) = a2c1c2 + (d2_d3-e3)*s1 + a3c1c23;
lineModelP(8,2) = a2s1c2 - (d2_d3-e3)*c1 + a3s1c23;
lineModelP(8,3) = a2s2 + a3s23 + d1;
lineModelP(8,4) = lineModelP(3,4);
lineModelP(8,5) = lineModelP(3,5);
lineModelP(8,6) = lineModelP(3,6);

lineModelP(9,1) = (d2+e1)*s1;
lineModelP(9,2) = -(d2+e1)*c1;
lineModelP(9,3) = d1;
lineModelP(9,4) = 0;
lineModelP(9,5) = 0;
lineModelP(9,6) = d1;
end

测试代码

clc;
clear;
DH_Para  = [0,     90,     0,     0, -90,    90
    0,      0,   425,   393,   0,     0
    160.7,  0,     0, 113.3,  99,  93.6
    0,     90,     0,   -90,   0,     0
    0,      0,     0,     0,   0,     0]';
 DH_Para(:,2:3)=DH_Para(:,2:3)/1000;
 DH_Para(:,1)=DH_Para(:,1)/180*pi;
 DH_Para(:,4)=DH_Para(:,4)/180*pi;
 exDhPara = [138,123.7,0,75,75,55]'/10000;
 jointPose = [-140,0.99,78.65,0.36,-90,0]/180*pi;
 lineModelP = RobotLineModel(DH_Para,exDhPara,jointPose)

测试结果

如上图所示,九个圆柱体的上下底面圆心坐标以全部求得。

获取上下圆心坐标用的工具代码:

        不可直接照抄,一定要明白每一个圆心坐标是如何求出来的。

clc;
clear;
%format long g; %输出结果为小数
syms d1 d2 d3  a2 a3 d4 a4 d5 d6_2 a7 th1 th2 th3 th4 th5 th6 d7 th7 a7 e3 e2 
syms alp7 th8 d8 a8 alp8  th10 d10 a10 alp10 d6_2 a9 d6 d9

th(10) = th10;   d(10) = d10;  a(10) = a10; alp(10) = alp10;

th(1) = th1; d(1) = d1; a(1) = 0;  alp(1) = 0;
th(2) = th2; d(2) = d2;  a(2) = 0;  alp(2) = pi/2;       %th2=th2+pi/2
th(3) = th3; d(3) = 0;  a(3) = a3; alp(3) = 0;
th(4) = th4; d(4) = 0; a(4) = a4; alp(4) = 0;            %th4=th4-pi/2
th(5) = th5; d(5) = d5; a(5) = 0;  alp(5) = -pi/2;
th(6) = th6; d(6) = d6+d7; a(6) = 0;  alp(6) = pi/2;      %d6_2为法兰的延长 在加上工端
th(7) = 0; d(7) = 0; a(7) = 0;  alp(7) = 17.5/100;           %alp7 = 19.2/110  弧长除以半径
th(8) = 0; d(8) = d8+d9; a(8) = 0;  alp(8) = 0;

T01 = connectingRodTransfer([alp(1), a(1), d(1), th(1)],0);
T12 = connectingRodTransfer([alp(2), a(2), d(2), th(2)],0);
T23 = connectingRodTransfer([alp(3), a(3), d(3), th(3)],0);
T34 = connectingRodTransfer([alp(4), a(4), d(4), th(4)],0);
T45 = connectingRodTransfer([alp(5), a(5), d(5), th(5)],0);
T56 = connectingRodTransfer([alp(6), a(6), d(6), th(6)],0);%
T67 = connectingRodTransfer([alp(7), a(7), d(7), th(7)],0);%
T78 = connectingRodTransfer([alp(8), a(8), d(8), th(8)],0);%
T=T01*T12*T23*T34*T45*T56*T67*T78;
simplify(T(1,4))
simplify(T(2,4))
simplify(T(3,4))
return


function TArr = connectingRodTransfer(dh,theta,inv)
if nargin == 2
    inv=0;
end
ct = cos(dh(4)+theta);
st = sin(dh(4)+theta);
ca = cos(dh(1));
sa = sin(dh(1));
a = dh(2);
d = dh(3);
TArr = [    ct      -st     0       a;
            st*ca   ct*ca   -sa     -sa*d;
            st*sa   ct*sa   ca      ca*d;
            0       0       0       1   ];
if inv
    TArr=[TArr(1:3,1:3)' -TArr(1:3,1:3)'*TArr(1:3,4);0 0 0 1];
end

下一章: 【机器人学】7-3.六自由度机器人自干涉检测-圆柱体的旋转变换【附MATLAB代码】

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

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

相关文章

nginx部署vue前端打包项目

一、nginx安装 安装说明见:Nginx使用命令安装说明-CSDN博客 二、打包文件上传部署 将vue打包后的静态文件进行上传,打包后的目录如下: 将dist文件夹进行压缩为dist.zip,并将该目录打包上传至服务器的nginx目录: /usr…

新课程杂志社《新课程》杂志社2024年第19期目录查阅

教育前沿_新时代教育 享中华传统节日,传中华传统文化——传统节日综合性学习活动设计 姜秀芝; 1-3 中华优秀传统文化在小学语文阅读教学中的渗透——以综合性学习“中华传统节日”的教学为例 张小红; 4-7 开卷有益 在思考中探索,在探索中成长…

Qt 0820作业

一、思维导图 二、闹钟 头文件代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> //时间类 #include <QTimer> //时间事件类 #include <QTimerEvent> //定时器事件类 #include <QMouseEvent> //鼠标…

无人机之故障排除篇

一、识别故障 掌握基本的无人机系统知识&#xff0c;遵循“先易后难、先外后内、先软件后硬件”的原则进行故障识别。一旦发现故障&#xff0c;立即停止飞行&#xff0c;避免进一步损坏。 二、机械部件维修 对于机身裂痕、螺旋桨损坏等情况&#xff0c;根据损坏程度更换相应部…

Tomcat目录详解

版本&#xff1a;Tomcat&#xff08;7.0.100&#xff09;&#xff08;linux版&#xff09; &#xff08;官网&#xff1a;Apache Tomcat - Welcome!&#xff09; 1.Tomcat是什么。 Tomcat是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。是Apache…

如何提高研发效能?思码逸 信通院给你答案

在市场竞争加剧的背景下&#xff0c;提高研发效能不仅是技术优化的需要&#xff0c;更是企业生存与发展的战略要求。在 2024 年伊始&#xff0c;北京思码逸科技有限公司&#xff08;简称“思码逸”&#xff09;携手合作伙伴启动了 DevData 2024 研发效能基准调研&#xff0c;并…

以简单的例子从头开始建spring boot web多模块项目(四)-多模块工具类

目的是为了验证主工程调用工具工程。 1、新建模块&#xff0c;名称为WebTool 同样为Maven Archetype&#xff0c;类型为 org.apache.maven.archetypes:maven-archetype-quickstart 2、修改pom.xml 增加spring-boot-starter的依赖。 <dependency><groupId>org.spri…

CISAW认证考试的时间是多久

CISAW&#xff0c;即中国信息安全保障人员&#xff0c;是中国信息安全认证与审查中心进行权威认证的缩写。它是全国范围内最为权威、最高端的信息安全认证之一。作为信息安全领域的重要认证&#xff0c;对于从事网络安全工作的人员来说具有极其重要的意义。因此&#xff0c;备考…

regeorg搭建socket隧道

regeorg搭建socket隧道 工具安装 下载地址 https://github.com/sensepost/reGeorg环境配置 说明 reGeorg提供了PHP、ASPX、JSP脚本&#xff0c;直接访问显示“Georg says, ‘All seems fine’”&#xff0c;表示脚本运行正常。# 攻击过程 vps:192.168.110.131 web服务器&a…

游戏内音乐盒、游戏内实时翻译外国队友语音的实现思路

奈何自己不能精通多个语言&#xff0c;在外服游戏的时候经常遇到老外叽里咕噜说一堆话&#xff0c;不知道讲些什么&#xff0c;可能有俄语、法语等&#xff0c;这时候有一个可以在游戏内实时翻译语言的工具就好了。 在本文中&#xff0c;我们将探讨如何提取游戏内的音频、队友…

Unity动画模块 之 3D模型导入基础设置 Rig页签

​本文仅作笔记学习和分享&#xff0c;不用做任何商业用途本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 1.Rig页签 Rig 选项卡 - Unity 手册&#xff0c;rig是设置骨骼与替身系统的&#xff0c;工作流程如下 Avatar是什么…

OpenAI 将向企业开放 GPT-4o 模型定制版

OpenAI 最近发布了一项新功能&#xff0c;使企业客户可以通过微调技术定制 GPT-4o 模型&#xff0c;从而应对日益激烈的人工智能竞争&#xff0c;并展示其投资回报。这一新功能的推出使得企业能够使用自己的数据对 GPT-4o 模型进行个性化调整&#xff0c;以满足他们的特定需求和…

学习设置echarts 折线图使用相关参数的方法整理

学习设置echarts 折线图使用相关参数的方法整理 折线图堆叠设置为不堆叠的方法 折线图堆叠设置为不堆叠的方法 官网是这样的&#xff0c;但是不需要这种堆叠形式的如下图&#xff1a; 第2条数据值 第1条数据值 第2条数据值 第3条数据值 第2条数据值 第3条数据值 需要改成…

通讯专题-RS232

1 概述 RS-232是一种点对点通信协议&#xff0c;这意味着每个数据信号沿一根导线传输&#xff08;差分信号使用两根导线传输一个数据信号&#xff09;&#xff0c;RS-232为全双工方式运行&#xff08;总线可同时发送和接收数据&#xff09;。 根据新修订的标准为容性负载为2500…

Servlet技术介绍与实践

Servlet技术是Java Web开发的核心组件之一&#xff0c;它提供了一种在Web服务器上执行Java代码的机制。自Servlet API首次发布以来&#xff0c;它已成为构建动态Web应用程序的基础。本文将深入探讨Servlet的工作原理、生命周期、关键特性&#xff0c;并通过示例代码展示如何在实…

精通推荐算法28:行为序列建模之DSIN— 基于Session建模用户行为序列

1 行为序列建模总体架构 2 DSIN背景 阿里巴巴研究人员发现&#xff0c;用户行为序列是基于Session的。Session内兴趣相似且集中&#xff0c;Session间则兴趣差异较大。Session按照时间间隔来划分&#xff0c;比如 30分钟。如图5-11所示为真实场景下的多个用户行为Session。 图…

【NI国产替代】NI‑9235四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;120 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9235可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

TCP协议段中的六个标志位

目录 ACK SYN RST FIN PSH URG TCP报文格式中的六个标志位由6个比特构成&#xff0c;在通信双方基于TCP协议互相发送报文数据时可以通过报头中标志位来区别对方发送的报文数据的请示。 ACK 确认号是否有效。 接收端对所收到的报文进行检查&#xff0c;若未发现错误&…

在控件graphicsView中实现绘图功能

文章目录 基础夯实&#xff1a;效果展示&#xff1a;一、目标&#xff1a;二、遇到的问题三、实例代码customgraphicsview.hcustomgraphicsview.cppmainwindow.hmainwindow.cppmian.cpp 基础夯实&#xff1a; 在Qt框架中&#xff0c;QGraphicsView 是一个非常强大的控件&#…

读论文《Temporal Graph Networks for Deep Learning on Dynamic Graphs》

论文地址&#xff1a;[2006.10637] Temporal Graph Networks for Deep Learning on Dynamic Graphs (arxiv.org) 项目地址&#xff1a;GitHub - twitter-research/tgn: TGN: Temporal Graph Networks 作者提出了一种名为Temporal Graph Networks&#xff08;TGNs&#xff09;…