首页 > 应用与设计 > 电器 > Service Robots > 服务型机器人 > TI机器人系统学习套件(TI-RSLK) >

服务型机器人

最新课程

热门课程

TI-RSLK 模块 7 - 讲座视频 - 有限状态机线路跟踪器

大家好,我是 Jon Valvano。 在上一个视频中, 我们讨论了一般的 有限状态机,具体来说, 是解决了交通信号灯的 控制器问题。 在本视频中, 我们将解决第二个有限 状态机示例,该示例 与本实验非常接近。 那就是, 我们将会考虑 如何打造一个 可使机器人循线 移动的系统。 所以地面上会有 一条线路,机器人上 会配有传感器, 我们希望机器人 能够沿这条线路移动。 还记得吧,有限状态机的 本质是我们会有 一个系统。 该系统将会有输入。 它将会有状态, 用于编码我们的知识, 也就是我们认为将会成真的情况。 它还会有输出, 用于影响我们的世界。 那么,我们要解决的 问题将会是一个 非常简单的简化版本的 机器人,要求该机器人 在桌子上沿一条线路移动。 实际的机器人 有八个传感器。 但是,我们今天在这里 讨论的机器人仅有两个传感器。 而且它们是二进制传感器。 所以,如果这里的这个 传感器能够看到线路, 则输入为 1。 如果该传感器没有看到 我想要沿循的线路, 则看到的是 0。 所以 1,1 输入状态 表示我正在线路上。 1,0 表示偏右。 0,1 表示偏左。 使用有限 状态机的根本意义在于 能够解决 这一很自然的问题 -- 好吧, 如果我没有看到任何线路, 那我是偏左了呢, 还是偏右了呢? 我们将使用 状态机的先验知识 来区分迷路的 两种可能的 情况 -- 偏左还是偏右。 我的电机 也非常简单。 我将会有两个电机, 一个左轮一个右轮 -- 您将在本课程中 构建一个差动 驱动型机器人。 如果我想 直走,我将会 同时驱动两个电机。 稍后,我们将在课堂上 学习有关复杂性质的 所有方面。 但简单来说, 如果输出为 1,1, 那么便会直走。 现在,向右转 -- 我不想急转弯。 我只想平缓地右转, 因为我将会假设 我离线路很近。 我要采用的 方法是, 我将会驱动左侧电机, 使其达到高电平。 所以,如果 我尝试右转, 我将会降低 右轮,或者说右侧 电机的速度。 具体的做法是, 使用这个占空比 为 50% 的切换式 振荡波形来驱动该电机。 这便是我用以 右转的方式的本质。 左转的方式则 与此相反。 显然,我将会将右侧 电机驱动至高电平 -- 持续为 1。 但对于左侧电机,我将会减慢 其速度并使其在高低电平之间切换。 这将会实现 平稳的左转。 这便是我将会 采用的方法。 好的,如果我得到 0,0,那么它将会停止。 但是在这个特殊的示例中, 我们不会用到停止。 所以,记住,解决 有限状态机问题的方法, 或者说策略, 便是考虑各种状态。 所以,我将会考虑 -- 我可以使用各种状态。 这个便会在这里被编码。 我实际上是在线路上。 我现在在 线路的正中间。 此外,还有 其他状态。 就像我说的, 我可能偏左, 也有可能偏右。 在这里这个特定的示例中, 或者说在本讲座中, 这些全部都是 我将会用到的状态。 在实验中,或者 在实际的机器人上, 您将会用到的 状态要多得多。 但是,在这里, 我只想介绍相应的设计策略, 说明如何将我的想法 映射到将会在机器人上运行的 实际代码中。 在找出这些状态后, 接下来我要做的事情便是, 关于这些状态, 我想要做什么? 如果我在 跑道的中央, 我便会想要直走, 所以我将会直走。 此时,引擎 -- 有限状态机引擎 将通过我的控制器 完成各个循环, 我将会提供输出。 我将会等一会儿, 因为电机非常慢。 我必须给它 留出反应时间。 我将会提供输入。 然后,我将会 根据我的现态 和输入来选择 我的次态。 这将会是 我的序列。 让我们直行, 看看会发生什么。 我们将会直行。 我将会输出、等待、 输入、转入次态、输出、 等待、输入、转入次态、输出、 等待、输入、转入次态、输出、等待、 输入、转入次态。 我在线路上。 然后,我将会 继续在线路上移动。 所以在这个虚拟 世界里,这个机器人 实际上是直行的。 但这条线路 是弯曲的。 所以,在几十、 几百、几千次的 直行之后, 我最终将会 偏离该线路。 现在,只有两个选择。 我可以走到偏左 或偏右的位置。 下面将说明 偏左时的情况。 当偏离路线时, 首先会发生的事情是 -- 如果我将会 走到偏左的位置, 首先会发生的是,左侧的传感器 将会变暗, 也就是变成 0。 现在,我正处于偏左状态。 在看到该情况时, 我知道之前的状态 -- 我过去一直在线路上。 然后,我会查看我的输入。 我看到左侧传感器的信号消失了。 我知道现在 有一点偏左了。 但在这个简单 的方案中,我在左边。 对此,我该怎么办呢? 我该怎么做? 我想右转。 我将会放慢速度。 我想右转。 所以,我将会降低 右侧电机的转速。 我将会放慢这个电机的速度。 所以,我将会放慢 右侧电机的转速, 使左侧电机 保持全速旋转。 所以,这个电机 将会全速运转。 这个则会 半速运转。 这将会实现 平稳的转弯。 由于我偏左了, 所以我想要右转。 所以,我的状态是 我偏左了。 我的措施是,通过 以 50% 的占空比驱动右侧电机 实现平稳右转。 换句话说, 这个电机 将会处于高电平。 这个电机将会 以 50% 的比例振荡。 这便是我为 右侧电机 提供的功率 -- 左侧电机满功率, 右侧电机半功率, 机器人将会平稳右转。 同样,机器人需要 一定的反应时间。 所以,如果我右转、 右转、右转, 我将会平稳右转, 直至回到线路上。 这样,我刚刚 偏左了。 现在,我看到两个传感器都已开启。 那么,我将会如何做呢? 现在,我回到了 中央状态。 所以,我将要 做的是直行。 此时,我将会重新 驱动两个电机全速运转。 我将会移动,好的, 再次输出、等待、输入、 转入次态、输出、等待、输入、 转入次态、输出、等待、输入、转入次态。 这里的虚拟机器人 实际上将再次执行, 但线路是弯曲的。 下面将说明 机器人走到偏右 位置时的情况。 之前我在线路上。 现在,我偏右了。 所以,我现在处于偏右状态。 我的意思是, 状态机处于 代表我的位置偏右的状态。 我想要做什么? 好吧,我想要左转。 我们已经了解了 如何右转,左转 则与之相反。 所以,我将会驱动 -- 继续以 100% 的 功率驱动右侧 电机,以 50% 的 功率驱动左侧电机。 这将会导致 -- 现在,我是偏右的。 我想要平稳左转, 从而重新找到线路。 就像前面的数千次操作 一样,我将会输出、 等待、输入、转入次态。 但是,这次我将会 -- 如果我想, 我将会缓慢左转。 所以,我将会左转。 我现在仍然偏右。 我将会左转。 我现在仍然偏右。 类似地,我将会驱动 左轮以较慢的速度转动。 我现在仍然偏右。 仍然偏右。 然后,嘣-- 我找到线路了。 所以,我之前在 偏右的位置 -- 之前是。 现在,我正从偏右 状态过渡到 中央状态,该状态让我知道 我又回到了线路上, 我将会做我在线路上时 总是会做的事情。 那就是直行。 好的,我会直行。 这基本上 就是我的策略。 我说过,真实的 循线机器人 将拥有不只 三个状态。 在实验中,您将会 拥有超过三个状态。 但是,我只是想 说明这个过程。 这些便是我的状态。 我将会开始 绘制状态转换图。 但是,现在我列出了这些状态。 由于这是一个 Moore 状态机, 因此,将会有一个结果 -- 每个状态的输出。 我将会驱动 -- 如果我将会在中央, 那么我将会直行。 如果偏左, 我将会右转。 如果偏右, 我将会左转。 这便是我将要 做的事情的本质。 接下来要做的是, 放入相应的时间。 我将其称为延迟或等待。 但是,如果我们 有实际的机器人, 那么等待的时间将是 电机机械响应时间的函数。 如果您的机器人 要在您给出命令后 大约 100 毫秒才能 实际执行相应任务, 这个时间便是 它的时间常数。 所以,我们将会以 大约这个时间 常数来运行 有限状态机。 我们将会以稍快的速度 运行状态机,但又不能太快。 如果比响应时间快太多, 则不会发生太多活动。 所以,我们将会 每 50 毫秒运行 该有限状态机一次。 注意,整体目标是 我所处的状态 -- 输入模式 -- 1,1 在线路上 -- 偏左、偏右 -- 这些是简单的状态。 但是这两个是较为复杂的状态。 传感器给出 0,0。 但是,我有可能是 这种情况的偏左。 也有可能是 对应这种情况的偏右。 区分这两个 状态便表明了 我实际上将会 如何解决这个问题, 以及我为什么 使用有限状态机。 好的,重申一下, 这里我将会使用三个状态。 每个状态都有 一个名称 -- 中央、偏左和偏右。 每个状态都有一个输出。 每个状态都有一个时间延迟。 然后,每个状态 都有箭头,箭头数量 是输入的函数。 如果我采用的是 n 位的输入,那么 我将会有 2 的 n 次方个箭头。 由于我采用的是 2 位的输入, 因此我将会在每个状态上 延伸出 4 个箭头 -- 00, 01, 10, 11. 这便是我的状态图 将会拥有的结构。 我们将会 在后面构建该图。 同样,根据 您是习惯 使用图表,还是图形 -- 这二者是 完全相同的。 您可以选择上述任何一种方式。 实际上我已经 开始给出了 C 代码, 因为事实 证明 C 代码 -- 这是状态转换表。 这是状态转换图。 因为事实证明 C 代码和状态转换表 是完全相同的。 它们之间的 映射很明显。 好的,同样,我是 从状态开始,然后是输出模式, 然后是时间延迟。 这将会是 50 毫秒。 现在,我只是 通过对我将要做的 事情的直觉来进行设计 -- 对吧? 以下便是我们 在这里将要做的事情。 如果我之前在线路上-- 我之前在 线路的中央, 并且现在看到的输入 模式为 1,1,那么我便知道 我现在仍在线路上。 我现在仍在 线路的中央。 所以,如果我之前在线路上, 并且我现在仍在线路上, 那么,我便是在线路上。 所以,我将 留在该状态。 这一个, 我之前偏左。 好的,我之前是 偏左的,但是现在 传感器变成了 1,1 --好极了。 好的,我回到了线路上。 所以,我将要 进入中央状态。 如果我偏右, 现在看到的是 1,1, 那么我现在 将会回到线路上。 状态与输出 之间似乎 有一个一一 对应的映射。 换句话说, 似乎每个输出 都只有一个 对应的状态。 不是这样的。 其实同一个输出 可能会对应多个状态。 而正确的说法是, 每个状态都 有且只有一个输出。 但反过来说就不正确了。 每个输出不一定 都有一个状态。 但这里这个例子比较简单。 如果我看到线路,这便 意味着我正在跑道的中央。 所以,我将要 做的是直行。 这是状态转换图。 如果您要绘制 -- 这是状态转换表。 如果您要绘制转换图, 我们在这张图上进行了说明。 如果我在线路上 -- 所有那里的 这个就是这个。 这里这个是 我在偏左位置。 好的,我现在 偏左,但是能够 看到线路 -- 这便是这个。 这里这个,我在偏右 位置,但是能看到线路 -- 这是这个 -- 好的,3、2、1。 这就是映射 -- 我说过, 表和图之间 有一个一一对应的映射。 这是这个 过程的开始。 这方面很简单。 现在,我已经开始 编写实际的 C 代码, 在这里向您展示 -- 这将会是 00、 01、10、11 条件 -- 这是我将会放在 我的 C 代码中的 实际代码,它也是 与转换表完美匹配。 我们来解决一个难一点儿的问题。 如果我在线路上, 现在传感器 -- 左侧的传感器死机了, 会发生什么? 这是左侧传感器, 现在它变黑了。 发生了什么? 这意味着 我最终偏左了。 我最终偏左了。 我将会编码 -- 这个箭头,这里 这个状态是我在中央, 并且看到的是 10。 如果我偏左了, 看到这个仍然是黑屏, 会发生什么。 这便是我将会 如何对其进行切换。 我将要进入 中央状态。 如果输入 模式恰巧是 01, 这边这个箭头就是这个 -- 所以,这是一个 很简单的状态机 -- 在实验中您将需要 对其进行修正, 因为它有一个错误 -- 但是,这里的 这个状态机将会 在两个状态之间轮换, 实现平稳的右转。 所以,右侧电机 -- 在这里右侧和 左侧电机将会 -- 我们偏左了。 所以,我们想要右转。 为了做到这一点, 我将会切换右侧电机, 并使左侧电机保持高电平。 我将会在 C 代码中 放入这两个 条目。 我将会每次 构建一点。 让我们来看看这个。 这便是我们在 寻找的,对吧? 这是我们曾尝试 解决的问题。 那就是,如果 我知道我偏左了 -- 我知道我偏左了, 因为上次看时, 我是在偏左位置 -- 现在完全黑屏了。 我处于迷路状态。 我知道,我之前 是在偏左位置, 而且现在我完全 看不到线路了, 那么我有很大的 可能性是偏左了。 我不可能 跳过线路。 它不会跳, 也不会飞。 所以,我不可能偏右。 所以,一定是偏左。 同样,这在 C 代码中 体现在这里。 在状态转换表中 则是向刚才那样。 在状态转换图中 也有相应的表现 形式。 接下来,在转弯时, 我将会如何做? 我将会急转弯。 我们实际上将会 停止右侧电机 -- 并向右急转弯。 我们现在偏左。 我们将会 向右急转弯, 方法是使一个电机完全停转, 而另一个电机仍然转动。 下面说一下另外一种情况。 现在我偏-- 之前我在线路中央。 现在,右侧 传感器黑屏了。 右侧传感器黑屏 意味着我刚才的位置偏右了。 同样,表格中的 这一点是与 这个转换图中的 这里对等的。 如果我之前 在偏右位置 -- 好的,然后我们 将通过在这两者 之间来回切换 来切换状态。 同样,如果 我只是稍微偏右, 如果输入为 10, 它将会在这两者 之间循环,导致一个 引脚变成高电平, 另一个则停止。 就像偏左时一样, 判断偏右的依据是, 我之前处于 偏右状态。 现在我看到完全黑屏了。 我现在迷路了。 我将会认为我处于偏右位置。 我将会完全 停止左侧电机, 使机器人 向左急转弯, 因为我现在偏右。 同样,这三者是 一一对应的。 这里的这个箭头代表 状态转换表中的 这个点和 C 代码中的这里。 我们已经介绍了一些奇怪的情况。 这一个并不奇怪。 它表达的是 -- 好吧,这些也比较奇怪。 这些才是真正的奇怪。 有时,我们不得不 为其填充条目。 您不得不为 它们提供一个条目。 但是其中的一部分 根本就没有意义。 我在线路上。 然后,嘣 -- 我突然远离线路。 假设您使用的是 一条没有终点的线路, 假设您的教授 给出了这样的傻子线路, 这种情况 便有可能发生, 上一秒您还在线路上, 下一秒就完全 脱离了线路。 这便是我们选择 50 毫秒的原因。 您无法使其 实际发生。 这太快了,机器人实际上 不可能发生这种情况。 但是我们不得不进行猜测。 所以我将会进行猜测。 偏左还是偏右, 可能性各占一半。 我随意选择一个。 这里是另外两个 实际上也不可能发生的情况, 因为控制器的 运行速度要比机器人的 移动速度快得多。 那就是,我之前 在偏左位置。 现在,传感器表示, 嘿,伙计,您偏右了。 我在这里假设 这种情况有可能发生。 这是我的线路。 我的机器人沿着 与线路垂直的方向 移动。 类似地,我之前 是在偏右位置。 现在,我又偏左了。 所以这是一些奇怪的情况, 它们可能永远都不会发生。 但无论如何我们得 放一些东西在这里。 将这些东西整合在一起, 我们便得到了 完整的状态转换图 -- 状态转换表。 而在 C 代码中, 在这里您可以看到, 这里的每个箭头 都代表这里的一个 条目。 很明显,这是一个 一一对应的映射,两方具有 完全相同的信息。 所以,我将会以 比机器人的移动速度 快得多的速度 运行我的有限状态机。 这里是实际的 C 代码。 我实际上会将这些 代码加载到某个机器人上。 机器人将会沿线路 移动 -- 一定程度上。 我说过,使用 更多的状态时, 效果会更好。 而且真实 机器人上的传感器 实际上有 8 位, 而不是仅仅 2 位。 但是,它的代码 将会与我们在交通信号灯 示例中看到的非常相似。 让我来全程演示一下。 好的,这是我的 结构元素。 同样,每个状态都有 一个 2 位输出、一个等待时间 和四个次态, 因为有两个端点。 总共只有三个状态。 这是一种基于指针的 东西,所以它在 C 代码中的 实际名称是指针。 这里是我们刚刚 绘制的状态转换表, 其中包括输出值、 等待时间和 次态,其中次态会因 输入是 00、01、 10 和 11 而有所不同。 好的,该状态机 -- 就像我说的,这个在 实际的机器人上运行。 我将时钟 调得很快。 到第 12 章时,我将会 介绍如何运行电机。 简单来说, 它会使电机停止。 然后,我们将会 提供输出。 同样,我们将会在 模块 13 中学习 如何向电机提供输出。 但是,电机输出是 首先完成的部分。 时间延迟,我们将会 在第 9 章中学习 如何使实际的 状态机发生延迟。 然后是在第 6 章中, 我们已经学习了 如何运行传感器输入, 以读取输入。 所以,这里是读取输入。 然后,这是 状态转换, 给出了现态、 输入的值, 也就是 0、1、2 或 3 -- 以及次态。 好的,最后总结一下, 我们已经完成了第二个 有限状态机。 在上一个讲座 结束时,我曾提到, 我真的觉得这是 您工具箱里的一个很好的工具, 因为您可以 通过这种抽象 方式解决 许多这种 类型的问题 -- 这种抽象方式也可以 说是一种系统,您会有输入、输出, 您知道的情况 不仅取决于当前的输入, 还取决于之前的输入。 希望您喜欢本次实验。 在您的职业生涯中, 您将会发现, 这些有限状态机 将是您工具箱里的 一个极好的工具。 523

大家好,我是 Jon Valvano。

在上一个视频中, 我们讨论了一般的

有限状态机,具体来说, 是解决了交通信号灯的

控制器问题。

在本视频中, 我们将解决第二个有限

状态机示例,该示例 与本实验非常接近。

那就是, 我们将会考虑

如何打造一个 可使机器人循线

移动的系统。

所以地面上会有 一条线路,机器人上

会配有传感器, 我们希望机器人

能够沿这条线路移动。

还记得吧,有限状态机的 本质是我们会有

一个系统。

该系统将会有输入。

它将会有状态, 用于编码我们的知识,

也就是我们认为将会成真的情况。

它还会有输出, 用于影响我们的世界。

那么,我们要解决的 问题将会是一个

非常简单的简化版本的 机器人,要求该机器人

在桌子上沿一条线路移动。

实际的机器人 有八个传感器。

但是,我们今天在这里 讨论的机器人仅有两个传感器。

而且它们是二进制传感器。

所以,如果这里的这个 传感器能够看到线路,

则输入为 1。

如果该传感器没有看到 我想要沿循的线路,

则看到的是 0。

所以 1,1 输入状态 表示我正在线路上。

1,0 表示偏右。

0,1 表示偏左。

使用有限 状态机的根本意义在于

能够解决 这一很自然的问题 -- 好吧,

如果我没有看到任何线路, 那我是偏左了呢,

还是偏右了呢?

我们将使用 状态机的先验知识

来区分迷路的 两种可能的

情况 --

偏左还是偏右。

我的电机 也非常简单。

我将会有两个电机, 一个左轮一个右轮 --

您将在本课程中 构建一个差动

驱动型机器人。

如果我想 直走,我将会

同时驱动两个电机。

稍后,我们将在课堂上 学习有关复杂性质的

所有方面。

但简单来说, 如果输出为 1,1,

那么便会直走。

现在,向右转 --

我不想急转弯。

我只想平缓地右转,

因为我将会假设 我离线路很近。

我要采用的 方法是,

我将会驱动左侧电机, 使其达到高电平。

所以,如果 我尝试右转,

我将会降低 右轮,或者说右侧

电机的速度。

具体的做法是, 使用这个占空比

为 50% 的切换式 振荡波形来驱动该电机。

这便是我用以 右转的方式的本质。

左转的方式则 与此相反。

显然,我将会将右侧 电机驱动至高电平 --

持续为 1。

但对于左侧电机,我将会减慢 其速度并使其在高低电平之间切换。

这将会实现 平稳的左转。

这便是我将会 采用的方法。

好的,如果我得到 0,0,那么它将会停止。

但是在这个特殊的示例中, 我们不会用到停止。

所以,记住,解决 有限状态机问题的方法,

或者说策略, 便是考虑各种状态。

所以,我将会考虑 --

我可以使用各种状态。

这个便会在这里被编码。

我实际上是在线路上。

我现在在 线路的正中间。

此外,还有 其他状态。

就像我说的, 我可能偏左,

也有可能偏右。

在这里这个特定的示例中, 或者说在本讲座中,

这些全部都是 我将会用到的状态。

在实验中,或者 在实际的机器人上,

您将会用到的 状态要多得多。

但是,在这里, 我只想介绍相应的设计策略,

说明如何将我的想法 映射到将会在机器人上运行的

实际代码中。

在找出这些状态后, 接下来我要做的事情便是,

关于这些状态, 我想要做什么?

如果我在 跑道的中央,

我便会想要直走, 所以我将会直走。

此时,引擎 --

有限状态机引擎 将通过我的控制器

完成各个循环, 我将会提供输出。

我将会等一会儿, 因为电机非常慢。

我必须给它 留出反应时间。

我将会提供输入。

然后,我将会 根据我的现态

和输入来选择 我的次态。

这将会是 我的序列。

让我们直行, 看看会发生什么。

我们将会直行。

我将会输出、等待、 输入、转入次态、输出、

等待、输入、转入次态、输出、 等待、输入、转入次态、输出、等待、

输入、转入次态。

我在线路上。

然后,我将会 继续在线路上移动。

所以在这个虚拟 世界里,这个机器人

实际上是直行的。

但这条线路 是弯曲的。

所以,在几十、 几百、几千次的

直行之后,

我最终将会 偏离该线路。

现在,只有两个选择。

我可以走到偏左 或偏右的位置。

下面将说明 偏左时的情况。

当偏离路线时, 首先会发生的事情是 --

如果我将会

走到偏左的位置, 首先会发生的是,左侧的传感器

将会变暗, 也就是变成 0。

现在,我正处于偏左状态。

在看到该情况时, 我知道之前的状态 --

我过去一直在线路上。

然后,我会查看我的输入。

我看到左侧传感器的信号消失了。

我知道现在 有一点偏左了。

但在这个简单 的方案中,我在左边。

对此,我该怎么办呢?

我该怎么做?

我想右转。

我将会放慢速度。

我想右转。

所以,我将会降低 右侧电机的转速。

我将会放慢这个电机的速度。

所以,我将会放慢 右侧电机的转速,

使左侧电机 保持全速旋转。

所以,这个电机 将会全速运转。

这个则会 半速运转。

这将会实现 平稳的转弯。

由于我偏左了, 所以我想要右转。

所以,我的状态是 我偏左了。

我的措施是,通过 以 50% 的占空比驱动右侧电机

实现平稳右转。

换句话说, 这个电机

将会处于高电平。

这个电机将会 以 50% 的比例振荡。

这便是我为 右侧电机

提供的功率 --

左侧电机满功率, 右侧电机半功率,

机器人将会平稳右转。

同样,机器人需要 一定的反应时间。

所以,如果我右转、 右转、右转,

我将会平稳右转, 直至回到线路上。

这样,我刚刚 偏左了。

现在,我看到两个传感器都已开启。

那么,我将会如何做呢?

现在,我回到了

中央状态。

所以,我将要 做的是直行。

此时,我将会重新 驱动两个电机全速运转。

我将会移动,好的, 再次输出、等待、输入、

转入次态、输出、等待、输入、 转入次态、输出、等待、输入、转入次态。

这里的虚拟机器人 实际上将再次执行,

但线路是弯曲的。

下面将说明 机器人走到偏右

位置时的情况。

之前我在线路上。

现在,我偏右了。

所以,我现在处于偏右状态。

我的意思是, 状态机处于

代表我的位置偏右的状态。

我想要做什么?

好吧,我想要左转。

我们已经了解了 如何右转,左转

则与之相反。

所以,我将会驱动 -- 继续以 100% 的

功率驱动右侧 电机,以 50% 的

功率驱动左侧电机。

这将会导致 --

现在,我是偏右的。

我想要平稳左转,

从而重新找到线路。

就像前面的数千次操作 一样,我将会输出、

等待、输入、转入次态。

但是,这次我将会 --

如果我想, 我将会缓慢左转。

所以,我将会左转。

我现在仍然偏右。

我将会左转。

我现在仍然偏右。

类似地,我将会驱动 左轮以较慢的速度转动。

我现在仍然偏右。

仍然偏右。

然后,嘣--

我找到线路了。

所以,我之前在 偏右的位置 --

之前是。

现在,我正从偏右 状态过渡到

中央状态,该状态让我知道 我又回到了线路上,

我将会做我在线路上时 总是会做的事情。

那就是直行。

好的,我会直行。

这基本上 就是我的策略。

我说过,真实的 循线机器人

将拥有不只 三个状态。

在实验中,您将会 拥有超过三个状态。

但是,我只是想 说明这个过程。

这些便是我的状态。

我将会开始 绘制状态转换图。

但是,现在我列出了这些状态。

由于这是一个 Moore 状态机,

因此,将会有一个结果 -- 每个状态的输出。

我将会驱动 --

如果我将会在中央, 那么我将会直行。

如果偏左, 我将会右转。

如果偏右, 我将会左转。

这便是我将要 做的事情的本质。

接下来要做的是, 放入相应的时间。

我将其称为延迟或等待。

但是,如果我们 有实际的机器人,

那么等待的时间将是 电机机械响应时间的函数。

如果您的机器人 要在您给出命令后

大约 100 毫秒才能 实际执行相应任务,

这个时间便是 它的时间常数。

所以,我们将会以 大约这个时间

常数来运行 有限状态机。

我们将会以稍快的速度 运行状态机,但又不能太快。

如果比响应时间快太多, 则不会发生太多活动。

所以,我们将会 每 50 毫秒运行

该有限状态机一次。

注意,整体目标是 我所处的状态 --

输入模式 --

1,1 在线路上 --

偏左、偏右 --

这些是简单的状态。

但是这两个是较为复杂的状态。

传感器给出 0,0。

但是,我有可能是 这种情况的偏左。

也有可能是 对应这种情况的偏右。

区分这两个 状态便表明了

我实际上将会 如何解决这个问题,

以及我为什么 使用有限状态机。

好的,重申一下, 这里我将会使用三个状态。

每个状态都有 一个名称 --

中央、偏左和偏右。

每个状态都有一个输出。

每个状态都有一个时间延迟。

然后,每个状态 都有箭头,箭头数量

是输入的函数。

如果我采用的是 n 位的输入,那么

我将会有 2 的 n 次方个箭头。

由于我采用的是 2 位的输入, 因此我将会在每个状态上

延伸出 4 个箭头 --

00, 01, 10, 11.

这便是我的状态图 将会拥有的结构。

我们将会 在后面构建该图。

同样,根据 您是习惯

使用图表,还是图形 --

这二者是 完全相同的。

您可以选择上述任何一种方式。

实际上我已经 开始给出了 C 代码,

因为事实 证明 C 代码 --

这是状态转换表。

这是状态转换图。

因为事实证明 C 代码和状态转换表

是完全相同的。

它们之间的 映射很明显。

好的,同样,我是 从状态开始,然后是输出模式,

然后是时间延迟。

这将会是 50 毫秒。

现在,我只是 通过对我将要做的

事情的直觉来进行设计 --

对吧?

以下便是我们 在这里将要做的事情。

如果我之前在线路上--

我之前在 线路的中央,

并且现在看到的输入 模式为 1,1,那么我便知道

我现在仍在线路上。

我现在仍在 线路的中央。

所以,如果我之前在线路上, 并且我现在仍在线路上,

那么,我便是在线路上。

所以,我将 留在该状态。

这一个, 我之前偏左。

好的,我之前是 偏左的,但是现在

传感器变成了 1,1 --好极了。

好的,我回到了线路上。

所以,我将要 进入中央状态。

如果我偏右, 现在看到的是 1,1,

那么我现在

将会回到线路上。

状态与输出 之间似乎

有一个一一 对应的映射。

换句话说, 似乎每个输出

都只有一个 对应的状态。

不是这样的。

其实同一个输出 可能会对应多个状态。

而正确的说法是, 每个状态都

有且只有一个输出。

但反过来说就不正确了。

每个输出不一定 都有一个状态。

但这里这个例子比较简单。

如果我看到线路,这便 意味着我正在跑道的中央。

所以,我将要 做的是直行。

这是状态转换图。

如果您要绘制 --

这是状态转换表。

如果您要绘制转换图, 我们在这张图上进行了说明。

如果我在线路上 --

所有那里的 这个就是这个。

这里这个是 我在偏左位置。

好的,我现在 偏左,但是能够

看到线路 -- 这便是这个。

这里这个,我在偏右 位置,但是能看到线路 --

这是这个 --

好的,3、2、1。

这就是映射 --

我说过, 表和图之间

有一个一一对应的映射。

这是这个 过程的开始。

这方面很简单。

现在,我已经开始 编写实际的 C 代码,

在这里向您展示 --

这将会是 00、 01、10、11 条件 --

这是我将会放在 我的 C 代码中的

实际代码,它也是 与转换表完美匹配。

我们来解决一个难一点儿的问题。

如果我在线路上, 现在传感器 --

左侧的传感器死机了, 会发生什么?

这是左侧传感器, 现在它变黑了。

发生了什么?

这意味着 我最终偏左了。

我最终偏左了。

我将会编码 --

这个箭头,这里 这个状态是我在中央,

并且看到的是 10。

如果我偏左了, 看到这个仍然是黑屏,

会发生什么。

这便是我将会 如何对其进行切换。

我将要进入 中央状态。

如果输入 模式恰巧是 01,

这边这个箭头就是这个 --

所以,这是一个 很简单的状态机 --

在实验中您将需要 对其进行修正,

因为它有一个错误 --

但是,这里的 这个状态机将会

在两个状态之间轮换,

实现平稳的右转。

所以,右侧电机 --

在这里右侧和 左侧电机将会 --

我们偏左了。

所以,我们想要右转。

为了做到这一点, 我将会切换右侧电机,

并使左侧电机保持高电平。

我将会在 C 代码中 放入这两个

条目。

我将会每次 构建一点。

让我们来看看这个。

这便是我们在 寻找的,对吧?

这是我们曾尝试 解决的问题。

那就是,如果 我知道我偏左了 --

我知道我偏左了, 因为上次看时,

我是在偏左位置 --

现在完全黑屏了。

我处于迷路状态。

我知道,我之前 是在偏左位置,

而且现在我完全 看不到线路了,

那么我有很大的 可能性是偏左了。

我不可能 跳过线路。

它不会跳,

也不会飞。

所以,我不可能偏右。

所以,一定是偏左。

同样,这在 C 代码中 体现在这里。

在状态转换表中 则是向刚才那样。

在状态转换图中 也有相应的表现

形式。

接下来,在转弯时, 我将会如何做?

我将会急转弯。

我们实际上将会

停止右侧电机 --

并向右急转弯。

我们现在偏左。

我们将会 向右急转弯,

方法是使一个电机完全停转, 而另一个电机仍然转动。

下面说一下另外一种情况。

现在我偏--

之前我在线路中央。

现在,右侧 传感器黑屏了。

右侧传感器黑屏 意味着我刚才的位置偏右了。

同样,表格中的 这一点是与

这个转换图中的 这里对等的。

如果我之前 在偏右位置 --

好的,然后我们 将通过在这两者

之间来回切换 来切换状态。

同样,如果 我只是稍微偏右,

如果输入为 10, 它将会在这两者

之间循环,导致一个 引脚变成高电平,

另一个则停止。

就像偏左时一样,

判断偏右的依据是,

我之前处于 偏右状态。

现在我看到完全黑屏了。

我现在迷路了。

我将会认为我处于偏右位置。

我将会完全 停止左侧电机,

使机器人 向左急转弯,

因为我现在偏右。

同样,这三者是 一一对应的。

这里的这个箭头代表 状态转换表中的

这个点和 C 代码中的这里。

我们已经介绍了一些奇怪的情况。

这一个并不奇怪。

它表达的是 -- 好吧,这些也比较奇怪。

这些才是真正的奇怪。

有时,我们不得不 为其填充条目。

您不得不为 它们提供一个条目。

但是其中的一部分 根本就没有意义。

我在线路上。

然后,嘣 -- 我突然远离线路。

假设您使用的是 一条没有终点的线路,

假设您的教授 给出了这样的傻子线路,

这种情况 便有可能发生,

上一秒您还在线路上,

下一秒就完全 脱离了线路。

这便是我们选择 50 毫秒的原因。

您无法使其 实际发生。

这太快了,机器人实际上 不可能发生这种情况。

但是我们不得不进行猜测。

所以我将会进行猜测。

偏左还是偏右, 可能性各占一半。

我随意选择一个。

这里是另外两个 实际上也不可能发生的情况,

因为控制器的 运行速度要比机器人的

移动速度快得多。

那就是,我之前 在偏左位置。

现在,传感器表示, 嘿,伙计,您偏右了。

我在这里假设 这种情况有可能发生。

这是我的线路。

我的机器人沿着 与线路垂直的方向

移动。

类似地,我之前 是在偏右位置。

现在,我又偏左了。

所以这是一些奇怪的情况, 它们可能永远都不会发生。

但无论如何我们得 放一些东西在这里。

将这些东西整合在一起,

我们便得到了 完整的状态转换图 --

状态转换表。

而在 C 代码中, 在这里您可以看到,

这里的每个箭头 都代表这里的一个

条目。

很明显,这是一个 一一对应的映射,两方具有

完全相同的信息。

所以,我将会以 比机器人的移动速度

快得多的速度 运行我的有限状态机。

这里是实际的 C 代码。

我实际上会将这些 代码加载到某个机器人上。

机器人将会沿线路 移动 -- 一定程度上。

我说过,使用 更多的状态时,

效果会更好。

而且真实 机器人上的传感器

实际上有 8 位, 而不是仅仅 2 位。

但是,它的代码

将会与我们在交通信号灯 示例中看到的非常相似。

让我来全程演示一下。

好的,这是我的 结构元素。

同样,每个状态都有 一个 2 位输出、一个等待时间

和四个次态, 因为有两个端点。

总共只有三个状态。

这是一种基于指针的 东西,所以它在 C 代码中的

实际名称是指针。

这里是我们刚刚 绘制的状态转换表,

其中包括输出值、 等待时间和

次态,其中次态会因 输入是 00、01、

10 和 11 而有所不同。

好的,该状态机 --

就像我说的,这个在 实际的机器人上运行。

我将时钟 调得很快。

到第 12 章时,我将会 介绍如何运行电机。

简单来说, 它会使电机停止。

然后,我们将会 提供输出。

同样,我们将会在

模块 13 中学习 如何向电机提供输出。

但是,电机输出是 首先完成的部分。

时间延迟,我们将会 在第 9 章中学习

如何使实际的 状态机发生延迟。

然后是在第 6 章中, 我们已经学习了

如何运行传感器输入, 以读取输入。

所以,这里是读取输入。

然后,这是 状态转换,

给出了现态、 输入的值,

也就是 0、1、2 或 3 --

以及次态。

好的,最后总结一下, 我们已经完成了第二个

有限状态机。

在上一个讲座 结束时,我曾提到,

我真的觉得这是 您工具箱里的一个很好的工具,

因为您可以 通过这种抽象

方式解决 许多这种

类型的问题 --

这种抽象方式也可以 说是一种系统,您会有输入、输出,

您知道的情况 不仅取决于当前的输入,

还取决于之前的输入。

希望您喜欢本次实验。

在您的职业生涯中, 您将会发现,

这些有限状态机 将是您工具箱里的

一个极好的工具。 523

视频报错
手机看
扫码用手机观看
收藏本课程

相关下载

查看全部

视频简介

TI-RSLK 模块 7 - 讲座视频 - 有限状态机线路跟踪器

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:25:37
在该模块中,你将学习如何利用有限状态机作为机器人系统的中央控制器。
已有7人参与了讨论去论坛跟帖交流
new
关闭广告