机器人端侧状态(on_state)参考

机器人端侧状态(on_state)参考

机器人通过 agentsdk.state_request.meta 事件向 SDK 上报自身状态——在被动回调里你会收到:

text
PassiveCallback.on_state(agent_id, event_id, state_name, state_value)
                          ^^^^^^^^^^                ^^^^^^^^^^^^^^^^
                          模块名                    模块负载(JSON 字符串)
语言重载入口
JavaPassiveCallback.onState(agentId, eventId, stateName, stateValue)
PythonPassiveCallback.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_statusTTS 运行态事件触发
vad_statusVAD 运行态事件触发
dialog_status对话状态机事件触发
action_status动作 / 技能任务状态事件触发
listening_status端侧聆听 / 唤醒状态事件触发
wakeup_behavior_status唤醒表现覆盖配置状态事件触发
vision_perception视觉感知摘要高频(限 10 Hz)
speaker当前发言人信息事件触发
settings端侧开关状态面板事件触发

map_info

地图基础信息与导航点位。

字段类型必填说明
map_idstring / number地图 ID
map_namestring地图名称
navi_pointsarray导航点列表
wallsarray墙位置信息列表
infeasible_areasarray人工墙位置信息列表

walls / infeasible_areas 元素格式:

字段类型必填说明
idnumber点位 ID
xnumberX 坐标
ynumberY 坐标
znumberZ 坐标

navi_points 元素格式:

字段类型必填说明
namestring点位名称
idnumber点位 ID
point_xnumberX 坐标
point_ynumberY 坐标

JSON 样例

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
  • 对应 encodingint8_zstd_base64
字段类型必填说明
map_idstring / number地图 ID
map_namestring地图名称
versionstring地图版本号
framestring坐标系,例如 map
widthnumber栅格宽度(格)
heightnumber栅格高度(格)
resolutionnumber米 / 格
originobject原点对象,含 x / y / yaw
encodingstring首推 int8_zstd_base64;调试可用 int8_raw
datastring压缩并 base64 编码后的地图内容;当 transport.mode=resource_ref 时可省略
data_md5string地图内容摘要
compressionobject大数据压缩元信息
transportobject大数据特化传输元信息

compression 字段:

字段类型必填说明
raw_layoutstring例如 int8_row_major
algorithmstring首推 zstd
binary_encodingstring首推 base64

transport 字段:

字段类型必填说明
modestringinline / chunked / resource_ref
resource_uristring资源引用模式下的地图地址
chunk_indexnumber分片序号,从 0 开始
chunk_countnumber总分片数

JSON 样例

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_namestring位置名称
location_coordinatestring坐标字符串,建议格式 "x,y"
orientationnumber / null朝向角,建议单位为度
floorstring / number楼层信息
buildingstring楼宇 / 场馆信息

SDK 的兼容专项事件 current_location.upload 既接受 {"current_location": {...}},也兼容只传 {"location_name": "..."}

JSON 样例

json
{
    "location_name": "前台",
    "location_coordinate": "1.2,3.4",
    "orientation": 90,
    "floor": "1F",
    "building": "总部大楼"
}

robot_pose

机器人当前几何位姿。

字段类型必填说明
map_idstring / number所属地图 ID
framestringmap / odom
xnumber当前 X 坐标
ynumber当前 Y 坐标
znumber当前 Z 坐标
yawnumber当前偏航角,建议弧度
pitchnumber俯仰角
rollnumber翻滚角
quaternionobject四元数对象
linear_velocityobject线速度对象
angular_velocityobject角速度对象
timestamp_msnumber采样时间戳

属于高频几何状态——SDK input_status_info 上传层默认按模块做最大 10 Hz 限频; 限频仅约束上云频率,本地缓存仍保留最新一次写入。

JSON 样例

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_idstring路径 ID
map_idstring / number所属地图 ID
framestring坐标系
plannerstring规划器名称
planning_statusstringrunning / ready / replanned / blocked / failed
start_poseobject起点位姿
target_poseobject终点位姿
path_pointsarray路径点列表
total_length_mnumber总路径长度
remaining_length_mnumber剩余路径长度
eta_secnumber预计剩余时间(秒)
updated_at_msnumber最近更新时间

JSON 样例

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_idstring / number导航任务 ID
task_namestring任务名称
task_typestring首阶段建议固定为 navigation
statestringwaiting / running / paused / completed / failed
target_xnumber目标 X
target_ynumber目标 Y
target_znumber目标 Z
start_time_msnumber开始时间
estimated_completion_msnumber预计完成时间
timestamp_msnumber更新时间
trace_idstring追踪 ID
error_messagestring错误原因

JSON 样例

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

规划 / 控制 / 避障状态摘要。

字段类型必填说明
statusstringrunning / path_block / start_replan / replan_timeout / task_finish / task_error
detailstring面向云端看板的简短补充说明

JSON 样例

json
{
    "status": "path_block",
    "detail": "前方有静态障碍物,正在重规划"
}

task_status

任务状态列表。值类型:array<object>

字段类型必填说明
statestringrunning / idle / pause 等任务状态
task_namestring用户可理解的任务名
task_idstring / number任务 ID
task_typestring任务类型,例如 navigation / calligraphy
messagestring当前任务说明
updated_at_msnumber最近更新时间

单任务场景也建议传数组(长度 1)。空任务态可上发: [{"state":"idle","task_name":""}]

JSON 样例

json
[
    {
        "state": "running",
        "task_name": "导航到茶水间",
        "task_id": "nav_001",
        "task_type": "navigation",
        "message": "执行中",
        "updated_at_ms": 1774828810000
    }
]

exhibit_tasks

当前 aimrt_agent 落地使用的扩展模块,用于同步展厅讲解任务列表。值类型:array

字段类型必填说明
task_namestring讲解任务名称
task_idstring / number讲解任务 ID
pointsarray<object>任务关联点位列表

points 元素:

字段类型必填说明
namestring点位名称
idstring / number点位 ID

在 TE 任务列表更新时整数组替换该模块。属于业务扩展,不属于导航域首阶段推荐模块。

JSON 样例

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 写入的扩展模块。

字段类型必填说明
modenumber业务模式:1=interaction / 2=silisoon / 3=抓取模式
silisoon_statusnumber业务状态值:1=送货中 / 2=空闲

JSON 样例

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 样例(裸字符串):

json
"wheeled"

注意:state_value 此处为裸字符串,不是对象。Java 用 stateValue 直接取,Python 用 state_value 即可——无需 json.loads


manipulation

机械臂 / 抓取 / 操作能力相关状态。

字段类型必填说明
is_onboolean当前是否处于 manipulation 能力开启 / 可用状态
modestring可选运行模式,例如 pick / place / assist
updated_at_msnumber最近更新时间

JSON 样例

json
{
    "is_on": true,
    "mode": "pick",
    "updated_at_ms": 1774828810000
}

supported_calligraphy_list

支持的书法文字列表。值类型:array<string>

适合书法、教育、交互展示等业务能力曝光;建议整数组替换

JSON 样例

json
["福", "禄", "寿", "喜", "你好", "新年快乐"]

tts_status

TTS 运行态快照。

字段类型必填说明
statestringidle / begin / playing / finished / interrupted / failed
item_idstring本次播报唯一标识
event_idstring关联对话事件 ID
textstring当前播报文本
domainstring领域标识——常见值:
task_master——系统级播报(优先级 l4–l8 不等,rule-base 级别)
omnissdk / agent——交互内部产生的播报事件(正常会话 / 主动交互)
prioritynumber当前播报优先级
error_msgstring失败原因
in_queue_item_idsarray<string>当前排队中的剩余 item 列表
updated_at_msnumber最近更新时间

JSON 样例

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 运行态快照。

字段类型必填说明
statestringbos / continue / eos / bos_timeout / finish
event_idstring关联对话事件 ID
updated_at_msnumber最近更新时间

JSON 样例

json
{
    "state": "eos",
    "event_id": "event_dialog_001",
    "updated_at_ms": 1774828810000
}

dialog_status

对话状态快照,覆盖 quit_voice 之前 / 之后的阶段。

字段类型必填说明
statestringidle / wake_up / waiting_asr / waiting_dm / processing_local / processing_remote / interrupted / finish
event_idstring当前对话事件 ID
before_quit_voiceboolean是否表示 quit_voice 前最后一次稳定状态
sourcestring状态来源,例如 sdk_dialog_manager / agent_controller
updated_at_msnumber最近更新时间

quit_voice 本身是控制事件,不是状态模块。

JSON 样例

json
{
    "state": "waiting_dm",
    "event_id": "event_dialog_001",
    "before_quit_voice": false,
    "source": "sdk_dialog_manager",
    "updated_at_ms": 1774828810000
}

action_status

动作 / 技能 / 运行任务状态快照。

字段类型必填说明
statestringidle / running / pause / completed / failed
tagstring动作标签,如 write / navigation / grasp
task_namestring任务名称
task_idstring / number任务 ID
messagestring当前运行说明
updated_at_msnumber最近更新时间

多个并行任务可上传数组

JSON 样例(单任务对象):

json
{
    "state": "running",
    "tag": "write",
    "task_name": "写 福 字",
    "task_id": "action_001",
    "message": "笔顺执行中 3/5",
    "updated_at_ms": 1774828810000
}

JSON 样例(多任务数组):

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

端侧聆听状态快照。

字段类型必填说明
statestringlistening / non_wakeup_silent
wakeup_statestringalready_wake_up / idle
event_idstring当前对话 / 唤醒事件 ID
sourcestring状态来源,例如 sdk_wakeup_manager
updated_at_msnumber最近更新时间
  • listening:端侧已唤醒,处于聆听 / 交互态
  • non_wakeup_silent:端侧未唤醒,保持静默监听或待机

JSON 样例

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 唤醒表现控制是否已生效。

字段类型必填说明
statestringactive / expired / cleared / failed
flow_idstring触发该覆盖配置的 flow ID
request_event_idstring触发该覆盖配置的 agentsdk.flow.*.request event ID
ttl_msnumber本次覆盖配置的保活时长,默认 30000
expires_at_msnumber端侧本地计算的过期时间戳
interrupt_current_interactionboolean唤醒表现触发时是否需要打断当前交互
behaviorobject当前生效的表现配置,结构与下发 setting.wakeup_behavior.behavior 一致;空对象或省略表示仅开启聆听、不做任何表现
error_msgstringstate=failed 时的失败原因
sourcestring状态来源,例如 agentsdk.flow / agent_controller
updated_at_msnumber最近更新时间

要点:

  • 该模块表达的是**"云端覆盖的唤醒表现配置状态"**,不是 KWS 引擎运行状态
  • 覆盖配置过期时,端侧应上发 state=expired,并恢复默认唤醒表现
  • 收到新的覆盖配置时,端侧可覆盖上一条仍未过期的配置
  • 当下发 behavior={} 或未下发 behavior 时,端侧应回传空对象或省略该字段,表示 listen-only 生效

JSON 样例(完整表现生效):

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 样例(仅开启聆听、不做表现):

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_modestring当前感知模式,示例:full / only_face
greeting_in_dialogboolean当前是否允许全双工下迎宾
streamsobject各感知流的摘要,key 为 stream_id
aggregateobject跨 stream 聚合后的稳定摘要
updated_at_msnumber最近更新时间

streams.<stream_id> 建议字段:

字段类型必填说明
image_sizeobject原始图像尺寸,含 width / height
person_countnumber当前 stream 内人数
tracked_person_countnumber当前 stream 内稳定跟踪人数
known_face_idsarray<string>当前 stream 内已识别人脸 ID
gesture_labelsarray<string>当前 stream 内手势标签集合
action_labelsarray<string>当前 stream 内动作标签集合
personsarray<object>当前 stream 内的几何与姿态详情

persons[] 建议字段:

字段类型必填说明
track_idnumber稳定跟踪 ID
global_idstring跨断轨聚合 ID
face_uidstring识别到的人脸 ID
identity_categorystringrecognized_known / recognized_unknown / unspecified
bodyobject人体框、人体关键点、手框、头框、身体朝向和头姿估计
faceobject人脸框、原始检测框、5 点 landmarks 和脸部朝向估计
gesturesarray<object>当前人体上的手势及其归一化手部 ROI
actionsarray<object>当前人体上的动作识别结果

aggregate 建议字段:

字段类型必填说明
person_countnumber当前视野内人数摘要
tracked_person_countnumber当前已稳定跟踪的人数摘要
known_face_idsarray<string>当前已识别的人脸 ID 列表
unknown_face_countnumber当前未识别但可见的人脸数量
facing_face_countnumber当前面向镜头的人脸数量
gesture_labelsarray<string>当前识别到的手势标签集合
action_labelsarray<string>当前识别到的动作标签集合

几何字段约定

  • 所有 *_box_norm / keypoints_norm / landmarks_norm 均使用相对图像宽高的归一化坐标
  • 矩形结构推荐 {x, y, w, h, cx, cy},坐标范围通常在 [0, 1]
  • 关键点结构推荐 {index, x, y, score}
  • 朝向估计可来自 face.yaw/pitch/rollbody.head_pose

要点:

  • 该模块会同时带上相对图像的归一化检测框、关键点和朝向估计
  • 为避免高频几何变化刷满链路,SDK 统一 input_status_info 上传层对 vision_perception 默认做最大 10 Hz 限频
  • 不直接上传原始图像和完整 PerceptionAggregateView
  • 若业务需要更细粒度的瞬时通知,建议配合自定义事件 vision.perception.event

JSON 样例

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_idstring关联对话事件 ID
orderstring多说话人时的排序,例如 left_to_right
image_sizeobject当前帧的图像尺寸 {width, height}
speaker_idstring当前发言人 ID(多对应 persons[*].face_uid
doanumberDOA 角度估计
personsarray<object>候选人列表

persons[] 字段:

字段类型必填说明
face_uidstring人脸 ID
identity_categorystringrecognized_known / recognized_unknown / unspecified
user_namestring用户名
user_descstring用户描述(备注)
faceobjectvision_perception.persons[].face 同构
agenumber估计年龄
gendernumber0 = 女 / 1 = 男

JSON 样例

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_dialogbool当前是否开启全双工状态下迎宾功能

JSON 样例

json
{
    "greeting_in_dialog": true
}

在业务侧消费

不同语言下的最小消费样板:

Python

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

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 */ }
    }
}

要点:

  1. state_value 不一定是 JSON 对象——例如 robot_form 是裸字符串、supported_calligraphy_listarray<string>task_status / exhibit_tasksarray<object>。先按本页对应模块查清楚类型再解析。
  2. 频率敏感robot_posevision_perception 默认按模块 ≤ 10 Hz,业务侧不要在每次 on_state 里做重 I/O。
  3. 整体替换语义planned_path / exhibit_tasks / supported_calligraphy_list 等的更新是整数组替换,不要做点级 merge。
  4. 空态显式上发:若当前无任务但需要显式同步,约定上发 task_status = [{"state":"idle","task_name":""}] 这种结构。