UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂

这篇具有很好参考价值的文章主要介绍了UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. ABB机械臂形态

2. ABB机械臂数学模型分析

3. 初步程序实现

4. 误差分析

5. 最终实现


  前文已经在Unity中,将3自由度机械臂的数学模型实现出来了,现在我们将它实际应用于机械臂中。选用的机械臂3D模型是ABB IRB 4600工业机器人,来自AssetStore。

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity  UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

(图片来自ABB官网)

1. ABB机械臂形态

  模型中总共有六个旋转轴,为了继承上一章内容和分析方法,仅使用其中的3个自由度。

  UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

2. ABB机械臂数学模型分析

  但是与上一章的数学模型不同的是,这里的base和Arm0两个节点坐标不同,因此在上一章的基础上,需要分两步来考虑:

  第一步:以base为原点来计算θ3,这一步与上一章相同;

 UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unityUnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity或者θ3=arctan(x/z)

  第二步:以Arm0为原点计算θ1和θ2。

  这里用二维图作示意,将坐标轴偏移一个距离,这时候Target的坐标变成了与Arm0节点的差值(x',y',z')

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

按照上一章的计算方式,重新计算W‘、A'、θT、θ2、θ1:

 UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity  UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

 UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

 UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

 UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

3. 初步程序实现

  1. 准备工作:首先要拿到上述计算需要用到的变量:

    public Transform Base,Arm0,Arm1,Hand,Target;
    float X, Y, Z; //记录目标Target的位置,相对于Base
    float x_plus, y_plus, z_plus; //Target的位置,相对于Arm0
    private float L1,L2;
    private float sita_1, sita_2, sita_3, sita_T, W, A;

  2. 准备工作:计算出L1、L2的值,这是固定不变的

        L1 = Vector3.Distance(Arm0.position, Arm1.position);
        L2 = Vector3.Distance(Arm1.position, Hand.position);

  3. 先在以base为原点的坐标系中计算出θ3,套公式:

        X = Target.position.x - Base.transform.position.x;
        Y = Target.position.y - Base.transform.position.y;
        Z = Target.position.z - Base.transform.position.z;
        sita_3 = Mathf.Atan2(X, Z);
        sita_3 = Mathf.Rad2Deg * sita_3;

  4. 再以Arm0为原点,计算x',y',z',W‘、A'、θT、θ2、θ1,套公式:

        x_plus = Target.position.x - Arm0.position.x;
        y_plus = Target.position.y - Arm0.position.y;
        z_plus = Target.position.z - Arm0.position.z;
        W = Mathf.Sqrt(square(x_plus) + square(z_plus));
        A = Mathf.Sqrt(square(W) + square(y_plus));
        sita_T = Mathf.Acos(W / A); 
        sita_1 = Mathf.Acos((square(L1) + square(W) + square(y_plus) - square(L2)) / (2 * L1 * A)) + sita_T;
        sita_2 = Mathf.Acos((square(W) + square(y_plus) - square(L1) - square(L2)) / (2 * L1 * L2));
        sita_1 *= Mathf.Rad2Deg;
        sita_2 *= Mathf.Rad2Deg;

  好了,运行试试看:

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

   结果中可以看到,虽然机械臂随着Target移动,但是却有一定的误差:Target和手爪之间错位了一段距离。这是为什么呢?下面分析一下误差产生的原因。

4. 误差分析

  将这几个旋转节点单独拿出来观察,从XY平面来看,在机械臂的初始状态,Arm0到Arm1,以及Arm1到Hand,并不是完全地与Y轴平行的,XZ平面也是如此。这一点从Arm0和Arm1的本地坐标上也能看出来。但上述数学模型是简化了的,没有考虑到这些问题。

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity  UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

   因此,在一开始还需要计算出初始角度,并在之后实际旋转时减去。sita_L1和sita_L2分别是两条手臂L1和L2的初始偏移角度。

        sita_L1 =(Mathf.Asin(Arm1.localPosition.x / L1))*Mathf.Rad2Deg;
        var temp = Hand.position.x - Arm1.position.x;
        sita_L2=(Mathf.Asin(temp/ L2)) * Mathf.Rad2Deg;

5. 最终实现

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity

 完整代码如下:

    public Transform Base,Arm0,Arm1,Hand,Target;
    private float L1,L2;
    private float sita_L1, sita_L2;//L1、L2初始位置的偏移角
    private float[] moveAngle;    

    void Start()
    {   //在ABB机械臂中,L1改成(S_Axis_2)到Arm1节点(U_Axis_3)的距离
        L1 = Vector3.Distance(Arm0.position, Arm1.position);
        L2 = Vector3.Distance(Arm1.position, Hand.position);

        sita_L1 =(Mathf.Asin(Arm1.localPosition.x / L1))*Mathf.Rad2Deg;
        var temp = Hand.position.x - Arm1.position.x;
        sita_L2=(Mathf.Asin(temp/ L2)) * Mathf.Rad2Deg;
    }

    void Update()
    {
        moveAngle=IKCaculator(Target,moveAngle);
        
        Vector3 euler0 = Base.transform.localEulerAngles;
        euler0.y = moveAngle[0];
        //插值旋转举例
        Base.localRotation = Quaternion.Slerp(Base.localRotation, Quaternion.Euler(Euler0), 0.9f * Time.deltaTime);
        if (Quaternion.Angle(Base.localRotation, Quaternion.Euler(Euler0)) < 0.5f)
            Base.transform.localEulerAngles = Euler0;

        Vector3 euler1 = Arm0.transform.localEulerAngles;
        euler1.z = moveAngle[1];
        Arm0.localEulerAngles = euler1;

        Vector3 euler2 = Arm1.transform.localEulerAngles;
        euler2.z =moveAngle[2];
        Arm1.localEulerAngles = euler2;

    }

    float[] IKCaculator(Transform target,float[] Scara)
    {
        float sita_1, sita_2, sita_3, sita_T, X, Y, Z, W, A,x_plus,y_plus,z_plus;
        //计算目标Target和第一个关节Base距离的三个分量X、Y、Z
        X = target.position.x - Base.transform.position.x;
        Y = target.position.y - Base.transform.position.y;
        Z = target.position.z - Base.transform.position.z;
        //计算目标Target和Arm0距离的三个分量x_plus、y_plus、z_plus
        x_plus = target.position.x - Arm0.position.x;
        y_plus = target.position.y - Arm0.position.y;
        z_plus = target.position.z - Arm0.position.z;
        //计算W和A,在图中为W'和A'
        W = Mathf.Sqrt(square(x_plus) + square(z_plus));
        A = Mathf.Sqrt(square(W) + square(y_plus));  //A的长度=根号(W平方+Y平方)
        sita_T = Mathf.Acos(W / A);  //辅助角T
        sita_1 = Mathf.Acos((square(L1) + square(W) + square(y_plus) - square(L2)) / (2 * L1 * A)) + sita_T;
        sita_2 = Mathf.Acos((square(W) + square(y_plus) - square(L1) - square(L2)) / (2 * L1 * L2));
        sita_3 = Mathf.Atan2(X, Z);

        sita_1 *= Mathf.Rad2Deg;
        sita_2 *= Mathf.Rad2Deg;
        sita_3 *= Mathf.Rad2Deg;

        Scara[0] = sita_3-90;    //ABB机械臂的误差排除
        Scara[1] =-(90- sita_1+sita_L1);
        Scara[2] = -(sita_2-sita_L2);
        return Scara;
    }

    static float square(float f)
    {
        return f * f;
    }

或者在旋转时加入球形插值,让它转得丝滑一些。

UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂,UnityVR--机械臂场景,unity文章来源地址https://www.toymoban.com/news/detail-690303.html

到了这里,关于UnityVR--机械臂场景8-三自由度逆向解算3-应用在ABB机械臂的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MATLAB】五自由度机械臂运动学逆解(数值法——牛顿迭代)实现

    本篇为五轴机械臂的数值法实现,同时,本方法可应用于六轴、七轴手臂的逆解。 数值法的好处:给定起始与目标位姿,能够自动迭代出最优解,无多解问题 关于 解析法 的实现,可以看我之前的博客:https://blog.csdn.net/qq_43557907/article/details/122707124 本篇文章是记录我个人在学

    2024年02月12日
    浏览(83)
  • 六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划

    对机器人进行轨迹规划的主要任务是,根据机器人的工作环境和工作任务要求,求得一系列机器人末端位姿变换的时间序列,使得机器人末端可以正确地从初始姿态沿着期望的轨迹运动到终止位姿,完成工作任务,。对于六自由度的机器人来说,轨迹规划要解决的关键问题是

    2024年02月03日
    浏览(56)
  • 78、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图  六、程序源码 七、资料包括  在当今大规模制造业中,企业为提高生产效率,保障产品质量,普遍重视生产过程的自动化程度,工业机器人作为自动

    2024年02月09日
    浏览(39)
  • 机械臂仿真:使用matlab机器人工具箱与标准DH法,实现6自由度机械臂的仿真运动

    在了解了如何描述末端执行器的位姿之后,接下来我们就可以实现对机械臂的数学建模。建模的工具有很多种,本文介绍一种基于 标准DH参数法 与Matlab的Robotics Toolbox - Peter Corke库来实现此过程,并尝试实现6自由度机器人的仿真运动。 强烈推荐b站教学视频MATLAB机器人工具箱

    2024年04月13日
    浏览(45)
  • 88、基于STM32单片机学习型搬运机器人四自由度机械臂机械手遥感控制设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

    单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大。其片内的4K程序存储器是FLASH工艺的,这种单

    2024年02月13日
    浏览(38)
  • 关于矩阵的自由度DOF的理解

    自由度,英语名Degrees of freedom,简写DOF。在学习SLAM的过程中多次看到自由度的概念,网上看有关于自由度的解释都过于抽象难以理解。先给出 自由度比较好理解的定义 : 自由度是n个变量在某个(些)约束下,能够自由变化的最多变量个数m为该约束下的自由度 自由度是用约

    2023年04月16日
    浏览(41)
  • 【自动驾驶】二自由度车辆动力学模型

    车辆数学模型 车辆模型-动力学模型(Dynamics Model) 我们作如下假设: 车辆所受的空气的力只会对车身坐标系x轴方向上的运动有影响,y轴方向和沿着z轴的旋转不会受到空气力的影响; 车辆运行在二维平面中,也就是z轴无速度。 车辆轮胎力运行在线性区间。 在运动学模型中,

    2023年04月12日
    浏览(48)
  • matlab 汽车动力学操控稳定性三自由度

    1、内容简介 略 34可以交流、咨询、答疑 2、内容说明 •1、汽车车速不变 。 •2、不考虑切向力对轮胎特性的影响。  •3、侧向加速度不大于0.3-0.4g 。 •4、前轮转角不大,不考虑前轮左右的区别。  •5、不考虑非悬架质量的倾角。 •6、不考虑空气动力作用。 •7、侧倾

    2024年01月18日
    浏览(32)
  • 平面三自由度机器人动力学建模与仿真

    网上二自由度机器臂动力学分析有很多,三自由度比较少,碰巧本科课设需要完成相关项目,分享一些经验供参考。 实际的三连杆机器臂的结构相对较复杂,很难进行精确地描述,因此,在本文中利用简化的数学模型进行讨论。简化条件如下: 假设机器臂是刚性结构,不考

    2024年02月04日
    浏览(40)
  • 基于STM32的自由度云台运动姿态控制系统

    目录 设计报告撰写内容 2 一、设计要求 2 1、掌握 MEMS 传感器 MPU6050 的应用方法; 2 3、二自由度云台运动姿态控制系统设计。 2 二、设计方案(要求给出详细的设计思路及其必要的论证) 2 1、硬件设计 3 1)电源系统 3 2)数字控制器 4 3)角度测量传感器 4 4)执行机构 5 5)系

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包