当前位置:   article > 正文

【智能车竞赛】状态机编程在智能车竞速赛道中的应用 - 编程小记_比赛状态机

比赛状态机

我曾试图通过一些代码上的小技巧,优化智能车竞速赛道的元素处理逻辑。
后来学长告诉我这叫做 “状态机” 。
——2022.07.20

一、我们为什么需要状态机?

定宽的白色赛道,在深色背景布上,以不同的角度扭曲交错,便形成了 “环岛”、“三岔” 等智能车竞速赛道的元素。相比于纯粹的直道和弯道,这些元素以其更高的图像复杂度和特殊的行驶规则,使我们在编写算法时不得不对其做特殊处理。

每个元素都有其唯一性的特征,如果我们能够从那一串图像数组中将其分辨出来,就相当于实现了元素的 “识别”。然而元素的处理远不止 “认出元素” 这么简单,我们还要考虑智能车在元素中各个位置不同的图像特征、以及相应的引导方式——比如在第一次识别到 “环岛” 时要引导车辆拐弯入环,而在识别到将要离开环岛时则要引导车辆不再拐进去。这个过程包含了一连串的动作,状态机编程正好能够帮助我们理清其中的逻辑,并大大提高代码的可读性和易修改性。

如果代码由多个组员共同完成,代码的可读性十分重要——这可不是光凭一堆注释就能解决的;若是只有一个人负责,就需要着重关注代码的易修改性——不然写到后期就是一部天书,修改简直无从下手,全删了又觉得可惜……
——《论模块化编程的重要性》

二、什么是 “状态机编程” ?

状态机(FSM. Finite State Machine)概念的最早来源我没能考证到。倒是有个蛮统一的定义:

状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。

它有另外一个更显见的称呼——“状态转移图”。它是一个有向的 “图(Graph)”,通过条件(Branch)将一个个不同的状态(Not)以一个既有的逻辑关系连接起来。

如果讲人话,就是:

使程序在所有可能(或者说 “需要”)的状态间,以预定的条件实现自动切换

在这里插入图片描述

状态机早时出现于 “状态寄存器和组合逻辑电路” 的硬件实现。其在编程中也有类似的实现形式,这篇文章的后半部分就给出了一个很好的例子:什么是状态机?状态机的概念 CSDN
后文中也会有有关智能车的示例。

在竞速赛道上,我们需要对付的每种元素都可以视为一个状态机。由于车子的行驶是单向的(正常情况下应该不会出现 “倒车”……),状态机的条件逻辑也应该依照正向的时序设置为单向,即:
F S M . b e g i n → E v e n t 1 S t a t e 1 A c t i o n 1 → E v e n t 2 S t a t e 2 A c t i o n 2 → E v e n t 3 ⋯ → E v e n t N S t a t e N A c t i o n N → E v e n t ( N + 1 ) F S M . e n d FSM.begin \xrightarrow[]{Event1} State1_{Action1} \xrightarrow[]{Event2} State2_{Action2} \xrightarrow[]{Event3} \\ \dots \xrightarrow[]{EventN}StateN_{ActionN} \xrightarrow[]{Event(N+1)} FSM.end FSM.beginEvent1

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号