重启Choregraphe应用后Speech recognition未重置的问题咨询
解决Choregraphe重启后Speech Recognition模块残留运行的问题
问题背景
我开发的Choregraphe应用包含两个流程:
- 问候对话流程:内部依次串联多个Speech Recognition模块,按顺序完成语音交互
- Bumper重启流程:检测脚部按键触发时,重启整个应用
遇到的问题:当问候流程运行到第2、3个等非首个Speech Recognition模块时按下bumper,重启应用后再次进入问候流程,系统不会执行第一个Speech Recognition模块,而是直接启动上次停留的那个模块。尝试过用Python脚本做Speech Recognition的取消订阅、重新订阅、暂停操作,都没解决。
解决方案
1. 重启时彻底停止并重置流程
Choregraphe的流程状态在重启时可能未完全清空,需要在重启逻辑中主动清理:
- 用
ALBehaviorManager先彻底停止问候流程,再清空Speech Recognition的订阅,最后重新启动主应用:from naoqi import ALProxy # 初始化代理 behavior_mgr = ALProxy("ALBehaviorManager", "机器人IP", 9559) sr_proxy = ALProxy("ALSpeechRecognition", "机器人IP", 9559) # 停止问候流程 behavior_mgr.stopBehavior("你的问候流程名称") # 取消Speech Recognition的订阅(替换成你的订阅名) sr_proxy.unsubscribe("sr_sub") # 重新启动主应用流程 behavior_mgr.runBehavior("你的主应用流程名称")
2. 用状态变量控制模块触发
给问候流程加一个全局状态变量,精准控制每个Speech Recognition模块的启动时机:
- 在Choregraphe中创建一个Memory变量,比如
current_sr_step,初始值设为1 - 每个Speech Recognition模块的启动条件绑定
memory://current_sr_step == X(X是模块序号,第一个模块绑定等于1) - 每个模块执行完成后,用Set Memory节点把
current_sr_step更新为下一个序号 - 在Bumper重启流程中,添加Set Memory节点,强制把
current_sr_step重置为1 - 这样重启后状态变量回到初始值,只会触发第一个模块
3. 使用Choregraphe内置的重置节点
如果你的Choregraphe版本支持,直接用Reset Behavior节点重置流程状态:
- 把Reset Behavior节点拖到Bumper触发的流程里
- 选择问候流程作为重置目标
- 确保该节点在重启应用前执行,彻底清空流程的运行进度
4. 确保流程从头启动
检查应用启动逻辑,避免使用恢复模式:
- 调用
ALBehaviorManager.runBehavior时,第二个参数保持默认的False,确保流程从头开始运行 - 不要使用
resumeBehavior方法,这个方法会恢复上次的运行状态
内容的提问来源于stack exchange,提问作者Victor Sánchez
相关产品推荐
相关产品推荐

