探索二自由度机械臂的非奇异终端滑模控制器(NTSMC)
二自由度机械臂非奇异终端滑模控制器 非奇异终端滑模NTSMC 有专门的说明文档

在机器人控制领域,二自由度机械臂的精准控制一直是研究热点。而非奇异终端滑模控制器(NTSMC)则为实现这一目标提供了一种强大的手段。今天咱就来唠唠这二自由度机械臂的NTSMC。
什么是非奇异终端滑模(NTSMC)
传统的滑模控制在趋近阶段能快速响应,但在到达滑模面后,控制精度会受限于线性滑模的约束。NTSMC则通过引入非线性滑模面,克服了这一缺点,使得系统不仅能快速趋近滑模面,而且在有限时间内收敛到平衡点,实现高精度控制。关于NTSMC,其实是有专门的说明文档,详细阐述了其理论基础和设计原理。咱这儿就挑关键部分讲讲,帮助大家理解代码实现。
代码示例及分析
以Python代码为例(当然,实际应用中可能根据硬件平台和具体需求选择C、C++等语言):
import numpy as np
import matplotlib.pyplot as plt
# 定义机械臂参数
m1 = 1.0
m2 = 1.0
l1 = 1.0
l2 = 1.0
g = 9.8
# 定义状态变量和时间
theta1 = np.pi / 4
theta2 = np.pi / 4
dtheta1 = 0
dtheta2 = 0
dt = 0.01
t = np.arange(0, 10, dt)
# 初始化控制输入和状态变量存储
u1_list = []
u2_list = []
theta1_list = []
theta2_list = []
# 定义滑模面参数
alpha1 = 2.0
alpha2 = 2.0
beta1 = 1.5
beta2 = 1.5
k1 = 5.0
k2 = 5.0
for i in range(len(t)):
# 计算动力学方程中的各项
M11 = m1 * l1 ** 2 + m2 * (l1 ** 2 + l2 ** 2 + 2 * l1 * l2 * np.cos(theta2))
M12 = m2 * (l2 ** 2 + l1 * l2 * np.cos(theta2))
M21 = m2 * (l2 ** 2 + l1 * l2 * np.cos(theta2))
M22 = m2 * l2 ** 2
C1 = -m2 * l1 * l2 * np.sin(theta2) * (2 * dtheta1 * dtheta2 + dtheta2 ** 2)
C2 = m2 * l1 * l2 * np.sin(theta2) * dtheta1 ** 2
G1 = (m1 + m2) * g * l1 * np.cos(theta1) + m2 * g * l2 * np.cos(theta1 + theta2)
G2 = m2 * g * l2 * np.cos(theta1 + theta2)
# 定义滑模面
s1 = dtheta1 + alpha1 * np.sign(theta1) * np.abs(theta1) ** beta1
s2 = dtheta2 + alpha2 * np.sign(theta2) * np.abs(theta2) ** beta2
# 计算控制输入
u1 = M11 * (-k1 * np.sign(s1) - alpha1 * beta1 * np.sign(theta1) * np.abs(theta1) ** (beta1 - 1) * dtheta1) - M12 * (-k2 * np.sign(s2) - alpha2 * beta2 * np.sign(theta2) * np.abs(theta2) ** (beta2 - 1) * dtheta2) + C1 + G1
u2 = M21 * (-k1 * np.sign(s1) - alpha1 * beta1 * np.sign(theta1) * np.abs(theta1) ** (beta1 - 1) * dtheta1) - M22 * (-k2 * np.sign(s2) - alpha2 * beta2 * np.sign(theta2) * np.abs(theta2) ** (beta2 - 1) * dtheta2) + C2 + G2
# 更新状态变量
d2theta1 = (u1 - C1 - G1 - M12 * d2theta2) / M11
d2theta2 = (u2 - C2 - G2) / M22
dtheta1 = dtheta1 + d2theta1 * dt
dtheta2 = dtheta2 + d2theta2 * dt
theta1 = theta1 + dtheta1 * dt
theta2 = theta2 + dtheta2 * dt
# 存储数据
u1_list.append(u1)
u2_list.append(u2)
theta1_list.append(theta1)
theta2_list.append(theta2)
# 绘制关节角度随时间变化图
plt.figure()
plt.plot(t, np.array(theta1_list) * 180 / np.pi, label='theta1')
plt.plot(t, np.array(theta2_list) * 180 / np.pi, label='theta2')
plt.xlabel('Time (s)')
plt.ylabel('Joint Angle (degrees)')
plt.legend()
plt.show()
代码分析
- 参数定义部分:
m1 = 1.0
m2 = 1.0
l1 = 1.0
l2 = 1.0
g = 9.8
这里定义了二自由度机械臂的质量(m1,m2)、连杆长度(l1,l2)以及重力加速度(g),这些参数是机械臂动力学模型的基础,不同的机械臂参数会直接影响控制效果。
- 状态变量初始化部分:
theta1 = np.pi / 4
theta2 = np.pi / 4
dtheta1 = 0
dtheta2 = 0
dt = 0.01
t = np.arange(0, 10, dt)
初始化了关节角度(theta1,theta2)及其角速度(dtheta1,dtheta2),还设定了时间步长(dt)和时间范围(t)。时间步长的选择很关键,它影响着数值计算的精度和效率。
- 滑模面参数定义部分:
alpha1 = 2.0
alpha2 = 2.0
beta1 = 1.5
beta2 = 1.5
k1 = 5.0
k2 = 5.0
alpha1,alpha2,beta1,beta2 是定义滑模面形状的参数,k1,k2 则是控制增益。这些参数的调整对控制器性能影响巨大,需要通过反复试验和理论分析来确定最优值。
- 动力学方程计算部分:
M11 = m1 * l1 ** 2 + m2 * (l1 ** 2 + l2 ** 2 + 2 * l1 * l2 * np.cos(theta2))
M12 = m2 * (l2 ** 2 + l1 * l2 * np.cos(theta2))
M21 = m2 * (l2 ** 2 + l1 * l2 * np.cos(theta2))
M22 = m2 * l2 ** 2
C1 = -m2 * l1 * l2 * np.sin(theta2) * (2 * dtheta1 * dtheta2 + dtheta2 ** 2)
C2 = m2 * l1 * l2 * np.sin(theta2) * dtheta1 ** 2
G1 = (m1 + m2) * g * l1 * np.cos(theta1) + m2 * g * l2 * np.cos(theta1 + theta2)
G2 = m2 * g * l2 * np.cos(theta1 + theta2)
这里根据机械臂的动力学原理,计算了惯性矩阵(M11,M12,M21,M22)、科里奥利力和离心力项(C1,C2)以及重力项(G1,G2)。这些项构成了机械臂动力学模型的核心,是后续控制输入计算的基础。
- 滑模面定义部分:
s1 = dtheta1 + alpha1 * np.sign(theta1) * np.abs(theta1) ** beta1
s2 = dtheta2 + alpha2 * np.sign(theta2) * np.abs(theta2) ** beta2
这就是NTSMC的关键,通过这种非线性的滑模面定义,使系统能在有限时间内收敛到平衡点。alpha1,beta1 等参数决定了滑模面的形状和收敛特性。
- 控制输入计算部分:
u1 = M11 * (-k1 * np.sign(s1) - alpha1 * beta1 * np.sign(theta1) * np.abs(theta1) ** (beta1 - 1) * dtheta1) - M12 * (-k2 * np.sign(s2) - alpha2 * beta2 * np.sign(theta2) * np.abs(theta2) ** (beta2 - 1) * dtheta2) + C1 + G1
u2 = M21 * (-k1 * np.sign(s1) - alpha1 * beta1 * np.sign(theta1) * np.abs(theta1) ** (beta1 - 1) * dtheta1) - M22 * (-k2 * np.sign(s2) - alpha2 * beta2 * np.sign(theta2) * np.abs(theta2) ** (beta2 - 1) * dtheta2) + C2 + G2
根据滑模控制理论,结合动力学模型,计算出每个关节的控制输入(u1,u2)。这里的计算考虑了滑模面状态(s1,s2)、关节状态(theta1,theta2,dtheta1,dtheta2)以及动力学参数,目的是让系统沿着滑模面运动并最终收敛到平衡点。
- 状态变量更新部分:
d2theta1 = (u1 - C1 - G1 - M12 * d2theta2) / M11
d2theta2 = (u2 - C2 - G2) / M22
dtheta1 = dtheta1 + d2theta1 * dt
dtheta2 = dtheta2 + d2theta2 * dt
theta1 = theta1 + dtheta1 * dt
theta2 = theta2 + dtheta2 * dt
利用计算得到的控制输入,更新关节角度和角速度。这里采用简单的欧拉积分方法进行数值求解,虽然简单,但能有效展示控制过程。
- 绘图部分:
plt.figure()
plt.plot(t, np.array(theta1_list) * 180 / np.pi, label='theta1')
plt.plot(t, np.array(theta2_list) * 180 / np.pi, label='theta2')
plt.xlabel('Time (s)')
plt.ylabel('Joint Angle (degrees)')
plt.legend()
plt.show()
最后将关节角度随时间的变化绘制成图,直观展示机械臂在NTSMC控制下的运动轨迹,便于分析控制效果。

总的来说,二自由度机械臂的NTSMC为实现高精度控制提供了很好的解决方案,通过合理设计滑模面和控制输入,能让机械臂在复杂环境下精准运动。当然,实际应用中还需要考虑更多因素,如模型不确定性、外部干扰等,这些都可以基于NTSMC进一步优化和扩展。希望这篇博文能让大家对二自由度机械臂的NTSMC有更深入的了解。



更多推荐
所有评论(0)