二自由度机械臂非奇异终端滑模控制器 非奇异终端滑模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()

代码分析

  1. 参数定义部分
m1 = 1.0
m2 = 1.0
l1 = 1.0
l2 = 1.0
g = 9.8

这里定义了二自由度机械臂的质量(m1m2)、连杆长度(l1l2)以及重力加速度(g),这些参数是机械臂动力学模型的基础,不同的机械臂参数会直接影响控制效果。

  1. 状态变量初始化部分
theta1 = np.pi / 4
theta2 = np.pi / 4
dtheta1 = 0
dtheta2 = 0
dt = 0.01
t = np.arange(0, 10, dt)

初始化了关节角度(theta1theta2)及其角速度(dtheta1dtheta2),还设定了时间步长(dt)和时间范围(t)。时间步长的选择很关键,它影响着数值计算的精度和效率。

  1. 滑模面参数定义部分
alpha1 = 2.0
alpha2 = 2.0
beta1 = 1.5
beta2 = 1.5
k1 = 5.0
k2 = 5.0

alpha1alpha2beta1beta2 是定义滑模面形状的参数,k1k2 则是控制增益。这些参数的调整对控制器性能影响巨大,需要通过反复试验和理论分析来确定最优值。

  1. 动力学方程计算部分
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)

这里根据机械臂的动力学原理,计算了惯性矩阵(M11M12M21M22)、科里奥利力和离心力项(C1C2)以及重力项(G1G2)。这些项构成了机械臂动力学模型的核心,是后续控制输入计算的基础。

  1. 滑模面定义部分
s1 = dtheta1 + alpha1 * np.sign(theta1) * np.abs(theta1) ** beta1
s2 = dtheta2 + alpha2 * np.sign(theta2) * np.abs(theta2) ** beta2

这就是NTSMC的关键,通过这种非线性的滑模面定义,使系统能在有限时间内收敛到平衡点。alpha1beta1 等参数决定了滑模面的形状和收敛特性。

  1. 控制输入计算部分
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

根据滑模控制理论,结合动力学模型,计算出每个关节的控制输入(u1u2)。这里的计算考虑了滑模面状态(s1s2)、关节状态(theta1theta2dtheta1dtheta2)以及动力学参数,目的是让系统沿着滑模面运动并最终收敛到平衡点。

  1. 状态变量更新部分
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

利用计算得到的控制输入,更新关节角度和角速度。这里采用简单的欧拉积分方法进行数值求解,虽然简单,但能有效展示控制过程。

  1. 绘图部分
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有更深入的了解。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐