2

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

我已经检查了主管模式,但除了设置模拟模式之外,它似乎对模拟运行没有一些控制。

编辑1:

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

4

2 回答 2

4

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

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

于 2019-07-09T15:01:11.047 回答
2

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

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

因此,如果您想从控制器执行单个步骤(例如按下 to 时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)
于 2019-07-17T07:23:04.780 回答