在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之间添加延迟,即只有在电机驱动到达所需位置后手指才会闭合。我用了睡眠,但没有用。

有不同的可能性来实现你想要的。一个简单的方法是引入一个时间计数器变量(您可能需要根据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变量),并仅在达到特定时间时执行某些操作。

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

最新更新