如何在Python中并行运行两台ROS2机器人的导航任务?
解决ROS2 Iron中两台机器人同步启动导航的问题
问题根源在于goThroughPoses()是阻塞式调用——它会一直等待当前机器人完成导航任务后才会执行下一行代码,导致两台机器人无法同时启动导航。以下是两种实用的并行执行方案:
方案1:使用Python threading模块创建独立线程
通过为每个机器人的导航任务分配单独线程,实现并行启动:
import threading from nav2_simple_commander.robot_navigator import BasicNavigator # 初始化分属不同命名空间的导航器 navigator1 = BasicNavigator(namespace='robot1') navigator2 = BasicNavigator(namespace='robot2') # 确保导航系统就绪 navigator1.waitUntilNav2Active() navigator2.waitUntilNav2Active() # 定义各机器人的导航任务函数 def run_robot1_nav(): navigator1.goThroughPoses(goal_pose1) def run_robot2_nav(): navigator2.goThroughPoses(goal_pose2) # 创建并启动线程 thread_robot1 = threading.Thread(target=run_robot1_nav) thread_robot2 = threading.Thread(target=run_robot2_nav) thread_robot1.start() thread_robot2.start() # 可选:等待两个导航任务完成后再执行后续逻辑 thread_robot1.join() thread_robot2.join()
方案2:使用concurrent.futures.ThreadPoolExecutor(更简洁)
利用线程池管理并行任务,代码更紧凑:
from concurrent.futures import ThreadPoolExecutor from nav2_simple_commander.robot_navigator import BasicNavigator navigator1 = BasicNavigator(namespace='robot1') navigator2 = BasicNavigator(namespace='robot2') # 等待导航系统激活 navigator1.waitUntilNav2Active() navigator2.waitUntilNav2Active() # 提交任务到线程池并行执行 with ThreadPoolExecutor(max_workers=2) as executor: executor.submit(navigator1.goThroughPoses, goal_pose1) executor.submit(navigator2.goThroughPoses, goal_pose2) # 可选:等待任务完成 # executor.shutdown(wait=True)
关键注意事项
- 必须为每个机器人配置独立的命名空间(比如
robot1、robot2),避免导航相关的话题、服务出现冲突 - 启动导航任务前,务必调用
waitUntilNav2Active()确保导航栈已正常初始化 - 如果需要实时监控任务状态,可以在主线程中通过
navigator1.isTaskComplete()和navigator2.isTaskComplete()轮询
内容的提问来源于stack exchange,提问作者Aryan Arora
相关产品推荐
相关产品推荐

