机器人系统数字孪生:提升工业能力
1. 相关工作
1.1 提出的框架
构建了一个机器人架构的数字副本,它分为两个组件:虚拟部分和真实部分。
-
虚拟元素
:是基于Unity平台构建的软件。
-
真实部分
:使用两个内置编码器的伺服电机来代表机器人的两个关节,这两个电机通过PID控制器进行控制。此外,还使用集成了ROS的Jetson Nano作为中央处理器。虚拟元素和真实部分通过TCP套接字协议套件相互连接。
Jetson Nano是一款小型但功能强大的计算机,能够并行运行多个神经网络,适用于图像分类、目标检测、分割和语音处理等应用。它功耗低于5W,能提供472 GFLOPS的计算能力以快速运行现代AI算法,具备64位ARM四核CPU、板载128核NVIDIA GPU以及4GB的LPDDR4内存,可并行运行多个神经网络并同时处理多个高分辨率传感器。
用户可以在虚拟模型和真实模型之间进行双向控制:
-
从虚拟到真实模型的控制过程
:当用户通过Unity控制器更改机器人的关节位置时,匹配角度数据将通过中央处理器发送。中央处理器会计算正向运动学以确定机械臂末端的位置。然后,虚拟机器人模型会控制匹配角度,并将数据提供给用户界面以显示关节角度值和机器人机械臂端点的坐标。最后,数据将通过TCP套接字协议套件发送到物理机器人以控制真实模型。
-
从真实到虚拟对象的控制过程
:与上述过程相反,从ROS的控制器开始,在此过程中,Unity端的控制器将被忽略。
以下是系统架构的mermaid流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Unity平台 - 虚拟模型):::process -->|TCP套接字协议| B(Jetson Nano - ROS):::process
B -->|UART| C(Arduino - 真实模型):::process
C -->|UART| B
B -->|TCP套接字协议| A
1.2 虚拟环境
使用Unity平台来构建和开发虚拟环境。Unity是一款专门用于游戏开发的软件,因此构建虚拟环境相对容易,并且它还支持虚拟现实和增强现实,有利于系统的未来发展。构建虚拟环境的步骤如下:
1. 使用可用工具和其他图形软件(如Blender)构建虚拟环境的对象。
2. 为机器人设置数据通信、运动学和旋转控制器等功能。
3. 从ABB主页下载ABB IRB 120机器人模型的详细信息。
4. 编辑并拼接各个部分,形成ABB IRB 120机器人。
5. 为机器人模型的每个关节设置坐标轴。
6. 设置模型的参数。
7. 将模型导出为URDF文件并存储在项目所在的目录中。
8. 将该模型导入Unity虚拟环境。
在虚拟环境中,中央处理器会处理数据、将数据存储在本地内存中并将数据传输到真实模型,同时控制器帮助用户更改角度。该虚拟环境支持数据可视化、监控和控制。
2. 方法:机器人手臂关节角度的数字孪生
2.1 比较逆运动学算法与Robot Studio
构建逆运动学算法后,将其与Unity、MATLAB和Robot Studio进行比较。发现Unity、自建算法和Robot Studio的坐标是互换的,关节值的误差非常小,这些误差是由于算法计算中的舍入过程导致的。结果表明,逆运动学计算在可接受的误差范围内是有效的。以下是测试得到的逆运动学评估表:
| No | 机械臂端点坐标 | 旋转角度 (°) | | | | | | 软件 |
| — | — | — | — | — | — | — | — | — |
| | | 关节1 | 关节2 | 关节3 | 关节4 | 关节5 | 关节6 | |
| 1 | X: 374
RX: 0
Y: 137.47
RY: 90
Z: 479.39
RZ: 90 | 24.48
24.47
24.48 | 6.8
6.8
6.8 | 20.96
20.96
20.96 | 44.34
44.34
44.34 | -36.35
-36.35
-36.35 | -38.21
-38.21
-38.21 | Robot Studio
Unity
MATLAB |
| 2 | X: 374
RX: 0
Y: -239.4
RY: 90
Z: 479.39
RZ: 90 | -38.4
-38.4
-38.4 | 17.87
17.87
17.87 | 7.78
7.78
7.78 | -61.37
-61.37
-61.37 | -45.05
-45.05
-45.05 | 52.3
52.3
52.3 | Robot Studio
Unity
MATLAB |
| 3 | X: 420.12
RX: 0
Y: -147.3
RY: 90
Z: 654.72
RZ: 90 | -22.93
-22.93
-22.93 | 19.01
19.01
19.01 | -26.64
-26.64
-26.64 | 72.59
72.59
72.59 | 24.1
24.1
24.1 | -71.04
-71.04
-71.04 | Robot Studio
Unity
MATLAB |
| 4 | X: 420.12
RX: 0
Y: 165.37
RY: 90
Z: 654.72
RZ: 90 | 25.41
25.41
25.41 | 20.95
20.95
20.95 | -29.2
-29.2
-29.2 | -73.21
-73.21
-73.21 | 26.63
26.63
26.63 | 71.34
71.34
71.34 | Robot Studio
Unity
MATLAB |
| 5 | X: 535.17
RX: 0
Y: -115.5
RY: 90
Z: 516.22
RZ: 90 | -14
-14
-14 | 38.4
38.4
38.4 | -28.05
-28.05
-28.05 | -54.23
-54.23
-54.23 | -17.35
-17.35
-17.35 | 52.96
52.96
52.96 | Robot Studio
Unity
MATLAB |
| 6 | X: 389.93
RX: 0
Y: 158.43
RY: 90
Z: 718.23
RZ: 90 | 26.49
26.49
26.49 | 22.06
22.06
22.06 | -44.05
-44.05
-44.05 | -53.08
-53.08
-53.08 | 33.91
33.91
33.91 | 47.84
47.84
47.84 | Robot Studio
Unity
MATLAB |
| 7 | X: 454.39
RX: 0
Y: -177.3
RY: 90
Z: 592.51
RZ: 90 | -24.88
-24.88
-24.88 | 25.73
25.73
25.73 | -23.7
-23.7
-23.7 | -85.64
-85.64
-85.64 | -24.95
-24.95
-24.95 | 85.19
85.19
85.19 | Robot Studio
Unity
MATLAB |
2.2 构建PID控制器
构建PID控制器的目的是控制电机的旋转角度,使用了行星GP36行星减速器直流伺服电机,减速比为1:27,转速为145 rpm,集成了500 CPR(每转脉冲数)的光学编码器和A - B两个通道。
从脉冲计数到角度的转换公式为:
[
\alpha(x) = \frac{p}{c \times r \times 360} = \frac{p}{500 \times 27 \times 360} = \frac{p}{37.5}
]
电机的PID控制器包含三个参数:Kp、Ki和Kd,这些参数通过手动调整实验确定,分别为Kp = 0.01、Ki = 0.002和Kd = 0.001。通过PID算法确定要供应给电机的电压(期望电压值),公式如下:
[
U = K_p \times e + K_i \times (e_{pre} + e \times (t - t_{pre})) + K_d \times \frac{e - e_{pre}}{t - t_{pre}}
]
其中,Kp、Ki、Kd分别为上述声明的PID系数,t是当前采样时间,tpre是上一采样时间,单位为秒(s),e是期望电机角度(p)与当前电机角度(pcur)之间的误差,epre是上一次的误差。
[
e = p - p_{cur}
]
由于电机驱动器的电源(UPow)为12V,微控制器为8位,将电压转换为控制脉冲(Pwm)的公式为:
[
Pwm = U \times \frac{255}{U_{Pow}} = U \times \frac{255}{12} = U \times 21.25
]
2.3 真实和虚拟模型之间的双向数据传输
在Jetson Nano上安装ROS,并设置节点和主题,以在Arduino和ROS之间以及ROS和Unity之间传输和接收数据。ROS作为中介,支持Arduino和Unity之间的数据收发。使用TCP套接字协议在ROS和Unity之间进行双向数据传输,使用UART在ROS和Arduino之间进行双向数据传输。作为ROS节点运行的TCP端点有助于在Unity和ROS之间传递消息,传递的消息预计会像ROS内部序列化的那样进行序列化。
机器人系统数字孪生:提升工业能力
3. 实验与结果
3.1 比较正向运动学算法与Robot Studio
构建正向运动学算法后,将其与Unity和Robot Studio进行比较。发现Unity、自建算法和Robot Studio的坐标是互换的,具体来说,Unity的X轴对应算法和Robot Studio的Y轴,Unity的Y轴对应算法和Robot Studio的Z轴,Unity的Z轴对应算法的X轴和Robot Studio的Y轴。得到的值误差非常小,这些误差是由于算法计算中的舍入过程导致的,这证明了算法的可行性。以下是测试得到的正向运动学评估表:
| No | 关节1 - 3 | 关节4 - 6 | PX | PY | PZ | 软件 |
| — | — | — | — | — | — | — |
| 1 | Joint1: 0
Joint2: 0
Joint3: 0 | Joint4: 0
Joint5: 0
Joint6: 0 | 374 | 374 | 374 | Robot Studio |
| | | | 0 | 630 | 0 | Unity |
| | | | 630 | 0 | 630 | MATLAB |
| 2 | Joint1: 10
Joint2: 30
Joint3: 15 | Joint4: 100
Joint5: 60
Joint6: 0 | 413.94 | 135.34 | 414 | Robot Studio |
| | | | 135.37 | 413.94 | 135 | Unity |
| | | | 341.91 | 341.98 | 341 | MATLAB |
| 3 | Joint1: 10.46
Joint2: -18.76
Joint3: 6.02 | Joint4: 5.59
Joint5: 25.7
Joint6: 2.86 | 257.61 | 50.61 | 258 | Robot Studio |
| | | | 135.37 | 257.64 | 51 | Unity |
| | | | 341.91 | 665.05 | 665 | MATLAB |
| 4 | Joint1: 20
Joint2: 25
Joint3: 30 | Joint4: 35
Joint5: 40
Joint6: 45 | 315.36 | 143.03 | 315 | Robot Studio |
| | | | 143.01 | 315.35 | 143 | Unity |
| | | | 260.52 | 260.54 | 260 | MATLAB |
| 5 | Joint1: 21
Joint2: 30
Joint3: 24 | Joint4: 15
Joint5: 10
Joint6: 18 | 373.27 | 146.74 | 373 | Robot Studio |
| | | | 146.74 | 373.25 | 147 | Unity |
| | | | 256.2 | 256.19 | 255 | MATLAB |
| 6 | Joint1: 26
Joint2: 24
Joint3: 20 | Joint4: 18
Joint5: 55
Joint6: 60 | 321.37 | 177.03 | 321 | Robot Studio |
| | | | 176.99 | 321.39 | 177 | Unity |
| | | | 308.18 | 307.44 | 307 | MATLAB |
| 7 | Joint1: 71
Joint2: 58
Joint3: 56 | Joint4: 30
Joint5: 100
Joint6: 90 | 5.24 | 124.13 | 5 | Robot Studio |
| | | | 124.12 | 525 | 124 | Unity |
| | | | 165.12 | 165.11 | 165 | MATLAB |
| 8 | Joint1: -131.53
Joint2: 5.04
Joint3: 22.36 | Joint4: -63.18
Joint5: 31.64
Joint6: -70.25 | -270.96 | -255.33 | -271 | Robot Studio |
| | | | -255.13 | -271.17 | -255 | Unity |
| | | | 438.77 | 438.036 | 438 | MATLAB |
| 9 | Joint1: -29.44
Joint2: -47.9
Joint3: -18.86 | Joint4: -90.96
Joint5: 39.75
Joint6: 76.07 | -130.88 | 21.15 | -131 | Robot Studio |
| | | | 21.01 | -131.12 | 21 | Unity |
| | | | 827.31 | 827.25 | 827 | MATLAB |
| 10 | Joint1: 92.25
Joint2: -3.69
Joint3: -89.73 | Joint4: -37.11
Joint5: -26.07
Joint6: 70.26 | -13.8 | -136.52 | -14 | Robot Studio |
| | | | -134.91 | -13.74 | -136 | Unity |
| | | | 919.8 | 919.44 | 919 | MATLAB |
3.2 误差和延迟
虚拟模型和真实模型之间的误差由物理机器人的中央处理单元计算,通过虚拟模型匹配角度值减去真实模型匹配角度值得到。设Em为虚拟模型关节值,En为物理模型关节值,m和n从1到系统存储的最后一个检索数据,系统的误差(\Delta E(t))计算公式为:
[
\Delta E(t) = E_m - E_n
]
计算延迟时,将从虚拟机器人发送数据到物理机器人的时间设为t1,从物理机器人发送数据到虚拟机器人的时间设为t2,系统的延迟(\Delta t(s))计算公式为:
[
\Delta t(s) = t_2 - t_1
]
以下是误差和延迟计算的mermaid流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(虚拟模型关节值 Em):::process -->|减法运算| C(误差 ΔE(t)):::process
B(真实模型关节值 En):::process -->|减法运算| C
D(虚拟到物理数据发送时间 t1):::process -->|减法运算| E(延迟 Δt(s)):::process
F(物理到虚拟数据发送时间 t2):::process -->|减法运算| E
3.3 数据存储
数据存储在本地、Firebase云存储和Google表格中。Cloud Firestore的数据传输和接收速率为10 Hz,免费版本每天限制50,000次数据更新和编辑。Google表格的数据收发速率也为10 Hz,每分钟限制100次获取和更新。
数据分为三个部分:集合、目录和文件。集合名为“data”,其中包含文件夹,每个文件夹的名称是数据存储到云的时间。文件位于目录内,收集的数据包括时间、虚拟模型的匹配位置、伺服电机的旋转位置以及虚拟模型匹配位置与伺服电机旋转位置之间的误差。
还使用了另一种本地数据存储方式,频率约为165 Hz,仅受本地存储内存限制。本地存储的数据表包含以下列:
- STT列:根据数据存储时间升序排列的数据序号。
- Time列:存储数据的时间。
- Error列:虚拟模型和真实模型匹配位置之间的误差。
- Joints Unity列:虚拟模型的关节位置。
- Joints Servo列:伺服电机的旋转位置。
3.4 结果
分析数据表明,系统启动后约2 s达到稳定状态,采样频率约为165 Hz。系统延迟约为30 ms,误差为± 2度。
模拟伺服电机电源故障时,当存储3000个数据时断开伺服电机,在存储3150个数据时重新通电,在存储4665个数据时再次断开伺服电机直至系统完全停止。通过对比故障发生前后的数据差异,可以观察到系统的响应情况。
4. 结论
成功构建了ABB IRB 120机器人的数字孪生模型,该模型通过TCP套接字协议套件实现了真实和虚拟之间的通信。计算了机器人的正向运动学,并与Robot Studio的正向运动学进行了比较。此外,为电机构建了PID控制器,并将数据存储在云存储和本地存储中,以便后续进行机器学习开发。
系统在不存储数据时的最大频率为165 Hz,将数据存入云时为10 Hz。运动学计算由于计算中的舍入值导致误差非常小,PID控制器稳定,能够按预期控制电机位置。真实和虚拟模型之间的双向数据传输由于计算中的转换舍入导致误差也非常小。
未来,计划提高数据发送到云的频率,并使用机器学习分析收集的数据,以帮助监控和评估系统。还打算制作典型移动机器人(如机械臂平台和康复机器人)的数字副本。
附录:运动学DH
使用ABB IRB 120机器人模型计算正向和实验运动学,基于机器人模型的关节设置坐标位置和方向表示。
ABB IRB 120的DH参数如下表所示:
| 关节 | θi (°) | ai (mm) | αi (°) | di (mm) |
| — | — | — | — | — |
| 1 | θ1(+90) | 0 | -90 | 290 |
| 2 | θ2(-90) | 270 | 0 | 0 |
| 3 | θ3 | 70 | -90 | 302 |
| 4 | θ4 | 0 | 90 | 0 |
| 5 | θ5 | 0 | -90 | 0 |
| 6 | θ6 | 0 | 0 | 72 |
每个关节的运动范围限制如下表所示:
| 关节 | 下限 [deg] | 上限 [deg] |
| — | — | — |
| 1 | -165 | 165 |
| 2 | -110 | 110 |
| 3 | -110 | 70 |
| 4 | -160 | 160 |
| 5 | -120 | 120 |
| 6 | -400 | 400 |
每个连杆可以看作是从一个坐标系到下一个坐标系的坐标变换,该变换表示为沿X轴和Z轴的平移和旋转的乘积,公式如下:
[
^{n - 1}T_n =
\begin{bmatrix}
\cos\theta_n & -\sin\theta_n\cos\alpha_n & \sin\theta_n\sin\alpha_n & a_n\cos\theta_n \
\sin\theta_n & \cos\theta_n\cos\alpha_n & -\cos\theta_n\sin\alpha_n & a_n\sin\theta_n \
0 & \sin\alpha_n & \cos\alpha_n & d_n \
0 & 0 & 0 & 1
\end{bmatrix}
]
正向运动学
正向运动学的目的是确定每个关节(或伺服)相对于全局坐标系(即连接到肩部的第一个坐标系)的绝对位置和方向。将上述DH参数应用到公式中,得到每个连杆的变换矩阵,进而计算每个坐标系相对于全局坐标系的位置和方向:
[
^0T_6 = ^0T_1 ^1T_2 ^2T_3 ^3T_4 ^4T_5 ^5T_6 =
\begin{bmatrix}
r_{11} & r_{12} & r_{13} & p_x \
r_{21} & r_{22} & r_{23} & p_y \
r_{31} & r_{32} & r_{33} & p_z \
0 & 0 & 0 & 1
\end{bmatrix}
]
其中,参数r构成机器人的旋转矩阵,参数P是机械臂端点的坐标位置。机械臂端点坐标的计算公式如下:
[
p_x = d_5c_1s_{234} + d_4s_1 - d_6c_1c_{234} + a_2c_1c_2 + d_6c_5s_1 + a_3c_1c_2c_3 - a_3c_1s_2s_3
]
[
p_y = d_5s_1s_{234} - d_4c_1 - d_6s_1c_{234} + a_2c_2s_1 - d_6c_5c_1 + a_3c_2c_3s_1 - a_3s_1s_2s_3
]
[
p_z = d_1 - d_6s_{234}s_5 + a_3s_{23} + a_2s_2 - d_5c_{234}
]
逆向运动学
由于关节数量较多,求解三角函数方程较为困难,因此将6个关节分为两组:第1到第3关节为一组,第4到第6关节为一组。
对于第1到第3关节:
设Pc点坐标为([P_{cx}, P_{cy}, P_{cz}]),通过一系列矩阵运算和化简得到:
[
\theta_1 = \text{atan2}(P_{cy}, P_{cx})
]
[
\theta_3 = \text{atan2}\left(\pm\sqrt{1 - \left(\frac{D}{\rho}\right)^2}, \frac{D}{\rho}\right) - \text{atan2}(d_4, a_3)
]
其中,
[
D = n_x^2 + n_y^2 - (a_2^2 + a_3^2 + d_4^2)
]
[
\rho = 2\sqrt{(a_2a_3)^2 + (a_2d_4)^2}
]
[
n_x = \frac{P_{cx}}{\cos\theta_1}
]
[
n_y = P_{cz} - d_1
]
继续进行矩阵运算和化简得到:
[
\theta_2 = \phi - \text{atan2}\left(\pm\sqrt{1 - \left(\frac{M}{\sigma}\right)^2}, \frac{M}{\sigma}\right)
]
其中,
[
M = d_4\cos\theta_3 + a_3\sin\theta_3
]
[
\sigma = \sqrt{p_x^2 + p_y^2}
]
[
\phi = \text{atan2}(p_y, p_x)
]
[
p_x = P_{cx}\cos\theta_1 + P_{cy}\sin\theta_1
]
[
p_y = d_1 - P_{cz}
]
对于第4到第6关节:
计算从第4到第6关节的变换矩阵(^3T_6),得到旋转矩阵(^3R_6),通过与(^0R_6 = ^0R_3 ^3R_6)的关系,得到:
[
\cos\theta_5 = r_{33}
]
[
\sin\theta_5 = \pm\sqrt{1 - r_{33}^2}
]
[
\theta_5 = \text{atan2}\left(\pm\sqrt{1 - r_{33}^2}, r_{33}\right)
]
超级会员免费看



5554

被折叠的 条评论
为什么被折叠?



