【问题标题】:Controlling Webots simulation step控制 Webots 模拟步骤
【发布时间】:2019-07-17 15:23:04
【问题描述】:

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

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

编辑 1:

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

【问题讨论】:

    标签: webots


    【解决方案1】:

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

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

    【讨论】:

    • 抱歉错误。我的意思是说如何执行一个模拟步骤而不是计算,我已经编辑了这个问题,你能不能也回答一下。
    • 抱歉耽搁了,我跳过了你的评论。我会作为新的答案来回答。
    【解决方案2】:

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

    当控制器同步时(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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多