器人技能 description 契約:SSOT 聲明式消歧 Schema 與源碼級(jí)校驗(yàn)指南)
具身智能機(jī)器人人工智能大模型模型推理服務(wù)本地部署計(jì)算機(jī)視覺(jué)ROS【免費(fèi)下載鏈接】IB_RobotSave the code of IB-Robot, an AI robot execution framework developed by openEuler Embedded for embodied intelligence scenarios. It includes references to the forked version of tensormsg, references to lerobot fork, code references to the lerobot_ros2:ros2_ws branch, as well as some code related to development usability.項(xiàng)目地址https://gitcode.com/openeuler/IB_Robot點(diǎn)擊查看免費(fèi)下載本文聚焦 IB-RobotopenEuler Embedded 具身智能機(jī)器人執(zhí)行框架中機(jī)器人技能skill的description:契約。該契約是 Agent/Hermes 調(diào)用方與確定性規(guī)則解析器在近義技能之間做出正確選擇的核心依據(jù)也是robot_config加載器強(qiáng)制校驗(yàn)的架構(gòu)級(jí)約束。讀完本文你將掌握description:塊的完整字段 Schema、近義技能消歧disambiguation的寫(xiě)作規(guī)范、時(shí)長(zhǎng)估算規(guī)則以及從 YAML 聲明到加載器校驗(yàn)、再到robot-skillCLI 驗(yàn)證的完整鏈路。1. 契約的定位為什么description:是架構(gòu)約束而非風(fēng)格選擇在 IB-Robot 的技能體系里每個(gè)新增或修改的技能必須在其 SSOT YAML與primitive_sequence同處一個(gè)文件中攜帶description:塊。它描述了Agent/Hermes 調(diào)用方和規(guī)則解析器如何從一組近義技能中選中當(dāng)前這個(gè)技能是整個(gè)技能選路邏輯的單一事實(shí)來(lái)源Single Source of TruthSSOT。省略這個(gè)塊不是一種風(fēng)格選擇而是一種架構(gòu)違規(guī)architecture violation。原因在于上層調(diào)用方如 Hermes、CLI、LLM Agent依賴(lài)summary、when_to_use、do_not_use等字段在多個(gè)行為相近的技能之間做選擇確定性規(guī)則解析器依賴(lài)aliases_zh配合rule_entry開(kāi)關(guān)完成中文觸發(fā)詞到技能名的固定短語(yǔ)匹配技能目錄catalog的文檔由description:塊自動(dòng)合成不再需要人工維護(hù)每技能的介紹文字。因此在設(shè)計(jì)流程design flow中description:的編寫(xiě)與校驗(yàn)通常發(fā)生在第 5 步Step 5: Author the Description Contract而在第 7 步實(shí)現(xiàn)技能時(shí)同樣必須攜帶該塊任何模板都不能遺漏。2. 完整 Schemadescription 塊字段總覽契約的完整結(jié)構(gòu)如下該結(jié)構(gòu)由robot_config.loader._validate_skill_description校驗(yàn)見(jiàn) loader.pyskill_name: description: summary: 120 chars, intent-first, not a mechanical description category: observation|recovery|gripper|translation|rotation|dance|social_greeting|social_affirmation|social_emotion|... when_to_use: [short phrases describing when to pick this skill] do_not_use: # MANDATORY for any skill with near-synonyms - condition: when NOT to pick this one instead_use: existing_skill_name # must be a real skill in the same config aliases_zh: [中文觸發(fā)詞] # ALSO drives the rule parser (single keyword source) aliases_en: [english triggers] motion_scope: [base|shoulder|elbow|wrist|gripper|arm] anchor_pose: named pose | none # must exist in embodied.named_poses unless none intensity: subtle|moderate|large # safety-relevant: large motions near people need care duration_sec_estimate: float 0 requires_motion_params: bool # true if it needs motion_direction/distance from the caller rule_entry: bool # true exposes aliases_zh to the deterministic rule parser2.1 各字段的源碼級(jí)約束從加載器_validate_skill_description的實(shí)現(xiàn)可以提煉出每個(gè)字段的硬性校驗(yàn)規(guī)則字段類(lèi)型/取值約束源碼行為summary非空字符串去除首尾空白后不超過(guò) 120 字符為空或超長(zhǎng)均報(bào)錯(cuò)summary must be a non-empty string/at most 120 characterscategory非空字符串must be a non-empty stringwhen_to_use非空字符串列表每個(gè)元素必須是去除空白后非空的字符串a(chǎn)liases_zh/aliases_en/motion_scope字符串列表可選字段元素必須非空motion_scope的取值必須屬于_VALID_MOTION_SCOPES {base, shoulder, elbow, wrist, gripper, arm}loader.py未知 token 會(huì)被逐一點(diǎn)名報(bào)錯(cuò)intensity可選字符串必須屬于_VALID_INTENSITIES {subtle, moderate, large}其他值報(bào)錯(cuò)anchor_pose可選字符串若非none則必須存在于embodied.named_poses中引用未定義 pose 會(huì)報(bào)references undefined poseduration_sec_estimate有限數(shù)值且大于 0非有限數(shù)nan/inf、布爾值、字符串、負(fù)數(shù)都會(huì)被拒絕must be greater than zerorequires_motion_params可選布爾非布爾報(bào)錯(cuò)rule_entry可選布爾非布爾報(bào)錯(cuò)do_not_use可選列表每個(gè) entry 必須是 mappingcondition非空字符串instead_use必須引用同配置中真實(shí)存在的技能名且不能指向技能自身must not reference the same skill值得一提的是加載器對(duì)description的校驗(yàn)發(fā)生在加載階段而非調(diào)用階段源碼 docstring 明確寫(xiě)道structural fields are enforced here rather than at call time這意味著配置不合法時(shí)技能在系統(tǒng)啟動(dòng)/加載時(shí)就會(huì)被拒絕而不是等到運(yùn)行時(shí)才暴露。2.2 技能目錄側(cè)的雙重校驗(yàn)除robot_config.loader外技能目錄包skill_catalog/skill_catalog/validator.py也維護(hù)了一套DESCRIPTION_FIELDS白名單summary、category、when_to_use、motion_scope、intensity、aliases_zh、aliases_en、anchor_pose、duration_sec_estimate、requires_motion_params、rule_entry、do_not_use并做了更細(xì)的約束motion_scope不允許重復(fù)值len(set(motion_scope)) ! len(motion_scope)報(bào)錯(cuò)aliases_zh/aliases_en必須是無(wú)重復(fù)的字符串列表aliases must be a unique string listdo_not_use每個(gè) entry 的鍵集合必須嚴(yán)格等于{condition, instead_use}不能多也不能少duration_sec_estimate必須有限且為正。這套校驗(yàn)與robot_config加載器形成互補(bǔ)前者面向技能目錄源樹(shù)后者面向機(jī)器人配置里的技能模板兩層一起保證了契約在任何消費(fèi)入口都不會(huì)被繞過(guò)。3. 消歧規(guī)則近義技能如何互相讓路契約存在的全部意義就是消歧。三條核心規(guī)則必須同時(shí)遵守正向引用在最終確定一個(gè)新技能前先列出它與既有技能之間的近義關(guān)系并針對(duì)每個(gè)近義技能添加一條do_not_use記錄把調(diào)用方引向正確的替代技能反向引用當(dāng)技能邊界發(fā)生變化時(shí)也應(yīng)在既有近義技能上添加指向新技能的反向重定向add反向 redirects on the existing synonym skills pointing at the new one單一關(guān)鍵詞源aliases_zh是中文觸發(fā)詞和目錄別名的唯一事實(shí)來(lái)源嚴(yán)禁在embodied_common.command_parser里再硬編碼一份平行關(guān)鍵詞表。3.1 aliases_zh 如何進(jìn)入規(guī)則解析器extract_skill_aliases只在兩個(gè)條件同時(shí)滿足時(shí)把a(bǔ)liases_zh注入確定性規(guī)則解析器rule_entry: true AND requires_motion_params: false也就是說(shuō)只有規(guī)則入口開(kāi)啟且不需要調(diào)用方額外提供 motion 參數(shù)的技能其中文觸發(fā)詞才會(huì)被用于固定短語(yǔ)匹配。這避免了兩類(lèi)誤用需要參數(shù)如方向、距離的技能不應(yīng)通過(guò)純關(guān)鍵詞直接觸發(fā)否則會(huì)因缺少參數(shù)而失敗未被rule_entry授權(quán)的技能關(guān)鍵詞不應(yīng)出現(xiàn)在規(guī)則路徑中。在技能目錄編譯階段compiler.pyaliases_zh與aliases_en會(huì)被一并取出并去空白組裝成該技能的別名元組aliases[skill_name] tuple( str(value).strip() for key in (aliases_zh, aliases_en) for value in description.get(key, []) )這印證了aliases_zh與aliases_en是同一份別名體系的組成部分只是分別面向中英文觸發(fā)場(chǎng)景。3.2 summary 必須意圖優(yōu)先summary的寫(xiě)作準(zhǔn)則是意圖驅(qū)動(dòng)而非機(jī)械描述。例如正確示例Wave hello/goodbye with the wrist意圖用腕部打招呼/告別錯(cuò)誤示例Sinusoidal joint-5 motion機(jī)械描述關(guān)節(jié) 5 正弦運(yùn)動(dòng)理由是 Agent/LLM 調(diào)用方依據(jù)意圖文本做語(yǔ)義選路機(jī)械的運(yùn)動(dòng)學(xué)描述既無(wú)法表達(dá)做什么也難以與近義技能區(qū)分。3.3 懸空引用必須為零do_not_use.instead_use指向的技能必須在同一份配置中真實(shí)存在加載器會(huì)拒絕懸空重定向dangling redirect。測(cè)試 test_skill_description_contract.py 驗(yàn)證了兩種典型錯(cuò)誤instead_use: ghost_skill不存在的技能→ 報(bào)references unknown skill ghost_skillinstead_use指向技能自身 → 報(bào)must not reference the same skill。同目錄下的集成測(cè)試還會(huì)遍歷 SO101 單臂配置啟用技能集合逐一斷言每個(gè)啟用技能都攜帶summary/category/when_to_use/motion_scope/intensity五個(gè)必備字段intensity取值必須落在{subtle, moderate, large}社交手勢(shì)類(lèi)技能wave_hello、nod_yes、shake_no、celebrate、greet_observe_raise、act_cute、happy_spin_upright等必須聲明do_not_use消歧記錄每條do_not_use的instead_use目標(biāo)必須是同一 profile 啟用的技能。4. 完整示例問(wèn)候技能簇的消歧契約文檔給出了wave_hello揮手問(wèn)候的完整寫(xiě)法。該示例在倉(cāng)庫(kù)中已經(jīng)落地為真實(shí)配置 wave_hello/manifest.yaml并擴(kuò)展出了英文別名wave_hello: description: summary: Wave hello or goodbye with the wrist (casual greeting gesture). category: social_greeting when_to_use: [greet someone, say hi or bye, wave to a person] do_not_use: - condition: agree or say yes instead_use: nod_yes - condition: formal raise-hand greet at the observe pose instead_use: greet_observe_raise - condition: dance rhythmically instead_use: dance_basic aliases_zh: [打招呼, 揮手, 揮揮手, 再見(jiàn), 嗨] aliases_en: [hello, hi, wave, goodbye, bye] motion_scope: [wrist] anchor_pose: home intensity: moderate duration_sec_estimate: 8.0 requires_motion_params: false rule_entry: true這個(gè)例子展示了消歧的完整形態(tài)三條do_not_use分別劃清邊界點(diǎn)頭同意→nod_yes、正式舉手問(wèn)候→greet_observe_raise、有節(jié)奏的舞蹈→dance_basicaliases_zh覆蓋了中文口語(yǔ)變體打招呼 / 揮手 / 揮揮手 / 再見(jiàn) / 嗨其中再見(jiàn)與嗨是問(wèn)候場(chǎng)景的常見(jiàn)說(shuō)法motion_scope: [wrist]表明動(dòng)作局限于腕部與其wave_hand等近義技能形成區(qū)分維度anchor_pose: home引用的是機(jī)器人配置中真實(shí)存在的命名位姿見(jiàn)下節(jié)。4.1 anchor_pose 必須落在 embodied.named_poses以 SO101 單臂配置 so101_single_arm.yaml 為例embodied.named_poses下定義了三個(gè)命名位姿home安全/回位位姿observe_table觀察桌面位姿對(duì)應(yīng)設(shè)計(jì)流程中的觀察位置 / 看桌面 / 觀察位錨點(diǎn)zero零位。因此anchor_pose只有兩種合法取值none或這些已定義 pose 之一。任何未定義的名字都會(huì)觸發(fā)加載器報(bào)錯(cuò)。4.2 duration_sec_estimate 的估算規(guī)則duration_sec_estimate不是拍腦袋而是有明確覆蓋口徑的確定性手臂運(yùn)動(dòng)時(shí)長(zhǎng) 1.0 秒若存在 open/closed 的 initial_gripper_state 每一條顯式 open_gripper / close_gripper 原語(yǔ) 1.0 秒 余量margin也就是說(shuō)只要技能涉及夾爪開(kāi)合無(wú)論是初始夾爪狀態(tài)還是序列中途的顯式夾爪原語(yǔ)都必須在手臂運(yùn)動(dòng)估算之外為每段夾爪動(dòng)作預(yù)留至少 1.0 秒并整體留出余量避免實(shí)際執(zhí)行超時(shí)或與上層任務(wù)預(yù)算沖突。5. 校驗(yàn)與實(shí)測(cè)測(cè)試用例如何鎖定契約契約文檔引用的校驗(yàn)函數(shù)_validate_skill_description由 test_skill_description_contract.py 全面覆蓋這些用例本身就是最好的字段取值速查表測(cè)試場(chǎng)景期望行為結(jié)構(gòu)完整的 description含do_not_use零錯(cuò)誤通過(guò)instead_use指向不存在技能報(bào)unknown skillinstead_use指向自身報(bào)same skillmotion_scope: [knee]、intensity: extreme、負(fù)數(shù)時(shí)長(zhǎng)、未定義 pose、rule_entry: yes全部被拒summary為 dict、category為布爾、anchor_pose為數(shù)字報(bào)必須是字符串類(lèi)錯(cuò)誤duration為nan/inf/-inf/超大數(shù)/布爾/字符串報(bào)must be a finite numberdescription缺失報(bào)description is required測(cè)試還特別斷言了 SO101 配置啟用的全部技能都必須攜帶完整契約以及社交手勢(shì)簇必須聲明消歧記錄——這與設(shè)計(jì)流程Step 5 強(qiáng)制的要求一致。6. 從 YAML 聲明到運(yùn)行驗(yàn)證的完整鏈路6.1 技能執(zhí)行的受控路徑IB-Robot 中任何真實(shí)機(jī)器人技能執(zhí)行都必須經(jīng)過(guò)安全守衛(wèi)路徑不得繞過(guò)直接調(diào)用硬件、/task_executor/*、MoveIt、ros2_control或控制器Hermes / Agent / CLI - /embodied/execute_skill - skill_executor - safety_guard - existing primitive executor6.2 通過(guò) robot-skill CLI 驗(yàn)證技能技能完成description:編寫(xiě)后可用robot-skill命令行工具做驗(yàn)證與執(zhí)行命令取自 ibrobot-robot-skill-design 技能說(shuō)明robot-skill --config-name NAME validate SKILL ARGS robot-skill --config-name NAME execute SKILL --task-id ID robot-skill --config-name NAME execute recover_safe_pose --task-id ID其中validate子命令只校驗(yàn)技能而不執(zhí)行定義于 cli.pyexecute需要顯式提供--task-id。真實(shí)機(jī)器人測(cè)試結(jié)束后除非用戶明確要求停在最終位姿否則應(yīng)當(dāng)執(zhí)行recover_safe_pose讓機(jī)械臂回到安全位姿。6.3 實(shí)操中的驗(yàn)證檢查清單結(jié)合契約與設(shè)計(jì)流程的 Validation Checklist新增/修改技能后應(yīng)逐項(xiàng)確認(rèn)技能名位于planning_policy.allowed_skills若希望 planner 可生成它該 allowlist 不影響 catalog 暴露每個(gè)原語(yǔ)都在SUPPORTED_PRIMITIVES內(nèi)每個(gè)命名位姿都存在于embodied.named_posesdescription:塊包含summary/category/when_to_use/motion_scope/intensity加載器強(qiáng)制校驗(yàn)并拒絕懸空的do_not_use.instead_use每個(gè)近義技能至少有一條do_not_use重定向如 wave_hello 與 greet_observe_raise、nod_yes 之間中文觸發(fā)詞只存在于description.aliases_zh不得在command_parser中硬編碼平行關(guān)鍵詞表catalog 文檔由description:塊自動(dòng)合成不手工維護(hù)逐技能 prose。7. 小結(jié)description:契約把技能該在什么場(chǎng)景被選中、絕不該在什么場(chǎng)景被選中這件事從隱式的調(diào)用邏輯中剝離出來(lái)變成一份顯式、可校驗(yàn)、可自動(dòng)生成文檔的 YAML 聲明。它以robot_config.loader._validate_skill_description為強(qiáng)校驗(yàn)入口以skill_catalog的目錄校驗(yàn)為第二道防線以aliases_zh rule_entry為規(guī)則解析器的單一觸發(fā)詞來(lái)源最終通過(guò)robot-skill validate/execute完成端到端驗(yàn)證。遵循這份契約Agent/Hermes 才能在wave_hello、nod_yes、greet_observe_raise、dance_basic等近義技能之間穩(wěn)定、準(zhǔn)確地完成選路。贊分享具身智能機(jī)器人人工智能大模型模型推理服務(wù)本地部署計(jì)算機(jī)視覺(jué)ROS【免費(fèi)下載鏈接】IB_RobotSave the code of IB-Robot, an AI robot execution framework developed by openEuler Embedded for embodied intelligence scenarios. It includes references to the forked version of tensormsg, references to lerobot fork, code references to the lerobot_ros2:ros2_ws branch, as well as some code related to development usability.項(xiàng)目地址https://gitcode.com/openeuler/IB_Robot點(diǎn)擊查看免費(fèi)下載相關(guān)推薦IB-Robot 公共運(yùn)行時(shí)接口綁定Interface Binding從邏輯接口到 ROS 契約的聲明式消費(fèi)方案IB Robot 公共運(yùn)行時(shí)接口綁定Interface Binding從邏輯接口到 ROS 契約的聲明式消費(fèi)方案 導(dǎo)讀 本文面向 IB Robotope具身智能機(jī)器人人工智能大模型模型推理服務(wù)本地部署計(jì)算機(jī)視覺(jué)ROSopenEulerOpenHarmony深度學(xué)習(xí)語(yǔ)音AI AgentAscendexpress-validator 中的 Schema 校驗(yàn)checkSchema 聲明式校驗(yàn)完全指南express validator 中的 Schema 校驗(yàn)checkSchema 聲明式校驗(yàn)完全指南 本篇指南圍繞 express validator 的后端IB-Robot 機(jī)器人運(yùn)行時(shí)契約層robot_runtime深度解析契約命名、運(yùn)行時(shí)剖面、Facade 門(mén)面與一致性測(cè)試IB Robot 機(jī)器人運(yùn)行時(shí)契約層robot_runtime深度解析契約命名、運(yùn)行時(shí)剖面、Facade 門(mén)面與一致性測(cè)試 robot_runtime 是具身智能機(jī)器人人工智能大模型模型推理服務(wù)本地部署計(jì)算機(jī)視覺(jué)ROSopenEulerOpenHarmony深度學(xué)習(xí)語(yǔ)音AI AgentAscend創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考