Wb_Device_Tag
,调用函数也是 wb_robot_get_device()
,但是不需要调用开启函数 wb_*_enable()
。
wb_motor_set_position()
给电机相应的位置请求。
#include <webots/robot.h>
#include <webots/motor.h>
#include <math.h>
#define TIME_STEP 32
int main() {
wb_robot_init();
WbDeviceTag motor = wb_robot_get_device("my_motor");
double F = 2.0; // frequency 2 Hz
double t = 0.0; // elapsed simulation time
while (1) {
double pos = sin(t * 2.0 * M_PI * F);
wb_motor_set_position(motor, pos);
wb_robot_step(TIME_STEP);
t += (double)TIME_STEP / 1000.0;
}
return 0;
}
webots/motor.h
里有电机的速度,加速度,力和各种参数的定义。wb_motor_set_position()
只指定期望目标值,跟实际机器人相似,电机的转角也达不到预期值,因为电机的转矩不够反抗重力。如果想要同时控制多个电机的转角的话,需要针对每个电机的转角设定期望值。wb_robot_step()
的使用Webots有两个不同时候的用法,就是控制延时和模拟延时。
wb_robot_step()
的使用)WorldInfo.basicTimeStep
)每个控制器都需要调用wb_robot_step()
, 要不然传感器和执行机构都不更新数据并卡住(仅在同步模式里)
Webots和每个机器人控制器都运行在个别的过程里。比如,仿真中包括连个机器人,总共有三个过程:一个是Webots的,其他两个是机器人的。每个控制器过程在调用wb_robot_step()
时交换传感器和执行机构数据。比如,wb_motor_set_position
也不能即时发送数据给Webots。
请看下面的代码:
while(1){
double d1 = wb_distance_sensor_get_value(ds1);
double d2 = wb_distance_sensor_get_value(ds2);
if(d2<d1) //WRONG: d2 will always equal to d1 here
avoidCollision();
wb_robot_step(40);
}
因为两个传感器数据读取函数中间没有wb_robot_step()
函数,所以两个值不能同时被变的。
这是正确的代码:
while(1){
double d1 = wb_distance_sensor_get_value(ds1);
wb_robot_step();
double d2 = wb_distance_sensor_get_value(ds2);
if (d2<d1)
avoidCollision();
wb_robot_step();
}
但是一般推荐在主控制循环里只包含一个|wb_robot_step()
函数来同时更新所有传感器和执行机构数据。如下:
while(1){
readSensors();
actuateMotors();
wb_robot_step(TIME_STEP);
}
这里可以把wb_robot_step()
函数放在循环的开头处。这样可以让传感器已经有有效的数据在读取传感器数据之前。否则,传感器可能未定义的情况下进行第一次迭代。
while(1){
wb_robot_step(TIME_STEP);
readSensors();
actuateMotors();
}
实例:
#include <webots/robot.h>
#include <webots/differential_wheels.h>
#include <webots/distance_sensor.h>
#define TIME_STEP 32
int main() {
wb_robot_init();
WbDeviceTag left_sensor = wb_robot_get_device("left_sensor");
WbDeviceTag right_sensor = wb_robot_get_device("right_sensor");
wb_distance_sensor_enable(left_sensor, TIME_STEP);
wb_distance_sensor_enable(right_sensor, TIME_STEP);
while (1) {
wb_robot_step(TIME_STEP);
// read sensors
double left_dist = wb_distance_sensor_get_value(left_sensor);
double right_dist = wb_distance_sensor_get_value(right_sensor);
// compute behavior
double left = compute_left_speed(left_dist, right_dist);
double right = compute_right_speed(left_dist, right_dist);
// actuate wheel motors
wb_differential_wheels_set_speed(left, right);
}
return 0;
}