为 webots 中的机器人控制器添加延迟
Adding delay to robot controller in 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
变量)并仅在达到特定时间时执行某些操作。
最后,另一种可能性是仅在达到目标位置时(而不是在某个固定的时间延迟之后)使用位置反馈进入下一个动作(关闭夹具)。
我正在网络机器人中使用 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
变量)并仅在达到特定时间时执行某些操作。
最后,另一种可能性是仅在达到目标位置时(而不是在某个固定的时间延迟之后)使用位置反馈进入下一个动作(关闭夹具)。