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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:37:05