控制Webots模拟步骤

时间:2019-07-09 13:12:38

标签: webots

是否有可能以编程方式计算Webots模拟步骤,即,每当一个模块完成其计划时,Webots便应根据模块的输出计算下一个模拟步骤。

我已经检查了Supervisor模式,但是除了设置模拟模式外,它似乎对模拟运行没有任何控制。

编辑1:

在计划完成另一个ROS节点后,如何从脚本“执行一个模拟步骤(在Webots环境中为ctrl + 1)”?

2 个答案:

答案 0 :(得分:2)

在Supervisor控制器中,您还可以访问所有Robot API。因此,可以使用the WorldInfo.basicTimeStep field函数获得全局离散时间步长常数(由wb_robot_get_basic_time_step()定义),并可以使用wb_robot_get_time()函数获得以秒为单位的模拟时间。

模拟基本时间步长是一个常数,在模拟过程中不能修改。当控制器(包括主管)调用wb_robot_step(int duration)函数时,模拟将继续进行,并且在“持续时间”之后将把手交还给控制器。在此期间,一个(如果“ duration”严格大于“ WorldInfo.basicTimeStep”,则为一个或多个) 可以应用模拟步骤。

答案 1 :(得分:1)

在您的版本之后,这是一个更具体的答案。我以前的答案仍然正确,但是更笼统。

当控制器同步时(Robot.synchronization字段的默认情况),Webots正在等待控制器调用wb_robot_step(int duration)函数以执行仿真步骤。

因此,如果您想从控制器执行单个步骤(例如按到Ctrl + 1时,则只需调用一次wb_robot_step(int duration)函数。

为说明这一点,以下控制器每3秒执行一次仿真步骤:

"""Perform one simulation step after some event."""

from controller import Robot
import time

robot = Robot()
timestep = int(robot.getBasicTimeStep())

while True:
    time.sleep(3)  # Wait 3 real seconds to simulate a blocking event.

    print 'Perform a simulation step.'
    robot.step(timestep)