程序化控制Webots仿真步长及ROS节点触发单步仿真咨询
当然可以搞定这个需求!其实你提到的Supervisor模式正是干这个的核心工具,只是可能没用到正确的API。我来给你拆解清楚:
一、编程控制Webots仿真步长(模块完成规划后执行下一步)
要实现“规划模块完成后才走一步仿真”,核心思路是先把仿真暂停,然后在规划完成时主动触发单步执行。用Supervisor脚本就能轻松做到:
- 第一步:启动Supervisor节点后,立刻把仿真模式设为
PAUSE,这样仿真不会自动跑起来,只会等你触发。 - 第二步:在循环里监听你的规划模块状态,一旦确认规划完成,调用单步执行API让Webots走一步。
给你个Python版的Supervisor脚本示例,逻辑很清晰:
from controller import Supervisor supervisor = Supervisor() # 初始设置仿真为暂停状态 supervisor.simulationSetMode(Supervisor.SIMULATION_MODE_PAUSE) # 循环保持脚本运行,监听规划模块状态 while supervisor.step(1000) != -1: # 这里替换成你判断规划模块完成的逻辑 # 比如检查共享变量、进程信号或者ROS消息 if is_planning_finished(): # 执行一次单步仿真,相当于手动按Ctrl+1 supervisor.simulationStep(1) # 紧接着可以把规划好的指令发给机器人 send_robot_commands()
这里要注意:supervisor.step(1000)是让Supervisor脚本本身保持存活(避免卡死退出),而supervisor.simulationStep(1)才是真正触发仿真走一个基本时间步的关键。
二、ROS节点完成规划后触发Webots单步仿真
如果你的规划逻辑在独立的ROS节点里,那通过ROS的服务或话题就能实现跨节点触发,步骤也很简单:
1. 在Webots端写Supervisor ROS节点
先让Webots的Supervisor节点提供一个ROS服务,收到请求就执行单步仿真:
import rospy from std_srvs.srv import Empty, EmptyResponse from controller import Supervisor supervisor = Supervisor() # 初始化ROS节点 rospy.init_node('webots_supervisor_trigger') # 初始暂停仿真 supervisor.simulationSetMode(Supervisor.SIMULATION_MODE_PAUSE) # 定义服务回调函数:收到请求就走一步仿真 def trigger_simulation_step(req): supervisor.simulationStep(1) return EmptyResponse() # 创建ROS服务,供规划节点调用 rospy.Service('/trigger_webots_single_step', Empty, trigger_simulation_step) # 保持脚本运行,监听ROS请求 while supervisor.step(1000) != -1 and not rospy.is_shutdown(): pass
2. 在规划ROS节点里调用服务
当你的规划节点完成计算后,调用上面创建的服务就能触发Webots单步:
import rospy from std_srvs.srv import Empty rospy.init_node('planning_controller') # 等待Webots的服务上线 rospy.wait_for_service('/trigger_webots_single_step') # 创建服务代理 trigger_step = rospy.ServiceProxy('/trigger_webots_single_step', Empty) def run_planning_cycle(): # 这里是你的规划逻辑代码 robot_plan = calculate_robot_path() # 把规划指令发给机器人(比如通过ROS话题发布) publish_robot_commands(robot_plan) # 触发Webots执行一步仿真 trigger_step() # 循环执行规划-触发仿真流程 while not rospy.is_shutdown(): run_planning_cycle() rospy.sleep(0.1)
额外小提示
- 如果你不需要服务的响应确认,也可以用ROS话题实现:让Supervisor订阅一个
/planning_completed的Bool话题,收到True时执行单步,更轻量化。 - 确保Webots的ROS插件已经正确加载,两个节点在同一个ROS环境下(比如统一的
ROS_MASTER_URI)。 supervisor.simulationStep(1)里的1指的是执行1个Webots基本时间步,这个时间步是你在世界文件里设置的basicTimeStep(默认32ms),不用改数值,保持1就行。
内容的提问来源于stack exchange,提问作者Tahir Mahmood




