当前位置: 首页 > 工具软件 > Webots > 使用案例 >

webots笔记 第二天

宗苗宣
2023-12-01

webots 笔记 第二天

1. Actuator(执行机构)的使用

  • 执行机构也跟传感器差不多,用的标签也是 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() 只指定期望目标值,跟实际机器人相似,电机的转角也达不到预期值,因为电机的转矩不够反抗重力。如果想要同时控制多个电机的转角的话,需要针对每个电机的转角设定期望值。

2. wb_robot_step()的使用

Webots有两个不同时候的用法,就是控制延时和模拟延时。

  • 控制延时(wb_robot_step()的使用)
  • 模拟延时(在场景树里的定义:WorldInfo.basicTimeStep

每个控制器都需要调用wb_robot_step(), 要不然传感器和执行机构都不更新数据并卡住(仅在同步模式里)

3. 一起使用传感器和执行机构

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;
}
 类似资料: