Unity 逆运动学 机械臂动画

 本文章内容来自【uinty逆运动学-机械臂动画1/2】 https://www.bilibili.com/video/BV1e8411z7Li/?share_source=copy_web&vd_source=c41752496c26208e08a172a2410eecfe

为实现Unity 中机械臂的运动 

我们先了解机械臂想要抓取到一个物体,抓点的位置和机械臂旋转角度的关系‘

图像斜率= (两点距离1-两点距离2)/(机器臂角度1-机械臂角度2)

这样得出的斜率有正负之分 具体怎么得可以看视频

用得出的斜率对机械臂进行旋转,从第一个机械臂旋转到最后一个机械臂

对机械臂进行设置时需要注意旋转节点需要是在旋转部件中心位置,并且需要绑定好父子级关系

对每个节点绑定Joint代码,并且设置子节点,设置好旋转轴

 设置旋转轴时要注意旋转轴是对于物体的局部旋转,不是对于全局的

然后创建一个空物体命名为JXB_IKManager挂载脚本设置好根节点与末节点(是为抓手所在位置)

附代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IKManger : MonoBehaviour
{
    //根节点
    public Joint m_root;

    //子节点
    public Joint m_end;

    //目标点
    public GameObject m_target;

    public float m_threshold = 0.05f;

    public float m_rate = 5.0f;
    /// <summary>
    /// 计算斜率
    /// </summary>
    /// <param name="_joint"></param>
    /// <returns></returns>
    float CalculateSlpoe(Joint _joint)
    {
        float deltaTheta = 0.01f;
        float distance1 = GetDistance(m_end.transform.position, m_target.transform.position);

        _joint.Rotate(deltaTheta);

        float distance2 = GetDistance(m_end.transform.position, m_target.transform.position);
        _joint.Rotate(-deltaTheta);

        return (distance2 - distance1) / deltaTheta;
    }

    // Update is called once per frame
    void Update()
    {
        if(GetDistance(m_end.transform.position,m_target.transform.position) > m_threshold)
        {
            Joint current = m_root;
            while(current != null)
            {
                float slope = CalculateSlpoe(current);
                current.Rotate(-slope * m_rate);
                current = current.GetChild();
            }
          
        }
 
    }
    float GetDistance(Vector3 _point1,Vector3 _point2)
    {
        print(Vector3.Distance(_point1, _point2));
        return Vector3.Distance(_point1, _point2);
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum Hinge { 
        X,
        Y, 
        Z
}


public class Joint : MonoBehaviour
{
    public Hinge _Hinge;
    public Joint m_child;
    public Joint GetChild()
    {
        return m_child;
    }
    public void Rotate(float _angle)
    {
        if (_Hinge == Hinge.X)
        {
            transform.Rotate(Vector3.right * _angle);
        }else if(_Hinge == Hinge.Y)
        {
            transform.Rotate(Vector3.up * _angle);
        }else if(_Hinge == Hinge.Z)
        {
            transform.Rotate(Vector3.forward * _angle);
        }
    }
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity实现机械臂逆运动学可以通过以下步骤完成: 1. 创建机械臂模型:在Unity中,首先需要创建机械臂的模型。可以使用Unity的3D建模工具或导入外部模型文件创建机械臂。 2. 定义机械臂关节:根据机械臂的结构,定义每个关节的类型和参数。例如,旋转关节可以使用`HingeJoint`组件来表示,平移关节可以使用`SliderJoint`组件。 3. 实现逆运动学算法:逆运动学算法用于计算机械臂关节的角度或位置以实现特定的目标位置或姿态。常见的逆运动学算法包括解析解法和数值解法。 - 解析解法:对于简单的机械臂结构,可以使用解析解法求解逆运动学问题。这涉及到数学计算和公式推导,可以根据机械臂的结构和要求手动推导出关节角度的表达式。 - 数值解法:对于复杂的机械臂结构或无法求得解析解的情况,可以使用数值解法求解逆运动学问题。这涉及到迭代计算和数值优化算法,通过不断调整关节角度来逼近目标位置或姿态。 4. 实现运动控制:在逆运动学算法的基础上,将计算得到的关节角度或位置应用到机械臂模型上,实现机械臂的运动控制。可以通过修改关节的旋转角度或位置来控制机械臂的姿态。 需要注意的是,机械臂逆运动学是一个复杂的问题,涉及到数学和物理知识。具体的实现方式和算法选择会根据机械臂的结构和需求而有所不同。以上是一个简单的概述,具体的实现细节可能需要根据具体情况进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值