5.2.2 屏幕控制
屏幕控制接口提供了完整的显示控制能力,包括表情控制、视频播放等功能。通过该接口,开发者可以实现机器人的视觉交互能力。
核心功能
多种预设表情播放
自选视频播放
播放列表和循环播放
播放优先级控制
表情播放状态查询话题
话题名称 |
数据类型 |
描述 |
QoS |
频率 |
|---|---|---|---|---|
|
|
Emoji播放状态 |
|
事件驱动 + 播放期间叠加 1Hz(详见下方) |
频率说明:该话题有两种推送方式叠加:① 状态切换时立即推送(事件驱动,含播放项切换);② 表情和视频播放期间另以 1Hz 周期推送 运行中(2) 进度。两者同时生效,不互斥。
FaceEmojiStatusros2-msg @ face_ui/FaceEmojiStatus.msg# 表情状态信息 MessageHeader header # 消息头 string e_path # 表情文件路径 string[] e_path_list # 当前一组表情的路径列表 uint8 e_id # 表情ID uint8 mode # 播放模式(1 (EMOTION_MODE_ONCE 单次), 2 (EMOTION_MODE_LOOP 循环)) int32 priority # 优先级 uint8 status # 当前状态(0 (STATUS_IDLE 空闲), 1 (STATUS_START 开始), 2 (STATUS_RUNNING 运行中), 3 (STATUS_FINISHED 完成), 4 (STATUS_STOPPED 被停止)) float64 time_to_end_ms # 当前播放项的剩余时长(单位:ms) uint8 display_type # 当前活跃显示层(0 (空闲), 1 (视频), 2 (svga 动画), 3 (rgb 纯色), 4 (图片), 5 (二维码), 6 (文本)) string trace_id # 关联触发本次状态变更的 RPC 调用 ID int32 error_code # 未启用
备注
字段使用说明:
status:当前固件在表情/视频播放与切换期间仅推送
运行中(2);被停止(4)正常使用不会触发;0-空闲、1-开始、3-完成暂未使用。订阅时建议对全部取值做兼容处理time_to_end_ms:当前播放项的剩余时长(
duration - position)。.msg 注释声称"如果重复,会将剩余重复时间计算在内",但实际实现仅返回当前项的剩余时长,不包含后续循环时间display_type:正常 SDK 使用仅见
video(1)(PlayEmoji/PlayVideo 触发),其余通过非 SDK 服务触发
表情播放服务
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
播放表情 |
|
|
播放表情列表 |
PlayEmojiros2-srv @ face_ui/srv/PlayEmoji.srv# 播放表情 # 服务名称: /aimdk_5Fmsgs/srv/PlayEmoji # 请求 CommonRequest header # 请求头 uint8 emotion_id # 表情 id uint8 mode # 播放模式枚举(1 (EMOTION_MODE_ONCE 单次), 2 (EMOTION_MODE_LOOP 循环)) int32 priority # 播放优先级 --- # 响应 CommonResponse header # 响应头(未启用,见下方说明) bool success # 是否控制成功 string message
备注
响应字段说明:header 字段未启用,header.status.value 始终为 UNKNOWN(0),header.code 始终为 0。用户应直接读取外层 success + message 字段,忽略 header
emotion_id表情对照表:
表情ID |
表情名称 |
说明 |
|---|---|---|
1 |
眨眼 |
基础眨眼动作 |
10 |
平静-眼睛变化1 |
平静状态眼睛变化 |
11 |
平静-眼睛变化2 |
平静状态眼睛变化 |
20 |
平静-游戏 |
游戏状态表情 |
30-33 |
平静-卖萌 |
卖萌表情系列 |
40 |
闭上眼 |
闭眼动作 |
50 |
睁开眼 |
睁眼动作 |
60 |
无聊 |
无聊表情 |
70 |
异常 |
异常状态 |
80 |
睡着 |
睡眠状态 |
90 |
快乐 |
快乐表情 |
100-101 |
加倍开心/狂喜 |
极度开心表情 |
110 |
悲伤 |
悲伤表情 |
120 |
同情 |
同情表情 |
130 |
疑惑 |
疑惑表情 |
140 |
震惊 |
震惊表情 |
150 |
撒娇 |
撒娇表情 |
160 |
严肃 |
严肃表情 |
170 |
思考 |
思考表情 |
180 |
愤怒 |
愤怒表情 |
190 |
加倍愤怒 |
极度愤怒表情 |
200 |
崇拜 |
崇拜表情 |
210 |
加倍崇拜 |
极度崇拜表情 |
220 |
充电 |
充电状态 |
priority优先级机制说明:
本优先级机制涵盖本章节全部表情和视频播放接口
新请求优先级不低于原有请求, 则覆盖原有请求运行
新请求优先级低于原有请求, 则被忽略
被覆盖的播放项不会推送
被停止(4)状态,可通过e_path、e_id、trace_id字段变化判断是否被抢占系统模块(如
task_manager)自动触发的表情/视频播放按故障严重程度使用分层优先级(一级过温为 8,阻尼倒/上肢失能等严重故障为 10)。调用播放接口时使用不低于当前生效优先级的值即可覆盖;如需确保不被系统模块抢占,可使用高于 10 的priority值
注意
避免显示控制冲突:
系统运行时,task_manager 模块会在开机过程、故障诊断、站点讲解等场景下自动调用表情/视频播放接口,interaction_slave 模块也会在充电状态变化等场景下通过内部通道调用表情播放接口,两者均可能覆盖用户的播放设置。有两种方式避免被抢占:
设置高优先级:调用播放接口时使用高于 10 的
priority值(系统模块故障场景最高用到 10),即可挡住系统模块的自动控制。此方式无需关闭模块,但每次调用都需指定,且会覆盖系统模块触发的故障表情提示(如摔倒保护、过温告警等),导致用户无法通过屏幕感知这些故障。关闭系统模块:在运控计算单元(PC1,10.0.1.40)上执行以下命令关闭
task_manager(interaction_slave同理,位于交互计算单元 PC3,10.0.1.42),但会同时影响导航、站点讲解等功能:
aima em stop-app task_manager
即使采取了上述措施,/face_ui_proxy/status 话题仍可能推送非用户主动发起的状态变更(来自其他系统模块或 App 远程控制)。可通过 trace_id 字段区分状态变更的触发来源。
PlayEmojiGroupros2-srv @ face_ui/srv/PlayEmojiGroup.srv# 播放表情组 # 服务名称: /aimdk_5Fmsgs/srv/PlayEmojiGroup # 请求 CommonRequest header # 请求头 uint8[] emotion_ids # 表情 id 列表 uint8 mode # 播放模式枚举(1 (EMOTION_MODE_ONCE 单次), 2 (EMOTION_MODE_LOOP 循环)) int32 priority # 播放优先级 --- # 响应 CommonResponse header # 响应头(未启用,见 PlayEmoji 说明) bool success # 是否成功 string message # 响应消息
视频播放服务
使用本功能前,请先阅读 优先级机制 中关于
task_manager自动控制的说明,避免显示控制冲突。
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
播放视频 |
|
|
播放视频列表 |
PlayVideoros2-srv @ face_ui/srv/PlayVideo.srv# 播放视频 # 服务名称: /aimdk_5Fmsgs/srv/PlayVideo # 请求 CommonRequest header # 请求头 string video_path # 视频的绝对路径, 注意文件放在交互计算单元及全员可读权限 uint8 mode # 播放模式(1 (EMOTION_MODE_ONCE 单次), 2 (EMOTION_MODE_LOOP 循环)) int32 priority # 播放优先级 --- # 响应 CommonResponse header # 响应头(未启用,见 PlayEmoji 说明) bool success # 是否成功 string message # 响应消息
注意事项:
视频文件播放默认不播放附带的音频
音视频文件使用绝对路径
音视频文件须放置于交互计算单元(PC3,10.0.1.42)上, 不在开发计算单元(PC2)上
音视频文件夹及该文件夹所有父目录应当为所有用户可访问读取(建议在/var/tmp/下创建子目录存放)
优先级机制见 上文
PlayVideoGroupros2-srv @ face_ui/srv/PlayVideoGroup.srv# 播放视频组 # 服务名称: /aimdk_5Fmsgs/srv/PlayVideoGroup # 请求 CommonRequest header # 请求头 string[] video_path_list # 视频组的绝对路径列表, 注意文件放在交互计算单元及全员可读权限 uint8 mode # 播放模式(1 (EMOTION_MODE_ONCE 单次), 2 (EMOTION_MODE_LOOP 循环)) int32 priority # 播放优先级 --- # 响应 CommonResponse header # 响应头(未启用,见 PlayEmoji 说明) bool success # 是否成功 string message # 响应消息
注意事项:
编程示例
详细的编程示例和代码说明请参考:
安全注意事项
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制
机器人处于稳定站立 / 走跑模式时, 请勿批量快速启动 ROS 节点(建议不超过 2 个/秒), 短时间内大量节点参与 DDS 发现会造成通信拥塞、影响运控实时性, 存在机器人失稳摔倒风险
备注
最佳实践
使用合适的播放模式,避免不必要的循环播放
订阅
/face_ui_proxy/status话题监控播放状态,发现被抢占后按需重新设置注意视频文件路径和权限要求