有限状态机线路跟踪器

展开字幕 关闭字幕 时长:25分37秒
评论 收藏 分享 上传者:hi5
大家好,我是 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
课程介绍 共计4课时,51分45秒

TI-RSLK 模块 7 - 有限状态机

TI 机器人 RSLK 有限状态机

此模块将演示如何使用有限状态机作为系统的中央控制器。有限状态机是嵌入式系统工具箱中的一种高效设计过程,可用于解决输入和输出问题。
展开

  • 相关产品
  • 样品申请
  • EVM购买
  • 文档下载
  • 软件/工具
  • TI Design
分享到X
微博
QQ
QQ空间
微信

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新文章 手机版

站点相关: EEWORLD首页 EE大学堂 论坛 下载中心 Datasheet 活动专区 博客

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2017 EEWORLD.com.cn, Inc. All rights reserved