四旋翼无人机自抗扰控制算法研究 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,这里面的 beta01beta02beta03omega0 都是预先设定好的参数,它们影响着观测器的性能。比如说,beta01 较大时,观测器对误差的响应会更迅速,但可能也更容易受到噪声影响。

接着是 NLSEF 类,在 control 方法里,通过计算不同的误差和一系列复杂的操作得到控制信号。这里面 r1r2h 也是参数,r1r2 决定了控制律对误差的敏感程度,h 有点像一个“平滑因子”。

最后在 simulate_trajectory 函数里,模拟了无人机的轨迹跟踪过程。设定好各种参数后,初始化了 ESONLSEF,然后在每个时间步里,根据期望轨迹和当前位置计算控制输入 u,通过观测器得到状态估计 z,再由控制律算出最终的控制信号,更新当前位置,这样一步步模拟无人机的轨迹跟踪。

总结

ADRC算法为四旋翼无人机的轨迹跟踪提供了一种强大且有效的解决方案。通过巧妙地估计和补偿扰动,让无人机在复杂环境下也能尽可能精准地跟踪我们设定的轨迹。当然,实际应用中还需要考虑更多的细节,比如硬件的响应速度、传感器的精度等等。但总的来说,ADRC为无人机控制开辟了一条很有潜力的道路,期待未来能看到更多基于它的精彩应用。

Logo

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

更多推荐