为 webot 中的机器人控制器添加延迟

问题描述

我正在使用 webots 中的 UR3 执行拾取和放置任务。 我需要机器人转到拾取位置,抓住物体(合上手指),然后转到放置位置。类似于以下代码:

  while (wb_robot_step(TIME_STEP) != -1) {
   // 1. Go to Pick position
   for (i = 0; i < 6; ++i)
     wb_motor_set_position(ur_motors[i],pick_position[i]);                  

   // 2. Grasp the object
   for (i = 0; i < 2; ++i)
      wb_motor_set_position(finger_motors[i],0.5);
        
   // 3. Go to Place position
   for (i = 0; i < 6; ++i)
     wb_motor_set_position(ur_motors[i],place_position[i]);                     
} 

但是,当我运行代码时,我看到当机器人要选择位置时,手指也会闭合。我在文档中读到“wb_motor_set_position 函数存储新位置,但它不会立即启动电机”。所以我想知道如何在第 1 步和第 2 步之间添加延迟,即只有在电机驱动达到所需位置后手指才会闭合。我使用了 sleep 但没有帮助。

解决方法

有不同的可能性来实现你想要的。 一个简单的方法是引入一个时间计数器变量(您可能需要根据您的 TIME_STEP 调整 100 和 200 值):

  int counter = 0;
  while (wb_robot_step(TIME_STEP) != -1) {
   // 1. Go to Pick position
   if (counter == 0)
     for (i = 0; i < 6; ++i)
       wb_motor_set_position(ur_motors[i],pick_position[i]);                  

   // 2. Grasp the object
   else if (counter == 100)
     for (i = 0; i < 2; ++i)
        wb_motor_set_position(finger_motors[i],0.5);
        
   // 3. Go to Place position
   else if (counter == 200)
     for (i = 0; i < 6; ++i)
       wb_motor_set_position(ur_motors[i],place_position[i]);                     
   counter++;
}

另一种可能是使用 wb_robot_get_time() 来检索当前模拟时间(而不是 counter 变量)并仅在达到特定时间时执行某些操作。

最后,另一种可能性是仅在到达目标位置时(而不是在一些固定的时间延迟后)才使用位置反馈步进到下一个动作(关闭夹具)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...