当前位置: 首页 > news >正文

机器人坐下后拍触摸板站起行动指令无效 — Bug 分析

坐下后拍触摸板站起行动指令无效 — Bug 分析一、场景描述机器人坐下语音或 App 指令拍两下触摸板使其站起下达行动指令前进/后退/旋转机器人有回复但不执行原地不动再次坐下再站起后恢复二、核心概念MC Action ID机器人运动控制器MC通过curr_action_id表示当前姿态。四足相关取值ID常量名中文含义能否行走101QUADRUPED_STAND_DEFAULT四足站立否102QUADRUPED_LOCOMOTION_DEFAULT四足行走态是107QUADRUPED_LOCOMOTION_HANDSHAKE握手否110QUADRUPED_GET_DOWN_DEFAULT趴下否111QUADRUPED_SIT_DOWN_DEFAULT坐下否只有curr_action_id 102行走态时MC 才会响应移动速度指令。三、完整调用链步骤 1用户说/点坐下App 发 PlayAnimation animation_id3 (kSitDown) → T1AnimationTaskDescription::GetSkillParamList(3) → GetQuadrupedAnimationParam(kSitDown) → action_id 111 (QUADRUPED_SIT_DOWN_DEFAULT) → ActionSkill Exec → 发 RPC 给 MC → MC 执行坐下 → curr_action_id 变为 111步骤 2拍触摸板站起触摸传感器检测到双击/三连拍 → ROS2 topic 发布 TouchState → Scheduler 回调 →DispatchTouchStatus→CreateTaskTouch文件t1_interaction.cpp:85-118std::shared_ptrSkillParamListT1InteractionTaskDescription::GetClickQuadrupedSkillParamList(){automotion_stateStateManager::GetInstance()-GetMotionState();int32_taction_id0;if(motion_state.curr_action_idQUADRUPED_SIT_DOWN_DEFAULT){// 当前坐着(111)action_idQUADRUPED_STAND_DEFAULT;// → 目标站起(101)audio_params-SetAudioFileNameQuadruped(坐下.wav);}elseif(motion_state.curr_action_idQUADRUPED_STAND_DEFAULT){// 当前站着(101)action_idQUADRUPED_SIT_DOWN_DEFAULT;// → 目标坐下(111)}else{action_idQUADRUPED_SIT_DOWN_DEFAULT;// 其他状态默认坐下}action_params-SetActionId(action_id);// → 设置目标为 101// Push 到 SkillParamList → Worker 执行 → ActionSkill → MC}执行结果MC 收到SetMcAction(101)机器人站起。curr_action_id101。步骤 3下达行动指令PlayMoveApp 下发 PlayMove →Scheduler::PlayMoveService→CheckMove通过 →DispatchMove→TaskFactory::CreateTaskMove→T1MoveTaskDescription::GetSkillParamList文件t1_move_task_description.cpp:98-108std::shared_ptrSkillParamListT1MoveTaskDescription::GetSkillParamList(step,distance,direction){autocurr_action_idStateManager::GetInstance()-GetMotionState().curr_action_id;// curr_action_id 101 (刚站起还在 STAND_DEFAULT)// ★ 关键检查当前状态是否需要先过渡到行走态(102)if((curr_action_idQUADRUPED_GET_DOWN_DEFAULT// 110 趴下||curr_action_idQUADRUPED_SIT_DOWN_DEFAULT// 111 坐下||curr_action_idQUADRUPED_STAND_DEFAULT// 101 站立 ← 新加的||curr_action_idQUADRUPED_LOCOMOTION_HANDSHAKE)// 107 握手direction!Direction::kStopWalk){// 注入过渡 Action: 先切到 QUADRUPED_LOCOMOTION_DEFAULT (102)autoaction_paramsstd::make_sharedActionParams();action_params-SetActionId(QUADRUPED_LOCOMOTION_DEFAULT);// 102action_params-SetCheckSet(true);// 阻塞等待 MC 确认skill_param_list-PushSkillParam(action_params);}// 然后才计算速度、方向Push MoveParams// ...}这个函数生成的 Skill 序列以从站立 101 移动为例Skill 1: ActionParams {action_id102, check_settrue} → ActionSkill 发 SetMcAction(102) 给 MC → 阻塞等待 MC 确认 curr_action_id 变为 102 Skill 2: MoveParams {velocity, duration} → MoveSkill 循环 pub 速度指令给 MC → MC 当前 action102行走态→ 执行移动四、Bug 根因修改前的代码有 Bugif((curr_action_idQUADRUPED_GET_DOWN_DEFAULT// 110||curr_action_idQUADRUPED_SIT_DOWN_DEFAULT// 111||curr_action_idQUADRUPED_LOCOMOTION_HANDSHAKE)// 107// ← 没有 101direction!Direction::kStopWalk){白名单是{110, 111, 107}。拍触摸板站起后curr_action_id 101不在白名单中。错误流程拍触摸板站起 → curr_action_id 101 (STAND_DEFAULT) ↓ App 下发 PlayMove ↓ GetSkillParamList 检查101 ∈ {110, 111, 107} ↓ → false不注入 Action(102) 过渡 ↓ 直接生成 MoveParams发速度指令给 MC ↓ MC: curr_action 101 (站立)不是 102 (行走态) ↓ MC 忽略速度指令 → 机器人不动 ❌为什么坐下趴下后恢复再次让机器人坐下 →curr_action_id 111111 在白名单中 → 下次 PlayMove 自动注入 Action(102) → 切到行走态 → 移动恢复。五、修复文件t1_move_task_description.cpp:103在白名单中增加QUADRUPED_STAND_DEFAULT101if((curr_action_idQUADRUPED_GET_DOWN_DEFAULT// 110 趴下||curr_action_idQUADRUPED_SIT_DOWN_DEFAULT// 111 坐下||curr_action_idQUADRUPED_STAND_DEFAULT// 101 站立 ← 新增||curr_action_idQUADRUPED_LOCOMOTION_HANDSHAKE)// 107 握手direction!Direction::kStopWalk){// 自动注入 Action(102)过渡到行走态action_params-SetActionId(QUADRUPED_LOCOMOTION_DEFAULT);// 102action_params-SetCheckSet(true);skill_param_list-PushSkillParam(action_params);}修复后的流程拍触摸板站起 → curr_action_id 101 (STAND_DEFAULT) ↓ App 下发 PlayMove ↓ GetSkillParamList 检查101 ∈ {110, 111, 101, 107} ↓ → true注入 Action(102) 过渡 ↓ Skill 1: ActionSkill → SetMcAction(102) → 阻塞等 MC 确认 → MC 切到行走态 Skill 2: MoveSkill → 发速度指令 → MC 执行移动 ↓ 机器人正常行走 ✅六、涉及文件汇总文件行号作用t1_interaction.cpp85-118触摸响应坐着→站起(101)t1_move_task_description.cpp98-108移动前自动注入行走态过渡(102)action_skill.cpp24-84发送 SetMcAction check_set 阻塞等待七、一句话总结拍触摸板站起后机器人处于STAND_DEFAULT(101)站立而非LOCOMOTION_DEFAULT(102)行走态移动代码的白名单漏了 101导致没有自动先切到 102 再发速度指令。MC 在站立态不响应移动指令。修复是在白名单补上 101。
http://www.gsyq.cn/news/1340052.html

相关文章:

  • 2026年数据中台选型必看:主流厂商治理能力排名与真实用户反馈
  • 婴儿推车怎么选?关注可坐可躺、亲肤面料、防震避震这三个关键 - 资讯焦点
  • 为你的Claude Code配置Taotoken后端彻底解决访问中断与Token不足烦恼
  • 长沙七和医美:美迪迈黄金微针的医疗级选择 - 资讯焦点
  • 我在大厂做AI研发的2年:那些调参的日子
  • 【限时解密】ElevenLabs未公开的瑞典文语料权重配置表:仅限前200名开发者获取的/sv-SE/声道微调参数
  • PPH管行业技术应用分析与市场格局观察权威分析 - 资讯焦点
  • PKPM结构设计许可不够用?自动释放闲置,建筑结构师福音
  • 灵感日报 2026年5月21日 | 今日产品机会榜 TOP5
  • IC载板制造中的收放板设备选型:薄板处理与无接触搬运的技术要求
  • Coding时代AI需求旺,Google、Minimax多模态模型引领行业新变革
  • 避坑指南:施耐德PLC用功能块做ModbusTCP通讯,这些参数配置错了程序就卡死
  • 泛微发布300+可落地AI应用 让组织业务数智升级
  • 王力宏重仓比亚迪,行业震惊
  • JavaSE-05-字符串(全面深入)
  • Vue3 入门学习
  • 【Qt学习】Windows上环境配置与项目初识
  • 观察taotoken多模型路由在不同负载下的响应表现
  • 浙大联合多校突破:全景图理解实现机器人导航与视觉搜索能力提升
  • 2026 年 Haskell 基金会大变革:执行董事卸任、组织重组、董事会人员调整!
  • 新加坡国立大学发布首个视频“潜台词“理解基准测试
  • 从达达主义到扩散模型:Midjourney后现代风格演进图谱(2022–2024关键节点+37项元数据验证)——稀缺性技术白皮书首发
  • 前端高频难题——防抖与节流的精准实现(避坑版)
  • 数字孪生完整教程(开发工具 + 三方对接全流程)
  • 高棉文TTS部署踩坑实录:从字符乱码到语调断裂,11个ElevenLabs官方未文档化的Khmer语言标记规则
  • 告别手动统计!Allegro Quick Reports 隐藏技巧:自动生成BOM位置图并导出Excel
  • 多平台矩阵系统的反脆弱架构:如何用技术解耦对抗平台规则的不确定性
  • 10 万行 Rust 代码开发实测封神!AI 应用经验大揭秘
  • 从“念稿子”到“讲故事”:学术答辩PPT的范式转移
  • 终极指南:如何使用OmenSuperHub完全掌控惠普OMEN游戏本性能