为了保持您的两轮机器人平衡out让它向前/向后漂移,你应该有一个线速度控制器的命令为 0 m/s,而不仅仅是一个角度控制器角度命令为 0 度。你的线速度控制器计算所需的加速度这会融入你的线性加速度控制器,它计算出所需的倾斜角或俯仰角,它会输入到你的俯仰角控制器,它调整电机油门以实现该螺距(例如,使用 PID 或 LQR 控制器,或者您也可以为这个内部自平衡环路提供基于物理的控制器)。
为了实现你所说的不再随波逐流或向前滚动的目标,你会停在那里。
但是,我想更进一步:如果您的车辆有怎么办already漂移或滚动了一点,您不想将其移回到开始“消除”漂移的位置吗?
方法如下:...[添加一个位置控制器也,这也融入了速度控制器]...
-
俯仰角控制器:就你而言,你的最里面的控制器听起来像是俯仰角:我认为你正在使用 LQR 控制器来调整轮毂电机油门控制俯仰角。您也可以为此使用 PID 控制器,or相反,提出基于物理的前馈解决方案,并与 PID 反馈解决方案相加以消除误差。
如果将俯仰角设定点设置为 0 度,那么只要没有外力作用在机器人上,并且机器人也开始静止,它就会保持直立状态。如果您推动机器人,它将开始以您施加的恒定速度线性平移(例如:向前或向后移动),同时保持固定的直立角度。从本质上讲,将俯仰角设定点保持在 0 度,这与推一个无动力的球或推车一样——它会根据牛顿第一运动定律(与惯性有关)沿着您推它的方向继续滚动:运动中的物体保持运动状态。
-
线性加速控制器:您需要添加一个外部控制器你在哪里调整俯仰角控制线性加速度(向前或向后)。
可以这样想:这是一个物理问题:两轮赛格威机器人向前倾斜得越多,重力导致其“向前摔倒”的速度就越快。它“向前下落”的速度越快,您就必须越快地驱动这些轮子,以使这些轮子回到它的下方,使其保持固定的倾斜角度,而不是继续进一步倾斜,直到它撞到地面。移动其下方的轮子以防止其翻倒,会使其朝该方向加速。
对于固定高度(对于空中车辆;或在水平表面上,对于地面车辆)和固定倾斜角度的倾斜车辆,线性加速度,a
, is: a = g*tan(theta)
, where g = acceleration due to gravity = 9.81 m/s^2
, and theta = tilt angle
。这是我刚刚画的“力量平衡”图(侧视图:向下是朝向地面,向上是朝向天空):
求解theta
(倾斜角度),你会得到:theta = atan(a/g)
.
So, a
平移(向前或向后)方向的单位为m/s^2
。随着时间的推移 (s
),该平移加速度导致一定的平移速度(m/s^2 * s = m/s
)。因此,如果您将其倾斜一会儿,让它加速,然后再次将其直立起来,那么您现在将以固定速度继续前进,假设地面平坦且没有摩擦。这就是当有人推或踢它时发生在你身上的事情!为了对抗这种翻译velocity,你需要一个速度控制器其中适用必要的加速度向相反方向转动,以停止车辆的运动。
-
线速度控制器:下一个控制器是速度控制器。您需要设置所需的速度(例如:0 m/s
来停止车辆)。在此控制器中,您调整线性加速度控制线速度.
然后您可以设置调整参数,tau [sec]
, 哪一个是时间常数您希望在哪个时间段内达到所需的速度。对于快速响应和低惯性系统,将其调整为非常小;对于缓慢响应和高惯性系统,将其调整为非常大。如果你把它调得太低,系统就会出现严重的抖动并对噪声做出响应——有点像在 PID 控制器中将控制循环设置得太快或将微分增益设置得太高。如果你调tau
太高,系统会非常缓慢且反应迟缓。本质上,tau
就像一个“增益”调整参数,其中response_gain = 1/tau
。因此,较大的时间常数,tau
,导致响应缓慢或“低增益”,并且小tau
导致快速响应或“高增益”。
你可以看到我的tau
我的四轴飞行器飞行控制器中的值用黄色圈出:
(此时此刻的视频链接 https://youtu.be/H5kXzpPFdII?t=20)。如图所示,当前设置为0.75 sec
。我对上图中该参数的注释如下:
time_const,tau(秒)(增益与 1/tau 成正比):0.75
因此,这个“线速度控制器”是具有基于物理的控制器的另一层。为此,您需要物理运动方程:dv [m/s] = a [m/s^2] * dt [sec]
。求解a
你得到a = dv/dt
。时间段,tau
,你想通过它来完成这是你的dt
(时间变化,以秒为单位),导致a = dv/tau
.
完整的计算示例到这一点:
所以,如果你的实际速度是2.5 m/s
你想要的速度是0 m/s
,然后是所需的速度变化,dv
,你需要的是dv = 2.5 m/s - 0 m/s = 2.5 m/s
。你最终需要调整tau
作为调整参数,通过实验或模拟和建模,或两者兼而有之。假设您选择了初始值tau
的价值tau = 2 sec
。然后,在该时间段内实现此速度变化所需的必要加速度tau
is a = dv/dt = dv/tau = 2.5m/s / 2 sec = 1.25 m/s^2
.
您所需的线性加速度线速度控制器这是您的输入线性加速度控制器多于。求解俯仰角,theta
, 来自线性加速度控制器 above: theta = atan(a/g) = atan(1.25 m/s^2 / 9.81 m/s^2) = atan(0.12742) = 0.1267 rad x 180 deg/pi rad = 7.26 deg
。所以,输入7.25 deg
(根据您的情况使用正确的符号)作为您的设定点俯仰角控制器为了在 2 秒的时间段 tau 内开始从 2.5 m/s 减速到 0 m/s。
以合理的速度运行内部控制回路,也许是 50 到 500 Hz。
以合理的速度运行外部控制回路,也许是 25 到 50 Hz。
请注意,控制循环离“外部”越远,控制循环运行的速度就越慢。例如,自动驾驶汽车最外层的控制回路以 10 Hz 左右的频率运行,部分原因是这已经足够好了,部分原因是计算复杂性非常高,这是计算机所能做的全部。
总之
为了保持您的两轮机器人平衡out让它向前/向后漂移,你应该有一个线速度控制器的命令为 0 m/s,而不仅仅是一个角度控制器角度命令为 0 度。你的线速度控制器计算所需的加速度这会融入你的线性加速度控制器,它计算出所需的倾斜角或俯仰角,它会输入到你的俯仰角控制器,它调整电机油门以实现该螺距(例如,使用 PID 或 LQR 控制器,或者您也可以为这个内部自平衡环路提供基于物理的控制器)。
为了实现你所说的不再随波逐流或向前滚动的目标,你会停在那里。
但是,我想更进一步:如果您的车辆有怎么办already漂移或滚动了一点,您不想将其移回到开始“消除”漂移的位置吗?
方法如下:添加另一层控制作为线性位置控制器在你之外速度控制器!
-
线性位置控制器:你会调整线速度随着时间的推移来控制线性位置。使用车轮编码器,您可以计算出您已经走了多远,并控制position让机器人回到开始的地方。或者,您可以简单地命令任意位置,使其行驶一定距离并在房间内导航。这是另一个基于简单物理/数学的前馈控制器,其中运动方程很简单v*t = d
, where v [m/s]
是速度,t [sec]
是时间,并且d [m]
是距离。
有多种方法可以做到这一点。
如果您的目标是到达某个位置并停止:
一种方法是在给定时间内命令一定的速度,以达到所需的距离。例如:命令 0.5 m/s 持续 3 秒0.5 m/s * 3 sec = 1.5 m
。然后,命令 0 m/s 在该点停止。您可能需要使用一些经验数据和启发法,提前一点命令 0 m/s 速度,以便让车辆有时间响应并停在您想要的位置,而不是超调。
这可能被称为“滴答控制器”(我现在正在发明这个术语),您可以在其中编写一个函数以 X 速度驱动 N 秒,以实现 Y 编码器在该方向上的距离移动的“滴答”,并根据经验进行调整:必要的。您可以调整该控制器,甚至能够在短时间内使用快速速度脉冲处理小至 1 个编码器刻度的刻度,从而达到exact当您接近命令位置时您想要的位置。每次控制循环迭代,您都会根据您现在所在的位置以及您想要到达的位置,传递所需距离编码器“刻度”数量的新值以进行移动。因此,这种基于物理的“前馈”控制器的有趣之处在于,它隐含地也是一种“反馈”控制器,这很奇怪。一些迂腐的学者可能想出了一些特殊的方式来谈论这个问题,甚至可能有一些特殊的术语,但我不知道它们是什么。
另一种方法是命令固定速度,例如:0.5 m/s,直到处于某个最小距离误差范围内,例如:0.5 m,然后切换到 PID 反馈控制器,该控制器命令velocity基于位置误差。这样,作为你的位置误差趋近于零,你的指令速度也将接近于零,这是有道理的。如果您的 PID 增益足够强,或者相反,如果您的位置误差足够大,则这与仅在位置上使用 PID 反馈控制器是一样的,您可以通过将速度命令限制为固定的最大值来使速度命令饱和。当然,即使对于微弱的增益,在一些足够大的距离误差下,命令的速度仍然会达到最大允许(饱和)值并被限幅。
如果您的目标是保持固定速度,同时以此速度遵循 2D 路径:
然后,您可以将速度控制器设置为固定值,同时更改命令航向以始终指向路径下方。我使用“引导点”技术或“纯粹追踪”算法来做到这一点,如我的这里有 3 个视频 https://github.com/ElectricRCAircraftGuy#heres-one-of-my-favorite-projects-ive-ever-done-autonomous-quadcopter-flight-controller-i-wrote-myself: 1 https://www.youtube.com/watch?v=LjuPA43HceQ, 2 https://www.youtube.com/watch?v=wY3oh2GIfCI, 。然而,由于我的车辆是悬停的四轴飞行器无人机,我可以奢侈地改变我的命令推力矢量而不是我的heading,因此我可以根据需要命令固定航向(即:保持无人机始终指向北方),同时更改命令的推力矢量以在不同的 2D (x-y) 方向上移动。
使用车轮编码器与数值积分获得精确测量:
虽然随着时间的推移对速度进行积分将获得距离,但在这种情况下最好使用数值积分或估计来计算前馈部分的命令速度输出。控制器这将输出所需的速度command在一定时间内time为了达到想要的效果位置改变.
使用车轮编码器,您可以测量actual行驶的距离而不是估计它使用随时间变化的速度。
如果您确实需要estimate通过积分移动的位置velocity over time,但是,您应该使用梯形数值积分,正如我在这里解释的:物理、测绘、机器人、游戏、航位推算和控制代码中的数值推导和集成 https://stackoverflow.com/a/72162992/4561887,因为它比矩形积分更准确并且实现起来很简单。同样,对于数值积分,简单的想法是velocity [m/s] * time [s] = distance [m]
.
再次请记住,您不一定要集成到estimate the actual行驶的距离。相当,measure通过对编码器刻度进行计数来计算实际行驶的距离,因为这是一种更精确的测量。