Контроль шага симуляции Webots - PullRequest
0 голосов
/ 09 июля 2019

Можно ли рассчитать шаг моделирования Webots программно, т. Е. Каждый раз, когда один модуль заканчивает свое планирование, Webots должен рассчитать следующий шаг моделирования в зависимости от выхода модуля.

Я проверил Supervisorрежим, но он, кажется, не имеет некоторого контроля над запуском симуляции, кроме установки режима симуляции.

Edit 1:

Как "выполнить один шаг симуляции (ctrl + 1 в Webotsenvironment) "из сценария после завершения планирования еще одного узла ROS?

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

В контроллере Supervisor вы также можете получить доступ ко всем API-интерфейсам роботов. Следовательно, можно получить глобальную дискретную постоянную времени (определенную полем WorldInfo.basicTimeStep ), используя функцию wb_robot_get_basic_time_step () , и получить смоделированное время в секундах, используя wb_robot_get_time () функция.

Базовый временной шаг симуляции - это постоянная, которую нельзя изменить во время симуляции. Симуляция продолжается, когда контроллеры (включая супервизоров) вызывают функцию wb_robot_step (int duration) , и после этой «продолжительности» рука будет возвращена контроллеру. В течение этого периода один (или более, если «продолжительность» строго больше, чем «WorldInfo.basicTimeStep») шаги моделирования могут быть применены.

1 голос
/ 17 июля 2019

После вашего издания приведу более конкретный ответ. Мой предыдущий ответ остается верным, но носит более общий характер.

Когда контроллер синхронизируется (случай по умолчанию поля 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)
...