最近需要在项目中用unity3D实现一个多自由度机械臂的仿真,由于是仿真而不是做游戏,所以对位置、速度还有时间控制方面的要求比较严格,本文中机械臂的实现只涉及运动学而不考虑动力学等。
传统方法中实现机械臂可以采用hingejoint(铰链关节)来实现,铰链关节的具体方法详见unity脚本手册,用铰链关节有其局限性。
铰链关节是靠给关节一个力以及一个关节要达到的转动速度来进行转动,靠给定铰链转动的最大值与最小值来使关节停止转动,也可以给铰链一个反方向力使其速度达到0来实现停止转动的目的。为实现速度的瞬时变化,可以将铰链关节的质量属性(惯性属性)设置为0,则速度的变化可以瞬间达到。
虽然这样也可以实现类似机械臂中转动关节的效果,但是这只能进行粗略仿真,对要求速度实时变化可控,例如速度变化与正弦曲线类似的情况下,铰链关节就极为不方便了。
而且铰链关节相当于把两个物体固定在了一起,在某些情况下会发生我们不希望看到的结果。
下面给出我在项目中实现机械臂关节转动的方法。
采用这种方式的结果大概就是这样,所有物体依次成父子关系排列。在hierarchy栏里排成一大长串。
可以直接在hierarchy栏中拖动,也可以在脚本中实现父子关系。
joint4.transform.parent=joint5.transform;
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