视频:餐厅
一、概述
这里演示餐厅可能发生的三种事。一是顾客按下餐桌铃希望问询上菜进度。对应kLink中的两条门铃按下。二是到既定时间了,机器人去巡检,对应kLink中“巡检、巡逻”。三是放门口的红外探测器探测到有人,播报迎宾词。对应那条“人体红外探测器”。把探测器优先级设为2,这比定时任务还低,是考虑到门口可能经常有人走动,避免它抢占掉“巡检、巡逻”任务。
地图上有4个位置。“1号桌”、“大厅1号桌”分别对应两餐桌位置,“门口”放着外红探测器,还有只蓝牙灯。
二、问询上菜进度
在C洼的餐厅云服务,可看到此餐厅摆放6张桌子,可选择5种菜。1号桌在第一张,大厅1号桌在第5张。此时这两张桌子处于空闲状态。这时按下1号桌铃。机器人将去1号桌位置。这时顾客还没点菜,到了后,播报方便用户怎么点菜的话。
1号桌点菜,下单了麻婆豆腐、花菜各一份。大厅一号桌点菜,下单了两份毛豆,三份水饺。同时,厨房那边开始烧菜,对每个菜都会设个估计完成时间。这时按下1号桌铃。机器人将去1号桌位置。到了后,改为播报此桌有2份未上菜,以及每份菜估计还须要时间。
在厨房,把1号桌要的2份菜改为已完成,这样1号桌就上完菜了。(...)这时按下大厅1号桌铃。机器人将去大厅1号桌位置。到了后,播报此桌有5份未上菜,以及每份菜估计还须要时间。
1号桌上完菜,但还没结账,再次按下1号桌铃。机器人将去1号桌位置。到了后,播报此次金额,以及如何付钱。
三、巡检、红外探测
巡检任务大概是这样的。首先移动到1号桌,执行抓拍前、后2张图像。然后去门口,执行打开蓝牙灯。最后去大厅一号桌,再次抓拍前、后、左、右4张图像。为尽快触发巡检任务,修改定时时间。一到定时时间,机器人开始执行巡检,先是去1号桌抓拍。
已到1号桌位置,因为还要拍后面,机器人要转180度。
已到大厅一号桌位置,除前面外,还要拍其它三个方向。于是会每转90度拍一张,直到转了270度。
巡检过程会产生事件,这里就是在那位置拍到的图像。在个人中心“事件”可查看它们,当然,也可以在手机上安装个kDesktop app。1点05分,对应在1号桌拍的两张。1点07分,对应大厅1号桌拍的4张。
红外探测器探测到有人经过,这时机器人在大厅一号桌位置,离门口不到2米,较近,机器人于是播报迎宾词。
让机器人去1号桌位置,这时离门口超过2米,认为远了。机器人不再播报迎宾词,改说“距离太远,不播报”。
四、任务:智能餐厅
4.1 餐桌序号/餐桌索引
机器人问询上菜进度,要向云服务器发请求。首先要解决个问题,它们是怎么协商正问的是哪餐桌,这里用上了设备别名。在kLink的“IoT设备”,可看到这两餐桌铃的别名前缀了“TB1”、“TB5”字样。这三个字符以及后面的连接符有特殊含义。
运行实现问询上菜任务的小程序kHome,进餐厅,会自动列出符合别名格式的IoT设备。触发问询上菜进度的IoT设备别名必须以着这么个格式:起始是“设备别名标识”指定的两个字符,后跟大于零的自然数,然后连接符“-”,最后是不为空的餐桌名称。
别名的数字部分对应“餐厅”云服务中、餐桌在列表的序号。于是“TB1”对应云服务中的第一张,即1号桌,“TB5”对应云服务中的第五张,即“大厅1号桌”。
除列出符合别名格式的设备外,这里还要给对应餐桌铃设备绑定餐桌在地图中位置。这样该铃被按下后,机器人就知道往哪走了。以别名是“TB1-1号桌”餐桌铃为例,对应地图上位置是“1号桌”。
4.2 智能餐厅任务
kHome问询上菜进度任务使用了12个变量。iot_alias和table是输入变量,分别表示按下的餐桌铃别名、餐桌索引。table_at、table_uuid、table_name、total_amount、cooking_name、cooking_count、cooking_time等10个是输出变量,table_at是要问询的餐桌索引,table_uuid是餐桌在地图上位置,table_name是云服务器写的餐桌名,total_amount是单子金额。以“cooking_”为前缀的都是数组,它们有着一样长度,表示未上菜的相关信息。name是未上菜名称,count是每种未上菜份数,time是剩余时间。
接下看餐桌铃关联执行的“智能餐厅”任务。“不可抢占”设置为是,表示正在处理一个问询上菜进度时,如果再有餐桌铃按下,会忽略。启动状态设置的是“查询餐桌位置”。要实现最后播报分两个状态,每个状态都要调用一次问询任务。“查询餐桌位置”是第一个状态,它是以餐桌铃别名iot_alias为参数调用问询任务。于是在输入变量赋值时,把指示正按下设备别名的内置变量fake__iot_alias_,赋值给iot_alias,另个变量table则保持空。此个问询将得到两个输出变量,一个是表示位置的table_uuid,另一个是表示索引的table_at。结束此状态后,转去“khome问询上菜进度”。
在“khome问询上菜进度”状态,先是移动到table_uuid位置。然后以table_at为参数再次调用问询任务。在输入变量赋值上,把之前得到的table_at赋值给table,iot_alias则保持空。此次问询将得到金额、未上菜、已上菜,即10个输出变量中的另外8个。从云服务得到问询结果后,系统会调用状态中的“已完成”。该值有5条分支,分别对应此次问询可能出现的五种结果。一是餐桌名变量table_name不存在,那表示网络收发出了问题。二是空的餐桌名,表示服务器没有table_at对应的餐桌。三是下单了,并且存在未上菜,这时用join2_2element函数联合相关数组,形成要播报的话。四是菜已上齐,但没付钱。五是该餐桌空闲。一旦播报完“已完成”生成的话,“智能餐厅”任务也就结束了。
五、任务:巡检、红外探测
对“巡检”,C洼文章“场景:巡检”有关于它的详细介绍。在位置“1号桌”和“大厅1号桌”都执行了抓拍。一次抓拍最多拍4张,当要拍多张时,会每隔“360除以count”拍一张,其中count是调用抓拍任务的输入参数。以count=4为例,每张间隔是90度。旋转方向总是逆时针,即4张分别是前、左、后、右。
对红外探测,这里操作很简单,就是播报下欢迎观临。不过,一旦机器人离门口有点远,那就没必要播报。这里用了个distance函数,只有当前机器人距离门口不超过2米,才报欢迎观临。否则报“距离太远,不播报”。实际使用时,把后者置空就行。
六、英文播报
这里播报用的都是中文,通过改写“问询上菜进度”任务,以及用任务界面修改“智能餐厅”脚本,便可实现英文播报。此时英文语句是“智能餐厅”任务生成,后面只要把这些英文语句念出来就行,而不是中文翻译成英文。只是念英文,像科大讯飞就有提供,叫语音合成sdk。免费的是否支持合成英文,这个不清楚。