生成、放置query.csv
- 用Excel生成一个文件(假设是query.xls),每行5列。
第一列:标识。唯一标识该类商品,不能重名。
第二列:位置。指示该类商品存放位置,不必是导航地图中位置。
第三列:名称。这类商品可能出现的名称,多个时用“;”(英文分号)隔开。
第四列:描述,该类商品大致功能,用于确认顾客要的是否是这种商品。
第五列:品牌,多个时用“;”(英文分号)隔开。 - 把query.xls导出到query.csv(必须这个文件名),并把csv编码设为UTF-8。具体操作,在Excel执行,另存为——保存类型选“CSV UTF-8(逗号分隔)(*.csv)”。——如果使用的Excel版本过低,没有设置编码为UTF-8功能,可这么修改query.csv编码:操作是运行“记事本”,文件——另存为——编码选“UTF-8”——保存。
- 用远程桌面,把query.csv复制到机器人<UserData>/aplt_leagor_khome__documents目录下。运行kHome,“问询”,单击右上角“导入”。
对第1、第2步,也可换为从这里下载个样例query.csv,然后在上面改。
一、问询商品
想象下顾客到超市买手机数据线,但不知数据线在哪位置,就想让机器人带他过去。这里假设数据线是放在地图的“门口”位置,看机器人是怎么带顾客去的。
现在演示正问询的商品不存在。
二、语音命令
总的来说,实现是使用了kLink机制,即“触发哪条件后,机器人去执行哪任务”。这里触发方式是语音命令。在kLink,可看到两条语音命令:问询商品1、问询商品2。只要满足任意一条,便会执行“问询商品”任务。
问询商品1定义了这么种格式,当起始词语是或“有卖”,或“有”,或“卖”时,后面部分就认为是要问的商品名称。它满足了这类提问:有卖数据线吗,有电脑吗。这个命令会把商品名称存放在一个叫name的变量,变量归属小程序是“内置”,即Bundle ID是aplt.launcher.fake。完整变量名就是aplt.launcher.fake__name。
问询商品2定义了这么种格式,当语句中有含有或“还有卖”,或“还有”,或“有卖”,或“还卖”词语时,前面部分就认为是要问的商品名称。这就满足了这类提问:数据线有卖吗,电脑还卖吗。同样,这个命令会把商品名称存放在一个叫name的变量。
三、问询商品任务
介绍完满足语音触发的条件后,说下要关联执行的问询商品任务。启动状态设置的是“khome查找商品”。在khome查找商品状态,会执行kHome小程序实现的问询任务。
进入kHome,查看“问询”。问询主要功能是根据商品名称找到该商品对应位置。实现上,靠的是一张商品表。“标识”字段唯一标识该类商品,不能重名,后面出现同名商品时,会用到它。“位置”字段指示该类商品存放的位置。“名称”字段可能含有多种商品,放着这类商品中可能出现的名称。“描述”是该类商品大致功能,用于确认顾客要的是否是这种商品。
会发现商品表中的“位置”不是导航地图标示的位置,这是考虑到制做表格会用表格编辑软件,像excel。过程将是先用excel制做出一个query.csv文件,然后kHome一次导入。为各环节独立,制表人员不须要知道实际导航地图情况。由于存在两种位置,就要用后面“位置”表。位置表做了这么个映射,左侧是商品表中位置,右侧是对应的导航地图中位置。
针对前面演示出现的“数据线”,出现在“充电线”类,商品表中位置是“C区”,导航地图位置是“门口”。
kLink任务要调用kHome问询任务,那kLink怎么把要查找的商品名称“数据线”送给kHome,以及把kHome找到的位置“门口”返回给kLink?这里用了变量。按方向,变量分输入变量和输出变量,这是站在被调用者kHome角度说的。送给kHome的称输入变量,kHome返回的称输出变量。kHome问询任务使用了9个变量。query_id、query_name是输入变量,分别表示要问询的商品标识、商品名称。id、position、desc、brands、position_uuid、ids、descs是输出变量,前5个是搜到单类商品时出现,分别表示该商品标识、商品表中位置、描述、品牌、以及导航地图中位置。后两个是搜到多类商品时出现,它们都是数组,分别表示这些商品的标识和描述。
知道kHome问询任务功能及变量,一些任务编程界面设置就好理解了。首先输入变量,对qury_id和query_name。kHome行为是这样的,如果存在query_id,就以query_id为关键字,去匹配商品表中的“标识”字段,否则用query_name去匹配商品表中的“名称”字段。查看qurey_id,它用到ids变量,此时这变量是不存在的,于是query_id也就不会存在。query_name则来自name,它正是前面两条语音命令生成,内容便是商品名称:数据线。
kHome根据商品名称搜到标识、位置、描述等内容后,放到相关变量,这时系统就会调用状态中的“已完成”。该值有3条分支,分别对应一次搜索可能出现的三种结果。一是只搜到一种,二是搜到多种,三是没搜到。第二种后面再介绍,对第三种,除设置要说的语音,还会把“结束任务”置为true,表示“khome查找商品”状态一结束,这问询商品任务就结束了。对第一种,说出商品描述后,会等待用户确认找的是否这商品。
顾客选了“是的”,进入“询问是否要带路”状态。在这状态,除了说出这商品位置,会再次要求顾客一个确认:是不是要带路。一旦顾客选了“带我去”,那进入“带路”状态。在“带路”状态,去的位置设置为kHome返回的导航地图中位置position_uuid。到位置后,此次问询商品任务结束。
等待用户确认找的是否这商品时,如果顾客选“不是”,那进入“不是kHome找出的商品”状态。在这状态,说了一条语音后,此次问询商品任务结束。
四、问询重名商品
会出现重名商品,像笔记本,可能是写日记用的本子,也可能是笔记本电脑。这里以打包袋(带)为例,看机器人怎么处理。
五、重名流程
和单名流程一样,任务启动后,首先进入“khome查找商品”状态,在这状态会执行kHome小程序实现的问询任务。和单名不一样,查找结束后,没有id、desc等单名相关变量了,而是产生表示多种的ids和descs。 对“完成时”字段,由于没有id变量、但存在ids,将进入第二条分支。为有较好用户提示,用join_element函数,把找到几种商品的描述生成一句话。说出这些商品描述后,会等待用户确认要找的是第几类商品。
生成用于选择第几类的次要词语时,用了joint_index函数,函数执行后会生成“第一类,第二类”这样字符串。顾客选了“第几类”后,再次进入“khome查找商品”状态。虽然执行的是同一个任务,但是所处环境和之前不一样了,已可以生成输入变量query_id。为计算qurery_id值,用了element函数,它会取出ids数组中的第几个单元,“第几个”来自之前用户选择了第几种。内置变量last_matched_index_类型是整数,存储着在最近一次语音导致状态变化中,选择了第几个次要词语。对khome查询,query_id优先级要高于query_name,此次会以query_id为关键字,去匹配商品表中的“标识”字段。“标识”字段不可能同名,而且这标识一定存在,于是会得到单名时一样结果。
得到id、position、desc等单名相关输出变量,后面处理便是继续单名商品时流程。即机器人说出商品描述后,会等待用户确认找的是否这商品,直到此次问询商品任务结束。
六、扩展
6.1 界面编写语音命令、kLink任务
在语音命令2,还有第二个变量more。计划是为满足这样语音:这种打包袋还有更小尺寸吗。“还有”之后的“更小尺寸吗”会赋值给more。这时用户可能已看到打包袋,只是想知道是否有更小尺寸。或许处理方法是扫下用户手中打包袋的二维码,然后在数据表中找有没有更小的。
对kLink任务,界面编写这种方式适合处理语音互动,像各地可能有自已的用词风格。功能上么,也可以加其它的,像问询品牌。
6.2 小程序实现查询任务
可基于kHome上改,改掉字段名,让用于其它问询场景。像商务楼一楼,机器人带去电梯、卫生间、物业室,等等。
6.3 改变触发方式
问询任务本质说来是三个步骤,一是某种触发方式产生一个关键字,二是以这关键字搜表、得到个导航地图中位置,三是机器人移动去该位置。对触发方式,这里用了语音命令,可改为通过重载IoT驱动,实现网络命令触发(IoT触发)。那边微信小程序发关键字到机器人,要什么饮料、以及房间号,机器人收到后来到工作间,工作人员把饮料放进机器人,机器人就移动去那房间,从而实现自助送餐。