四旋翼无人机自抗扰控制算法研究 ADRC 轨迹跟踪 附带说明文
在无人机的控制领域,实现精准的轨迹跟踪一直是个热门话题。今天咱们就唠唠四旋翼无人机的自抗扰控制算法(ADRC)在轨迹跟踪方面的神奇之处。
什么是自抗扰控制算法(ADRC)
简单来说,ADRC把系统中各种不确定因素,像模型误差、外部干扰等,都看成是对系统的“总扰动”,然后想办法估计并补偿这个总扰动,让系统能稳定地按照我们期望的轨迹运行。它就像是给无人机安上了一个聪明的“大脑”,能自动应对各种复杂情况。
ADRC在四旋翼无人机轨迹跟踪中的应用
原理简述
四旋翼无人机在空中的运动是相当复杂的,受到重力、空气阻力、电机动力不平衡等各种因素影响。ADRC算法的核心就是通过扩张状态观测器(ESO)实时估计出这些内外扰动的总和,并通过非线性状态误差反馈控制律(NLSEF)来产生合适的控制输入,以抵消这些扰动,从而让无人机精准地跟踪设定轨迹。
代码示例与分析
咱们来看看关键部分的代码(以Python语言为例,简化示意,实际应用会更复杂):
import numpy as np # 定义扩张状态观测器(ESO) class ESO: def __init__(self, beta01, beta02, beta03, omega0): self.beta01 = beta01 self.beta02 = beta02 self.beta03 = beta03 self.omega0 = omega0 self.z = np.zeros(3) def update(self, x, u): e = self.z[0] - x self.z[0] = self.z[0] - self.beta01 * e * self.omega0 + self.z[1] * self.omega0 self.z[1] = self.z[1] - self.beta02 * e * self.omega0 * self.omega0 + self.z[2] * self.omega0 self.z[2] = self.z[2] - self.beta03 * e * self.omega0 * self.omega0 * self.omega0 return self.z # 定义非线性状态误差反馈控制律(NLSEF) class NLSEF: def __init__(self, r1, r2, h): self.r1 = r1 self.r2 = r2 self.h = h def control(self, z1, z2, v1, v2): e1 = v1 - z1 e2 = v2 - z2 a1 = np.fabs(e1) + self.h a2 = np.sqrt(a1 * a1 + 8 * self.r1 * self.h * np.fabs(e1)) fhan1 = -self.r1 * (a2 - a1) / (2 * self.h) * np.sign(e1) a1 = np.fabs(e1 + e2) + self.h a2 = np.sqrt(a1 * a1 + 8 * self.r2 * self.h * np.fabs(e1 + e2)) fhan2 = -self.r2 * (a2 - a1) / (2 * self.h) * np.sign(e1 + e2) return fhan1 + fhan2 # 模拟无人机轨迹跟踪 def simulate_trajectory(): # 设定参数 time_step = 0.01 total_time = 10 num_steps = int(total_time / time_step) desired_trajectory = np.sin(np.linspace(0, total_time, num_steps)) beta01 = 3.0 beta02 = 3.0 beta03 = 1.0 omega0 = 10.0 r1 = 100.0 r2 = 100.0 h = 0.01 eso = ESO(beta01, beta02, beta03, omega0) nlsef = NLSEF(r1, r2, h) current_position = 0 positions = [] for i in range(num_steps): # 这里简单假设控制输入u与期望轨迹和当前位置的误差有关 u = desired_trajectory[i] - current_position z = eso.update(current_position, u) control_signal = nlsef.control(z[0], z[1], desired_trajectory[i], 0) current_position += control_signal * time_step positions.append(current_position) return positions咱们来分析下这段代码哈。首先定义了ESO类,这个类的作用就是实现扩张状态观测器。在update方法里,通过不断计算误差e来更新状态变量z,这里面的beta01、beta02、beta03和omega0都是预先设定好的参数,它们影响着观测器的性能。比如说,beta01较大时,观测器对误差的响应会更迅速,但可能也更容易受到噪声影响。
接着是NLSEF类,在control方法里,通过计算不同的误差和一系列复杂的操作得到控制信号。这里面r1、r2和h也是参数,r1和r2决定了控制律对误差的敏感程度,h有点像一个“平滑因子”。
最后在simulate_trajectory函数里,模拟了无人机的轨迹跟踪过程。设定好各种参数后,初始化了ESO和NLSEF,然后在每个时间步里,根据期望轨迹和当前位置计算控制输入u,通过观测器得到状态估计z,再由控制律算出最终的控制信号,更新当前位置,这样一步步模拟无人机的轨迹跟踪。
总结
ADRC算法为四旋翼无人机的轨迹跟踪提供了一种强大且有效的解决方案。通过巧妙地估计和补偿扰动,让无人机在复杂环境下也能尽可能精准地跟踪我们设定的轨迹。当然,实际应用中还需要考虑更多的细节,比如硬件的响应速度、传感器的精度等等。但总的来说,ADRC为无人机控制开辟了一条很有潜力的道路,期待未来能看到更多基于它的精彩应用。