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

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

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

一、场景描述

  1. 机器人坐下(语音或 App 指令)
  2. 拍两下触摸板使其站起
  3. 下达行动指令(前进/后退/旋转)
  4. 机器人有回复但不执行,原地不动
  5. 再次坐下再站起后恢复

二、核心概念: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_id=3 (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 回调 →DispatchTouchStatusCreateTaskTouch

文件:t1_interaction.cpp:85-118

std::shared_ptr<SkillParamList>T1InteractionTaskDescription::GetClickQuadrupedSkillParamList(){automotion_state=StateManager::GetInstance()->GetMotionState();int32_taction_id=0;if(motion_state.curr_action_id==QUADRUPED_SIT_DOWN_DEFAULT){// 当前坐着(111)action_id=QUADRUPED_STAND_DEFAULT;// → 目标站起(101)audio_params->SetAudioFileNameQuadruped("坐下.wav");}elseif(motion_state.curr_action_id==QUADRUPED_STAND_DEFAULT){// 当前站着(101)action_id=QUADRUPED_SIT_DOWN_DEFAULT;// → 目标坐下(111)}else{action_id=QUADRUPED_SIT_DOWN_DEFAULT;// 其他状态默认坐下}action_params->SetActionId(action_id);// → 设置目标为 101// Push 到 SkillParamList → Worker 执行 → ActionSkill → MC}

执行结果:MC 收到SetMcAction(101),机器人站起。curr_action_id=101

步骤 3:下达行动指令(PlayMove)

App 下发 PlayMove →Scheduler::PlayMoveServiceCheckMove通过 →DispatchMoveTaskFactory::CreateTaskMoveT1MoveTaskDescription::GetSkillParamList

文件:t1_move_task_description.cpp:98-108

std::shared_ptr<SkillParamList>T1MoveTaskDescription::GetSkillParamList(step,distance,direction){autocurr_action_id=StateManager::GetInstance()->GetMotionState().curr_action_id;// curr_action_id = 101 (刚站起,还在 STAND_DEFAULT!)// ★ 关键检查:当前状态是否需要先过渡到行走态(102)if((curr_action_id==QUADRUPED_GET_DOWN_DEFAULT// 110 趴下||curr_action_id==QUADRUPED_SIT_DOWN_DEFAULT// 111 坐下||curr_action_id==QUADRUPED_STAND_DEFAULT// 101 站立 ← 新加的!||curr_action_id==QUADRUPED_LOCOMOTION_HANDSHAKE)// 107 握手&&direction!=Direction::kStopWalk){// 注入过渡 Action: 先切到 QUADRUPED_LOCOMOTION_DEFAULT (102)autoaction_params=std::make_shared<ActionParams>();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_id=102, check_set=true} → ActionSkill 发 SetMcAction(102) 给 MC → 阻塞等待 MC 确认 curr_action_id 变为 102 Skill 2: MoveParams {velocity, duration} → MoveSkill 循环 pub 速度指令给 MC → MC 当前 action=102(行走态)→ 执行移动!

四、Bug 根因

修改前的代码(有 Bug)

if((curr_action_id==QUADRUPED_GET_DOWN_DEFAULT// 110||curr_action_id==QUADRUPED_SIT_DOWN_DEFAULT// 111||curr_action_id==QUADRUPED_LOCOMOTION_HANDSHAKE)// 107// ← 没有 101!&&direction!=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 = 111,111 在白名单中 → 下次 PlayMove 自动注入 Action(102) → 切到行走态 → 移动恢复。


五、修复

文件:t1_move_task_description.cpp:103

在白名单中增加QUADRUPED_STAND_DEFAULT(101):

if((curr_action_id==QUADRUPED_GET_DOWN_DEFAULT// 110 趴下||curr_action_id==QUADRUPED_SIT_DOWN_DEFAULT// 111 坐下||curr_action_id==QUADRUPED_STAND_DEFAULT// 101 站立 ← 新增||curr_action_id==QUADRUPED_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.jsqmd.com/news/860315/

相关文章:

  • 2026防火选型玻璃钢桥架厂家五大排行榜 阻燃防腐更安心 - 资讯纵览
  • 软件许可优化公司怎么选?聊聊五家(格发、Flexera、Snow、Anglepoint、OpenLM)
  • 在Ubuntu 20.04上搞定PetaLinux 2020.1:从依赖安装到环境配置的完整避坑指南
  • 2026别错过!一键生成论文工具深度测评与推荐
  • 高级考前3天每天练什么,逐日安排不焦虑
  • 别让几何清理拖后腿!ANSA新手必看的点、线、面高效处理指南(附19版新功能)
  • 微信投票制作平台哪个好用?免费投票工具推荐 - 资讯纵览
  • caxa2015可以导出2005exb而且有二次开发示例
  • Taotoken平台在应对大模型API服务波动时的稳定性体验
  • 为什么智能体单独可用、协同失效?核心瓶颈:缺少统一业务本体
  • 5分钟掌握小鹿快传:零基础部署P2P文件直传完全指南
  • Taotoken 多模型聚合平台助力智能数据分析与建模工作流
  • STM32电容触摸按键灵敏度调不好?从tpad_scan函数源码带你分析点按与连按的逻辑
  • 优之彩不锈钢蜂窝板:重新定义高端空间装饰的“六边形战士”
  • HC-SR505人体感应模块的5个实战应用场景,从安防到节能都能用(含ESP8266联动教程)
  • 海边度假防晒推荐 2026油皮专用高倍修护防水防晒测评 - 资讯焦点
  • RK3568开发板实战:替换Buildroot默认桌面,让你的Qt应用开机全屏自启动
  • 5月最新10款降AI神器实测:哪个能降知网维普AI率,从99.5%降至3.8%可信吗? - 我要发一区
  • 使用Taotoken CLI工具一键为团队所有虚拟机配置统一AI环境
  • 第十章:什么是Agentic AI?——让AI从“回答问题“到“替你办事“
  • 普宁配眼镜哪家专业|验光师资质怎么看才不踩坑 - 品牌观察
  • 618下半程冲刺!易元AI“全域推广内容弹药库”限时开放:千套模板+素材包免费领,前200名还送诊断
  • 郑州建设工程律师推荐:3位深耕建工领域的专业律师 - 资讯焦点
  • RecurDyn仿真数据流转全攻略:从AKISPL函数创建到CSV结果导出与对比
  • 抖音无水印下载神器:轻松保存你喜欢的每一刻精彩
  • SDR++软件无线电:3个关键步骤让你轻松探索无线电频谱世界
  • 商旅平台哪个好?基于真实用户反馈的2026商旅平台排行与选型建议(最新版) - 资讯纵览
  • OpenAI Codex:下一代 Coding Agent 全面解析
  • 郑州工程款纠纷律师排名:3位帮施工方拿回钱的建工律师 - 资讯焦点
  • 太初元碁洪源:异构计算能力将成为未来AI算力基础设施的重要方向|AIGC2026