Webots笔记




1. 文件内容

1.1 软件本体

图片

目录 说明
docs Webots 用户手册和 API 文档,提供学习与参考指南。
include C/C++ 开发控制器代码的头文件。
lib 包含控制器库和 Webots 运行时依赖。
msys64 GNU 工具链(如 GCC、make)及 POSIX 环境,用于 Windows 编译控制器代码。
projects Webots 自带的示例项目,包括仿真场景、机器人模型和控制器代码。
resources 资源文件(如纹理、声音、图标),用于渲染场景和模型。
scripts 自动化管理 Webots 的脚本文件,如安装、初始化和调试工具。

1.2 工程文件

目录 说明
controllers 存放控制器代码
libraries 存放共享库文件
plugins 存放 Webots 插件
protos 存放自定义节点
worlds 存放世界文件(.wbt

2. Solid、Robot节点图


3. 使用自定义源文件的编译配置

在 Webots 项目中include自定义文件时,可能出现无法识别自定义源文件的问题,导致编译失败。

原始配置

原始 Makefile 如下:

space :=
space +=

WEBOTS_HOME_PATH=$(subst $(space),\ ,$(strip $(subst \,/,$(WEBOTS_HOME))))

include $(WEBOTS_HOME_PATH)/resources/Makefile.include

#缺少自定义源文件的定义,编译器无法找到需要编译的 `.c` 文件。

解决方法

Makefile 中添加自定义源文件和头文件路径配置:

space :=
space +=

WEBOTS_HOME_PATH=$(subst $(space),\ ,$(strip $(subst \,/,$(WEBOTS_HOME))))

# 自动检测当前目录下的所有 .c 文件
C_SOURCES = $(wildcard *.c)

# 添加编译选项和头文件路径
CFLAGS += -Wall -Werror -O2 -I.

include $(WEBOTS_HOME_PATH)/resources/Makefile.include

4. 常用节点基础操作整理(C语言)

4.1 Motor

4.1.1 简介

Webots 的 Motor 是一个虚拟设备,用于控制机器人的电机运动。通过 Motor 设备,可以设置电机的速度、位置和力矩等参数,支持以下两种控制模式:

  • 位置控制模式:电机移动到指定位置(弧度)。
  • 速度控制模式:电机以指定的速度旋转。

Derived from Device.

Webots 官方文档 - Motor


4.1.2 电机初始化

电机初始化可以通过两种方式完成:

  1. 简单句柄获取:仅获取电机句柄,适合轻量级操作。
  2. 全配置初始化:通过参数结构体对电机进行完整初始化,适合复杂场景。

4.1.2.1 简单句柄获取

WbDeviceTag Motor_Init_Device(const char *motor_name);
  • 功能:获取电机句柄,不对电机进行任何初始化配置。
  • 参数
    • motor_name:电机在 Webots 场景中的节点名称。
  • 返回值
    • 返回电机句柄(WbDeviceTag 类型),失败返回 0。
  • 示例
    WbDeviceTag motor = Motor_Init_Device("lf_steer_motor");
    if (motor == 0) {
      printf("Error: Motor not found.\n");
    }
    wb_motor_set_velocity(motor, 5.0);  // 设置速度
    wb_motor_set_position(motor, 1.57); // 设置位置

4.1.2.2 全配置初始化

WbDeviceTag Motor_Init(const Motor_Init_Params *params);
  • 功能:获取电机句柄并初始化电机参数。
  • 参数
    • params:初始化参数结构体,包含电机的所有配置。
  • 返回值
    • 返回电机句柄(WbDeviceTag 类型),失败返回 0。
  • 结构体定义
    typedef struct {
      const char *motor_name;  /* 电机节点名称 */
      const char *sensor_name; /* 传感器节点名称(可以为 NULL) */
      double init_position;    /* 初始位置(弧度) */
      double init_velocity;    /* 初始速度(弧度/秒) */
      double max_velocity;     /* 最大速度(弧度/秒) */
      double max_acceleration; /* 最大加速度(弧度/秒²) */
      double max_force;        /* 最大力矩(N·m) */
      int position_control;    /* 1: 位置控制模式,0: 速度控制模式 */
      int sampling_period;     /* 传感器采样周期(毫秒,仅当 sensor_name 不为 NULL 时有效) */
    } Motor_Init_Params;
  • 示例

    Motor_Init_Params params = {
      .motor_name = "motor1",
      .sensor_name = "sensor1",
      .init_position = 0.0,
      .init_velocity = 0.0,
      .max_velocity = 10.0,
      .max_acceleration = 5.0,
      .max_force = 100.0,
      .position_control = 1,  // 位置控制模式
      .sampling_period = 64
    };
    
    WbDeviceTag motor = Motor_Init(¶ms);

4.1.3 电机参数设置

以下是 Webots 中 Motor 提供的全部功能函数,适用于两种初始化方式的电机句柄。


4.1.3.1 设置电机目标位置

void wb_motor_set_position(WbDeviceTag tag, double position);
  • 功能:设置电机的目标位置。
  • 参数
    • tag:电机设备句柄。
    • position:目标位置(弧度)。
  • 说明:仅在位置控制模式下有效。
  • 示例
    wb_motor_set_position(motor, 1.57);  // 设置到 90 度位置

4.1.3.2 设置电机速度

void wb_motor_set_velocity(WbDeviceTag tag, double velocity);
  • 功能:设置电机的目标速度。
  • 参数
    • tag:电机设备句柄。
    • velocity:目标速度(弧度/秒)。
  • 说明
    • 在速度控制模式下直接设置速度。
    • 在位置控制模式下作为最大速度限制。
  • 示例
    wb_motor_set_velocity(motor, 5.0);  // 设置速度为 5 弧度/秒

4.1.3.3 设置电机加速度

void wb_motor_set_acceleration(WbDeviceTag tag, double acceleration);
  • 功能:限制电机的最大加速度。
  • 参数
    • tag:电机设备句柄。
    • acceleration:最大加速度(弧度/秒²)。
  • 示例
    wb_motor_set_acceleration(motor, 2.0);  // 设置加速度为 2 弧度/秒²

4.1.3.4 设置电机力矩

void wb_motor_set_available_force(WbDeviceTag tag, double force);
void wb_motor_set_available_torque(WbDeviceTag tag, double torque);
  • 功能:设置电机的最大输出力矩或扭矩。
  • 参数
    • tag:电机设备句柄。
    • forcetorque:最大力矩或扭矩(N·m)。
  • 示例
    wb_motor_set_available_force(motor, 50.0);  // 设置力矩限制为 50 N·m
    wb_motor_set_available_torque(motor, 20.0); // 设置扭矩限制为 20 N·m

4.1.3.5 设置控制参数(PID)

void wb_motor_set_control_pid(WbDeviceTag tag, double p, double i, double d);
  • 功能:设置电机的 PID 控制参数。
  • 参数
    • tag:电机设备句柄。
    • pid:PID 控制的比例、积分和微分参数。
  • 示例
    wb_motor_set_control_pid(motor, 0.1, 0.01, 0.05);  // 设置 PID 参数

4.1.3.6 获取电机设置参数

double wb_motor_get_target_position(WbDeviceTag tag);
// 获取电机的目标位置(弧度)

double wb_motor_get_velocity(WbDeviceTag tag);
// 获取电机的当前速度(弧度/秒)

double wb_motor_get_max_velocity(WbDeviceTag tag);
// 获取电机的最大速度(弧度/秒)

double wb_motor_get_acceleration(WbDeviceTag tag);
// 获取电机的当前加速度(弧度/秒²)

double wb_motor_get_available_force(WbDeviceTag tag);
// 获取电机的当前可用力矩(N·m)

double wb_motor_get_available_torque(WbDeviceTag tag);
// 获取电机的当前可用扭矩(N·m)
......

4.1.4 注意事项

  1. 初始化方式

    • 简单句柄获取方式:通过 Motor_Init_Device 获取句柄后,用户需要手动设置电机的参数。
    • 全配置方式:通过 Motor_Init 自动完成所有参数的初始化。
  2. 控制模式

    • 位置控制模式:需通过 wb_motor_set_position 设置目标位置。
    • 速度控制模式:需将目标位置设置为 INFINITY
  3. 传感器使用

    • 配置位置传感器(如 PositionSensor)才能读取电机当前位置。
  4. 单位

    • 位置:弧度。
    • 速度:弧度/秒。
    • 力矩:牛顿米(N·m)。

4.2 PositionSensor

4.2.1 简介

Webots 的 PositionSensor 是一种虚拟设备,用于获取机器人关节、电机等运动设备的实际位置反馈值(如当前角度或线性位移)。位置传感器可以帮助实现闭环控制,或者用于监测设备的实时状态。

Derived from Device.

Webots 官方文档 - PositionSensor


4.2.2 位置传感器初始化

位置传感器的初始化主要通过获取设备句柄并启用传感器完成。


4.2.2.1 获取位置传感器句柄

WbDeviceTag wb_robot_get_device(const char *name);
  • 功能:通过名称获取位置传感器的句柄。
  • 参数
    • name:位置传感器在 Webots 场景中的节点名称。
  • 返回值
    • 返回位置传感器的句柄(WbDeviceTag 类型),失败返回 0。

4.2.2.2 启用位置传感器

void wb_position_sensor_enable(WbDeviceTag tag, int sampling_period);
  • 功能:启用位置传感器并设置采样周期。
  • 参数
    • tag:位置传感器的句柄。
    • sampling_period:采样周期,单位为毫秒。
  • 说明
    • 采样周期决定了传感器数据更新的频率,较小的采样周期会增加计算负担。

4.2.2.3 禁用位置传感器

void wb_position_sensor_disable(WbDeviceTag tag);
  • 功能:禁用位置传感器。
  • 参数
    • tag:位置传感器的句柄。

4.2.3 位置传感器数据获取

以下是位置传感器提供的功能函数:


4.2.3.1 获取当前位置

double wb_position_sensor_get_value(WbDeviceTag tag);
  • 功能:获取位置传感器的当前值。
  • 参数
    • tag:位置传感器的句柄。
  • 返回值
    • 返回当前位置值,单位为 弧度(取决于设备类型)。
  • 说明
    • 如果传感器关联的设备是旋转运动(如电机),返回值为弧度。
    • 如果传感器关联的设备是线性运动,返回值为米。

4.2.3.2 获取采样周期

int wb_position_sensor_get_sampling_period(WbDeviceTag tag);
  • 功能:获取位置传感器的采样周期。
  • 参数
    • tag:位置传感器的句柄。
  • 返回值
    • 返回采样周期(单位为毫秒)。

4.2.3.3 获取位置传感器测量范围

double wb_position_sensor_get_min_position(WbDeviceTag tag);
double wb_position_sensor_get_max_position(WbDeviceTag tag);
  • 功能:获取位置传感器的最小和最大测量范围。
  • 参数
    • tag:位置传感器的句柄。
  • 返回值
    • wb_position_sensor_get_min_position:返回传感器的最小测量值。
    • wb_position_sensor_get_max_position:返回传感器的最大测量值。

4.2.3.4 获取测量单位

WbPositionSensorType wb_position_sensor_get_type(WbDeviceTag tag);
  • 功能:获取位置传感器的测量单位类型。
  • 参数
    • tag:位置传感器的句柄。
  • 返回值
    • 返回测量单位类型:
    • WB_POSITION_SENSOR_ROTATIONAL:弧度(旋转设备)。
    • WB_POSITION_SENSOR_LINEAR:米(线性设备)。

4.2.4 注意事项

  1. 设备初始化

    • 必须通过 wb_robot_get_device 获取位置传感器的句柄,并调用 wb_position_sensor_enable 启用传感器。
    • 设置合适的采样周期,避免过低导致性能问题。
  2. 单位说明

    • 对于旋转设备(如电机),位置值以 弧度 为单位。
    • 对于线性设备(如线性马达),位置值以 为单位。
    • 如果需要角度值,请将弧度转换为角度:
      double degree = radian * (180.0 / M_PI);
  3. 测量范围

    • 使用 wb_position_sensor_get_min_positionwb_position_sensor_get_max_position 获取传感器的有效测量范围。
    • 超过范围的值可能无效。
  4. 数据延迟

    • 传感器值的更新取决于采样周期,较大的采样周期可能导致数据滞后。

4.3 InertialUnit


4.3.1 简介

Webots 的 InertialUnit(惯导单元)是一种虚拟设备,用于获取机器人在三维空间中的 俯仰角(Pitch)、横滚角(Roll)和 航向角(Yaw)。这些角度是相对于惯性坐标系计算的。

Derived from Device and Solid.

Webots 官方文档 - InertialUnit


4.3.2 惯导初始化

惯导初始化主要通过获取惯导设备的句柄,并对其启用。


4.3.2.1 获取惯导句柄

WbDeviceTag wb_robot_get_device(const char *name);
  • 功能:根据设备名称获取惯导设备的句柄。
  • 参数
    • name:惯导设备在 Webots 场景中的节点名称。
  • 返回值
    • 返回惯导设备句柄(WbDeviceTag 类型),失败返回 0。

4.3.2.2 启用惯导

void wb_inertial_unit_enable(WbDeviceTag tag, int sampling_period);
  • 功能:启用惯导设备,设置采样周期。
  • 参数
    • tag:惯导设备句柄。
    • sampling_period:采样周期,单位为毫秒。
  • 说明:采样周期决定数据更新的频率。

4.3.2.3 禁用惯导

void wb_inertial_unit_disable(WbDeviceTag tag);
  • 功能:禁用惯导设备,停止数据更新。
  • 参数
    • tag:惯导设备句柄。

4.3.3 惯导数据获取

以下是惯导相关的数据获取函数:


4.3.3.1 获取 Roll、Pitch 和 Yaw

const double *wb_inertial_unit_get_roll_pitch_yaw(WbDeviceTag tag);
  • 功能:获取当前的 Roll、Pitch 和 Yaw 值。
  • 参数
    • tag:惯导设备句柄。
  • 返回值
    • 返回一个数组,分别包含 Roll(横滚角)、Pitch(俯仰角)和 Yaw(航向角),单位为弧度。

4.3.3.2 获取惯导状态

int wb_inertial_unit_get_sampling_period(WbDeviceTag tag);
// 获取惯导设备的当前采样周期(毫秒)

4.3.4 注意事项

  1. 初始化方式

    • 使用 wb_robot_get_device 获取惯导句柄。
    • 启用惯导时,必须设置合适的采样周期(单位为毫秒)。
  2. 单位说明

    • Roll、Pitch 和 Yaw 的单位为弧度。
    • 如果需要使用角度,可以进行单位转换:
      double degree = radian * (180.0 / M_PI);
      double radian = degree * (M_PI / 180.0);
  3. 采样周期

    • 采样周期越小,惯导数据更新越频繁,但可能会增加计算负担。
  4. 惯导限制

    • 惯导设备仅提供相对静态参考坐标系的角度数据,而不包含角速度、线速度或位置数据。
    • 如果需要更复杂的惯性测量功能,可以结合 Webots 的其他设备(如加速度计和陀螺仪)使用。

4.4 Keyboard


4.4.1 简介

Webots 的 Keyboard 是一种虚拟设备,用于检测用户在仿真过程中通过键盘输入的按键事件。这可以用来控制机器人行为、模拟用户输入或进行调试操作。

Derived from Device.

Webots 官方文档 - Keyboard


4.4.2 键盘初始化

在 Webots 中使用键盘设备,需要先启用设备并设置采样周期。


4.4.2.1 启用键盘设备

void wb_keyboard_enable(int sampling_period);
  • 功能:启用键盘设备并设置采样周期。
  • 参数
    • sampling_period:键盘事件的采样周期(单位:毫秒)。
  • 说明
    • 较小的采样周期会提高按键事件的捕获频率,但可能增加计算负担。

4.4.2.2 禁用键盘设备

void wb_keyboard_disable();
  • 功能:禁用键盘设备,停止捕获按键事件。
  • 参数:无。

4.4.3.1 获取当前按键

int wb_keyboard_get_key();
  • 功能:获取当前按下的按键。
  • 返回值
    • 返回当前按下键的 ASCII 值或 Webots 特定按键的键值。
    • 如果没有按键被按下,返回 -1。
  • 说明
    • 如果在一个时间步内按下多个键,只会返回其中一个按键的键值。
    • 特定按键的键值(例如方向键)可通过 按键列表 查阅。

4.4.3.2 按键值常量

以下是部分常用按键的键值常量:

#define WB_KEYBOARD_UP    315 // 上方向键
#define WB_KEYBOARD_DOWN  317 // 下方向键
#define WB_KEYBOARD_LEFT  314 // 左方向键
#define WB_KEYBOARD_RIGHT 316 // 右方向键
#define WB_KEYBOARD_HOME  313 // Home 键
#define WB_KEYBOARD_END   312 // End 键

更多按键常量可参考官方文档:Webots 键值列表


4.4.3 示例流程

  1. 启用键盘设备并设置采样周期:

    wb_keyboard_enable(32);  // 设置采样周期为 32 毫秒
  2. 在主循环中检测按键:

    int key = wb_keyboard_get_key();
    if (key != -1) {
       printf("Key pressed: %d\n", key);
       if (key == WB_KEYBOARD_UP) {
           // 处理上方向键按下的逻辑
       }
    }
  3. 禁用键盘设备(如果不再需要):

    wb_keyboard_disable();

4.4.4 注意事项

  1. 设备初始化

    • 在调用 wb_keyboard_get_key 之前,必须先通过 wb_keyboard_enable 启用键盘设备。
    • 启用键盘时,需要设置适当的采样周期。
  2. 按键值

    • 对于普通键盘按键,返回其 ASCII 值。例如,A 键返回 65
    • 对于特殊键(如方向键),返回 Webots 定义的键值。
  3. 性能优化

    • 较高的采样频率会增加按键检测的灵敏度,但也可能对仿真性能产生影响。
  4. 多按键处理

    • 同一时间步内按下多个按键时,wb_keyboard_get_key 只会返回其中一个按键的键值。如果需要检测多个按键,可以在连续的时间步中捕获输入。

4.5 Display


4.5.1 简介

Webots 的 Display 是一个虚拟显示设备,用于在仿真环境中绘制图形、文本或显示图像。它类似一个屏幕,适用于:

  • 绘制动态图形:点、线、矩形、圆形等。
  • 显示文本信息:调试或实时展示数据。
  • 加载并显示图像:展示外部图片。

Derived from Device.

Webots 官方文档 - Display


4.5.2 显示设备初始化

显示设备的初始化主要通过获取设备句柄和设置相关参数完成。


4.5.2.1 获取显示设备句柄

WbDeviceTag wb_robot_get_device(const char *name);
  • 功能:通过名称获取显示设备的句柄。
  • 参数
    • name:显示设备在 Webots 场景中的节点名称。
  • 返回值
    • 返回显示设备句柄(WbDeviceTag 类型),失败返回 0。

4.5.2.2 获取显示设备分辨率

int wb_display_get_width(WbDeviceTag tag);
int wb_display_get_height(WbDeviceTag tag);
  • 功能:获取显示设备的分辨率。
  • 参数
    • tag:显示设备句柄。
  • 返回值
    • wb_display_get_width:显示设备的宽度(像素)。
    • wb_display_get_height:显示设备的高度(像素)。

4.5.3 显示设备功能

以下是显示设备的常用功能函数:


4.5.3.1 设置绘图颜色

void wb_display_set_color(WbDeviceTag tag, int color);
  • 功能:设置显示设备的绘图颜色。
  • 参数
    • tag:显示设备句柄。
    • color:颜色值(32 位整数,格式为 0xRRGGBBAA)。
    • RR:红色分量(8 位)。
    • GG:绿色分量(8 位)。
    • BB:蓝色分量(8 位)。
    • AA:透明度分量(8 位,0xFF 为完全不透明,0x00 为完全透明)。

4.5.3.2 绘制点

void wb_display_draw_pixel(WbDeviceTag tag, int x, int y);
  • 功能:在指定坐标上绘制一个像素点。
  • 参数
    • xy:像素点的坐标。

4.5.3.3 绘制线条

void wb_display_draw_line(WbDeviceTag tag, int x1, int y1, int x2, int y2);
  • 功能:绘制一条直线。
  • 参数
    • x1y1:直线的起点坐标。
    • x2y2:直线的终点坐标。

4.5.3.4 绘制矩形

void wb_display_draw_rectangle(WbDeviceTag tag, int x, int y, int width, int height);
void wb_display_fill_rectangle(WbDeviceTag tag, int x, int y, int width, int height);
  • 功能:绘制矩形或填充矩形。
  • 参数
    • xy:矩形左上角的坐标。
    • widthheight:矩形的宽和高。

4.5.3.5 绘制圆形

void wb_display_draw_oval(WbDeviceTag tag, int cx, int cy, int a, int b);
void wb_display_fill_oval(WbDeviceTag tag, int cx, int cy, int a, int b);
  • 功能:绘制椭圆或填充椭圆。
  • 参数
    • cxcy:椭圆的中心坐标。
    • ab:椭圆的水平半径和垂直半径。

4.5.3.6 显示文本

void wb_display_draw_text(WbDeviceTag tag, const char *text, int x, int y);
  • 功能:在显示设备上绘制文本。
  • 参数
    • text:要显示的字符串。
    • xy:文本左下角的坐标。

4.5.3.7 加载图像

WbImageRef wb_display_image_load(WbDeviceTag tag, const char *filename);
  • 功能:加载图像文件到显示设备。
  • 参数
    • filename:图像文件的路径。
  • 返回值
    • 图像引用(WbImageRef),用于后续操作。

4.5.3.8 显示图像

void wb_display_image_paste(WbDeviceTag tag, WbImageRef ir, int x, int y, bool blend);
  • 功能:将加载的图像绘制到显示设备。
  • 参数
    • ir:图像引用。
    • xy:图像左上角的坐标。
    • blend:是否启用透明混合。

4.5.4 注意事项

  1. 设备句柄

    • 确保通过 wb_robot_get_device 获取有效的 Display 设备句柄。
    • 设备名称需与 Webots 场景文件中的名称一致。
  2. 颜色值格式

    • 颜色值使用 32 位整数表示,格式为 0xRRGGBBAA
    • 示例:0xFF0000FF 表示不透明红色。
  3. 分辨率

    • 可以通过 wb_display_get_widthwb_display_get_height 获取分辨率。
    • 在绘图操作时,坐标应在分辨率范围内。
  4. 性能优化

    • 复杂绘图操作可能增加计算负担。
    • 在主循环中优化绘图逻辑,避免冗余操作。
  5. 图像路径

    • 图像文件路径应相对于 Webots 的项目目录。

# 资源

webots入门教学视频+舵轮模型创建
入门教程:Webots


版本管理

版本 时间 描述
v1.0.0 2025.1.20 初始版本
v1.1.0 2025.1.20 更新3.2
v1.2.0 2025.1.26 更新4.1,4.2,4.3,4.4,4.5

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇