02-Unity通过OPC UA监控ABB机器人

写在前面

本人目前研二下,第一次写这个blog,菜的一批,一部分python和unity代码是在我几个同门帮助下完成的,历经千辛万苦,拖了一天又一天,终于完成,深知自己不适合读研,希望早日毕业,因此写这篇文章记录一下学习过程。😅

一、软件介绍

1.Unity 2022.3.55(unity官网下载)

2.OPC UA 服务器的插件Iot Gateway(ABB官网下载)

3.UaExpert软件 (Downloads - Unified Automation)

4.Pycharm 2020.1(python3.7)

5.Robotstudio 6.08(后面简称RS)

二、效果展示

打包在其他工控机上可视化:

三、实现过程

1、unity只与虚拟ABB机器人Robot studio通讯

1)首先要有一个RS的机器人仿真工作站,并且仿真可以运行。

2)unity需要有一个RobotToAPP的包,我在unitystore官网买的(用于制作游戏的优质资源 | Unity Asset Store),C#代码会调用RobotToAPP方法。

1.unity设置UI,并绑定变量

2.unity C#代码如下:

using System.Collections;
//using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using RobotToAPP;
//using TMPro;
//using static RobotToAPPSamples;

public class RobotToUnity : MonoBehaviour
{
    public Text[] jointTexts; // 引用用于显示关节数据
    public GameObject[] robotJoints;   // 引用机器人的 6 个关节 GameObject
    private Quaternion[] initialJointRotations; // 保存关节的初始旋转
    public Text[] tcpTexts;// 引用用于显示 TCP 信息
    public Text[] quaternionTexts;// 引用用于显示四元数信息
    public Text[] externalAxisTexts;// 引用用于显示外部轴数据


    private Vector3[] axisRotationInfo = new[]
    {
        new Vector3(0, 0, 1),   // 轴1:绕 Z 轴,正向
        new Vector3(0, -1, 0),  // 轴2:绕 Y 轴,反向
        new Vector3(0, -1, 0),  // 轴3:绕 Y 轴,反向
        new Vector3(-1, 0, 0),  // 轴4:绕 X 轴,反向
        new Vector3(0, -1, 0),  // 轴5:绕 Y 轴,反向
        new Vector3(-1, 0, 0)   // 轴6:绕 X 轴,反向
    };

    void Start()
    {
        // 初始化初始旋转数组
        initialJointRotations = new Quaternion[6];
        for (int i = 0; i < 6; i++)
        {
            if (robotJoints.Length > i && robotJoints[i] != null)
            {
                initialJointRotations[i] = robotJoints[i].transform.localRotation;
            }
        }
        ABBCommunicator.Instance.HOST = "http://localhost/";
        StartCoroutine(PeriodicallyReadJoints());
        //PerformAdditionalActions();// 调用封装的方法

    }


    IEnumerator PeriodicallyReadJoints()
    {
        while (true)
        {
            // 读取关节数据
            ReadJointAction jointAction = new ReadJointAction();
            jointAction.OnCompleted = jointData =>
            {
                UpdateJointTexts(jointData);
                DriveRobotJoints(jointData);
            };
            jointAction.Execute();

            // 读取 TCP 和四元数数据
            ReadRobotTargetAction targetAction = new ReadRobotTargetAction();
            targetAction.OnCompleted = targetData =>
            {
                UpdateTcpTexts(targetData);
                UpdateQuaternionTexts(targetData);
            };
            targetAction.Execute();

            // 读取外部轴数据
            ReadExternalJointAction externalAction = new ReadExternalJointAction();
            externalAction.OnCompleted = externalData =>
            {
                UpdateExternalAxisTexts(externalData);
            };
            externalAction.Execute();

            // 每 0.1 秒读取一次数据,可根据需要调整间隔时间
            yield return new WaitForSeconds(0.1f);
        }
    }

    // 更新关节数据的 UI 显示
    void UpdateJointTexts(JointsData data)
    {
        if (jointTexts.Length >= 6)
        {
            jointTexts[0].text = $"Joint1: {data.Joint1}";
            jointTexts[1].text = $"Joint2: {data.Joint2}";
            jointTexts[2].text = $"Joint3: {data.Joint3}";
            jointTexts[3].text = $"Joint4: {data.Joint4}";
            jointTexts[4].text = $"Joint5: {data.Joint5}";
            jointTexts[5].text = $"Joint6: {data.Joint6}";
        }
    }

    void DriveRobotJoints(JointsData data)
    {
        if (robotJoints.Length >= 6)
        {
            float[] jointValues = new float[6]
            {
                data.Joint1,
                data.Joint2,
                data.Joint3,
                data.Joint4,
  
### Unity3D中机器人数字孪生的开源项目与资源 在Unity3D中开发机器人数字孪生项目,可以通过以下开源项目和资源进行学习和参考。这些资源涵盖了从三维建模到数据通信的多个方面,能够帮助开发者快速上手并实现复杂的机器人数字孪生系统。 #### 1. ABB_IRB120机械臂数字孪生项目 一个可运行的ABB_IRB120机械臂数字孪生项目已经分享在相关专栏中[^1]。该项目展示了如何在Unity3D中模拟机械臂的运动学特性,并通过虚拟环境实现对真实机器人的控制和监控。开发者可以从中学习如何利用Unity3D的物理引擎来模拟机器人运动以及如何实现虚实同步。 #### 2. 加工流程虚实同步的数字孪生系统 该系统通过Unity3D实现了机器人加工流程的虚实同步[^2]。具体而言,它使用了Unity3D的建模工具和材质系统来创建逼真的机器人模型和加工场景。同时,借助Unity3D的物理引擎,模拟了加工过程中的碰撞、切削等物理现象。此外,通过TCP/IP协议实现了与实际设备的数据交互,确保了虚拟环境与现实设备之间的实时同步。 #### 3. 分拣机数字孪生项目 此项目展示了如何将分拣机的数字孪生集成到Unity3D开发平台中[^3]。重点在于通过OPC UA协议实现客户端-服务器通信(服务器为B&R Automation PLC,客户端为Unity3D)。该项目还采用了多线程编程技术进行性能优化,适合需要高性能通信的工业应用场景。 #### 4. 其他开源工具与资源 除了上述具体项目外,还有许多其他工具和资源可以帮助开发者构建机器人数字孪生系统。例如,一些免费工具提供了强大的功能和资源,适用于建筑设计、游戏开发、机器人研究等多个领域[^4]。开发者可以根据自己的需求选择合适的工具进行开发。 #### 5. 深海领域的数字孪生技术 虽然主要针对深海领域,但深海底热液喷口数字孪生技术的相关研究也值得借鉴[^5]。这种技术结合了传感技术、AI for Science和超算技术,推动了海洋科学进入“虚拟探测”时代。尽管其应用领域有所不同,但其中涉及的建模方法和数据处理技术可能对机器人数字孪生项目的开发有所启发。 ```python # 示例代码:Unity3D中通过TCP/IP协议实现数据通信 import socket def establish_tcp_connection(ip, port): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((ip, port)) return client_socket def send_data_to_robot(client_socket, data): client_socket.sendall(data.encode('utf-8')) # 假设IP地址为"192.168.1.100",端口号为5000 client_socket = establish_tcp_connection("192.168.1.100", 5000) send_data_to_robot(client_socket, "MoveRobotToPosition") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值