(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试

这篇具有很好参考价值的文章主要介绍了(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2.3.5  基于自适应反演滑模控制器的仿真测试

文件test/fault_AISMC.py实现了一个基于非线性动力学模型的无人机飞行控制仿真环境,通过使用自适应反演滑模控制器(Adaptive Inverse Sliding Mode Control,AdaptiveISMC_nonlinear)对无人机进行控制,并引入了执行器故障模型以模拟实际飞行中可能发生的故障情况。最后可视化仿真结果,展示了无人机在控制算法下的轨迹、执行器状态、故障检测与隔离等信息,用于分析控制器对飞行器动态响应及故障情况的影响。

文件test/fault_AISMC.py的具体实现流程如下所示。

(1)函数Env.init()用于初始化仿真环境,包括定义执行器故障(actuator_faults)、初始条件(ic)、参考轨迹(ref0)以及创建无人机模型(Copter_nonlinear)、执行器故障检测与隔离模块(FDI)和自适应反演滑模控制器(AdaptiveISMC_nonlinear)。

class Env(BaseEnv):
    def __init__(self):
        super().__init__(solver="odeint", max_t=20, dt=10, ode_step_len=100)
        # Define faults
        self.actuator_faults = [
            LoE(time=5, index=0, level=0.0),
            # LoE(time=10, index=3, level=0.3)
        ]
        # Define initial condition and reference at t=0
        ic = np.vstack((0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))
        ref0 = np.vstack((1, -1, -2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0))
        # Define agents
        self.plant = Copter_nonlinear()
        self.n = self.plant.mixer.B.shape[1]
        self.fdi = FDI(numact=self.n)
        self.controller = AdaptiveISMC_nonlinear(self.plant.J,
                                                 self.plant.m,
                                                 self.plant.g,
                                                 self.plant.d,
                                                 ic,
                                                 ref0)

(2)函数Env.get_ref(t, x)的功能是根据当前时间 t 和状态 x 计算参考轨迹 ref,包括期望位置、速度、姿态和角速度。

    def get_ref(self, t, x):
        pos_des = np.vstack((1, -1, -2))
        vel_des = np.vstack((0, 0, 0))
        quat_des = np.vstack((1, 0, 0, 0))
        omega_des = np.zeros((3, 1))
        ref = np.vstack((pos_des, vel_des, quat_des, omega_des))
        return ref

(3)函数Env._get_derivs(t, x, p, gamma, effectiveness)的功能根据当前时间 t、状态 x、控制参数 p、滑模变量 gamma 和执行器效应性 effectiveness 计算执行器指令、执行器输出、作用在飞行器上的力和滑模变量。

    def _get_derivs(self, t, x, p, gamma, effectiveness):
        ref = self.get_ref(t, x)
        forces, sliding = self.controller.get_FM(x, ref, p, gamma, t)
        # Controller
        Bf = self.plant.mixer.B * effectiveness
        L = np.diag(effectiveness)
        rotors_cmd = np.linalg.pinv(Bf.dot(L)).dot(forces)
        rotors = np.clip(rotors_cmd, 0, self.plant.rotor_max)
        return rotors_cmd, rotors, forces, ref, sliding

(4)函数Env.set_dot(t的功能根据当前时间 t 更新仿真状态的导数,包括计算执行器指令、执行器输出和作用在飞行器上的力,并更新控制器和飞行器的状态。

    def set_dot(self, t):
        x = self.plant.state
        p, gamma = self.controller.observe_list()
        effectiveness = np.array([1.] * self.n)
        for act_fault in self.actuator_faults:
            effectiveness = act_fault.get_effectiveness(t, effectiveness)
        rotors_cmd, rotors, forces, ref, sliding = \
            self._get_derivs(t, x, p, gamma, effectiveness)

        self.plant.set_dot(t, rotors)
        self.controller.set_dot(x, ref, sliding)

(5)函数Env.logger_callback(i, t, y, *args)是仿真过程中的日志记录回调函数,用于提取并返回包括时间 t、飞行器状态 x、执行器指令、执行器输出、参考轨迹、滑模变量和作用在飞行器上的力等信息的字典。

    def logger_callback(self, i, t, y, *args):
        states = self.observe_dict(y)
        x_flat = self.plant.observe_vec(y[self.plant.flat_index])
        ctrl_flat = self.controller.observe_list(y[self.controller.flat_index])
        x = states["plant"]
        effectiveness = np.array([1.] * self.n)
        for act_fault in self.actuator_faults:
            effectiveness = act_fault.get_effectiveness(t, effectiveness)
        rotors_cmd, rotors, forces, ref, sliding = \
            self._get_derivs(t, x_flat, ctrl_flat[0], ctrl_flat[1], effectiveness)

        return dict(t=t, x=x, rotors=rotors, rotors_cmd=rotors_cmd,
                    ref=ref, gamma=ctrl_flat[1], forces=forces)

(6)函数exp1_plot()用于绘制仿真结果的多个子图,包括飞行器执行器指令与实际输出的对比、期望轨迹与实际轨迹的对比、执行器故障检测与隔离滑模变量的演变,以及在执行器故障发生时的标注。通过可视化展示飞行器的动态响应和控制性能,有助于分析控制系统的稳定性和鲁棒性。

def exp1_plot():
    data = fym.logging.load("case3_A.h5")
    print(data.keys())
    # Rotor
    plt.figure()
    ax = plt.subplot(411)
    plt.plot(data["t"], data["rotors"][:, 0], "k-", label="Response")
    plt.plot(data["t"], data["rotors_cmd"][:, 0], "r--", label="Command")
    plt.ylim([-5.1, 45])
    plt.legend()

    plt.subplot(412, sharex=ax)
    plt.plot(data["t"], data["rotors"][:, 1], "k-")
    plt.plot(data["t"], data["rotors_cmd"][:, 1], "r--")
    plt.ylim([-5.1, 45])

    plt.subplot(413, sharex=ax)
    plt.plot(data["t"], data["rotors"][:, 2], "k-")
    plt.plot(data["t"], data["rotors_cmd"][:, 2], "r--")
    plt.ylim([-5.1, 45])

    plt.subplot(414, sharex=ax)
    plt.plot(data["t"], data["rotors"][:, 3], "k-")
    plt.plot(data["t"], data["rotors_cmd"][:, 3], "r--")
    plt.ylim([-5.1, 45])

    plt.gcf().supxlabel("Time, sec")
    plt.gcf().supylabel("Rotor force")
    plt.tight_layout()

    plt.figure()

    ax = plt.subplot(411)
    plt.plot(data["t"], data["ref"][:, 0, 0], "r-", label="x (cmd)")
    plt.plot(data["t"], data["x"]["pos"][:, 0, 0], label="x")

    plt.plot(data["t"], data["ref"][:, 1, 0], "r--", label="y (cmd)")
    plt.plot(data["t"], data["x"]["pos"][:, 1, 0], label="y")

    plt.plot(data["t"], data["ref"][:, 2, 0], "r-.", label="z (cmd)")
    plt.plot(data["t"], data["x"]["pos"][:, 2, 0], label="z")
    plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))

    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(412, sharex=ax)
    plt.plot(data["t"], data["x"]["vel"].squeeze())
    plt.legend([r'$u$', r'$v$', r'$w$'], loc='center left', bbox_to_anchor=(1, 0.5))

    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(413, sharex=ax)
    plt.plot(data["t"], data["x"]["quat"].squeeze())
    plt.legend([r'$q0$', r'$q1$', r'$q2$', r'$q3$'])
    # plt.plot(data["t"], np.transpose(quat2angle(np.transpose(data["x"]["quat"].squeeze()))))
    # plt.legend([r'$psi$', r'$theta$', r'$phi$'], loc='center left', bbox_to_anchor=(1, 0.5))
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(414, sharex=ax)
    plt.plot(data["t"], data["x"]["omega"].squeeze())
    plt.legend([r'$p$', r'$q$', r'$r$'], loc='center left', bbox_to_anchor=(1, 0.5))
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    # plt.xlabel("Time, sec")
    # plt.ylabel("Position")
    # plt.legend(loc="right")
    plt.tight_layout()

    plt.figure()

    ax = plt.subplot(411)
    plt.plot(data['t'], data['gamma'].squeeze()[:, 0])
    plt.ylabel(r'$-\hat{h_{1}}$')
    plt.grid(True)
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(412, sharex=ax)
    plt.plot(data['t'], data['gamma'].squeeze()[:, 1])
    plt.ylabel(r'$\hat{h_{2}}$')
    plt.grid(True)
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(413, sharex=ax)
    plt.plot(data['t'], data['gamma'].squeeze()[:, 2])
    plt.ylabel(r'$\hat{h_{3}}$')
    plt.grid(True)
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))

    plt.subplot(414, sharex=ax)
    plt.plot(data['t'], data['gamma'].squeeze()[:, 3])
    plt.ylabel(r'$\hat{h_{4}}$')
    plt.grid(True)
    plt.axvspan(5, 5.042, alpha=0.2, color="b")
    plt.axvline(5.042, alpha=0.8, color="b", linewidth=0.5)
    plt.annotate("Rotor 0 fails", xy=(5, 0), xytext=(5.5, 0.5),
                 arrowprops=dict(arrowstyle='->', lw=1.5))
    plt.xlabel("Time [sec]")

    plt.tight_layout()

    # fig4 = plt.figure()
    # ax1 = fig4.add_subplot(4, 1, 1)
    # ax2 = fig4.add_subplot(4, 1, 2, sharex=ax1)
    # ax3 = fig4.add_subplot(4, 1, 3, sharex=ax1)
    # ax4 = fig4.add_subplot(4, 1, 4, sharex=ax1)

    # ax1.plot(data['t'], data['forces'].squeeze()[:, 0])
    # ax2.plot(data['t'], data['forces'].squeeze()[:, 1])
    # ax3.plot(data['t'], data['forces'].squeeze()[:, 2])
    # ax4.plot(data['t'], data['forces'].squeeze()[:, 3])

    # ax1.set_ylabel('F')
    # ax1.grid(True)
    # ax2.set_ylabel('M1')
    # ax2.grid(True)
    # ax3.set_ylabel('M2')
    # ax3.grid(True)
    # ax4.set_ylabel('M3')
    # ax4.grid(True)
    # ax4.set_xlabel('Time [sec]')
    # plt.tight_layout()
    plt.show()

执行后将回执多个子图,如图2-8所示。

  1. 执行器输出与指令对比图:包含四个子图,每个子图对应飞行器的一个执行器,展示了执行器的实际输出与控制器指令之间的对比,以评估执行器的性能。
  2. 控制系统状态与期望轨迹对比图:包含四个子图,分别展示了飞行器的位置、速度、姿态以及角速度的实际状态与期望轨迹之间的对比,以评估控制系统的跟踪性能。
  3. 执行器故障检测与隔离滑模变量演变图: 展示了执行器故障检测与隔离系统的滑模变量在时间上的演变,以分析故障检测与隔离性能。

(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试,《运动控制算法--Python篇》,无人机,python,机器人,运动控制,算法

(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试,《运动控制算法--Python篇》,无人机,python,机器人,运动控制,算法

(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试,《运动控制算法--Python篇》,无人机,python,机器人,运动控制,算法

图2-9  绘制的子图文章来源地址https://www.toymoban.com/news/detail-853341.html

未完待续

到了这里,关于(2-3-3)位置控制算法:无人机运动控制系统——基于自适应反演滑模控制器的仿真测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 无人机原理::(一)模型框架与控制系统框架详解

    上图为PX4固件框架总览,蓝色方块是指飞控系统中的各个模块。 下面分别介绍各个模块的作用: Mavlink模块最为常用,可以调整为off_board模式以配合机载电脑,机载电脑可以将控制信息与飞控的姿态信息打包成MAVLink消息传给飞控 对于图中的位置控制与姿态控制模块,主要关

    2024年02月10日
    浏览(51)
  • 基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出虚拟现实动画

    目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1四旋翼无人机的动力学模型 4.2 PID控制器设计 4.3 姿态控制实现 4.4 VR虚拟现实动画展示 5.完整工程文件        基于PID控制器的四旋翼无人机控制系统的simulink建模与仿真,并输出vr虚拟现实动画,输出PID控制器

    2024年04月09日
    浏览(57)
  • 一种基于位置预测的无人机辅助海面自组网地理路由算法

    【摘  要】 为解决传统海上通信方式中卫星通信传输时延较长,岸基通信覆盖范围有限的问题,提出一种基于位置预测的无人机辅助海面自组网地理路由算法。所提算法采用高斯马尔科夫模型获取节点的预测位置。若遇到路由空洞,转发节点发起两跳转发过程。多因素决策考

    2024年02月03日
    浏览(52)
  • 超维空间S2无人机使用说明书——55、代码详解:基础PID算法控制无人机的跟随代码详解

    PID,即比例 Proportion、积分 Integral 和微分 Derivative 三个单词的缩写;比例积分微分控制,简称PID控制。 简单讲,根据给定值和实际输出值构成控制偏差,将偏差按比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。 常规 PID 控制器作为一种线性控制器。 步骤

    2024年01月21日
    浏览(59)
  • 无人机飞行控制、导航和路径规划的原理、技术和相关算法

    无人机飞行控制、导航和路径规划是无人机技术的核心组成部分,其原理和技术涉及多个学科领域。这些技术和算法的不断发展和优化,为无人机的应用和发展提供更强有力的支持。下面解释它们的原理、技术和相关算法。 飞行控制: 无人机飞行控制的基本原理是通过传感

    2024年04月12日
    浏览(48)
  • m基于PID控制算法的四旋翼无人机飞行控制simulink仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB   无人机采用常见的四旋翼无人飞行器,如图1所示。       PID 控制器,即控制器的控制方式为 P 比例调整, I 积分调整以及 D 微分调整三个部分构成, PID 控制器是目前为止应用最为广泛的控制方式。 PID 控制器具

    2023年04月22日
    浏览(75)
  • ICM-42670-P六轴MEMS运动传感器无人机智能手表运动设备IMU

    TDK InvenSense品牌各类产品,可支持算法定制与开发 TDK InvenSense公司的ICM-42670-P六轴MEMS运动跟踪装置结合了一个三轴陀螺仪和一个三轴加速度计。该设备针对的是需要超低功耗以驱动更长的电池寿命的消费者和物联网应用。该传感器提供低功耗的六轴和加速度计的工作模式。它

    2024年02月12日
    浏览(44)
  • 【无人机控制】基于模型预测控制MPC无人机实现轨迹跟踪附Matlab代码

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信       无

    2024年04月28日
    浏览(33)
  • (无人机方向)ros小白之键盘控制无人机(终端方式)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 ubuntu 18.04 pycharm ros melodic 做一个在终端中键盘输入指令,控制飞机起飞以及进入offbaord File-Settings-Project Interpreter-右边小齿轮Show All-选中正在使用的python 点击右边最下面的图标,打开Interpreter Path 添加/

    2024年02月15日
    浏览(39)
  • 无人机基础知识:多旋翼无人机各模式控制框图

    无人机(Unmanned Aerial Vehicle),指的是一种由动力驱动的、无线遥控或自主飞行、机上无人驾驶并可重复使用的飞行器,飞机通过机载的计算机系统自动对飞行的平衡进行有效的控制,并通过预先设定或飞机自动生成的复杂航线进行飞行,并在飞行过程中自动执行相关任务和

    2023年04月09日
    浏览(113)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包