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.
4.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
:电机设备句柄。force
或torque
:最大力矩或扭矩(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
:电机设备句柄。p
、i
、d
: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 注意事项
-
初始化方式
- 简单句柄获取方式:通过
Motor_Init_Device
获取句柄后,用户需要手动设置电机的参数。 - 全配置方式:通过
Motor_Init
自动完成所有参数的初始化。
- 简单句柄获取方式:通过
-
控制模式
- 位置控制模式:需通过
wb_motor_set_position
设置目标位置。 - 速度控制模式:需将目标位置设置为
INFINITY
。
- 位置控制模式:需通过
-
传感器使用
- 配置位置传感器(如
PositionSensor
)才能读取电机当前位置。
- 配置位置传感器(如
-
单位
- 位置:弧度。
- 速度:弧度/秒。
- 力矩:牛顿米(N·m)。
4.2 PositionSensor
4.2.1 简介
Webots 的 PositionSensor
是一种虚拟设备,用于获取机器人关节、电机等运动设备的实际位置反馈值(如当前角度或线性位移)。位置传感器可以帮助实现闭环控制,或者用于监测设备的实时状态。
Derived from Device.
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 注意事项
-
设备初始化
- 必须通过
wb_robot_get_device
获取位置传感器的句柄,并调用wb_position_sensor_enable
启用传感器。 - 设置合适的采样周期,避免过低导致性能问题。
- 必须通过
-
单位说明
- 对于旋转设备(如电机),位置值以 弧度 为单位。
- 对于线性设备(如线性马达),位置值以 米 为单位。
- 如果需要角度值,请将弧度转换为角度:
double degree = radian * (180.0 / M_PI);
-
测量范围
- 使用
wb_position_sensor_get_min_position
和wb_position_sensor_get_max_position
获取传感器的有效测量范围。 - 超过范围的值可能无效。
- 使用
-
数据延迟
- 传感器值的更新取决于采样周期,较大的采样周期可能导致数据滞后。
4.3 InertialUnit
4.3.1 简介
Webots 的 InertialUnit
(惯导单元)是一种虚拟设备,用于获取机器人在三维空间中的 俯仰角(Pitch)、横滚角(Roll)和 航向角(Yaw)。这些角度是相对于惯性坐标系计算的。
Derived from Device and Solid.
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 注意事项
-
初始化方式
- 使用
wb_robot_get_device
获取惯导句柄。 - 启用惯导时,必须设置合适的采样周期(单位为毫秒)。
- 使用
-
单位说明
- Roll、Pitch 和 Yaw 的单位为弧度。
- 如果需要使用角度,可以进行单位转换:
double degree = radian * (180.0 / M_PI); double radian = degree * (M_PI / 180.0);
-
采样周期
- 采样周期越小,惯导数据更新越频繁,但可能会增加计算负担。
-
惯导限制
- 惯导设备仅提供相对静态参考坐标系的角度数据,而不包含角速度、线速度或位置数据。
- 如果需要更复杂的惯性测量功能,可以结合 Webots 的其他设备(如加速度计和陀螺仪)使用。
4.4 Keyboard
4.4.1 简介
Webots 的 Keyboard
是一种虚拟设备,用于检测用户在仿真过程中通过键盘输入的按键事件。这可以用来控制机器人行为、模拟用户输入或进行调试操作。
Derived from Device.
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 示例流程
-
启用键盘设备并设置采样周期:
wb_keyboard_enable(32); // 设置采样周期为 32 毫秒
-
在主循环中检测按键:
int key = wb_keyboard_get_key(); if (key != -1) { printf("Key pressed: %d\n", key); if (key == WB_KEYBOARD_UP) { // 处理上方向键按下的逻辑 } }
-
禁用键盘设备(如果不再需要):
wb_keyboard_disable();
4.4.4 注意事项
-
设备初始化
- 在调用
wb_keyboard_get_key
之前,必须先通过wb_keyboard_enable
启用键盘设备。 - 启用键盘时,需要设置适当的采样周期。
- 在调用
-
按键值
- 对于普通键盘按键,返回其 ASCII 值。例如,
A
键返回65
。 - 对于特殊键(如方向键),返回 Webots 定义的键值。
- 对于普通键盘按键,返回其 ASCII 值。例如,
-
性能优化
- 较高的采样频率会增加按键检测的灵敏度,但也可能对仿真性能产生影响。
-
多按键处理
- 同一时间步内按下多个按键时,
wb_keyboard_get_key
只会返回其中一个按键的键值。如果需要检测多个按键,可以在连续的时间步中捕获输入。
- 同一时间步内按下多个按键时,
4.5 Display
4.5.1 简介
Webots 的 Display
是一个虚拟显示设备,用于在仿真环境中绘制图形、文本或显示图像。它类似一个屏幕,适用于:
- 绘制动态图形:点、线、矩形、圆形等。
- 显示文本信息:调试或实时展示数据。
- 加载并显示图像:展示外部图片。
Derived from Device.
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);
- 功能:在指定坐标上绘制一个像素点。
- 参数:
x
、y
:像素点的坐标。
4.5.3.3 绘制线条
void wb_display_draw_line(WbDeviceTag tag, int x1, int y1, int x2, int y2);
- 功能:绘制一条直线。
- 参数:
x1
、y1
:直线的起点坐标。x2
、y2
:直线的终点坐标。
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);
- 功能:绘制矩形或填充矩形。
- 参数:
x
、y
:矩形左上角的坐标。width
、height
:矩形的宽和高。
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);
- 功能:绘制椭圆或填充椭圆。
- 参数:
cx
、cy
:椭圆的中心坐标。a
、b
:椭圆的水平半径和垂直半径。
4.5.3.6 显示文本
void wb_display_draw_text(WbDeviceTag tag, const char *text, int x, int y);
- 功能:在显示设备上绘制文本。
- 参数:
text
:要显示的字符串。x
、y
:文本左下角的坐标。
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
:图像引用。x
、y
:图像左上角的坐标。blend
:是否启用透明混合。
4.5.4 注意事项
-
设备句柄
- 确保通过
wb_robot_get_device
获取有效的Display
设备句柄。 - 设备名称需与 Webots 场景文件中的名称一致。
- 确保通过
-
颜色值格式
- 颜色值使用 32 位整数表示,格式为
0xRRGGBBAA
。 - 示例:
0xFF0000FF
表示不透明红色。
- 颜色值使用 32 位整数表示,格式为
-
分辨率
- 可以通过
wb_display_get_width
和wb_display_get_height
获取分辨率。 - 在绘图操作时,坐标应在分辨率范围内。
- 可以通过
-
性能优化
- 复杂绘图操作可能增加计算负担。
- 在主循环中优化绘图逻辑,避免冗余操作。
-
图像路径
- 图像文件路径应相对于 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 |