探索四旋翼无人机的ADRC轨迹跟踪算法
四旋翼无人机自抗扰控制算法研究 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为无人机控制开辟了一条很有潜力的道路,期待未来能看到更多基于它的精彩应用。




更多推荐
所有评论(0)