3D_6Axis_Robotic_Arm_Simulator with Python-wxPython-OpenGL and OPC-UA [Cyber Twin]

English 简体中文 繁体中文 Tiếng Việt
Summary

A cyber-physical twin simulation system for a 3D 6-Axis Robotic Arm has been developed, leveraging Python, wxPython, OpenGL, and OPC-UA to create a realistic Operational Technology (OT) environment. This system adheres to the ISA-95 automation hierarchy, comprising a Level 0 OpenGL-rendered robot simulator, a Level 1 OPC-UA PLC for control logic, and a Level 2 HMI for supervisory monitoring and remote command execution. It features realistic kinematics, object interaction with simplified physics, and supports both manual and automated control, including an auto-grab function and predefined action sequences. Communication between the simulator and PLC uses UDP, while OPC-UA facilitates robust data exchange and command issuance between the PLC and HMI. This platform provides a safe, scalable, and hardware-independent environment for robotics control development and OT cybersecurity training.

项目设计目的 : 本项目的目标是开发一个基于软件的3D六轴机械臂在OT环境中的信息物理双胞胎仿真系统,该系统利用 PythonwxPythonOpenGLOPC-UA TCP 协议。系统设计遵循国际自动化标准 ISA-95 (IEC/ISO 62264),并作为一个复杂的信息双胞胎,弥合了虚拟仿真与工业自动化之间的鸿沟。

该仿真系统包含三个主要模块,它们反映了ISA-95自动化层级:1. 机械臂仿真器(0级 - 现场级),2. 机械臂OPC-UA PLC(1级 - 控制级)和 3. 用户远程控制器(2级 - 监控级)。通过将实时物理仿真与工业通信标准相结合,本项目为机器人控制开发和OT安全培训提供了一个安全、可扩展的环境。

系统概览演示如下所示:

该项目还提供了机械臂自动控制功能,例如自动搜索和抓取方块,并已用于一些网络演习和CTF。

# Author:      Yuancheng Liu
# Created:     2026/01/20
# Version:     v_0.0.3
# Copyright:   Copyright (c) 2026 LiuYuancheng
# License:     MIT License

1. 引言

摘要 : 智能制造和工业控制系统(ICS)的进步推动了对机器人系统真实、灵活、安全仿真环境的需求,以满足开发和培训目的。特别地,机械臂在现代生产线中广泛应用,其中精确控制、实时监控以及系统层之间可靠的通信至关重要。本项目 3D 6Axis Robotic Arm Simulator with Python–wxPython–OpenGL and OPC-UA 旨在通过提供一个轻量级但功能完善的信息物理仿真环境来满足这些需求。该系统使用户能够可视化、监控和控制六轴机械臂,同时模拟真实的工业通信和控制工作流程。

1.1 项目背景介绍

两年前,我创建了一个控制Braccio Plus Robot Arm的项目:https://www.linkedin.com/pulse/braccio-plus-robot-arm-controller-yuancheng-liu-h5gfc,但该项目需要硬件,因此难以用于需要多套系统的网络演习和培训。

这个仿真器项目的灵感来源于刘亚东教授的课程“A Robot Simulator Developed by Python, wxPython, VTK with OPC UA Support”,由于课程程序源代码不公开,并且VTK的3D模型资源TLS文件需要学员购买,我采用简化方法和免费库对UI设计进行了一些修改,并添加了一些附加功能:

  • 使用OpenGL替换VTK在画布中构建简化的3D机械臂

  • 引入了方块对象和相关的方块位置传感器,以模拟真实的交互场景

  • 实现了夹持器机构,以演示物体(方块)的抓取和放置操作

再次特别感谢刘亚东教授在YouTube上分享了原创教育内容。供参考,原始教程系列如下:

1.2 系统架构介绍

该平台基于ISA-95自动化层级金字塔设计,从0级(现场设备)延伸到4级(企业系统)。当前实现主要集中在0-2级,如下所示:

  1. 机械臂仿真器(0级 - 现场级) : 该模块提供一个3D OpenGL渲染界面,用于可视化物理机械臂。它模拟硬件组件——例如方块位置传感器、伺服电机和触觉传感器——允许进行复杂的动作,如物体操作(例如,“抓取和放置”操作)。它还具有一个本地化控制面板,用于直接手动覆盖和实时状态可视化。

  2. 机械臂OPC-UA PLC(1级 - 控制级) : 作为操作的大脑,该模块模拟一个工业可编程逻辑控制器(PLC)。它处理来自仿真器的传入传感器数据,并将控制信号发送回虚拟电机,从而促进自主或半自主运动所需的逻辑循环。

  3. 用户远程HMI控制器(2级 - 监控级) : 这是面向最终用户的人机界面(HMI)。它通过OPC-UA协议与PLC建立安全连接,从而实现对机械臂遥测的远程监控以及通过网络执行远程命令。

1.3 系统用例介绍

该PLC控制机械臂系统的修改版本用于以下CTF竞赛中的OT挑战构建:

CISS 2024 Control The Orthanc Obstacles Challenge :

Deutschland's Bester Hacker 2024 OT Challenge 1 :


2. 项目设计

该系统使用Python开发,其中wxPython用于GUI,OpenGL用于3D可视化,OPC UA (IEC 62541)用于标准化工业通信。它旨在通过将仿真、控制逻辑和监控集成到一个统一平台中,模拟真实的运营技术(OT)机器人制造环境的一部分。

2.1 系统设计目标

设计遵循以下关键目标:

  • 模拟真实的OT行为 : 重现伺服电机驱动机械臂的动态,包括多关节运动学、传感器反馈和执行器响应。3D可视化提供了机器人运动和与物体交互的直观表示。

  • 实现远程监控和控制 : 支持通过OPC UA进行实时数据交换和控制,允许用户从远程人机界面(HMI)监控系统状态并发出命令。

  • 支持OT网络安全培训 : 提供一个受控且可观察的环境,用于分析工业通信模式、测试异常检测以及模拟对PLC–HMI交互的潜在攻击。

2.2 系统工作流程概览

整体系统工作流程如下图所示,其结构跨越三个OT层:0级(仿真)、1级(PLC控制)和2级(监控控制)。

2.2.1 0级 → 1级:传感器数据仿真(基于UDP的I/O仿真)

  • 3D机械臂仿真器(浅蓝色部分)持续生成模拟现场数据,包括:方块位置(地面位置传感器)和关节旋转角度(基座、肩部、肘部、腕部、夹持器)。这些值使用UDP消息传输到PLC模块,模拟了从物理传感器获取的真实世界电气或模拟信号。

  • 在OPC-UA PLC(1级)侧,传入的UDP数据被映射到PLC local input variables,然后变量存储在OPC UA地址空间(UA Namespace / UA Objects)中,对于UA数据存储类型:UA-Int16 → 方块坐标值,UA-Float → 关节角度,UA-Bool → 夹持器压力传感器状态。

2.2.2 1级:PLC决策和梯形逻辑执行

PLC模块作为核心控制引擎。它使用我之前开发的Virtual PLC Simulation framework框架实现。该模块支持:加法器逻辑执行和OPC UA服务器功能。控制循环按以下步骤运行:

  • 步骤1:读取当前传感器值(例如,关节角度)

  • 步骤2:与目标值(来自HMI或预定义序列)进行比较

  • 步骤3:执行控制逻辑以确定所需运动

  • 步骤4:生成输出控制信号(伺服电机命令)

例如,如果target shoulder anglecurrent angle,PLC会持续发送调整信号,直到传感器反馈与所需位置匹配。产生的控制信号通过UDP传输回仿真器,模拟对伺服电机的执行器控制信号。

2.2.3 1级 → 2级:OPC UA通信

PLC通过OPC UA服务器(OPC-UA-TCP)公开所有相关数据,包括:关节角度、方块位置、夹持器状态和控制命令。然后2级HMI/控制器作为OPC UA客户端连接,并定期检索更新的值。

2.2.4 2级:监控控制和可视化

SCADA/HMI模块提供了一个面向用户的监控界面,其主要功能包括:

  • 实时可视化:关节角度以六轴图表显示,方块位置映射到2D地面投影,以及系统状态监控。

  • 手动控制:用户可以通过滑块调整每个关节角度,然后电机控制命令通过OPC UA发送到PLC。

  • 自动控制(轨迹执行):用户可以加载预定义动作序列,系统执行重复的抓取和放置操作。

  • 运动计算:控制器估算机械臂是否能到达目标方块,并计算到达方块所需的关节角度。

 


3. 机械臂仿真器实现

本节描述了机械臂仿真器的详细实现,它代表了系统的Level 0 (physical/field layer)。该仿真器使用以下技术开发:

  • wxPython → 用于主GUI框架,承载3D场景并与用户操作交互。

  • OpenGL (GL / GLU / GLUT) → 用于实时3D机械臂和场景渲染。

整体UI布局和功能组件如下所示:

该模块可以独立于其他系统组件运行。内置的本地控制面板允许用户直接操作机械臂,使其适用于独立测试、调试和演示。

3.1 3D场景模块实现

3D机械臂包括4个不同长度的圆柱连杆和多轴机器人关节(基座、肩部、肘部、腕部和夹持器),并具有旋转范围。用户可以在全局文件中调整连杆的长度。

3.1.1 机械臂圆柱连杆

机械臂被建模为一个由四个刚性连杆依次连接组成的运动链:

连杆索引 颜色 连接 旋转基座 长度
Link-00 红色 基座 → 肩部 基座 2.0 单位
Link-01 绿色 肩部 → 肘部 肩部 1.5 单位
Link-02 蓝色 肘部 → 腕部 肘部 1.0 单位
Link-03 黄色 腕部 → 夹持器 腕部 0.5 单位

3.1.2 关节和执行器建模

机械臂包括六个可控轴,每个轴都关联:一个模拟角度传感器(反馈)、一个伺服电机(执行器)、一个定义的旋转范围,并且电机可以通过控制面板中相应的UI控制滑块直接控制。

功能 表面 传感器 执行器 范围 UI控制
Axis-0 基座旋转 X - Y 角度传感器 01 伺服电机 01 (-180°, 180°) 基座滑块
Axis-1 肩部旋转 Y - Z 角度传感器 02 伺服电机 02 (-90°, 90°) 肩部滑块
Axis-2 肘部旋转 Y - Z 角度传感器 03 伺服电机 03 (-180°, 180°) 肘部滑块
Axis-3 腕部旋转 Y - Z 角度传感器 04 伺服电机 04 (-90°, 90°) 腕部滑块
Axis-4 夹持器旋转 X - Y 角度传感器 05 伺服电机 05 (-180°, 180°) 夹持器旋转滑块
Axis-5 夹持器开合   角度传感器 06 伺服电机 06 (0°, 100°) 夹持器开合滑块

为了简化仿真并避免复杂的物理建模,夹持器被限制为始终沿Z轴向下指向。这确保了稳定的物体交互(与方块对象),而无需完整的物理引擎。

3.2 操作功能实现

所有机械臂关节变换按顺序应用,形成一个完整的正向运动学链,用于实时姿态更新。在本节中,我们还添加了一些物理仿真功能,以在OpenGL中实现碰撞动力学或重力仿真。

3.2.1 物体交互:抓取和释放机制

当夹持器位置在方块的0.04-unit阈值距离内时,仿真器实现了一种简化但有效的抓取逻辑:

  • 夹持器闭合动作会触发一个虚拟压力传感器检查过程。

  • 如果夹持器电机停止闭合时,两个夹持器手指都“触碰”到方块表面,它将触发夹持器手指压力传感器。

  • 压力传感器触发后,方块被视为成功抓取并附着到夹持器上,并随其移动。

  • 然后方块颜色变为橙色,表示成功抓取(如下图所示)

3.2.2 方块重力仿真算法

一个轻量级、视觉效果良好的方块重力模型在主渲染循环中实现:

  • 如果方块未附着到夹持器上:其Z轴位置逐渐减小。

  • 运动持续到方块到达地面。

3.2.3 传感器反馈和本地监控面板

  • 仿真器持续计算并显示:夹持器末端执行器位置(通过正向运动学计算)、方块位置(地面传感器读数)以及关节角度和夹持器状态。

  • 所有值实时更新并显示在本地控制面板中,允许用户在操作过程中观察系统状态变化。

  • 还提供了一个重置功能,用于将仿真恢复到初始状态。

3.2.4 外部通信接口 (UDP API)

  • 为了与更高级模块集成,模拟器包含一个 UDP 服务器线程,用于处理:传感器数据传输(模拟导线连接到 PLC 输入触点)和电机控制命令(模拟导线连接到 PLC 输出线圈)。

  • 此外,用户可以开发自定义程序,通过库中提供的 API:lib/physicalWorldComm.py 与模拟器交互,以发送控制命令、获取传感器数据、监控系统状态。

 


4. OPC-UA PLC 的实现

OPC-UA PLC 模块代表系统的第一层(控制层),并作为中央决策单元。它负责处理传感器数据、执行控制逻辑,并协调物理模拟器(0 层)和监控控制器(2 层)之间的通信。OPCUA PLC 仿真模块的梯形图逻辑控制、UA 数据存储和处理是通过项目Python Virtual PLC Simulator with IEC 62541 OPC-UA-TCP Communication Protocol 实现的。详情请查看此链接:https://github.com/LiuYuancheng/PLC_and_RTU_Simulator/tree/main/OPCUA_PLC_Simulator

4.1 OPC UA 变量表

UA-Object 变量名 UA_Type PLC I/O Type 相关模拟器组件
RobotArmCtrl - VN_GRIPPER_CTRL gripperCtrl UA-Bool PLC Input 夹爪压力传感器
RobotArmCtrl - VN_CUBE_POS_X cubePosX UA-Float PLC Input 方块位置传感器
RobotArmCtrl - VN_CUBE_POS_Y cubePosY UA-Float PLC Input 方块位置传感器
RobotArmCtrl - VN_CUBE_POS_Z cubePosZ UA-Float PLC Input 方块位置传感器
RobotArmCtrl - VN_ARM_ANGLE_1 armAngle1 UA-Float PLC Input 基座旋转角度传感器
RobotArmCtrl - VN_ARM_ANGLE_2 armAngle2 UA-Float PLC Input 肩部旋转角度传感器
RobotArmCtrl - VN_ARM_ANGLE_3 armAngle3 UA-Float PLC Input 肘部旋转角度传感器
RobotArmCtrl - VN_ARM_ANGLE_4 armAngle4 UA-Float PLC Input 腕部旋转角度传感器
RobotArmCtrl - VN_ARM_ANGLE_5 armAngle5 UA-Float PLC Input 夹爪旋转角度传感器
RobotArmCtrl - VN_ARM_ANGLE_6 armAngle6 UA-Float PLC Input 夹爪开合角度传感器
RobotArmCtrl - VN_MOTOR1_CTRL motor1Ctrl UA-Int16 PLC Output Servo Motor 01
RobotArmCtrl - VN_MOTOR2_CTRL motor2Ctrl UA-Int16 PLC Output Servo Motor 02
RobotArmCtrl - VN_MOTOR3_CTRL motor3Ctrl UA-Int16 PLC Output Servo Motor 03
RobotArmCtrl - VN_MOTOR4_CTRL motor4Ctrl UA-Int16 PLC Output Servo Motor 04
RobotArmCtrl - VN_MOTOR5_CTRL motor5Ctrl UA-Int16 PLC Output Servo Motor 05
RobotArmCtrl - VN_MOTOR5_CTRL motor6Ctrl UA-Int16 PLC Output Servo Motor 06
HMIRequest - VN_Motor1_TGT motor1Target UA-Int16 N.A N.A (来自远程控制器的请求)
HMIRequest - VN_Motor2_TGT motor2Target UA-Int16 N.A N.A (来自远程控制器的请求)
HMIRequest - VN_Motor3_TGT motor3Target UA-Int16 N.A N.A (来自远程控制器的请求)
HMIRequest - VN_Motor4_TGT motor4Target UA-Int16 N.A N.A (来自远程控制器的请求)
HMIRequest - VN_Motor5_TGT motor4Target UA-Int16 N.A N.A (来自远程控制器的请求)
HMIRequest - VN_Motor6_TGT motor6Target UA-Int16 N.A N.A (来自远程控制器的请求)

4.2 PLC 控制时钟周期

PLC 以周期性循环执行的方式运行,类似于真实的工业控制器。每个时钟周期包括数据采集、处理和输出更新。工作流程如下图所示:

  • 输入数据采集 (获取传感器数据): PLC 通过从机械臂模拟器获取当前 3D 方块坐标和 6 轴关节角度传感器数据来模拟现场数据采集。

  • OPC-UA 服务器更新 (变量同步): 获取的传感器数据被映射到内部变量并推送到 OPC-UA 服务器,以确保“数字孪生”反映物理状态。

  • 一次性初始化 (同步参数): 在第一个周期 (initFlag) 期间,系统将所有内部控制参数与 OPC-UA 服务器同步,以确保一致的起始状态。

  • 控制逻辑执行 (读取与比较): PLC 从 OPC-UA 服务器读取目标控制值(例如,期望的电机角度或夹爪状态),并将其与本地内部状态进行比较。

  • 变化检测 (设置标志): 如果 OPC-UA 目标值与本地状态之间检测到差异,PLC 会触发内部标志(sendArmCtrlFlagsendGripperCtrlFlag)以指示需要更新。

  • 输出更新 (命令执行器): 如果标志已设置,PLC 会将命令信号 (UDP 消息) 发送回 3D 机械臂模拟器,以调整伺服电机或夹爪状态。


5. HMI 远程控制器的实现

HMI 远程控制器代表系统的第二层(监控层)。它为用户提供了一个交互式界面,用于监控系统状态、发布控制命令,并通过与 PLC 的 OPC-UA-TCP 通信(如项目设计部分所述)执行自动化机器人操作。我在我的Smart Braccio ++ IoT Robot Emulator 项目中重用了部分功能和 UI 面板。

控制器的界面是使用wxPython 开发的,主要 UI 布局如下所示:

主要 UI 功能包括:

  • PLC 连接面板 : 允许选择通信协议(例如,OPC-UA TCP, OPC-UA HTTP, UDP)并显示实时连接状态。

  • 方块地面投影位置显示 : 方块在地面上的 X-Y 投影位置以及机械臂可触及的最大范围。

  • 关节角度可视化面板 : 6 个面板使用圆形仪表显示 6 轴关节的传感器和电机角度以及最大旋转范围,“绿针”表示传感器读数,“黄针”表示当前目标电机角度。

  • 伺服电机控制滑块和控制按钮 : 手动调整每个关节控制电机,重置模拟状态,启用自动抓取方块功能以及加载/执行预定义动作序列。

5.1 方块位置映射与自动抓取

为了自动搜索和抓取场景中的物体,控制器使用方块的地面位置(x, y) 来估算所需的关节角度,使机械臂夹爪到达该位置(在阈值范围内,当前阈值距离 = 0.04 单位)。计算四个 theta 角的主要算法如下所示:

主要参数计算算法如下所示:

  • 基座旋转角度 (轴-0) : 基座角度使用 θ₀ = arctan(y / x) 计算 (如果 x = 0y > 0 → θ₀ = 90°,如果 x = 0y < 0 → θ₀ = -90°)

  • 距离计算 : 方块到机械臂基座的距离 k = √(x² + y²)

  • 肩部旋转角度 (轴-1) : θ₁,地面投影距离 a = cos( θ₁ ) × 1.5

  • 肘部旋转角度 (轴-2) : θ₂,地面投影距离 b = cos( θ₁ + θ₂) × 1.0

  • 腕部旋转角度 (轴-3) : θ₃,地面投影距离 c = cos( θ₁ + θ₂ + θ₃) × 0.5

  • X 轴距离关系: 距离 k'≈ a + b + c

  • Z 轴投影距离 1: d = sin( θ₁ ) x 1.5

  • Z 轴投影距离 2 : e = sin( θ₁+ θ₂ ) x 1.0

  • Z 轴投影距离 3 : f = sin( θ₁+ θ₂+ θ₃ ) x 0.5

  • Z 轴距离关系 : 机械臂基座距离 2 ≈ d + e + f

计算角度的详细步骤如下所示,我使用 scipy 的fsolve 快速找到一个可能的值:

抓取方块物体的详细操作步骤如下所示:

  • 从 OPC-UA PLC 读取方块地面投影位置,然后计算它是否在可达区域内。

  • 如果方块物体可达,则计算所需的关节角度 θ₀, θ₁, θ₂, θ₃。

  • 将电机角度目标更改命令发送给 PLC 以执行运动序列。

  • 当机械臂传感器显示机械臂处于正确位置时,发送夹爪闭合命令以抓取方块。

此过程的演示如下所示(用户可以通过“自动抓取方块”按钮触发此功能):

5.2 预定义动作序列执行

控制器支持加载并重复执行来自 JSON 配置的预定义运动序列。

示例任务列表 JSON 文件:

[('grip', '220'), ('base', '90'), ('shld', '155'), ('elbw', '90'), ('wrtP', '205'), ('wrtR', '150'),('grip', '160'),('elbw', '130'),('base', '180'),('grip', '220'),]

执行流程:

  • 用户创建序列 JSON 文件并将其放入文件夹 "src/robotArmController/Scenarios" 中。

  • 按下“执行场景”按钮后,控制器将命令逐一发送给 PLC。对于命令执行间隔,它会等待每个动作完成,然后进行下一个动作。


6. 系统设置与使用

有关系统配置和使用,请参阅用户手册文档:

https://github.com/LiuYuancheng/Python_3D_6Axis_Robotic_Arm_Simulator/blob/main/System_Usage_Manual.md

 


7. 总结与参考

项目总结视频: https://youtu.be/Id3tBvNlzc4?si=pdiII1w45f2kjvS1

3D 六轴机械臂模拟器成功展示了在模块化信息物理系统中高性能可视化和工业标准通信的集成。通过将架构与 ISA-95 hierarchy 对齐,该项目创建了一个真实的环,其中 0 层物理、1 层 PLC 逻辑和 2 层 SCADA/HMI 交互无缝共存。利用 PythonwxPythonOpenGL 实现了轻量级而强大的复杂运动学和传感器反馈模拟,同时 OPC-UA 的实现确保了该系统对现代智能制造和 OT cybersecurity 研究仍然具有相关性。最终,该模拟器作为一个可访问的、硬件独立的平台,供开发人员测试控制算法,以及供安全专业人员在一个安全、受控的沙箱中探索工业协议漏洞。

主要相关项目和参考:

 

Project Source Code Repo: https://github.com/LiuYuancheng/Python_3D_6Axis_Robotic_Arm_Simulator

Thanks for spending time to check the article detail, if you have any question and suggestion or find any program bug, please feel free to message me. Many thanks if you can give some comments and share any of the improvement advice so we can make our work better ~


Last edited by LiuYuancheng ([email protected]) at 20/02/2026, if you have any question please free to message me.

 

  RELATED

No related programming articles found. Browse all programming tutorials and articles.

  COMMENTS

0

No comment for this article.