5.2.2 屏幕控制

屏幕控制接口提供了完整的显示控制能力,包括表情控制、视频播放等功能。通过该接口,开发者可以实现机器人的视觉交互能力。

核心功能

  • 多种预设表情播放

  • 自选视频播放

  • 播放列表和循环播放

  • 播放优先级控制

表情播放状态查询话题

话题名称

数据类型

描述

QoS

频率

/face_ui_proxy/status

FaceEmojiStatus

Emoji播放状态

BEST_EFFORT+TRANSIENT_LOCAL

事件驱动 + 播放期间叠加 1Hz(详见下方)

频率说明:该话题有两种推送方式叠加:① 状态切换时立即推送(事件驱动,含播放项切换);② 表情和视频播放期间另以 1Hz 周期推送 运行中(2) 进度。两者同时生效,不互斥。

  • FaceEmojiStatus ros2-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 服务触发

表情播放服务

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/PlayEmoji

PlayEmoji

播放表情

/aimdk_5Fmsgs/srv/PlayEmojiGroup

PlayEmojiGroup

播放表情列表

  • PlayEmoji ros2-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 字段区分状态变更的触发来源。

  • PlayEmojiGroup ros2-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                   # 响应消息
    

    表情 id 枚举同 表情对照表,优先级机制见 上文。

视频播放服务

使用本功能前,请先阅读 优先级机制 中关于 task_manager 自动控制的说明,避免显示控制冲突。

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/PlayVideo

PlayVideo

播放视频

/aimdk_5Fmsgs/srv/PlayVideoGroup

PlayVideoGroup

播放视频列表

  • PlayVideo ros2-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/下创建子目录存放)

    • 优先级机制见 上文

  • PlayVideoGroup ros2-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 话题监控播放状态,发现被抢占后按需重新设置

  • 注意视频文件路径和权限要求