机器人端侧状态(onState)参考 · iOS
机器人端侧状态(onState)参考 · iOS
机器人通过 agentsdk.state_request.meta 事件向 SDK 上报自身状态——在被动回调里你会收到:
PassiveCallback.onState(agentId:eventId:stateName:stateValue:)
^^^^^^^^^ ^^^^^^^^^^^^
模块名 模块负载(JSON 字符串)
| 语言 | 重载入口 |
|---|---|
| Swift | PassiveCallback.onState(agentId:eventId:stateName:stateValue:) |
| Java | PassiveCallback.onState(agentId, eventId, stateName, stateValue) |
| Python | PassiveCallback.on_state(agent_id, event_id, state_name, state_value) |
⚠️
stateValue可能为简单字符串、数字、对象或对象数组。如果业务侧使用结构化字段,需要自行用JSONSerialization/JSONDecoder解析。
本页定义所有 stateName 取值及对应 stateValue 的字段结构——共 22 个模块。
每个模块除字段表外都附 JSON 样例,便于直接对照解析。
模块清单
stateName | 主题 | 频率 |
|---|---|---|
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 编码后的地图内容 |
data_md5 | string | 否 | 地图内容摘要 |
compression | object | 否 | 大数据压缩元信息 |
transport | object | 否 | 大数据特化传输元信息 |
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 | 否 | 楼宇 / 场馆信息 |
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 上传层默认按模块做最大
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 | 否 | 最近更新时间 |
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 |
JSON 样例:
[
{
"task_name": "总部参观线路 A",
"task_id": "exhibit_001",
"points": [
{ "name": "前台", "id": 1 },
{ "name": "展示厅", "id": 2 },
{ "name": "茶水间", "id": 3 }
]
}
]
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
机器人形态。值类型:string(裸字符串,不是对象)。
示例值:
"two-legged"/"four-legged"/"wheeled"。
JSON 样例(裸字符串):
"wheeled"
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 / 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 | 否 | 状态来源 |
updated_at_ms | number | 否 | 最近更新时间 |
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
}
listening_status
端侧聆听状态快照。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
state | string | 是 | listening / non_wakeup_silent |
wakeup_state | string | 是 | already_wake_up / idle |
event_id | string | 否 | 当前对话 / 唤醒事件 ID |
source | string | 否 | 状态来源 |
updated_at_ms | number | 否 | 最近更新时间 |
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 | 否 | 触发该覆盖配置的 event ID |
ttl_ms | number | 否 | 本次覆盖配置的保活时长,默认 30000 |
expires_at_ms | number | 否 | 端侧本地计算的过期时间戳 |
interrupt_current_interaction | boolean | 否 | 是否需要打断当前交互 |
behavior | object | 否 | 当前生效的表现配置;空对象表示仅开启聆听 |
error_msg | string | 否 | state=failed 时的失败原因 |
source | string | 否 | 状态来源 |
updated_at_ms | number | 否 | 最近更新时间 |
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
}
vision_perception
视觉感知摘要快照,可同时承载相对图像的几何位置信息。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
perception_mode | string | 否 | 当前感知模式,示例:full / only_face |
greeting_in_dialog | boolean | 否 | 当前是否允许全双工下迎宾 |
streams | object | 否 | 各感知流的摘要,key 为 stream_id |
aggregate | object | 是 | 跨 stream 聚合后的稳定摘要 |
updated_at_ms | number | 否 | 最近更新时间 |
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 | 否 | 多说话人时的排序 |
image_size | object | 否 | 当前帧的图像尺寸 {width, height} |
speaker_id | string | 否 | 当前发言人 ID |
doa | number | 否 | DOA 角度估计 |
persons | array<object> | 是 | 候选人列表 |
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 号员工,创业元老",
"age": 14,
"gender": 0
}
]
}
settings
端侧开关状态面板——每个子字段原则上都是 bool。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
greeting_in_dialog | bool | 否 | 当前是否开启全双工状态下迎宾功能 |
JSON 样例:
{
"greeting_in_dialog": true
}
在业务侧消费
Swift
override func onState(agentId: String, eventId: String, stateName: String, stateValue: String) {
guard let data = stateValue.data(using: .utf8),
let obj = try? JSONSerialization.jsonObject(with: data) else { return }
switch stateName {
case "robot_pose":
if let pose = obj as? [String: Any] {
print("x=\(String(describing: pose["x"])) yaw=\(String(describing: pose["yaw"]))")
}
case "tts_status":
if let tts = obj as? [String: Any], tts["state"] as? String == "finished" {
// TTS 已播完
}
case "robot_form":
// robot_form 是裸字符串,无需 JSON 解析
print("form = \(stateValue)")
default:
break
}
}
Java
@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 "robot_form" -> log.info("form = {}", stateValue);
default -> { /* ignore */ }
}
}
要点:
stateValue不一定是 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":""}]。