You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

程序化控制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

火山引擎 最新活动