在unity中实现机械臂的仿真操作的方法

最近需要在项目中用unity3D实现一个多自由度机械臂的仿真,由于是仿真而不是做游戏,所以对位置、速度还有时间控制方面的要求比较严格,本文中机械臂的实现只涉及运动学而不考虑动力学等。

传统方法中实现机械臂可以采用hingejoint(铰链关节)来实现,铰链关节的具体方法详见unity脚本手册,用铰链关节有其局限性。

铰链关节是靠给关节一个力以及一个关节要达到的转动速度来进行转动,靠给定铰链转动的最大值与最小值来使关节停止转动,也可以给铰链一个反方向力使其速度达到0来实现停止转动的目的。为实现速度的瞬时变化,可以将铰链关节的质量属性(惯性属性)设置为0,则速度的变化可以瞬间达到。

虽然这样也可以实现类似机械臂中转动关节的效果,但是这只能进行粗略仿真,对要求速度实时变化可控,例如速度变化与正弦曲线类似的情况下,铰链关节就极为不方便了。

而且铰链关节相当于把两个物体固定在了一起,在某些情况下会发生我们不希望看到的结果。

下面给出我在项目中实现机械臂关节转动的方法。

一、机械臂联动

为实现机械臂的末端随之前的关节转动而转动的效果,这里采用 父子关系实现这种父臂带动子臂动的效果。


采用这种方式的结果大概就是这样,所有物体依次成父子关系排列。在hierarchy栏里排成一大长串。

可以直接在hierarchy栏中拖动,也可以在脚本中实现父子关系。

joint4.transform.parent=joint5.transform;

二、联体坐标变换

由于要采用4×4的位姿转换矩阵约束每次转动后的位姿,所以最好我们每个关节的转动都是基于联体坐标系进行的变换(即每个关节的转动角度都是相对于其上一个关节的
坐标系)。在这里我实现的是三自由度的球关节,其他正常关节与这个类似。
这里我用了三个空物体来实现球关节的效果,三个空物体依次成父子关系。每个空物体控制一个自由度的转动,每个空物体的转动都是相对于其父物体坐标系的。具体的角
度控制使用了transform.localrotation,localrotation是物体相对于父物体的姿态参数,能够很好地控制子物体相对于父物体的相对姿态。
transform.localRotation = Quaternion.Euler(temp_angle[0], 0, 0);
//例如我要这个空物体控制x轴方向的转动,那么我就在这个空物体中改变temp_angle[0]的值,如果我要让这个关节转60度,你可以让它在update里每次转1度,分60次转完,这样就实现了动画的效果,当然如果要控制具体的时间,还要采用其他方法。

同理,如果要控制绕当前y轴和z轴的转动只需要把temp_angle的位置换一下就好。

三、时间的控制

做仿真对时间的要求还是比较高的,最开始想用unity中的协程来做,但是后来发现用协程控制的时间不够精确,有一定误差,累积起来就无法忽视了。

于是采用了另一种方法,即把角度变化的代码放在FixedUpdate里执行,在设置里把时间间隔设成你需要的值,就可以控制物体角度等时间间隔变化了。



就不附具体代码了,总之大体的思路就是这样~~~~~~


---------------------分割线--------------------------------------------

简单做了个小demo,感兴趣的同学可以去看看~~~

https://github.com/JinghanSun/armSimulationByUnity3D

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页