安川電機のアームロボットを遠隔操作する案件があり、基本的にはWebカメラで見るのですが、ロボットの現在状況を3Dで表示したいということでUnityを使ってみました。
Unityに関しては、Courseraのゲーム開発のコースを途中まで視聴した程度のレベルです。ですのでシミュレーションといってもアニメーションを表示するだけのものです。
ここではわかりやすくするためにロボットの関節角度をUnityのUIスライダーで与えています。実際にはロボットの関節角度データはロボットのコントローラからもらいます.
台座から手先に向けて順番に入れ子構造にしていくことで、ある関節を回した時にそこから先のアームを一体で動かすことができます。各アームは根元から、S、L、U、R、B、Tと名前がついています。アームにはそれぞれ円柱部材(Axis)があって、それより手先側のアセンブリの回転軸となっています。
Cadのデータを使ってかっこよくしたものがこちらです。
描画フレームごとにスクリプト(RotationScript.cs)で各軸の回転処理を行います。
using UnityEngine; using UnityEngine.UI; using System.Collections; using System.IO; using System; using System.Text; public class RotationScript : MonoBehaviour { public Transform target; public Vector3 direction; public int axisNum; private Vector3 targetPos; private float[] data = new float[6]; private float[] angle = new float[6]; public Slider S_Slider; public Slider L_Slider; public Slider U_Slider; public Slider R_Slider; public Slider B_Slider; public Slider T_Slider; // Use this for initialization void Start() { for (int i = 0; i < 6; i++) { angle[i] = 0; } } // Update is called once per frame void Update() { data[0] = S_Slider.value; data[1] = L_Slider.value; data[2] = U_Slider.value; data[3] = R_Slider.value; data[4] = B_Slider.value; data[5] = T_Slider.value; if (angle[axisNum] != data[axisNum]) { targetPos = target.position; transform.RotateAround(targetPos, target.up, data[axisNum]-angle[axisNum]); angle[axisNum] = data[axisNum]; } } }