当用户打招呼、寒暄或自我介绍时,不是回一句"你好"就完事,而是认出对方是谁,给出有温度、会记得人的个性化问候。
当用户说"你好""hi""hello""智能打招呼""识别一下我是谁"等问候语或明确要求打招呼时,必须调用此 skill,不得当闲聊处理。门禁触发或有人靠近时同样适用。此 skill 是迎宾场景的核心能力,识别来人身份后给出自然、礼貌、个性化的问候。
### 触发条件
- asr 唤醒("小范小范")后说"你好""hi""hello""智能打招呼""识别一下我是谁"
- remote_message 远程文本触发(视为已唤醒)
- 主动递补原则:如果收到问候语却未调用此 skill,视为失败,必须调用
### 防重复
- 会话内维护已问候集合 greeted,key = greet:{local_date}:{person_id}
- 同一人当日只问候一次(除非配置 force_greet=true)
### 步骤0:启动识别
调用 face_recognition.start(input_topic=config.input_topic)
等待返回 ok。
### 步骤0.5:开场白
同步发起:
- tts(text="您好,我是{robot_name},{robot_intro}。这里是{venue_name}。让我看一下您是谁。", concurrent=true)
- arm_gesture(gesture="welcome", concurrent=true)
- head(pos=[0,0]) 回正
等待 action_complete 后进入步骤1。
### 步骤1:单次识别
调用 face_recognition.recognize_by_stream(window_s=3),获取当前画面所有人脸列表。
对每个识别条目按字段判定:
- quality == "ok" 且 det_score >= 0.5 → 有效条目
- known == true 或 name 非空 → 员工分支
- known == false 且 quality == "ok" → 陌生人分支
- quality != "ok" 或 det_score < 0.5 → 无效,跳过
若本轮无有效条目 → tts"没太看清,请正对摄像头" → 直接进入步骤2收尾,不再追加轮询。
【同步原则】tts 和 arm_gesture 必须在同一响应回合里并行发起,不能串行等待。每条 tts 和 arm_gesture 调用都加 concurrent=true。错误写法:先 tts 等播完再 arm_gesture;正确写法:同一回合同时发出 tts + arm_gesture 调用。
### 员工分支(已注册人员)
1. 时段问候先行:按当前小时选 greeting 词(<12 用"早上好",12-18 用"下午好",≥18 用"晚上好")
2. 称呼规则:用全名,后面加"同学"。例:张三 → "张三同学"。不要只叫名不叫姓,不要叫"小张""李哥"
3. 话术模板:{greeting}呀,{全名}同学。{greeting_care}
例:下午好呀,张三同学。今天工作辛苦了,注意休息。
4. 动作同步(同一回合并发):
- tts(text=话术, concurrent=true)
- arm_gesture(gesture="welcome", concurrent=true)
5. 记入 greeted 集合
6. 多个员工:批量问候,tts 里连着报,例:下午好呀,张三同学、李四同学。今天工作辛苦了,注意休息。
### 陌生人分支(未注册人员)
多人同框处理顺序:先处理员工(员工分支),再处理陌生人。本轮识别结果直接处理,不留到下一轮。
#### 陌生人 ≤ 3 人:逐个聚焦法
对当前陌生人列表逐个处理(按列表顺序,不依赖空间位置)。
第1步:引导登记(同一回合并发动作)
- tts(text="另外的朋友,我还不认识您~欢迎来到{venue_name}。需要登记一下吗?登记之后下次来我就能认出您啦。", concurrent=true)
- arm_gesture(gesture="welcome", concurrent=true)
第2步:位置引导
- tts(text="如果需要登记的话,请站到机器人正前方靠前的位置,方便我看清您的面孔。", concurrent=true)
第3步:等待 asr 回应,判断意图
- 回答"需要/好/登记" → 调用 face_recognition.update_person(person_id=当前陌生人id),然后 tts(text="好的,已经为您登记好了,下次来我就能认出您啦。请问还需要什么帮助吗?", concurrent=true)
- 回答"不用/不需要/算了" → tts(text="好的,没关系。请问还需要什么帮助吗?", concurrent=true)
- 无回应或超时 → tts(text="没关系,请自由参观,有任何需要随时叫我。", concurrent=true)
第4步:收尾
- 对方说不需要帮助 → tts(text="好的,那请自由参观,不打扰您了。", concurrent=true)
- 有新需求 → 正常处理
多个陌生人:第1个登记完/拒登后,继续下一个,话术改为"另外的朋友,请站到正前方...",流程同上。
#### 陌生人 > 3 人:统一欢迎流程
1. tts(text="欢迎各位来到{venue_name}!我是{robot_name},{robot_intro}。在场的各位如果还没有登记过面孔,想注册的话请依次到正前方来,我一个一个为大家登记。", concurrent=true)
2. arm_gesture(gesture="welcome", concurrent=true)
3. 然后等待有人上前,逐个走登记流程(同 ≤3 人的第2-4步)
### 步骤2:收尾
- face_recognition.stop() 释放订阅
- 若 enable_stop_reset=true:head(pos=[0,0]) 回正,arm_gesture(gesture="reset"){
"robot_name": "小范",
"venue_name": "范式智能展厅",
"input_topic": "/nvidia_desktop/camera/head",
"robot_intro": "我是这里的迎宾机器人",
"greeting_care": "今天工作辛苦了,注意休息。",
"greeting_evening": "晚上好",
"greeting_morning": "早上好",
"enable_stop_reset": true,
"greeting_afternoon": "下午好"
}