小程序任务:cpp任务(task_cpp)

  • 会出现什么变量,以及变量什么语义,依赖于单任务小程序怎么实现。因为这个,相关任务脚本最好是小程序开发者去编写,使用者只是做些小改。任务窗口提供“导出”和“导入”,方便把别人写的任务脚本汇入自个可使用的cpp任务。

小程序任务有三种类型:moveit、ble和cpp。moveit_api用于编写moveit任务,cpp_api用于编写cpp任务。当智能家居发生事件时,像按下门铃,触发的往往是cpp任务,这意味着用户对cpp任务的要求会是各式各样。以按下门铃来说,每家都可能细微上有不同。如果坚持必须用代码去写任务,对一般用户来说太苛刻了。于是cpp任务提供了两种编写方式。一是app会提供个任务生成界面,通过拖拉模块就可生成些逻辑不复杂任务。二是用C++编写,这就可处理复杂逻辑了。

为方便,本文会以一个cpp任务为示例,过程中,必须先执行操作1,后面2到6则不要次序了,且能重复,7则是结束任务。

  1. 机器人自主移动到一个叫“门口”位置。说“您好,屋主不在。我可以帮做这些事:收快递、拿药、开灯、以及关灯”。
  2. 来人说“收快递”。机器人回,“请说下快递单号”。来人回,“123456789123”。机器人回,“是这儿的快递,等下,给你开个小门”。按个按钮,按完后说,“请把快递放入房内”。——按按钮是假设这门中有个小门,按下按钮后,会打开小门。
  3. 来人说“拿一瓶药”。机器人回,“这就去取药,稍等下。”机器人移动“储物点”,拿上药后,放到后面拖斗,回到“门口”。
  4. 来人说“太暗了,能开下灯吗”。机器人用蓝牙开灯。
  5. 来人说“我走了,关灯吧”。机器人用蓝牙关灯。
  6. 来人说“人口普查”。这不是可操作命令。机器人重复初始状态时回答,“您好,屋主不在。我可以帮做这些事:收快递、拿药、开灯、以及关灯”。
  7. 单条操作执行完后,回到初始状态,持续一分钟没收到语音命令,结束任务。

这任务逻辑不复杂,可用app提供的任务界面生成。界面在生成任务时会遵循一些规则。

 

一、任务过程会让处在某种状态

换到C++,会用一个int类型的变量表示状态,变量名state_。以下是按下门铃任务会出现的状态。

enum {state_moveto_door, state_query_express_NO, state_open_door, state_no_person,
	state_take_medicine, state_turnon_lamp, state_turnoff_lamp};

除它们外,还有个叫初始的状态,值nposm(-1)。

如果是单步骤操作,一个操作对应一个状态。否则对多步骤操作,那在这个操作的每个阶段都要写一种状态。以收快递为例,它分两个步骤。来人说了“收快递”,进入第一步后的state_query_express_NO状态。听到快递单号,进入第二步后的state_open_door状态。

 

二、溢出时间

两种溢出时间,一是cpp任务的溢出时间,二是各操作(阶段)的溢出时间。在任一时刻,只有一种溢出时间在计数。

 cpp任务溢出时间 操作溢出时间
何时工作初始或回到nposm状态后处在操作状态时
阈值是个固定值根据不同操作,这值会变
设置函数set_stop_task_cpp_ticksset_stop_step_ticks(threshold)

示例的按下门铃事件,cpp任务溢出时间设为了1分钟。对操作溢出时间,询问快递单号可短点,像30秒。换到是个搬运操作,溢出时间则设了较长的6分钟。

 

三、状态

状态可分为三种:异步状态,可中断状态和同步状态。

 异步状态(async_state)可中断状态(interruptable_state)同步状态(sync_state)
条件async_task.type != nposm,此状态下threshold_s一定不是nposmasync_task.type == nposm && threshold_s != nposmasync_task.type == nposm && threshold_s == nposm
是否出现在启动阶段可以不可以可以。一旦出现,必须最后一个状态
完成后下一状态(启动阶段)由启动时状态变化to_state指定。(非启动阶段)有对应异步状态变化的,那个to_state指定。否则nposm语音导致状态变化中的to_state指定nposm

3.1 异步状态

含有有效异步任务的状态,称为异步状态。此状态下,threshold_s不能是nposm。

 

3.2 可中断状态

会有这么种状态,它可以被中断,继而回到初始状态nposm。以收快递为例,来人说了“收快递”,进入state_query_express_NO状态,但迟迟不说快递单号,或说出句能启动第一步骤的命令,像“开灯”,这时会由state_query_express_NO立即回到nposm状态。这个state_query_express_NO就是个可中断状态。反之,state_open_door这种机械臂操作,工作中即使听到第一步骤命令,也不会中断工作。要想结束,一是等工作完成,二是再次触发按下门铃事件。对可中断状态的几个特点。

  1. 收到第一步骤命令后,会立即回到nposm状态。
  2. 操作溢出时间到期后,会立即回到nposm状态。当然,要是操作溢出时间到了,非可中断状态也会回到nposm状态。

该状态是可中断状态的判断条件:异步任务是nposm,并且溢出时间不是nposm。

在启动阶段,禁止出现可中断状态。原因是可中断状态是等着来人说话,启动时状态变化是须要一气呵成,中间不能还要等着根据来人说话让进入不同状态。

 

3.3 同步状态

会有这么种状态,它在此次就能完成全部操作,执行完后,也不须要再根据来人语音进入不同状态。

该状态是同步状态的判断条件:异步任务是nposm,并且溢出时间是nposm。

同步状态没有溢出时间,同步状态执行必须回到空闲(state_=nposm)状态。

 

3.4 状态完成后,机器人进入哪状态

完成异步任务后,机器人进入哪状态?这分两种情况。在启动阶段,由启动时状态变化的to_state决定。在非启动阶段,如果有以它为from_state的异步状态变化,进入该变化的to_state,否则进入nposm。

完成可中断状态,机器人进入哪状态?在启动阶段,不存在这种状态。非启动阶段,这种状态是等着用户说出语音,然后跟据语音内容来决定下一状态,因而由语音导致的状态变化的to_state指定是哪状态。完成可中断状态后,下一状态是由语音导致的状态变化的to_state指定的那个状态

完成同步状态后,机器人进入哪状态,这分两种情况。在启动阶段,同步状态一定是最后一个状态,即下一状态是nposm。在非启动阶段,同步阶段下的下一状态会进入nposm。综上所述,完成同步状态后,下一状态是nposm。

 

3.5 状态字段:is_end

is_end用于指示完成该状态后,是否要结束此个task_cpp任务。

  1. 在启动阶段中状态,只有最后一个状态才能允许is_end=true。
  2. 在可中断状态,都不允许is_end=true。
  3. 有做为异步状态变化的from_state的状态,不允许is_end=true。

 

四、简单语义识别(tkey_2_state)

当来人说了一句话,转化为文字后,如何知道这文字对应是那条命令。举个例子,收快递、有快递、快递到了,都可归到收快递。这可纳为语言处理中语义识别,如何解决语义识别,这是个大内容。在没有很好条件时,tkey_2_state给了一种简单的关建词法。

  • major_key。主关键词,只一个。一旦设了,文字上必须出现。
  • minor_keys。次关键词。minor_keys可以是多个。
  • key_strategy。指明了对次关键词的处理策略,有三种。keys_at_least_one表示只要出现当中一个就算命中。keys_all_match_and_order要求全部出现,并按加入的次序,才算命中。keys_all_match_no_order则要求全部出现,但可以不管次序,就算命中。

结合tkey_2_state规则,可按以下设置识别“收快递”。

major_key=快递,
minor_keys=有、到、取、收,
key_strategy=keys_at_least_one,
from_state=nposm
to_state=state_query_express_NO

这个组合,就可让“有快递”,“快递到了”,“取快递”,“收快递”都识别“收快递”命令。from_state、to_state是方便状态转换。表示只在nposm状态时,才会去尝试识别“收快递”命令,一旦命中了,那就会进入询问快递单号状态。

 

五、如何处理无效语音

无效语音指的是不会导致第一步骤,也不是有效答案的语音,像不是对的快递单号。对这类语音,以下是处理规则。

  • 正处在nposm,那播报,在这个任务,机器人能干啥。
  • 不在nposm,针对具体状态去播报。处于state_query_express_NO时,会叫用户提供快递单号,在state_open_door,会说正在开小门,叫访客等待。

 

六、启动时自动执行的操作

一旦开始执行,有些命令会自动执行些操作。对门铃按下任务,原来近距离接收来人语音,机器人须要先自主移动去一个叫“门口”位置。这时,走到“门口”位置这个操作也会定义成一个状态state_moveto_door,也要调用set_stop_step_ticks()。执行完启动时操作后,机器人进入nposm状态,

 

 

全部评论: 0

    写评论: