如何让函数中循环的全局变量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
相关产品推荐
相关产品推荐

