【机器人学】2-3.六自由度机器人运动学逆解-工业机器人【附MATLAB代码】

解析解推导

假设有一工业机器人参数如下图所示:

matlab代码

clc;clear;
%带入机器人初始值
d1 = 0.670;
d4 = 1.280;
d6 = 0.215;a2 = 0.312;
a3 = 1.075;
a4 = 0.225;Position=[288.1, -433.1, 2832,96.9158,  -29.6162,  109.3547];
px = Position(1)/1000;
py = Position(2)/1000;
pz = Position(3)/1000;
rx = Position(4);
ry = Position(5);
rz = Position(6);posture = [rx,ry,rz]/180*pi;
a = Euler2RotMat(posture);px = px - a(1,3)*d6;
py = py - a(2,3)*d6;
pz = pz - a(3,3)*d6;%目标位置姿态矩阵
nx=a(1,1);ox=a(1,2);ax=a(1,3);
ny=a(2,1);oy=a(2,2);ay=a(2,3);
nz=a(3,1);oz=a(3,2);az=a(3,3);% 求解关节角1  theta1_1 = - atan2(py,-px) ;theta1_2 = - atan2(py,-px)+ pi ;  
% 求解关节角3c1_1 = cos(theta1_1);s1_1 = sin(theta1_1);c1_2 = cos(theta1_2);s1_2 = sin(theta1_2);Q = d4*d4+a4*a4;M1 = ((c1_1*px+s1_1*py-a2)^2+(pz-d1)^2-a4*a4-d4*d4-a3*a3)/(2*a3);M2 = ((c1_2*px+s1_2*py-a2)^2+(pz-d1)^2-a4*a4-d4*d4-a3*a3)/(2*a3);theta3_1 =  atan2(M1,sqrt(Q-M1^2))-atan2(a4,d4);theta3_2 =  atan2(M1,-sqrt(Q-M1^2))-atan2(a4,d4);   theta3_3 =  atan2(M2,sqrt(Q-M2^2))-atan2(a4,d4);   theta3_4 =  atan2(M2,-sqrt(Q-M2^2))-atan2(a4,d4);    % 求解关节角2t1_1 = px*c1_1+py*s1_1-a2;t1_2 = px*c1_2+py*s1_2-a2;t2 = pz-d1;A1 = a4+a3*cos(theta3_1);A2 = a4+a3*cos(theta3_2);A3 = a4+a3*cos(theta3_3);A4 = a4+a3*cos(theta3_4);B1 = -d4-a3*sin(theta3_1);B2 = -d4-a3*sin(theta3_2);B3 = -d4-a3*sin(theta3_3);B4 = -d4-a3*sin(theta3_4);theta2_1 = atan2(-B1,A1) + atan2(t2,t1_1) - theta3_1 ;theta2_2 = atan2(-B2,A2) + atan2(t2,t1_1) - theta3_2 ;   theta2_3 = atan2(-B3,A3) + atan2(t2,t1_2) - theta3_3 ; theta2_4 = atan2(-B4,A4) + atan2(t2,t1_2) - theta3_4 ;% 求解关节角5k1_1 = -nx*cos(theta1_1)*sin(theta3_1+theta2_1)-ny*sin(theta1_1)*sin(theta3_1+theta2_1)+nz*cos(theta3_1+theta2_1);k1_2 = -nx*cos(theta1_1)*sin(theta3_2+theta2_2)-ny*sin(theta1_1)*sin(theta3_2+theta2_2)+nz*cos(theta3_2+theta2_2);k1_3 = -nx*cos(theta1_2)*sin(theta3_3+theta2_3)-ny*sin(theta1_2)*sin(theta3_3+theta2_3)+nz*cos(theta3_3+theta2_3);k1_4 = -nx*cos(theta1_2)*sin(theta3_4+theta2_4)-ny*sin(theta1_2)*sin(theta3_4+theta2_4)+nz*cos(theta3_4+theta2_4);k2_1 = -ox*cos(theta1_1)*sin(theta3_1+theta2_1)-oy*sin(theta1_1)*sin(theta3_1+theta2_1)+oz*cos(theta3_1+theta2_1);k2_2 = -ox*cos(theta1_1)*sin(theta3_2+theta2_2)-oy*sin(theta1_1)*sin(theta3_2+theta2_2)+oz*cos(theta3_2+theta2_2);k2_3 = -ox*cos(theta1_2)*sin(theta3_3+theta2_3)-oy*sin(theta1_2)*sin(theta3_3+theta2_3)+oz*cos(theta3_3+theta2_3);k2_4 = -ox*cos(theta1_2)*sin(theta3_4+theta2_4)-oy*sin(theta1_2)*sin(theta3_4+theta2_4)+oz*cos(theta3_4+theta2_4);k3_1 = -ax*cos(theta1_1)*sin(theta3_1+theta2_1)-ay*sin(theta1_1)*sin(theta3_1+theta2_1)+az*cos(theta3_1+theta2_1);k3_2 = -ax*cos(theta1_1)*sin(theta3_2+theta2_2)-ay*sin(theta1_1)*sin(theta3_2+theta2_2)+az*cos(theta3_2+theta2_2);k3_3 = -ax*cos(theta1_2)*sin(theta3_3+theta2_3)-ay*sin(theta1_2)*sin(theta3_3+theta2_3)+az*cos(theta3_3+theta2_3);k3_4 = -ax*cos(theta1_2)*sin(theta3_4+theta2_4)-ay*sin(theta1_2)*sin(theta3_4+theta2_4)+az*cos(theta3_4+theta2_4);theta5_1 = atan2(sqrt(k1_1^2+k2_1^2),-k3_1);theta5_2 = atan2(sqrt(k1_2^2+k2_2^2),-k3_2);theta5_3 = atan2(sqrt(k1_3^2+k2_3^2),-k3_3);theta5_4 = atan2(sqrt(k1_4^2+k2_4^2),-k3_4);theta5_5 = -atan2(sqrt(k1_1^2+k2_1^2),-k3_1);theta5_6 = -atan2(sqrt(k1_2^2+k2_2^2),-k3_2);theta5_7 = -atan2(sqrt(k1_3^2+k2_3^2),-k3_3);theta5_8 = -atan2(sqrt(k1_4^2+k2_4^2),-k3_4);% 求解关节角6theta6_1 = atan2(-k2_1/sin(theta5_1),k1_1/sin(theta5_1));theta6_2 = atan2(-k2_1/sin(theta5_5),k1_1/sin(theta5_5));theta6_3 = atan2(-k2_2/sin(theta5_2),k1_2/sin(theta5_2));theta6_4 = atan2(-k2_2/sin(theta5_6),k1_2/sin(theta5_6));theta6_5 = atan2(-k2_3/sin(theta5_3),k1_3/sin(theta5_3));theta6_6 = atan2(-k2_3/sin(theta5_7),k1_3/sin(theta5_7));theta6_7 = atan2(-k2_4/sin(theta5_4),k1_4/sin(theta5_4));theta6_8 = atan2(-k2_4/sin(theta5_8),k1_4/sin(theta5_8));% 求解关节角4N1_1 = ax*cos(theta1_1)*cos(theta3_1+theta2_1)+ay*sin(theta1_1)*cos(theta3_1+theta2_1)+az*sin(theta3_1+theta2_1);N1_2 = ax*cos(theta1_1)*cos(theta3_2+theta2_2)+ay*sin(theta1_1)*cos(theta3_2+theta2_2)+az*sin(theta3_2+theta2_2);N1_3 = ax*cos(theta1_2)*cos(theta3_3+theta2_3)+ay*sin(theta1_2)*cos(theta3_3+theta2_3)+az*sin(theta3_3+theta2_3);N1_4 = ax*cos(theta1_2)*cos(theta3_4+theta2_4)+ay*sin(theta1_2)*cos(theta3_4+theta2_4)+az*sin(theta3_4+theta2_4);N2_1 = ax*sin(theta1_1)-ay*cos(theta1_1);N2_2 = ax*sin(theta1_2)-ay*cos(theta1_2);theta4_1 = atan2(N2_1/sin(theta5_1),N1_1/sin(theta5_1));theta4_2 = atan2(N2_1/sin(theta5_5),N1_1/sin(theta5_5));theta4_3 = atan2(N2_1/sin(theta5_2),N1_2/sin(theta5_2));theta4_4 = atan2(N2_1/sin(theta5_6),N1_2/sin(theta5_6));theta4_5 = atan2(N2_2/sin(theta5_3),N1_3/sin(theta5_3));theta4_6 = atan2(N2_2/sin(theta5_7),N1_3/sin(theta5_7));theta4_7 = atan2(N2_2/sin(theta5_4),N1_4/sin(theta5_4));theta4_8 = atan2(N2_2/sin(theta5_8),N1_4/sin(theta5_8));
theta_STD = [ theta1_1,theta2_1,theta3_1,theta4_1,theta5_1,theta6_1;theta1_1,theta2_1,theta3_1,theta4_2,theta5_5,theta6_2;theta1_1,theta2_2,theta3_2,theta4_3,theta5_2,theta6_3;theta1_1,theta2_2,theta3_2,theta4_4,theta5_6,theta6_4;theta1_2,theta2_3,theta3_3,theta4_5,theta5_3,theta6_5;theta1_2,theta2_3,theta3_3,theta4_6,theta5_7,theta6_6;theta1_2,theta2_4,theta3_4,theta4_7,theta5_4,theta6_7;theta1_2,theta2_4,theta3_4,theta4_8,theta5_8,theta6_8;]*180/pi
function rotMat=Euler2RotMat(rpy)rx=rpy(1);ry=rpy(2);rz=rpy(3);cRx=cos(rx);sRx=sin(rx);cRy=cos(ry);sRy=sin(ry);cRz=cos(rz);sRz=sin(rz);rotMat=[cRz*cRy cRz*sRy*sRx-sRz*cRx cRz*sRy*cRx+sRz*sRxsRz*cRy sRz*sRy*sRx+cRz*cRx sRz*sRy*cRx-cRz*sRx-sRy       cRy*sRx                      cRy*cRx];
end

当输入:Position=[288.1, -433.1, 2832,96.9158,  -29.6162,  109.3547]时(姿态用ZYX欧拉角表示,此数据来自机器人示教器上每个关节为100°时的正解值),结果为:

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

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

相关文章

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…

PIC单片机HEX文件格式分析

在调试PIC单片机在bootloader程序时,需要将hex文件转换为bin文件,在转换之前先了解一下hex文件中数据是如何定义的。 直接打开一个LED灯闪烁的程序生成的hex文件,芯片型号为PIC18F46K80 可以看到每条数据都是由6部分组成的,下面分…

用户中心项目教程(四)---Vue脚手架完成前端初始化

目录 1.项目的创建 2.使用开发工具打开 3.项目运行方法 4.使用按钮组件 5.全局注册 6.如何进行组件的测试 7.使用组件的效果展示 8.关于这个vue项目内容的说明 1.项目的创建 这个前提你是你完成了我的教程(三)里面的相关配置,不然你可…

【GitHub】登录时的2FA验证

一、如何进行2FA认证 1.在你的浏览器中下载 Authenticator身份验证插件 2.使用身份验证器添加凭证 2.1 使用身份验证器扫描验证二维码 选择扫描二维码

目标跟踪算法发展简史

单目标跟踪(Single Object Tracking,SOT)是计算机视觉领域中的一个重要研究方向,旨在在视频序列中持续定位并跟踪一个特定目标。随着计算机视觉和机器学习技术的飞速发展,单目标跟踪算法经历了从经典方法到深度学习的演…

【Java设计模式-7】责任链模式:我是流水线的一员

一、责任链(Chain of Responsibility Patten)模式是个啥? 想象一下,你要请假。你先把请假申请交给了小组长,小组长一看,这事儿他能决定,就直接批了。要是小组长觉得这事儿得往上汇报&#xff0…

QT调用OpenSceneGraph

OSG和osgQt编译教程,实测通过 一、下载OpenSceneGraph OpenSceneGraphhttps://github.com/openscenegraph/OpenSceneGraph 二、使用CMAKE编译OpenSceneGraph 1.打开cmake,配置源代码目录 2. CMAKE_INSTALL_PREFIX设置为install文件夹,生…

数据结构与算法面试专题——引入及归并排序

数据结构与算法引入 我们都知道数据结构与算法很重要,甚至会将其称为程序员的“内功”,但是我们花了很多时间学的算法和数据结构,好像就只是为了应对算法面试,对日常的开发工作没有什么帮助。 这点对于我们数据工程师来说&#…

《鸿蒙 HarmonyOS 应用开发从入门到精通(第 2 版)》学习笔记 ——HarmonyOS 环境搭建之安装DevEco Studio

作为一款开发工具,除了具有基本的代码开发、编译构建及调测等功能外,DevEco Studio还具有如下特点: 高效智能代码编辑:支持Java、XML、ArkTS、JS、C/C等语言的代码高亮、代码智能补齐、代码错误检查、代码自动跳转、代码格式化、…

电脑办公技巧之如何在 Word 文档中添加文字或图片水印

Microsoft Word是全球最广泛使用的文字处理软件之一,它为用户提供了丰富的编辑功能来美化和保护文档。其中,“水印”是一种特别有用的功能,它可以用于标识文档状态(如“草稿”或“机密”)、公司标志或是版权信息等。本…

学习记录之原型,原型链

构造函数创建对象 Person和普通函数没有区别,之所以是构造函数在于它是通过new关键字调用的,p就是通过构造函数Person创建的实列对象 function Person(age, name) {this.age age;this.name name;}let p new Person(18, 张三);prototype prototype n…

logback日志自定义占位符

前言 在大型系统运维中,很大程度上是需要依赖日志的。在java大型web工程中,一般都会使用slf4jlogback这一个组合来实现日志的管理。 logback中很多现成的占位符可以可以直接使用,比如线程号【%t】、时间【%d】、日志等级【%p】,…

Android系统开发(八):从麦克风到扬声器,音频HAL框架的奇妙之旅

引言:音浪太强,我稳如老 HAL! 如果有一天你的耳机里传来的不是《咱们屯里人》,而是金属碰撞般的杂音,那你可能已经感受到了 Android 音频硬件抽象层 (HAL) 出问题的后果!在 Android 音频架构中&#xff0c…

数据恢复常用方法(三)如何辨别固态硬盘故障类型

数据恢复首先需要辨别固态硬盘故障类型,只有先确认故障类型,才能进行下一步动作 如下是一种常见的场景,固态硬盘无法识别,接入电源与数据线,电脑的磁盘管理不显示任何信息。 第一步:确认硬件状态&#xff…

【大数据】机器学习----------强化学习机器学习阶段尾声

一、强化学习的基本概念 注: 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个…

StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级

自 StarRocks 3.0 起,社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势,能有效应对大数据量增长带来的存储成本压力,做到 single source of truth 的同时继续拥有极速的查询性能,同时也…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库(Monorepo)搭建指南:从零开始 单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例&#xff0…

基于python的博客系统设计与实现

摘要:目前,对于信息的获取是十分的重要,我们要做到的不是裹足不前,而是应该主动获取和共享给所有人。博客系统就能够实现信息获取与分享的功能,博主在发表文章后,互联网上的其他用户便可以看到,…

Spring Boot AOP实现动态数据脱敏

依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…

SparkSQL函数综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建项目2.2 添加依赖2.3 设置源目录2.4 创建日志属性文件2.5 创建hive配置文件2.6 创建数据分析对象2.6.1 导入相关类2.6.2 创建获取Spark会话方法2.6.3 创建表方法2.6.4 准备数据文件2.6.5 创建加载数据方法2.6.6 创建薪水排行榜方法2.6.…