精华内容
下载资源
问答
  • 2020-01-14 10:29:41

    一、倒立摆系统的研究目的和意义

         倒立摆控制系统(InvertedPendulumSystem简称IPS)是一个复杂的、不稳定的、非线性系统,是进行控制理论教学及开展各种控制实验的理想实验平台。倒立摆的典型性在于:作为被控对象,它是一个高阶次、不稳定、多变量、非线性、强耦合的复杂被控系统,可以有效地反应出控制中的许多问题。

         对倒立摆系统的研究能有效的反映控制中的许多典型问题:如非线性问题、鲁棒性问题、镇定问题、随动问题以及跟踪问题等。通过对倒立摆的控制,用来检验新的控制方法是否有较强的处理非线性和不稳定性问题的能力。同时,其控制方法在军工、航天、机器人和一般工业过程领域中都有着广泛的用途,如机器人行走过程中的平衡控制、火箭发射中的垂直度控制和卫星飞行中的姿态控制等。

        倒立摆的种类有很多,接其澎式可分为:悬挂式倒立摆、旋转式倒立摆、环形倒立摆和平面倒立摆;按级数可分为:一级、二级、三级、四级、多级等;接其运动轨道可分为:水平式、倾斜式;按控制电机 又可分为:单电机和多级电机。

        研究倒立摆系统具有的挑战意义不仅仅是由于级数的增加而产生的控制难度,并且由于他的本身所具有的复杂性、不稳定性以及非线性的特点进而不断研究拓展的新的理论方法,以应用到新的控制对象中,提供更好的实验理论和实验平台。对于机器人的直立行走,航天飞行器的飞行平稳控制都具有非常大的意义,不断进行理论与工业的实践结合,推动科学技术的发展,更加广泛的应用到经济活动中。这对于航空航天技术的进步具有非常大的理论意义和实际意义,具有非常广阔的研究前景。

    二、直线型一阶倒立摆原理

        倒立摆系统大致可以分为控制器、运动平台、受控杆三部分。直线型一阶倒立摆的控制器可以用计算机或者单片机实现,运动平台为直线型、受控杆为均匀质量铁杆。受控杆与运动平台相连。

         直线型一阶倒立摆受控过程如下:

                             状态一:系统处于自然稳定状态即受控杆自然下垂、运动平台速度为零、控制器未工作。

                             状态二:控制器工作,驱动运动平台运动,在惯性作用下,受控杆摆动。称为起摆状态。具体的解决控制方法有能量起摆

                              状态三:受控杆稳定控制,当受控杆上升到模型预计的小角度范围时,启动该控制算法。

                              状态四:受控杆稳定。倒立摆从自然稳定状态进入受控稳定状态。

     上述为倒立摆从自然稳定状态转移至受控稳定状态的控制过程。当然,采用不同的控制算法,其控制表述可能不同,当其最终目的一致。

    倒立摆视频汇总:自动学习起摆和稳定一阶倒立摆

                              VREP仿真之直线型一阶倒立摆:起摆与稳摆 

    附上Alan V. Oppenheim/奥本海姆对倒立摆的讲解:反馈举例-倒立摆

    其它博文链接:直线型一阶倒立摆1---概念篇





                             直线型一阶倒立摆2---建模



                             直线型一阶倒立摆3---控制器设计

                             直线型一阶倒立摆4---能量起摆

                             直线型一阶倒立摆5---硬件平台搭建

                             直线型一阶倒立摆6---软件设计

                                直线型一阶倒立摆7---总结

    有需要直线型一阶倒立摆的VREP仿真文件:可点击

    更多相关内容
  • 介绍了旋转倒立摆的结构原理,运用分析力学中的Lagrange方程建立了旋转倒立摆的线性数学模型,推导出其公式及较为准确的状态方程描述,分析了旋转倒立摆的不稳定性和可控性。设计了控制系统硬件电路及软件程序编写,...
  • 线性倒立摆模型的时间最优控制,王铁军,张明廉,本文对线性倒立摆模型的时间最优控制进行了研究。对线性倒立摆模型进行约当标准型变换,使之后的直接状态转移公式变得简单。用相
  • 倒立摆:Simulink建模

    千次阅读 2021-03-29 16:03:49
    倒立摆:Simulink建模 内容 在此页面中,我们概述了如何建立倒立摆系统的模型,刹车使用Simulink及其附件进行仿真。然后可以使用非线性仿真来测试模型的线性化版本的有效性。仿真模型还可以用于评估基于线性...

    倒立摆:Simulink建模

    内容

    在此页面中,我们概述了如何建立倒立摆系统的模型,刹车使用Simulink及其附件进行仿真。然后可以使用非线性仿真来测试模型的线性化版本的有效性。仿真模型还可以用于评估基于线性化模型设计的控制方案的性能。

    物理设置和系统方程式

    在此示例中,我们将考虑带有手推车的倒立摆系统的二维版本,其中放置被约束为在下图所示的垂直平面中移动。对于该系统,控制输入是 使推车水平移动的力,输出是摆的角位置 和推车的水平位置

    对于此示例,我们假设以下数量:
    (M)推车质量0.5公斤
    (m)摆质量0.2公斤
    (b)推车的摩擦系数为0.1 N / m / sec
    (l)到摆质量中心的长度0.3 m
    (I)摆的质量惯性矩0.006 kg.m ^ 2
    (F)施加在推车上的力
    (x)推车位置坐标
    垂直(向下)的(θ)摆角
    下面是该系统的两个自由图。

    由于手推车和摆锤之间的物理约束(销接头)会降低系统的自由度,因此该系统在Simulink中中进行建模具有挑战性。手推车和摆锤都具有一个自由度(为分别 状语从句: )。我们修正牛顿第二定律( )的第一原理生成这些自由度的微分方程,如下所示。
    (1)
    (2)
    但是,有必要包括相互作用力 以及 手推车和摆锤之间的相互作用力,以便对系统的动力学进行完全建模。这些力量的加入需要建模 -和 质量的钟摆中心的翻译-components除了其旋转动力性能。在“ 倒立摆:系统建模” 教程中,相互作用力 进行了代数求解。
    通常,我们想利用 Simulink的建模功能来为我们代数。因此,我们将为摆的附加 -和- 组分方程建模,如下所示。
    (3)
    (4)
    (5)
    (6)
    但是,位置坐标 是的精确函数 。因此,我们可以用的导数表示它们的导数 。首先解决 -component方程,我们得出以下结果。
    (7)
    (8)
    (9)
    然后处理 -component方程式,我们得到以下结果。
    (10)
    (11)
    (12)
    然后,这些表达式可以代入表达式 从上方如下。
    (13)
    (14)
    现在,我们可以在Simulink中表示这些方程式。Simulink可以直接与非线性方程式一起使用,因此没有必要像在“ 倒立摆:系统建模” 页面中那样线性化这些方程式。

    用Simulink建立非线性模型

    我们可以按照下面给出的步骤,使用上面导出的公式在Simulink中建立倒立摆模型。
    • 首先在MATLAB命令窗口中键入 simulink 以打开Simulink环境。然后,通过在打开的 Simulink起始页 窗口中选择“ 新建”>“ Simulink”>“空白模型” ,或按 Ctrl-N, 在Simulink中打开一个新模型窗口。
    • 更改每个Fcn块的标签以匹配其关联功能。
    • 双击每个Integrator块以添加相关状态变量的 State Name :。有关示例,请参见下图。还要将“ 初始条件” 更改为 钟摆角度”为“ pi”,以表示钟摆开始笔直指向上方。

    • 从Simulink / Signal Routing库中插入四个多路复用器(Mux)块,每个Fcn块一个。
    • 分别从Simulink / Sinks和Simulink / Sources库中插入两个Out1块和一个In1块。然后双击块的标签以更改其名称。两个输出用于手推车的“位置”和摆的“角度”,而一个输入用于应用于手推车的“力”。
    • 将Mux块的每个输出连接到相应Fcn块的输入。

    现在我们将四个方程式(1),(2),(13)和(14)分别输入到Fcn块中。让我们从下面重复的等式(1)开始。
    (15)
    • 按照上一步中指定的顺序将这三个输入连接到此Mux块。
    • 双击第一个Fcn块,然后输入 xddot 的方程式,如下所示。

    现在,让我们输入方程式(2),下面将重复进行。
    (16)
    • 将上面的方程式输入到Fcn块中,更改Mux块的输入数量,然后以正确的顺序将正确的信号连接到Mux块。
    • 对下面重复的方程式(13)和(14)重复此过程。
    (17)
    (18)
    完成所有这些步骤后,生成的模型应如下所示。

    为了将所有这些组件保存为单个子系统块,请首先选择所有块,然后右键单击所选部分,然后从菜单中 选择“ 从选择中 创建子系统” 。您的模型应如下所示。您也可以通过右键单击 此处 ,然后选择“ 将链接另存为...” 来下载该系统的文件。

    用Simscape建立非线性模型

    在本节中,我们还显示了如何使用Simulink的Simscape扩展的物理建模模块来构建倒立摆模型。Simscape库中的块代表实际的物理组件;因此,可以构建复杂的多体动力学模型,而无需像上面通过应用牛顿定律所做的那样,根据物理原理来构建数学方程。
    打开一个新的Simulink模型,并按照以下步骤在Simscape中创建倒立摆模型。为了使自己定向,我们将假设一个坐标系统,其中小车沿- 方向(向右正 方向)移动,而正-方向朝上。按照标准惯例, 然后将正方向指向运动平面。
    • 从Simscape / Multibody / First Generation(1G)/ Bodies库中插入一个Body块来表示购物车。遵循本页顶部给出的系统参数,双击块,然后将 质量: 设置为“ 0.5”,单位为 kg 。默认情况下,Body块包括两个端口。由于我们需要端口来定义摆锤与手推车的连接位置以及施加外力和摩擦力的位置,因此必须添加第三个端口。这可以通过“ 位置”选项卡右侧的按钮完成。由于手推车只能沿一个维度移动,因此两个力必须沿该维度并置( -方向)。由于我们实质上是将购物车建模为只能平移的点质量,因此您不必更改任何其他默认参数。但是,我们计划使用Simscape对系统的运动进行动画处理,因此将创建额外的端口以相对于其重心(CG )定义购物车的四个角(仅二维)。下图显示了推车主体的可能定义。

    • 插入第二个Body块来代表摆锤。双击该块,然后将 质量: 设置为“ 0.2”,单位为 kg。由于摆只能绕- 轴旋转,因此唯一需要定义与该主方向相关的惯性。为简单起见,定义惯量: 等于“ 0.006 * eye(3)”,单位为 kg * m ^ 2 。由于我们将摆锤建模为具有大小和质量的刚体,因此该本体可以旋转,因此正确定义摆锤在推车上的附着位置及其CG非常重要。具体来说,定义连接点 CS1 位置为[[0 0 0]”,并且原点 相邻 并且将 CG 定义为与附件 CS1 (如上定义)相距0.3米。还定义摆的四个角。确保显示定义连接点的端口。在“ 可视化” 选项卡下,您还可以更改摆锤的颜色以使其从购物车中脱颖而出。

    • 接下来,从Simscape / Multibody / First Generation(1G)/ Jjoints库中添加一个Revolute块,以定义将摆锤连接到购物车的关节。默认情况下,关节将被定义为围绕- 轴旋转,该轴与我们正在建模的情况相匹配。将与推车相对应的车身模块连接到关节的基础端口(B ),将与摆锤相对应的车身模块连接到关节的从动端口( F )。双击“ Revolute”块,并将“ 传感器/执行器端口数: ”设置为“ 2”。
    • 然后从Simscape / Multibody / First Generation(1G)/ Sensors&Actuators库中添加一个Joint Initial Condition块和一个Joint Sensor块,并将这些块连接到Revolute块。双击“联合初始条件”块,然后选中“ 启用”框。我们可以将默认值用于关节的初始位置和速度。采用0度的初始位置对应于根据上面的摆体的定义垂直向上指向的摆。这与的原始定义不一致 ,但是它将使响应结果与本示例其他页面中从线性化模型生成的结果一致。接下来,双击“关节传感器”块,然后将“角度” 测量的单位更改为 rad 。角位置是此关节所需的唯一测量,其他框可能保持未选中状态。
    • 从Simscape / Multibody / First Generation(1G)/ Joints库中添加两个Prismatic块,以定义手推车的平移自由度以及对手推车的作用力。由于手推车在技术上是点质量,因此我们只需要一个棱柱块,但是通过使用两个棱柱块,我们可以在不同的位置施加力。双击每个棱镜块,然后将“ 动作轴”更改为“ [1 0 0]”,以反映两个力沿- 方向作用的事实。然后,将每个模块的从动端口(F )连接到代表手推车的车身模块上施加力( CS1 )和摩擦力( CS2 )的端口。
    • 接下来,从Simscape / Multibody / First Generation(1G)/ Bodies库中添加两个Ground块,以定义推车运动的基础。具体来说,将每个接地块的输出连接到每个棱柱形块的基本端口( B )。
    • 对于您刚刚创建的接地块之一,双击该块并选中“ Show Machine Environment”端口框。然后从Simscape / Multibody / First Generation(1G)/ Bodies库中添加一个Machine Environment模块,并将其连接到您刚刚为其添加端口的Ground模块。机器环境模块允许我们在仿真中定义重力。在这种情况下 ,m / s ^ 2 单位的默认方向(负方向)和大小(“ 9.81”)是正确的。该块还允许我们定义可视化和数值求解器的参数。对于此示例,默认参数是合适的。
    • 接下来,从Simscape / Multibody / First Generation(1G)/ Sensors&actuators库中添加两个关节执行器模块和一个关节传感器模块。关节致动器模块将用于生成外部作用力和摩擦力,而关节传感器模块将感测小车的运动。注意,还有一个平移摩擦块可用,但是由于我们仅采用简单的粘性模型,因此我们将自己计算摩擦力。双击“棱柱”块之一,并将“ 传感器/执行器端口数: ”设置为“ 1”(对于力执行器)。对于其他棱柱形块,设置 传感器/执行器端口数: 到“ 2”(一个用于力致动器,另一个用于手推车传感器)。然后按所述连接关节执行器和关节传感器模块。对于这种情况,关节执行器模块的默认值已足够,但是由于计算摩擦力需要速度,因此我们必须将关节传感器模块更改为输出位置和速度。双击“关节传感器”模块,然后选中“ 速度 ”框,同时选中“ 位置 ”框。无需更改默认指标单位。同时取消选中“将 所选参数作为一个信号输出 ”复选框。
    • 从Simulink / Math Operations库中添加一个增益块,以表示粘性摩擦系数 。按照页面顶部的定义将“增益”设置为“ 0.1”,并将输入连接到小车的关节传感器模块的速度输出,并将增益的输出连接到摩擦力的关节执行器。
    • 接下来,从Simulink / Ports&Subsystems库中添加两个Out1块和一个In1块。将Out1模块连接到其余的关节传感器模块输出,将In1模块连接到其余的关节执行器输入。
    • 最后,如下图所示连接并标记组件。您可以按照与翻转块类似的方式旋转块,即,右键单击块,然后从“ 旋转和翻转” 菜单中选择“ 旋转块 ” 。

    您还可以将该模型另存为单个子系统块,如上一节所述。您可以通过右键单击块并从结果菜单中选择“ 背景颜色” 来更改子系统的 颜色 。您可以通过右键单击 此处 下载完整的模型文件,但请注意,您需要Simulink的Simscape附加组件才能运行该文件。我们在“ 倒立摆:Simulink控制器设计” 页面中使用此模型 。

    产生开环响应

    现在,我们将模拟倒立摆系统对施加到推车上的冲击力的响应。该仿真需要脉冲输入。由于Simulink库中没有这样的模块,因此我们将使用Pulse Generator模块来近似单位脉冲输入。我们可以使用上面生成的任何一个模型,但是,在这种情况下,我们将使用Simscape模型,因为它可以使我们可视化倒立摆系统的运动。请按照以下步骤进行操作。
    • 打开上面生成的倒立摆simscape模型。
    • 从Simulink / Sources库中添加一个Pulse Generator模块。双击该块并更改参数,如下所示。特别是,将“ 期间: ”更改为“ 10”。由于我们将模拟运行10秒钟,因此可以确保仅生成一个“脉冲”。还要将 幅度 更改为“ 1000”,并将 脉冲宽度(周期的百分比) 更改为“ 0.01”。这些设置一起产生一个近似于单位脉冲的脉冲,因为输入的幅度在很短的时间内非常大,脉冲的面积等于1。

    • 从Simulink / Sinks库中添加一个范围块。
    • 为了在示波器上显示两个输入,请右键单击“示波器”块,选择“ 信号和端口”, 然后将“ 输入端口数 ”更改为“ 2”。
    如图所示,连接模块并标记连接到示波器模块的信号。

    将该系统另存为Pend_Openloop.slx,或右键单击 此处 并选择“ 将链接另存为...”进行下载
    在开始仿真之前,我们要启用倒立摆系统的可视化。从模型窗口顶部的菜单中,选择“ 仿真”>“模型配置参数” 。然后从窗口左侧的目录中选择 Simscape Multibody 1G 。然后选中 仿真过程 显示动画 的框,如下图所示。

    现在,开始模拟(从“ 模拟” 菜单中选择 “运行” 或输入 Ctrl-T )。在仿真过程中,倒立摆的动画(如下图所示)将可视化系统产生的运动。

    然后打开范围。您将看到以下有关摆角和手推车位置的输出。

    请注意,钟摆反复摆动完整的旋转,其中角度以 弧度翻转。此外,手推车的位置不受限制地增长,但在摆动的摆锤的影响下会摆动。这些结果与“ 倒立摆:系统分析” 页面中显示的开环仿真结果相差很大。当然,这是由于该模拟采用了完全非线性的模型,而先前的分析却依赖于倒立摆模型的线性逼近。为了更直接地将仿真模型的结果与先前的结果进行比较,我们将从仿真模型中提取一个线性模型。

    从仿真中提取线性模型

    除了将我们的仿真模型与先前的结果进行比较之外,出于分析和设计的目的,可能还需要提取一个线性模型。通常应用于动态系统分析及其关联控制设计的许多分析技术只能应用于线性模型。因此,可能期望从非线性仿真模型中提取近似线性模型。我们将在Simulink中完成此操作。
    • 首先,打开上面生成的Simulink模型之一Pend_Model.slx或Pend_Model_Simscape.slx。
    • 如果使用变量生成了仿真模型,则必须在执行线性化之前在MATLAB工作区中定义物理常数。这可以通过在MATLAB命令窗口中输入以下命令来完成。
    M = 0.5;
    m = 0.2;
    b = 0.1;
    I = 0.006;
    g = 9.8;
    l = 0.3;
    • 接下来,从模型窗口顶部的菜单中选择“ 分析”>“控制设计”>“线性分析” 。这将导致 线性分析工具 窗口打开。
    • 为了执行我们的线性化,我们首先需要确定模型的输入和输出以及我们希望对其进行线性化的工作点。首先,右键单击代表Simulink / Simscape模型中“力”输入的信号。然后从结果菜单中选择“ 线性分析点”>“开环输入 ”。同样,右键单击模型的两个输出信号(摆角和小车位置)中的每一个,然后在每种情况下从结果菜单中选择“ 线性分析点”>“开环输出 ”。现在,应该在模型上通过箭头符号标识最终的输入和输出,如下图所示。

    • 接下来,我们需要确定要线性化的工作点。从“ 工作点:” 菜单中,选择“ 修剪模型” ,如下图所示。这将打开“ 修剪模型” 窗口。在此窗口中,选择绿色三角形指示的 开始修整 按钮。这将创建操作点 op_trim1
    • 由于我们希望检查该系统的脉冲响应,因此请返回“ 线性分析” 选项卡并选择“ 脉冲” ,如下图所示。

    • 最后,从“ 操作点:” 拖放到菜单中选择 op_trim1 ,然后由绿色小三角形表示的“ 脉冲” 按钮。这将自动生成脉冲响应图和线性化模型 linsys1
    • 为了将结果与“ 倒立摆:系统分析” 页面中生成的图进行比较,有必要更改- 轴比例缩放。这可以通过在快捷菜单中选择“ 属性” 来实现。然后出现的窗口应如下所示,其中上图是摆角的响应,下图是手推车位置的响应。

    这些图与“ 倒立摆:系统分析” 页面中生成的图非常相似,但不完全相同。
    我们还可以将生成的线性化模型导出到 MATLAB工作区中,以进行进一步的分析和设计。只需在 线性分析工作区中 linsys1 对象上单击 鼠标 右键以复制该对象,即可完成此操作。然后在 MATLAB工作区中 单击以对象为对象。
    展开全文
  • 文章目录基于STM32控制的旋转倒立摆前言一、旋转倒立摆的结构1.相对编码器与绝对编码器2.相对编码器与绝对编码器的信号采集3.STM32编码器模式4.使用STM32CubeMx配置过程二、倒立摆模型建立三、实验方案与实验现象1....

    **

    基于STM32控制的旋转倒立摆

    **


    前言

    近期在学习简易旋转倒立摆装置,倒立摆其实是一个十分经典的自动控制模型,不过开始学习了解结构和原理还是花了很多时间,在思路以及调试过程中遇到了很多困难。
    我认为倒立摆有两个难点,一个是自动起摆一个是机械结构,其中自动起摆涉及到PID算法与运动方程的求解,而机械结构主要是尽量减小转动阻尼同时避免旋转时线的缠绕。我买了平衡小车家的机械结构套件,他们为了避免线缠绕使用了导线环,这是一个好东西,可以完美解决导线缠绕问题。主要想讲一下我做的整个过程以及反思总结。


    一、旋转倒立摆的结构

    旋转倒立摆实物图
    整个机械结构主要是三个部分用于带动整个结构运动的电机,一个测量主动摆位置的编码器,以及一个测量摆杆位置的编码器。查阅资料后发现两者是有区别的,一个是相对编码器(测量主动摆位置),一个是绝对编码器(测量随动摆位置的),下面会主要介绍什么是增量式编码器与绝对编码器。

    1.相对编码器与绝对编码器

    增量式编码器:增量式旋转编码器在电机旋转时输出脉冲。 要使用增量编码器确定轴
    位置, 必须知道起始位置并使用外部电路来计算输出脉冲数。
    绝对编码器:绝对旋转编码器输出对应于旋转角度的数字代码。 无需计算脉冲就能了解电机轴的位置。 只需要读取编码器的数字输出。
    增量式编码器的特点:增量式编码器非常适合测速度,可无限累加测量。但是存在零点累计误差,抗干扰较差,接收设备的停机需断电记忆,开机应找零或参考位等问题。增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。
    绝对编码器的特点:角位移传感器为单圈绝对值编码器,由机械位置决定的每个位置是唯一的(每个位置的高低电平不同),不需要找参考点,抗干扰性较强,一般用来测量位置位移。
    简单来说增量编码器就是通过是输出脉冲让后让单片机计数脉冲数来算速度,绝对编码器就是直接输出角度变化的数字量。而我使用的是增量式编码器中的增量式霍尔编码器。霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。
    huoerbianmaq

    2.相对编码器与绝对编码器的信号采集

    知道了两种编码器的工作方式就能清楚地知道如何去使用了,其中增量式霍尔编码器通过计算编码器产生的脉冲个数从而获取运动方向和速度。绝对编码器其实核心是一个电位器,它的阻值会随着旋转角度不同而不同。 这里使用的是STM32的编码器模式获取增量式霍尔编码器的信号。绝对编码器主要是使用单片机的AD采样功能获取它的信号。

    3.STM32编码器模式

    在STM32中,编码器使用的是定时器接口,通过数据手册可知,定时器1,2,3,4,5和8有编码器的功能,而其他没有。编码器输入信号TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
    在这里插入图片描述
    STM32编码器有三种工作模式,其中模式三即为上文中提到的四倍频模式。
    在这里插入图片描述

    4.使用STM32CubeMx配置过程

    (1) 首先打开timer3的encoder模式:
    在这里插入图片描述
    (2) 下面才是重点,配置具体定时器的参数:
    在这里插入图片描述
    选择的encoderMode是 TI1和TI2模式。这种模式下,AB两相的上升沿和下降沿都会计数,所以计数值是实际值的4倍,需要做分频。还有个地方需要解释一下,我刚开始的时候就是把这里的设置没搞清楚,看Polarity参数设置的是Rising Edge。这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检测AB相的上升沿,下降沿还是同样会计数的。Input Filter滤波值是从1-15,看情况设定,是用来滤除一些杂波的。
    (3) 生成代码这样基本就配置好了,生成mdk工程。然后就是添加应用代码了。在初始化中添加打开定时器的encoder模式:

    HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
    

    然后定期调用下面这一句函数就可以获取到encoder编码器的计数值:

    enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim3));//获取定时器的值
    

    二、倒立摆模型建立

    通过牛顿力学公式,在较为理想的情况下(无摩擦,主动摆、随动摆都是质量均匀的刚体)对倒立摆系统进行建模。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    可以发现倒立摆系统在右半平面存在极点,它是一个不稳定的系统,同时它也是一个非线性系统。

    三、实验方案与实验现象

    1.整体方案

    倒立摆是一种非线性、不稳定系统,而PID控制对于线性系统控制效果较好,对于倒立摆系统的建模是通过将目标值附近进行线性化得到的传递函数模型,进而通过PID控制将系统调控的稳定。对于初始位置离目标值较远,近似线性化模型已经不太吻合,PID就达不到很好的控制效果。所以起始阶段选用能量控制,让倒立摆运动到适合PID控制的位置。
    在这里插入图片描述
    关于能量控制:
    在这里插入图片描述
    摆杆的能量其实是一个系数可以改变的积分,所以给定了能量控制策略在这里插入图片描述
    摆杆一共有a>0,𝜃>0;a>0,𝜃<0;a<0,𝜃>0;a<0,𝜃<0;(a为摆杆加速度)四种运动状态,开始给摆杆一个速度,随后摆杆会摆会到𝜃=0,但是速度不为0,此时给倒立摆一个与摆杆运动方向相反的速度,之后摆杆状态为a<0,𝜃<0;等再次𝜃=0时,速度不为0,此时再次给倒立摆一个与摆杆运动方向相反的速度,之后会重复a>0,𝜃<0;a<0,𝜃>0;这两个状态,倒立摆能量就会积攒,最后达到目标位置附近。
    部分代码如下:

    //能量控制
    	float w0 = (float)sqrt((double)(mP*g*Lk)/Inertia);
    	float E = ((mP*g*Lk)/2)*(((pow((double)(pendulum_speed/w0),2))) + cos(pendulum_angle) - 1);
    	float torque_swing = Kv*(E-E0)*sign(pendulum_speed*cos(pendulum_angle));
    	return torque_swing;
    
    //角度控制
    int balance(float Angle)
    {  
       float Bias;                       //倾角偏差
    	 static float Last_Bias,D_Bias;    //PID相关变量
    	 int balance;                      //PWM返回值 
    	 Bias=Angle-ZHONGZHI;              //求出平衡的角度中值 和机械相关
    	 D_Bias=Bias-Last_Bias;            //求出偏差的微分 进行微分控制
    	 balance=PID.Balance_KP*Bias + D_Bias*PID.Balance_KD;   //===计算倾角控制的电机PWM  PD控制
       Last_Bias=Bias;                   //保持上一次的偏差
    	 return balance;
    }
    

    2.实验现象与上位机数据

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    通过串口发送数据我获取了倒立摆电机电压,位置传感器的值,以及角度传感器的值,从图中可以看出倒立摆角度基本能维持在180°附近,但位置有少许波动,但基本能在很小范围内稳定,效果能基本符合预期。
    起摆过程是比较理想的开始给予一次速度后,在到达角度为0的时候给予摆臂和摆杆相反方向的速度,两次能量给予过后倒立摆就能到达目标位置附近。位置也能基本稳定在一个小范围内,第二幅图中后半部分是人为加入扰动之后位置的值,可以看出倒立摆能基本为定在目标位置附近,但是不如最初稳定,其次单片机AD采样的数值由于有噪声会有跳动,虽然已经将AD采样的值转化为角度,但是会有±1°左右的误差,这会导致目标位置时刻在变化,所以倒立摆会时刻调整弥补这种误差,这是电压有时候跳变较大的原因。从采集的数据来看实验现象基本与理论相符合,但抗干扰性较差,说明实验PID值还需要进一步调整,但基本现象符合预期。
    最后的能量曲线也可看出能量基本维持不变,中间有一段能量跳变是因为经过传感器的死区传感器数值存在较大的跳变这会导致速度产生突变进而获得的能量数值不准确,所以我选择基于能量是判断角度为0根据速度方向,从而去给电机与摆杆相反运动方向的电压就可避免因为死区存在电压跳变而导致能量突变的问题。

    反思与总结

    1. 完成以上这个小任务是花费了很长时间的,前前后后两个月,主要的问题体现在三个方面包括基础知识的欠缺、思路不是很明确、心态的调整方面。整个倒立摆任务的完成需要理解机械结构、确定方案以及涉及相应的代码。首先是机械结构,倒立摆的机械结构其实就是一个电机两个编码器,但刚开始AB式增量式霍尔编码器不太明白怎么使用,花了一定时间才查到资料怎么用STM32编码器获取数据的。最主要的问题是使用摆杆上的角度编码器的时候,没有去测试每一根线是做什么用的,举个例子AB式增量霍尔编码器一共是六根线,两根是电机供电、两根是编码器供电、两根是编码器的脉冲,角度编码器只有三根线,因为它的原理就是一个电位器,这是犯得一个比较低级的错误,误认为中间的一根线为改变阻值的线(因为一般电位器都是两边为定值),这导致后面控制摆杆运动的时候由于数据获取不准确一直没有正常的效果,最大的问题出现在开始了解结构上,应该是一步一步测试知道怎么用。
    2. 方案的选定上其实找了很多别人的方案,不过是只拿到了程序,有很多小的地方不够理解,只是看着别人的现象成功,不够理解别人是如何实现的。总结来说就是思路不够清楚,单纯的看别人代码去了,代码可能只是每个人都是对的,但是不一定适用每个人的机械结构,具体的应该是理解原理自己进行微调,也就是说需要一个完整的正确的方案,再去开始实施,不然只看代码,对于调控硬件来说,不会起到什么作用,相反会因为一些机械结构反应和别人不一样而特别困惑。整个环节实现以后,其实去查了一些资料包括系统的建模,方案为什么使用等一些原理,其实更有助于帮助理解整个倒立摆系统,单一的看代码其实本末倒置,后续调起来也比较浪费时间。
    3. 其次比较大的问题就是,相关单片机的知识有一段时间没有用过了,很多都忘了,整个倒立摆系统要用到定时、中断、AD采样、PWM波输出、串口通信等功能,是一步一步看着视频一个功能一个功能学习的,中间出现了很多各种各样的问题,主要原因都是不太熟悉单片机这一块,每一个功能调试也浪费了一些时间。
    4. 最后是做的整个过程中在心态方面的问题,因为时间很长,在中间一段时间其实是比较困惑的,方向不对,查资料很多不适合或者导师给的资料需要很久才能看懂等等,有一段时间比较没进度、没方向,所以心态也比较差,这就导致做事效率比较低,是一个恶性循环,之后的学习中是需要尽快调整这种不好的状态的。
      整个小任务做完以后,其实收获还是很多的,最重要的是学会遇到问题的解决方式,先查资料怎么去做,再去一步步get小细节,先有大方向再去做小的一步一步的,对于这次的任务来说直接的体现形式其实就是一段代码,但只看代码其实起不了很大的作用,相反出现不同的现象也不知道怎么解决会浪费更多的时间。其次对于PID的理解以及单片机的一些基本功能的使用也有了更一步的了解,以前不熟悉或者忘记的部分有了更深的理解。
    展开全文
  • 在单摆的基础上,构造了具有双时滞控制项的倒立摆,研究讨论了具双时滞倒立摆系统方程的稳定性.从对系统线性化方程的特征方程根的分布分析入手,给出了滞量对系统稳定性影响的具体结论和公式.最后,通过数值模拟验证了...
  • Matlab代码,可以复制到matlab里,查看仿真结果

    前言

    SLIP模型是Hopping的重要模型,可以使用raibert方法控制这个混合动力学模型

    代码

    main函数

    robot.m = 1;
    robot.g = 10;
    robot.ground = 0;
    robot.l = 1;
    robot.control.k = 100;
    robot.control.T = pi*sqrt(robot.m/robot.control.k);
    robot.control.kp = 0.1;
    robot.control.vdes = [0 0.5 0.6 0.9 1.0 1.1];
    % [0 0.5 0.6 0.9 1.0 1.1 0.7 0.3 0];[0 0.1 0.2 0.3 0.4 0.5];
    robot.control.theta = asin(robot.control.vdes(1)*robot.control.T/(2*robot.l)) + robot.control.kp * (robot.control.vdes(1) - robot.control.vdes(1));
                          
    robot.fps = 20;
    
    %%%% 初始条件 %%%%
    y0 = 1.2; xdot = robot.control.vdes(1); x0 = 0; y0dot = 0;
    z0 = [x0 xdot y0 y0dot];
    t0 = 0;
    z1 = z0(2:3);
    steps = length(robot.control.vdes); % 仿真步数
    %%%% main %%%%
    options = optimset('TolFun',1e-10,'TolX',1e-10,'Display','iter');
    [zstart,fval,exitflag] = fsolve(@fixpt,z1,options,robot);
    zstart = [0 zstart 0 robot.l*sin(robot.control.theta) ...
                         y0 - robot.l*cos(robot.control.theta)];
    [t_all,z_all,v_apex]=bounce(zstart,t0,steps,robot);
    figure(1)
    animate(t_all,z_all,robot); % z_all = [x0 xdot y0 y0dot xfoot yfoot];
    
    % figure(2)
    % subplot(2,1,1)
    % plot(t_all,z_all(:,1),'r',t_all,z_all(:,3),'b');
    % % plot(t_all,t_all(:,3),'b');hold off;
    % legend('x','y');
    % xlabel('时间','FontSize',12);ylabel('位移','FontSize',12);
    % subplot(2,1,2)
    % plot(t_all,z_all(:,2),'r',t_all,z_all(:,4),'b');
    % % plot(t_all,t_all(:,4),'b');hold off;
    % legend('Vx','Vy');
    % xlabel('时间','FontSize',12);ylabel('速度','FontSize',12);
    
    figure(2)
    subplot(2,1,1)
    plot(t_all,z_all(:,1),'r');hold on;
    plot(t_all,z_all(:,3),'b');
    legend('x','y');
    xlabel('时间','FontSize',12);ylabel('位移','FontSize',12);
    subplot(2,1,2)
    plot(t_all,z_all(:,2),'r');hold on;
    plot(t_all,z_all(:,4),'b');
    legend('Vx','Vy');
    xlabel('时间','FontSize',12);ylabel('速度','FontSize',12);
    
    figure(3)
    plot(z_all(:,1),z_all(:,3),'r');
    
    figure(4)
    stairs(robot.control.vdes,'k--','LineWidth',2);hold on;
    stairs(v_apex,'r','LineWidth',2);
    legend('v_desired','v_actual');
    
    

    其他函数

    main函数通过调用bounce函数来实现SLIP模型的跳动,因此要定义bounce函数,同时也要定义一个动画仿真函数

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%% 全部函数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%% 总运动函数 %%%%
    function [t_all,z_all,v_apex]=bounce(z0,t0,steps,robot)% z0 = [x0 xdot y0 y0dot xfoot yfoot];
    t_al = [0]; z_al = z0;v_tem_apex = [];
    for i = 1:steps
        robot.control.theta = asin(z0(2)*robot.control.T/(2*robot.l)) + robot.control.kp * (z0(2) - robot.control.vdes(i));
                          
        [t_temp1,z_temp1] = fall(z0,t0,robot); %下落积分
        t0 = t_temp1(end); z0 = z_temp1(end,1:6); 
        [t_temp2,z_temp2] = stance(z0,t0,robot); %触地积分
        t0 = t_temp2(end); z0 = z_temp2(end,1:6);
        [t_temp3,z_temp3] = fly(z0,t0,robot);%上升积分
        t0 = t_temp3(end); z0 = z_temp3(end,1:6);
        v_tem_apex = [v_tem_apex z0(2)];
        t_al = [t_al;t_temp1(2:end);t_temp2(2:end);t_temp3(2:end)];
        z_al = [z_al;z_temp1(2:end,:);z_temp2(2:end,:);z_temp3(2:end,:)];
    end
    t_all = t_al;
    z_all = z_al;
    v_apex = v_tem_apex;
    
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%% 分批运动函数 %%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%% 空中下落 %%%%
    function [t_temp1,z_temp1] = fall(z0,t0,robot) % z0 = z0 = [x0 xdot y0 y0dot xfoot yfoot];
    dt = 10;
    tspan = linspace(t0,t0+dt,dt*1000);
    options = odeset('RelTol',1e-9,'AbsTol',1e-9,'Events',@contact);
    [t,z] = ode45(@flight,tspan,z0(1:4),options,robot);
    t_temp1 = t;
    z_temp1 = [z ...
               z(:,1) + robot.l*sin(robot.control.theta) ...
               z(:,3) - robot.l*cos(robot.control.theta)];
    %%%% 支撑相 %%%%
    function [t_temp2,z_temp2] = stance(z0,t0,robot)% z0 = z0 = [x0 xdot y0 y0dot xfoot yfoot];
    x_foot = z0(1) + robot.l*sin(robot.control.theta);
    z0(1) = -robot.l*sin(robot.control.theta); % 改成相对位置
    dt = 10;
    tspan = linspace(t0,t0+dt,dt*1000);
    options = odeset('RelTol',1e-9,'AbsTol',1e-9,'Events',@release);
    z1 = z0(1:4);
    [t,z] = ode45(@stancefun,tspan,z1,options,robot);
    z(:,1) = z(:,1) + x_foot; % 改回绝对位置
    t_temp2 = t;
    z_temp2 = [z ...
               x_foot*ones(length(z(:,1)),1)...
               zeros(length(z(:,1)),1)];
    %%%% 返回顶点 %%%%
    function [t_temp3,z_temp3] = fly(z0,t0,robot)
    dt = 10;
    tspan = linspace(t0,t0+dt,dt*1000);
    options = odeset('RelTol',1e-9,'AbsTol',1e-9,'Events',@apex);
    [t,z] = ode45(@flight,tspan,z0(1:4),options,robot);
    t_temp3 = t;
    z_temp3 = [z ...
               z(:,1) - robot.l*sin(robot.control.theta) ...
               z(:,3) - robot.l*cos(robot.control.theta)];
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  动力学方程  %%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    function zdot = flight(t,z,robot)
    zdot = [z(2) 0 z(4) -robot.g]';
    
    function zdot = stancefun(t,z,robot)
    x = z(1); y = z(3); %x & y position of com wrt ground
    l = sqrt(x^2+y^2);
    F_spring = robot.control.k*(robot.l-l);
    Fx_spring =  F_spring*(x/l);
    Fy_spring = F_spring*(y/l);
    Fy_gravity = robot.m*robot.g;
    xddot = (1/robot.m)*(Fx_spring);
    yddot = (1/robot.m)*(-Fy_gravity+Fy_spring);
    zdot = [z(2) xddot z(4) yddot]';
    
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  检测函数  %%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function [gstop,isterminal,direction] = contact(t,z0,robot)
    gstop = z0(3) - robot.l*cos(robot.control.theta);
    isterminal = 1;
    direction = -1;
    
    
    function [gstop,isterminal,direction] = release(t,z0,robot)
    gstop = z0(3) - robot.l*cos(robot.control.theta);
    isterminal = 1;
    direction = 1;
    
    function [gstop,isterminal,direction] = apex(t,z0,robot)% z0 = z0 = [x0 xdot y0 y0dot xfoot yfoot];
    gstop = z0(4);
    isterminal = 1;
    direction = -1;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%  可视化函数  %%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    function animate(t_all,z_all,robot)% z_all = [x0 xdot y0 y0dot xfoot yfoot];
    t_inter = linspace(t_all(1),t_all(end),robot.fps*(t_all(end)-t_all(1)));
    [m,n] = size(z_all);
    for i = 1:n
        z_inter(:,i) = interp1(t_all,z_all(:,i),t_inter);
    end
    camera_rate = (max(z_all(:,1))-min(z_all(:,1)))/length(t_inter);
    
    window_xmin = -1.0*robot.l; window_xmax = robot.l;
    window_ymin = -0.1; window_ymax = 1.9*robot.l;
    axis('equal');
    set(gcf,'Color',[1,1,1])
    % axis([window_xmin window_xmax window_ymin window_ymax])
    
    
    for i = 1:length(t_inter)
        z_temp = z_inter(i,:);
        x0 = z_temp(1);  y0 = z_temp(3);  xfoot = z_temp(5);  yfoot = z_temp(6);
        plot(x0,y0,'ko','MarkerEdgeColor','black','MarkerSize',20,'MarkerFaceColor','k');
        line([xfoot x0],[yfoot y0],'LineWidth',4,'Color','green'); % 腿
        line([-10 10], [0 0],'LineWidth',2,'Color','black'); % 地面
        window_xmin = window_xmin + camera_rate;
        window_xmax = window_xmax + camera_rate;
        axis('equal')
        axis off
        axis([window_xmin window_xmax window_ymin window_ymax])
    
        pause(0.05);
    end
    
    
    展开全文
  • 直线型一阶倒立摆4---能量起摆

    千次阅读 2020-01-14 17:48:05
    五、能量起摆 能量起摆这一概念来自于K.J.Astrom and K.Furuta的... 摘要:这篇文章介绍了能量控制和展示了如何用该方法设计策略控制倒立摆起摆。 导论 倒立摆起摆是一个经典的控制学实验,see Furutaet...
  • 一级倒立摆装置

    2022-05-08 15:52:21
    一级倒立摆装置
  • 这是在一次课程实验中遇到的,由于比较感兴趣,就多花了些时间研究了一下,实验设备是前海格致便携倒立摆,编写语言是C语言,如果你需要使用其他语言,我相信在理解位置型PID的原理后你将能够非常轻易的编写出来。...
  • 倒立摆控制系统

    千次阅读 2019-11-08 19:07:19
    倒立摆是按照电赛的要求进行制作,硬件使用了带编码器反馈的减速电机、光电编码器和32F103ZET6单片 机最小系统。注意事项:结构一定要稳定,底盘一定要稳!倒立摆系统很敏感,一点不稳定都会进行放大,从而影响算法...
  • PID参数整定具体方法-圆周倒立摆

    千次阅读 多人点赞 2019-07-26 17:40:00
    0.前言 关于PID参数的整定,...为了让大家少走弯路,这里将给出圆周倒立摆直立环PID参数整定的具体步骤。 多图预警! 圆周倒立摆整体图 1.PID编程及理解 磨刀不误砍材工,是骡子是马,咱先看看,要想调好PI...
  • 《基于双闭环PID控制的一阶倒立摆控制系统的设计.doc》由会员分享,可在线阅读全文,更多相关《基于双闭环PID控制的一阶倒立摆控制系统的设计(最终版)》请在www.woc88.com上搜索。1、tlab是一个基于矩阵运算的软件,...
  • 往期本文是双足机器人系列的第三篇,在前面的文章中我们介绍了2D线性倒立摆的基本理论,详见:【双足机器人(1)】线性倒立摆及其运动控制(附代码)在这篇文章中我们要详细介绍3D线性倒立摆的基本...
  • 公式和图片需要交叉引用,所以正文用latex写,一并放到代码仓库里,不适合latex的动图和链接放到博客里。建模仿真使用simucpp,仿真效果展示使用EGE,波形图展示使用matplotlib。 代码 ...
  • 直线二阶倒立摆之数学建模

    千次阅读 多人点赞 2020-06-06 10:07:52
    本文是关于二阶倒立摆模型如何在平衡点处得到其的线性化模型的说明,介绍的比较详细,但是大部分内容参考于前人所写的论文,这些参考文献,我将列在本文的最后,但是我所建立的模型不同于论文中的模型,基本上计算...
  • 对一级倒立摆进行LQR控制的MATLAB仿真实验,可以得到摆杆的角度与小车的位置图,另有完整的word讲解,公式都是用公式编辑器编辑的
  • 基于树莓派倒立摆的方案模型,利用matlab中的Simulink进行了倒立摆的仿真,验证了方案的实际可行性,并且学习了树莓派的python编程方法,掌握了部分linux系统,在控制倒立摆稳定的过程中,并且以PID控制器的算法思想...
  • 该例的系统包含一个装有一个倒立摆的小车。我们的控制目标是通过给小车作用一个力,使顶部的倒立摆不落下来。下图标示出了各个变量的含义。 对于这个例子,我们有以下参数: (M) 小车质量 0.5 kg (m) 倒立摆质量 ...
  • 本文将针对一阶倒立摆和二阶倒立摆系统,对其利用《线性系统理论》课程中的相 关知识进行分析,主要包括如下内容: 建立数学模型,1)牛顿定律;2)分析力学,即欧拉拉格朗日方程(两个方程应 该是一样的); 基于 ...
  • 基于一阶倒立摆系统的模糊神经网络PID控制

    千次阅读 多人点赞 2020-01-14 15:11:52
    基于一阶倒立摆系统的模糊神经网络PID控制 1.1 研究背景 模糊系统、神经网络和遗传算法被认为是21世纪人工智能最具发展前途的三个重要领域。它们构成了所谓的“智能计算”。随着科学技术的飞速发展,现代工业控制...
  • 倒立摆控制示例 嘿。 如果您在这里,那么您要么感到无聊,要么知道倒立摆问题是控制工程中的标准问题。 我已经建立了这个问题的模拟。 我自己没有重新推导状态空间公式; 我使用了 。 对于 ODE 传播,我使用了 ...
  • 1. 简介 在仿人双足机器人的控制里面,可以将机器人模型简化为一个线性倒立摆模型(下图来自梶田秀司教授的《仿人机器人》[1],该书电子版可在公众号后台回复【HR】获得),...
  • 倒立摆控制率及属性模型参考https://zhuanlan.zhihu.com/p/54071212 这里仅给出状态空间方程: 其中q: 控制器输入U=-[K1 K2 K3 K4] X K矩阵由matlab的LQR函数算出 Webots建模 我们直接修改官方示例 ...
  • 倒立摆Cartpole-v1 简介 倒立摆为一个小车和一个杆通过轴连接,杆在初始时稍有偏离垂直线,在重力作用下会倒下,游戏目的是通过左右控制小车(施加左右的力)来避免杆的倒下。 API 获取初始状态 env = gym.make(...
  • 简介 本文是《线性系统理论》大作业的一部分,内容是一阶和二阶倒立摆的分析与控制,本文是 线性系统大作业——0.一阶和二阶倒立摆建模与控制系统设计 的一部分。 另外,由于本文字数过多,超过了CSDN单篇文章的字数...
  • 倒立摆stm32F407控制程序

    千次阅读 2020-04-12 16:47:59
    写好倒立摆程序的关键是确定pid算法的程序和参数值。我根据网上查找的资料写了用stm32F407控制倒立摆的pid程序,现在我将程序分享给大家。 我的程序主要是根据位置式离散pid公式pwm=Kpe(k)+Ki∑e(k)+Kd[e(k-1)-e(k-1...
  • 控制系统设计课设\两轮移动式倒立摆的运动控制,两轮自平衡小车原理和控制
  • 对于倒立摆,设计的reward就更简单了,因为倒立摆很容易就探索完整个状态空间了,所以给的额外reward就是,如果游戏结束,给-10的reward。 奖赏的设计其实应该是八仙过海各显神通的地方。比方说倒立摆的reward可以...
  • 倒立摆是比较典型的系统,国内外学者常常通过在倒立摆上开发控制算法。 对倒立摆的控制分为两大任务: 起摆 稳摆 所以本文想通过此项目对自动控制原理进行一个复习与学习的过程,具体目标设想建立单摆模型,通过...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 346
精华内容 138
关键字:

倒立摆公式