机器人端侧状态(onState)参考
机器人端侧状态(onState)参考
机器人通过 agentsdk.state_request.meta 事件向 SDK 上报自身状态——在被动回调里你会收到:
PassiveCallback.onState(agentId, eventId, stateName, stateValue)
^^^^^^^^^ ^^^^^^^^^^^^
模块名 模块负载(JSON 字符串)
| 语言 | 重载入口 |
|---|---|
| Java | PassiveCallback.onState(agentId, eventId, stateName, stateValue) |
| Python | PassiveCallback.on_state(agent_id, event_id, state_name, state_value) |
⚠️
state_value可能为简单字符串、数字、对象或对象数组。如果业务侧使用结构化字段,需要自行用JSONObject.parseObject(stateValue)/json.loads(state_value)解析。
本页定义所有 state_name 取值及对应 state_value 的字段结构——共 22 个模块。
每个模块除字段表外都附 JSON 样例,便于直接对照解析。
模块清单
state_name | 主题 | 频率 |
|---|---|---|
map_info | 地图基础信息与导航点位 | 低频 / 事件触发 |
map_2d_grid | 二维栅格地图快照 | 极低频 |
current_location | 当前语义位置 | 事件触发 |
robot_pose | 几何位姿 | 高频(限 10 Hz) |
planned_path | 当前算路路径 | 事件触发 |
locomotion_status | 导航执行状态 | 事件触发 |
pnc_status | 规控避障状态摘要 | 事件触发 |
task_status | 任务状态列表 | 事件触发 |
exhibit_tasks | 展厅讲解任务列表 | 事件触发 |
silisoon | 业务模式与状态扩展 | 事件触发 |
robot_form | 机器人形态 | 一次性 / 偶尔 |
manipulation | 机械臂 / 抓取状态 | 事件触发 |
supported_calligraphy_list | 书法可写文字列表 | 一次性 / 偶尔 |
tts_status | TTS 运行态 | 事件触发 |
vad_status | VAD 运行态 | 事件触发 |
dialog_status | 对话状态机 | 事件触发 |
action_status | 动作 / 技能任务状态 | 事件触发 |
listening_status | 端侧聆听 / 唤醒状态 | 事件触发 |
wakeup_behavior_status | 唤醒表现覆盖配置状态 | 事件触发 |
vision_perception | 视觉感知摘要 | 高频(限 10 Hz) |
speaker | 当前发言人信息 | 事件触发 |
settings | 端侧开关状态面板 | 事件触发 |
map_info
地图基础信息与导航点位。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
map_id | string / number | 否 | 地图 ID |
map_name | string | 否 | 地图名称 |
navi_points | array | 否 | 导航点列表 |
walls | array | 否 | 墙位置信息列表 |
infeasible_areas | array | 否 | 人工墙位置信息列表 |
walls / infeasible_areas 元素格式:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | number | 是 | 点位 ID |
x | number | 否 | X 坐标 |
y | number | 否 | Y 坐标 |
z | number | 否 | Z 坐标 |
navi_points 元素格式:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 是 | 点位名称 |
id | number | 是 | 点位 ID |
point_x | number | 否 | X 坐标 |
point_y | number | 否 | Y 坐标 |
JSON 样例:
{
"map_id": "MAP_001",
"map_name": "1F 大厅",
"navi_points": [
{ "name": "前台", "id": 1, "point_x": 1.2, "point_y": 3.4 },
{ "name": "茶水间", "id": 2, "point_x": 5.6, "point_y": 7.8 }
],
"walls": [
{ "id": 101, "x": 0.0, "y": 0.0, "z": 0.0 },
{ "id": 102, "x": 10.0, "y": 0.0, "z": 0.0 }
],
"infeasible_areas": [
{ "id": 201, "x": 2.5, "y": 3.0, "z": 0.0 }
]
}
map_2d_grid
二维栅格地图快照——仅在地图切换、地图版本变化、首次全量同步或收到 session.input_status_info.sync 时低频上报。
默认推荐编码:
- 原始栅格布局:
int8 raw - 压缩算法:
zstd - 文本封装:
base64 - 对应
encoding:int8_zstd_base64
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
map_id | string / number | 是 | 地图 ID |
map_name | string | 否 | 地图名称 |
version | string | 否 | 地图版本号 |
frame | string | 否 | 坐标系,例如 map |
width | number | 是 | 栅格宽度(格) |
height | number | 是 | 栅格高度(格) |
resolution | number | 是 | 米 / 格 |
origin | object | 是 | 原点对象,含 x / y / yaw |
encoding | string | 是 | 首推 int8_zstd_base64;调试可用 int8_raw |
data | string | 否 | 压缩并 base64 编码后的地图内容;当 transport.mode=resource_ref 时可省略 |
data_md5 | string | 否 | 地图内容摘要 |
compression | object | 否 | 大数据压缩元信息 |
transport | object | 否 | 大数据特化传输元信息 |
compression 字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
raw_layout | string | 否 | 例如 int8_row_major |
algorithm | string | 否 | 首推 zstd |
binary_encoding | string | 否 | 首推 base64 |
transport 字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
mode | string | 否 | inline / chunked / resource_ref |
resource_uri | string | 否 | 资源引用模式下的地图地址 |
chunk_index | number | 否 | 分片序号,从 0 开始 |
chunk_count | number | 否 | 总分片数 |
JSON 样例:
{
"map_id": "MAP_001",
"map_name": "1F 大厅",
"version": "v2",
"frame": "map",
"width": 1024,
"height": 1024,
"resolution": 0.05,
"origin": { "x": -25.6, "y": -25.6, "yaw": 0.0 },
"encoding": "int8_zstd_base64",
"data": "KLUv/QBYDQAA...<base64>...",
"data_md5": "9e107d9d372bb6826bd81d3542a419d6",
"compression": {
"raw_layout": "int8_row_major",
"algorithm": "zstd",
"binary_encoding": "base64"
},
"transport": { "mode": "inline" }
}
current_location
当前语义位置信息(高频几何位姿请走 robot_pose)。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
location_name | string | 否 | 位置名称 |
location_coordinate | string | 否 | 坐标字符串,建议格式 "x,y" |
orientation | number / null | 否 | 朝向角,建议单位为度 |
floor | string / number | 否 | 楼层信息 |
building | string | 否 | 楼宇 / 场馆信息 |
SDK 的兼容专项事件
current_location.upload既接受{"current_location": {...}},也兼容只传{"location_name": "..."}。
JSON 样例:
{
"location_name": "前台",
"location_coordinate": "1.2,3.4",
"orientation": 90,
"floor": "1F",
"building": "总部大楼"
}
robot_pose
机器人当前几何位姿。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
map_id | string / number | 否 | 所属地图 ID |
frame | string | 否 | map / odom 等 |
x | number | 是 | 当前 X 坐标 |
y | number | 是 | 当前 Y 坐标 |
z | number | 否 | 当前 Z 坐标 |
yaw | number | 是 | 当前偏航角,建议弧度 |
pitch | number | 否 | 俯仰角 |
roll | number | 否 | 翻滚角 |
quaternion | object | 否 | 四元数对象 |
linear_velocity | object | 否 | 线速度对象 |
angular_velocity | object | 否 | 角速度对象 |
timestamp_ms | number | 否 | 采样时间戳 |
属于高频几何状态——SDK
input_status_info上传层默认按模块做最大10 Hz限频; 限频仅约束上云频率,本地缓存仍保留最新一次写入。
JSON 样例:
{
"map_id": "MAP_001",
"frame": "map",
"x": 1.234,
"y": 5.678,
"z": 0.0,
"yaw": 1.5708,
"pitch": 0.0,
"roll": 0.0,
"quaternion": { "w": 0.7071, "x": 0.0, "y": 0.0, "z": 0.7071 },
"linear_velocity": { "x": 0.3, "y": 0.0, "z": 0.0 },
"angular_velocity": { "x": 0.0, "y": 0.0, "z": 0.1 },
"timestamp_ms": 1774828800210
}
planned_path
当前算路路径,建议按整条路径替换,不做点级局部 merge。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
path_id | string | 否 | 路径 ID |
map_id | string / number | 否 | 所属地图 ID |
frame | string | 否 | 坐标系 |
planner | string | 否 | 规划器名称 |
planning_status | string | 是 | running / ready / replanned / blocked / failed |
start_pose | object | 否 | 起点位姿 |
target_pose | object | 否 | 终点位姿 |
path_points | array | 是 | 路径点列表 |
total_length_m | number | 否 | 总路径长度 |
remaining_length_m | number | 否 | 剩余路径长度 |
eta_sec | number | 否 | 预计剩余时间(秒) |
updated_at_ms | number | 否 | 最近更新时间 |
JSON 样例:
{
"path_id": "path_001",
"map_id": "MAP_001",
"frame": "map",
"planner": "global_planner_v2",
"planning_status": "running",
"start_pose": { "x": 0.0, "y": 0.0, "yaw": 0.0 },
"target_pose": { "x": 10.0, "y": 5.0, "yaw": 1.5708 },
"path_points": [
{ "x": 0.0, "y": 0.0 },
{ "x": 2.5, "y": 1.2 },
{ "x": 5.0, "y": 2.5 },
{ "x": 7.5, "y": 3.8 },
{ "x": 10.0, "y": 5.0 }
],
"total_length_m": 11.18,
"remaining_length_m": 8.94,
"eta_sec": 30,
"updated_at_ms": 1774828800210
}
locomotion_status
当前导航执行状态。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
motion_task_id | string / number | 否 | 导航任务 ID |
task_name | string | 否 | 任务名称 |
task_type | string | 否 | 首阶段建议固定为 navigation |
state | string | 是 | waiting / running / paused / completed / failed |
target_x | number | 否 | 目标 X |
target_y | number | 否 | 目标 Y |
target_z | number | 否 | 目标 Z |
start_time_ms | number | 否 | 开始时间 |
estimated_completion_ms | number | 否 | 预计完成时间 |
timestamp_ms | number | 否 | 更新时间 |
trace_id | string | 否 | 追踪 ID |
error_message | string | 否 | 错误原因 |
JSON 样例:
{
"motion_task_id": "nav_001",
"task_name": "前往茶水间",
"task_type": "navigation",
"state": "running",
"target_x": 10.0,
"target_y": 5.0,
"target_z": 0.0,
"start_time_ms": 1774828800000,
"estimated_completion_ms": 1774828830000,
"timestamp_ms": 1774828810000,
"trace_id": "trace_abc123",
"error_message": ""
}
pnc_status
规划 / 控制 / 避障状态摘要。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
status | string | 是 | running / path_block / start_replan / replan_timeout / task_finish / task_error |
detail | string | 否 | 面向云端看板的简短补充说明 |
JSON 样例:
{
"status": "path_block",
"detail": "前方有静态障碍物,正在重规划"
}
task_status
任务状态列表。值类型:array<object>。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | running / idle / pause 等任务状态 |
task_name | string | 是 | 用户可理解的任务名 |
task_id | string / number | 否 | 任务 ID |
task_type | string | 否 | 任务类型,例如 navigation / calligraphy |
message | string | 否 | 当前任务说明 |
updated_at_ms | number | 否 | 最近更新时间 |
单任务场景也建议传数组(长度
1)。空任务态可上发:[{"state":"idle","task_name":""}]
JSON 样例:
[
{
"state": "running",
"task_name": "导航到茶水间",
"task_id": "nav_001",
"task_type": "navigation",
"message": "执行中",
"updated_at_ms": 1774828810000
}
]
exhibit_tasks
当前 aimrt_agent 落地使用的扩展模块,用于同步展厅讲解任务列表。值类型:array。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
task_name | string | 是 | 讲解任务名称 |
task_id | string / number | 是 | 讲解任务 ID |
points | array<object> | 否 | 任务关联点位列表 |
points 元素:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 是 | 点位名称 |
id | string / number | 是 | 点位 ID |
在 TE 任务列表更新时整数组替换该模块。属于业务扩展,不属于导航域首阶段推荐模块。
JSON 样例:
[
{
"task_name": "总部参观线路 A",
"task_id": "exhibit_001",
"points": [
{ "name": "前台", "id": 1 },
{ "name": "展示厅", "id": 2 },
{ "name": "茶水间", "id": 3 }
]
},
{
"task_name": "研发区参观线路 B",
"task_id": "exhibit_002",
"points": [
{ "name": "工程办公区", "id": 4 },
{ "name": "实验室", "id": 5 }
]
}
]
silisoon
SDK 兼容专项事件 waiter.silisoon.status_upload 写入的扩展模块。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
mode | number | 是 | 业务模式:1=interaction / 2=silisoon / 3=抓取模式 |
silisoon_status | number | 是 | 业务状态值:1=送货中 / 2=空闲 |
JSON 样例:
{
"mode": 2,
"silisoon_status": 1
}
robot_form
SDK 兼容专项事件 robot.body_info.upload 写入的扩展模块。值类型:string。
示例值:
"two-legged"/"four-legged"/"wheeled"。SDK 直接把form字段写成status_info.robot_form。
JSON 样例(裸字符串):
"wheeled"
注意:
state_value此处为裸字符串,不是对象。Java 用stateValue直接取,Python 用state_value即可——无需json.loads。
manipulation
机械臂 / 抓取 / 操作能力相关状态。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
is_on | boolean | 是 | 当前是否处于 manipulation 能力开启 / 可用状态 |
mode | string | 否 | 可选运行模式,例如 pick / place / assist |
updated_at_ms | number | 否 | 最近更新时间 |
JSON 样例:
{
"is_on": true,
"mode": "pick",
"updated_at_ms": 1774828810000
}
supported_calligraphy_list
支持的书法文字列表。值类型:array<string>。
适合书法、教育、交互展示等业务能力曝光;建议整数组替换。
JSON 样例:
["福", "禄", "寿", "喜", "你好", "新年快乐"]
tts_status
TTS 运行态快照。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | idle / begin / playing / finished / interrupted / failed |
item_id | string | 否 | 本次播报唯一标识 |
event_id | string | 否 | 关联对话事件 ID |
text | string | 否 | 当前播报文本 |
domain | string | 否 | 领域标识——常见值: • task_master——系统级播报(优先级 l4–l8 不等,rule-base 级别)• omnissdk / agent——交互内部产生的播报事件(正常会话 / 主动交互) |
priority | number | 否 | 当前播报优先级 |
error_msg | string | 否 | 失败原因 |
in_queue_item_ids | array<string> | 否 | 当前排队中的剩余 item 列表 |
updated_at_ms | number | 否 | 最近更新时间 |
JSON 样例:
{
"state": "playing",
"item_id": "item_tts_001",
"event_id": "event_dialog_001",
"text": "好的,正在为您播报。",
"domain": "agent",
"priority": 5,
"error_msg": "",
"in_queue_item_ids": ["item_tts_002", "item_tts_003"],
"updated_at_ms": 1774828810000
}
vad_status
VAD 运行态快照。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | bos / continue / eos / bos_timeout / finish |
event_id | string | 否 | 关联对话事件 ID |
updated_at_ms | number | 否 | 最近更新时间 |
JSON 样例:
{
"state": "eos",
"event_id": "event_dialog_001",
"updated_at_ms": 1774828810000
}
dialog_status
对话状态快照,覆盖 quit_voice 之前 / 之后的阶段。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | idle / wake_up / waiting_asr / waiting_dm / processing_local / processing_remote / interrupted / finish |
event_id | string | 否 | 当前对话事件 ID |
before_quit_voice | boolean | 否 | 是否表示 quit_voice 前最后一次稳定状态 |
source | string | 否 | 状态来源,例如 sdk_dialog_manager / agent_controller |
updated_at_ms | number | 否 | 最近更新时间 |
quit_voice本身是控制事件,不是状态模块。
JSON 样例:
{
"state": "waiting_dm",
"event_id": "event_dialog_001",
"before_quit_voice": false,
"source": "sdk_dialog_manager",
"updated_at_ms": 1774828810000
}
action_status
动作 / 技能 / 运行任务状态快照。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | idle / running / pause / completed / failed |
tag | string | 否 | 动作标签,如 write / navigation / grasp |
task_name | string | 否 | 任务名称 |
task_id | string / number | 否 | 任务 ID |
message | string | 否 | 当前运行说明 |
updated_at_ms | number | 否 | 最近更新时间 |
多个并行任务可上传数组。
JSON 样例(单任务对象):
{
"state": "running",
"tag": "write",
"task_name": "写 福 字",
"task_id": "action_001",
"message": "笔顺执行中 3/5",
"updated_at_ms": 1774828810000
}
JSON 样例(多任务数组):
[
{ "state": "running", "tag": "navigation", "task_name": "导航到 A 点", "task_id": "nav_001", "updated_at_ms": 1774828810000 },
{ "state": "running", "tag": "tts", "task_name": "讲解 A 点", "task_id": "tts_001", "updated_at_ms": 1774828810000 }
]
listening_status
端侧聆听状态快照。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | listening / non_wakeup_silent |
wakeup_state | string | 是 | already_wake_up / idle |
event_id | string | 否 | 当前对话 / 唤醒事件 ID |
source | string | 否 | 状态来源,例如 sdk_wakeup_manager |
updated_at_ms | number | 否 | 最近更新时间 |
listening:端侧已唤醒,处于聆听 / 交互态non_wakeup_silent:端侧未唤醒,保持静默监听或待机
JSON 样例:
{
"state": "listening",
"wakeup_state": "already_wake_up",
"event_id": "status_nav_001",
"source": "sdk_wakeup_manager",
"updated_at_ms": 1774828800210
}
wakeup_behavior_status
唤醒表现覆盖状态快照——用于回传云端下发的 agentsdk.flow 唤醒表现控制是否已生效。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | active / expired / cleared / failed |
flow_id | string | 否 | 触发该覆盖配置的 flow ID |
request_event_id | string | 否 | 触发该覆盖配置的 agentsdk.flow.*.request event ID |
ttl_ms | number | 否 | 本次覆盖配置的保活时长,默认 30000 |
expires_at_ms | number | 否 | 端侧本地计算的过期时间戳 |
interrupt_current_interaction | boolean | 否 | 唤醒表现触发时是否需要打断当前交互 |
behavior | object | 否 | 当前生效的表现配置,结构与下发 setting.wakeup_behavior.behavior 一致;空对象或省略表示仅开启聆听、不做任何表现 |
error_msg | string | 否 | state=failed 时的失败原因 |
source | string | 否 | 状态来源,例如 agentsdk.flow / agent_controller |
updated_at_ms | number | 否 | 最近更新时间 |
要点:
- 该模块表达的是**"云端覆盖的唤醒表现配置状态"**,不是 KWS 引擎运行状态
- 覆盖配置过期时,端侧应上发
state=expired,并恢复默认唤醒表现 - 收到新的覆盖配置时,端侧可覆盖上一条仍未过期的配置
- 当下发
behavior={}或未下发behavior时,端侧应回传空对象或省略该字段,表示 listen-only 生效
JSON 样例(完整表现生效):
{
"state": "active",
"flow_id": "flow_mock_demo_001",
"request_event_id": "event_wakeup_behavior_001",
"ttl_ms": 30000,
"expires_at_ms": 1774828830210,
"interrupt_current_interaction": true,
"behavior": {
"tts": { "text": "我在,请说" },
"emoticon": { "id": 103, "times": 1 },
"motion": { "id": [10226] }
},
"source": "agentsdk.flow",
"updated_at_ms": 1774828800210
}
JSON 样例(仅开启聆听、不做表现):
{
"state": "active",
"flow_id": "flow_mock_demo_001",
"request_event_id": "event_wakeup_listen_only_001",
"ttl_ms": 30000,
"expires_at_ms": 1774828830210,
"interrupt_current_interaction": false,
"behavior": {},
"source": "agentsdk.flow",
"updated_at_ms": 1774828800210
}
vision_perception
视觉感知摘要快照,可同时承载相对图像的几何位置信息。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
perception_mode | string | 否 | 当前感知模式,示例:full / only_face |
greeting_in_dialog | boolean | 否 | 当前是否允许全双工下迎宾 |
streams | object | 否 | 各感知流的摘要,key 为 stream_id |
aggregate | object | 是 | 跨 stream 聚合后的稳定摘要 |
updated_at_ms | number | 否 | 最近更新时间 |
streams.<stream_id> 建议字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
image_size | object | 否 | 原始图像尺寸,含 width / height |
person_count | number | 是 | 当前 stream 内人数 |
tracked_person_count | number | 是 | 当前 stream 内稳定跟踪人数 |
known_face_ids | array<string> | 否 | 当前 stream 内已识别人脸 ID |
gesture_labels | array<string> | 否 | 当前 stream 内手势标签集合 |
action_labels | array<string> | 否 | 当前 stream 内动作标签集合 |
persons | array<object> | 否 | 当前 stream 内的几何与姿态详情 |
persons[] 建议字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
track_id | number | 否 | 稳定跟踪 ID |
global_id | string | 否 | 跨断轨聚合 ID |
face_uid | string | 否 | 识别到的人脸 ID |
identity_category | string | 否 | recognized_known / recognized_unknown / unspecified |
body | object | 否 | 人体框、人体关键点、手框、头框、身体朝向和头姿估计 |
face | object | 否 | 人脸框、原始检测框、5 点 landmarks 和脸部朝向估计 |
gestures | array<object> | 否 | 当前人体上的手势及其归一化手部 ROI |
actions | array<object> | 否 | 当前人体上的动作识别结果 |
aggregate 建议字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
person_count | number | 是 | 当前视野内人数摘要 |
tracked_person_count | number | 是 | 当前已稳定跟踪的人数摘要 |
known_face_ids | array<string> | 否 | 当前已识别的人脸 ID 列表 |
unknown_face_count | number | 否 | 当前未识别但可见的人脸数量 |
facing_face_count | number | 否 | 当前面向镜头的人脸数量 |
gesture_labels | array<string> | 否 | 当前识别到的手势标签集合 |
action_labels | array<string> | 否 | 当前识别到的动作标签集合 |
几何字段约定:
- 所有
*_box_norm/keypoints_norm/landmarks_norm均使用相对图像宽高的归一化坐标 - 矩形结构推荐
{x, y, w, h, cx, cy},坐标范围通常在[0, 1] - 关键点结构推荐
{index, x, y, score} - 朝向估计可来自
face.yaw/pitch/roll或body.head_pose
要点:
- 该模块会同时带上相对图像的归一化检测框、关键点和朝向估计
- 为避免高频几何变化刷满链路,SDK 统一
input_status_info上传层对vision_perception默认做最大10 Hz限频 - 仍不直接上传原始图像和完整
PerceptionAggregateView - 若业务需要更细粒度的瞬时通知,建议配合自定义事件
vision.perception.event
JSON 样例:
{
"perception_mode": "full",
"greeting_in_dialog": true,
"streams": {
"front_cam": {
"image_size": { "width": 1280, "height": 720 },
"person_count": 2,
"tracked_person_count": 2,
"known_face_ids": ["face_uid001"],
"gesture_labels": ["wave"],
"action_labels": [],
"persons": [
{
"track_id": 1,
"global_id": "g_1",
"face_uid": "face_uid001",
"identity_category": "recognized_known",
"face": {
"box_norm": { "x": 0.29, "y": 0.17, "w": 0.05, "h": 0.11, "cx": 0.32, "cy": 0.22 },
"yaw": 4.8, "pitch": -2.1, "roll": 0.9
}
}
]
}
},
"aggregate": {
"person_count": 2,
"tracked_person_count": 2,
"known_face_ids": ["face_uid001"],
"unknown_face_count": 1,
"facing_face_count": 1,
"gesture_labels": ["wave"],
"action_labels": []
},
"updated_at_ms": 1774828810000
}
speaker
发言人信息。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
event_id | string | 否 | 关联对话事件 ID |
order | string | 否 | 多说话人时的排序,例如 left_to_right |
image_size | object | 否 | 当前帧的图像尺寸 {width, height} |
speaker_id | string | 否 | 当前发言人 ID(多对应 persons[*].face_uid) |
doa | number | 否 | DOA 角度估计 |
persons | array<object> | 是 | 候选人列表 |
persons[] 字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
face_uid | string | 否 | 人脸 ID |
identity_category | string | 否 | recognized_known / recognized_unknown / unspecified |
user_name | string | 否 | 用户名 |
user_desc | string | 否 | 用户描述(备注) |
face | object | 否 | 与 vision_perception.persons[].face 同构 |
age | number | 否 | 估计年龄 |
gender | number | 否 | 0 = 女 / 1 = 男 |
JSON 样例:
{
"event_id": "event_xxx",
"order": "left_to_right",
"image_size": { "width": 1280, "height": 720 },
"speaker_id": "face_uid001",
"doa": 60,
"persons": [
{
"face_uid": "face_uid001",
"identity_category": "recognized_known",
"user_name": "张三",
"user_desc": "001 号员工,创业元老",
"face": {
"box_norm": { "x": 0.2891, "y": 0.1667, "w": 0.0547, "h": 0.1111, "cx": 0.3164, "cy": 0.2222 },
"detected_box_norm": { "x": 0.2875, "y": 0.1639, "w": 0.0578, "h": 0.1167, "cx": 0.3164, "cy": 0.2222 },
"landmarks_norm": [
{ "index": 0, "x": 0.3023, "y": 0.2056 },
{ "index": 1, "x": 0.3305, "y": 0.2042 },
{ "index": 2, "x": 0.3164, "y": 0.2222 }
],
"yaw": 4.8,
"pitch": -2.1,
"roll": 0.9,
"facing_camera": true
},
"age": 14,
"gender": 0
}
]
}
settings
端侧开关状态面板——每个子字段原则上都是 bool。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
greeting_in_dialog | bool | 否 | 当前是否开启全双工状态下迎宾功能 |
JSON 样例:
{
"greeting_in_dialog": true
}
在业务侧消费
不同语言下的最小消费样板:
Python
import json
from linksoul_agentsdk.passive import Asr2LlmCallback
class MyCb(Asr2LlmCallback):
def on_state(self, agent_id, event_id, state_name, state_value):
if state_name == "robot_pose":
pose = json.loads(state_value)
print(f"x={pose['x']} y={pose['y']} yaw={pose['yaw']}")
elif state_name == "tts_status":
tts = json.loads(state_value)
if tts["state"] == "finished":
... # TTS 已播完
elif state_name == "robot_form":
# robot_form 是裸字符串,无需 json.loads
print(f"form = {state_value}")
def on_request(self, *a, **k):
...
Java
import com.alibaba.fastjson2.JSONObject;
@Override
public void onState(String agentId, String eventId, String stateName, String stateValue) {
switch (stateName) {
case "robot_pose" -> {
JSONObject pose = JSONObject.parseObject(stateValue);
log.info("x={} y={} yaw={}", pose.getDouble("x"), pose.getDouble("y"), pose.getDouble("yaw"));
}
case "tts_status" -> {
JSONObject tts = JSONObject.parseObject(stateValue);
if ("finished".equals(tts.getString("state"))) {
// ...
}
}
case "robot_form" -> log.info("form = {}", stateValue);
default -> { /* ignore */ }
}
}
要点:
state_value不一定是 JSON 对象——例如robot_form是裸字符串、supported_calligraphy_list是array<string>、task_status/exhibit_tasks是array<object>。先按本页对应模块查清楚类型再解析。- 频率敏感:
robot_pose与vision_perception默认按模块 ≤10 Hz,业务侧不要在每次onState里做重 I/O。 - 整体替换语义:
planned_path/exhibit_tasks/supported_calligraphy_list等的更新是整数组替换,不要做点级 merge。 - 空态显式上发:若当前无任务但需要显式同步,约定上发
task_status = [{"state":"idle","task_name":""}]这种结构。