You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让函数中循环的全局变量x进入copying()时停止/冻结

解决方案

先修复核心运行问题

你的代码里主函数先调用fun(),它是无限循环,会导致后续的listener()永远无法执行,ROS订阅回调根本不会触发。必须用多线程让两个函数并行运行。

实现x冻结的逻辑

通过全局控制标志pause_flag暂停fun()中的x递增循环,进入copying()时将标志设为True,此时fun()会停止x的递增,直到标志被重置(若需要恢复)。

修改后的完整代码

import os
import threading
from std_msgs.msg import String
from datetime import datetime
import rospy

# 全局变量
x = 0
pause_flag = False

def fun():
    global x, pause_flag
    while True:
        for x in range(12):
            # 检查暂停标志,若为True则阻塞等待
            while pause_flag:
                continue
            cmd = f'rosbag record -O /home/mubashir/catkin_ws/src/germany1_trush/rosbag/{x}.bag /web_cam --duration 5 '
            os.system(cmd)

def callback(data):
    global pub, pause_flag
    print(data.data)
    if data.data == "True":
        pub.publish(f"{datetime.now()}")
        print("Callback function ")
        copying()

def copying():
    global pause_flag, x
    # 设置暂停标志,冻结x
    pause_flag = True
    print(f"当前冻结的x值: {x}")
    print("x已停止递增,保持冻结状态")
    # 如需恢复递增,可在后续逻辑中添加 pause_flag = False

def listener():
    global pub
    rospy.init_node('bag_recorder_node', anonymous=True)
    pub = rospy.Publisher('recording_status', String, queue_size=10)
    rospy.Subscriber("button_press", String, callback)
    rospy.spin()

if __name__ == '__main__':
    # 用线程启动fun()和listener(),实现并行运行
    thread_fun = threading.Thread(target=fun)
    thread_fun.daemon = True  # 设为守护线程,主进程退出时自动结束
    thread_fun.start()
    
    listener()

关键修改说明

  • 引入threading模块,将fun()放在单独线程中运行,确保listener()能正常启动,ROS回调可触发。
  • 添加全局pause_flag变量,fun()的循环会持续检查该标志:当pause_flag为True时,会卡在循环中,不再执行录制命令和x的递增。
  • copying()中设置pause_flag = True触发x冻结,如需恢复递增,可在合适场景(如另一个回调、用户输入)设置pause_flag = False。
  • 补充ROS节点初始化代码rospy.init_node,原代码缺失该步骤会导致listener无法正常工作。

内容的提问来源于stack exchange,提问作者Mubashir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 02:30:44