arm_robot_unity

安川電機のアームロボットを遠隔操作する案件があり、基本的にはWebカメラで見るのですが、ロボットの現在状況を3Dで表示したいということでUnityを使ってみました。
Unityに関しては、Courseraのゲーム開発のコースを途中まで視聴した程度のレベルです。ですのでシミュレーションといってもアニメーションを表示するだけのものです。

ここではわかりやすくするためにロボットの関節角度をUnityのUIスライダーで与えています。実際にはロボットの関節角度データはロボットのコントローラからもらいます.

台座から手先に向けて順番に入れ子構造にしていくことで、ある関節を回した時にそこから先のアームを一体で動かすことができます。各アームは根元から、S、L、U、R、B、Tと名前がついています。アームにはそれぞれ円柱部材(Axis)があって、それより手先側のアセンブリの回転軸となっています。

arm_robot_unity_2

Cadのデータを使ってかっこよくしたものがこちらです。

arm_robot_unity_3

描画フレームごとにスクリプト(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];
        }
    }
}