Webots 2025a + ROS 2 Jazzy e-puck 机器人集成与导航研究教程
介绍 Webots 2025a 与 ROS 2 Jazzy 环境下 e-puck 机器人的集成使用。涵盖环境搭建、基础仿真启动、节点话题验证、Rats Life 地图系统研究、ROS 2 Control 底层控制及 Nav2 航点导航全流程。包含传感器数据解析、参数调优、多机器人扩展及常见问题解决,适合深入理解机器人仿真与控制逻辑。

介绍 Webots 2025a 与 ROS 2 Jazzy 环境下 e-puck 机器人的集成使用。涵盖环境搭建、基础仿真启动、节点话题验证、Rats Life 地图系统研究、ROS 2 Control 底层控制及 Nav2 航点导航全流程。包含传感器数据解析、参数调优、多机器人扩展及常见问题解决,适合深入理解机器人仿真与控制逻辑。

本教程聚焦实操步骤和深度研究维度,从环境搭建到核心模块拆解,每一步标注操作指令、验证方法和研究切入点,帮助你彻底掌握 e-puck 机器人的 ROS 2 集成使用。
# 方式 1:DEB 包安装(推荐)
wget https://cyberbotics.com/Cyberbotics.asc
sudo apt-key add Cyberbotics.asc
sudo apt-add-repository 'deb https://cyberbotics.com/debian binary-amd64/'
sudo apt update
sudo apt install webots=2025a-1
# 方式 2:下载压缩包解压
wget https://cyberbotics.com/files/release/webots/R2025a/webots_2025a_amd64.tar.xz
tar -xf webots_2025a_amd64.tar.xz
sudo mv webots /opt/
echo 'export WEBOTS_HOME=/opt/webots' >> ~/.bashrc
echo 'export PATH=$WEBOTS_HOME:$PATH' >> ~/.bashrc
source ~/.bashrc
# 创建 ROS 2 工作空间
mkdir -p ~/webots_ws/src && cd ~/webots_ws/src
# 克隆官方仓库(Jazzy 分支)
git clone --branch jazzy https://github.com/cyberbotics/webots_ros2.git
cd webots_ros2
# 安装依赖
rosdep install --from-paths . --ignore-src -r -y
# 编译工作空间
cd ~/webots_ws
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
# 加载环境变量
source install/setup.bash
echo 'source ~/webots_ws/install/setup.bash' >> ~/.bashrc
sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup ros-jazzy-turtlebot3-navigation2
先执行以下命令验证环境就绪(确保无报错):
# 加载 ROS 2 环境(若已添加到.bashrc 可跳过)
source ~/webots_ws/install/setup.bash
# 验证功能包存在
ros2 pkg list | grep webots_ros2_epuck
# 验证 Webots 版本
webots --version
# 输出应包含 2025a
操作指令:
# 启动仅包含 e-puck 机器人的基础仿真
ros2 launch webots_ros2_epuck robot_launch.py
现象:
新开终端,分步执行以下命令,逐行验证并记录结果(研究机器人与 ROS 2 的通信链路):
ros2 node list
预期输出(核心节点):
/epuck/base_controller
/epuck/robot_state_publisher
/webots_ros2_driver
/webots_ros2_epuck_node
研究点:
/webots_ros2_driver:Webots 与 ROS 2 的核心桥接节点,负责传感器/执行器数据转发;/epuck/base_controller:机器人运动控制节点,处理速度指令。ros2 topic list | grep epuck
预期核心话题:
| 话题名称 | 数据类型 | 作用 | 研究价值 |
|---|---|---|---|
/epuck/cmd_vel | geometry_msgs/msg/Twist | 速度控制指令 | 机器人运动控制入口 |
/epuck/laser_scan | sensor_msgs/msg/LaserScan | 激光雷达数据 | SLAM/避障/定位核心输入 |
/epuck/odometry | nav_msgs/msg/Odometry | 里程计数据 | 位姿估计、运动建模 |
/epuck/joint_states | sensor_msgs/msg/JointState | 关节状态 | 底层轮子运动反馈 |
/epuck/imu | sensor_msgs/msg/Imu | IMU 数据 | 姿态补正、运动融合 |
实际效果示例:
/ros2/topic/list
.../camera/camera_info /clock /cmd_vel .../joint_states .../odom .../scan ...
# 查看激光雷达数据(精简输出,仅看关键值)
ros2 topic echo /epuck/laser_scan --noarr
# 查看里程计数据(关注 position 和 orientation)
ros2 topic echo /epuck/odometry --noarr
# 查看 IMU 数据(关注角速度和加速度)
ros2 topic echo /epuck/imu --noarr
研究点:
angle_min/angle_max(扫描范围)、range_min/range_max(有效距离);pose(位姿)和 twist(线/角速度)是否与 Webots 中机器人运动同步;# 前进:线速度 0.2m/s,角速度 0rad/s
ros2 topic pub --once /epuck/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
# 左转:线速度 0,角速度 1rad/s
ros2 topic pub --once /epuck/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"
# 停止:所有速度为 0
ros2 topic pub --once /epuck/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
现象:Webots 中机器人对应执行前进/左转/停止动作。
# 安装键盘控制工具(若未装)
sudo apt install ros-jazzy-teleop-twist-keyboard
# 启动键盘控制,映射到 e-puck 的 cmd_vel 话题
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r cmd_vel:=/epuck/cmd_vel
操作说明:
w:前进,x:后退,a:左转,d:右转,s:停止;z/c:调整线速度,q/e:调整角速度。研究点:
# 启动包含迷宫地图的完整场景
ros2 launch webots_ros2_epuck rats_life_launch.py
现象:
/map 话题。首先找到地图配置文件路径:
# 定位 map_rats_life.yaml 文件
rospack find webots_ros2_epuck
# 输出示例:/home/ros2/webots_ws/install/webots_ros2_epuck/share/webots_ros2_epuck
# 进入配置目录
cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/config
打开 map_rats_life.yaml,逐行分析:
image: map_rats_life.pgm # 地图图像文件(PGM 格式)
resolution: 0.05 # 地图分辨率:0.05m/像素(5cm)
origin: [-10.0, -10.0, 0.0] # 地图原点(对应 Webots 世界坐标系)
negate: 0 # 0=白色为自由空间,1=黑色为自由空间
occupied_thresh: 0.65 # 像素值>0.65 视为障碍物
free_thresh: 0.196 # 像素值<0.196 视为自由空间
frame_id: map # 地图坐标系名称(必须与 Nav2 对齐)
研究操作:
# 查看地图话题数据(验证地图加载)
ros2 topic echo /map --noarr
# 可视化地图(需启动 RViz2)
rviz2
在 RViz2 中配置:
map;Map 组件,Topic 选择 /map;RobotModel 组件,Robot Description 选择 /robot_description;LaserScan 组件,Topic 选择 /epuck/laser_scan。现象:RViz2 中显示迷宫地图、机器人模型和激光扫描数据。
rats_life_launch.py 验证效果。打开 Webots 场景文件:
cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/worlds
webots rats_life.wbt
# 直接用 Webots 打开场景文件
打开控制配置文件:
cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/config
cat ros2_control.yml
核心内容解析:
controller_manager: ros__parameters:
update_rate: 100 # 控制频率 100Hz
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
joint_velocity_controller:
type: velocity_controllers/JointGroupVelocityController
joint_velocity_controller:
ros__parameters:
joints: # 控制的关节名称(e-puck 左右轮)
- left_wheel_joint
- right_wheel_joint
interface_name: velocity # 控制接口类型(速度控制)
研究点:
update_rate:控制频率越高,运动越平滑,但占用资源越多;/robot_description 查看)。# 查看关节状态(确认关节名称和当前速度)
ros2 topic echo /epuck/joint_states
# 发布关节速度指令(直接控制左右轮)
# 左轮 1rad/s,右轮 1rad/s → 前进
ros2 topic pub /epuck/joint_velocity_controller/commands std_msgs/msg/Float64MultiArray "{data: [1.0, 1.0]}"
# 左轮 -1rad/s,右轮 1rad/s → 原地旋转
ros2 topic pub /epuck/joint_velocity_controller/commands std_msgs/msg/Float64MultiArray "{data: [-1.0, 1.0]}"
# 停止关节运动
ros2 topic pub /epuck/joint_velocity_controller/commands std_msgs/msg/Float64MultiArray "{data: [0.0, 0.0]}"
研究对比:
/epuck/cmd_vel(高层运动指令)和 /epuck/joint_velocity_controller/commands(底层关节指令)的控制差异;/epuck/odometry 中速度的映射关系(验证运动学模型)。# 启动包含 Nav2 的航点导航场景
ros2 launch webots_ros2_epuck rats_life_waypoints_launch.py
启动后自动加载的模块(研究重点):
| 模块名称 | 节点/话题 | 作用 |
|---|---|---|
| 地图服务器 | /map | 提供全局地图 |
| AMCL 定位 | /amcl_pose | 基于激光的蒙特卡洛定位 |
| BT 导航器 | /navigate_to_pose | 行为树导航逻辑 |
| 路径规划器 | /plan | 全局/局部路径规划 |
| 控制器 | /cmd_vel | 输出速度指令到机器人 |
# 查看 AMCL 定位结果(机器人在地图中的位姿)
ros2 topic echo /amcl_pose --noarr
# 查看全局路径规划结果
ros2 topic echo /plan --noarr
# 查看 Nav2 状态(是否就绪)
ros2 topic echo /nav2_controller/status --noarr
关键验证:
/amcl_pose 的 pose 应与 Webots 中机器人位置一致(误差 < 0.1m);/nav2_controller/status 的 status 应为 1(就绪)。# 安装 Nav2 命令行工具(若未装)
sudo apt install ros-jazzy-nav2-cli
# 发送目标点 1:x=2.0, y=1.0, 朝向 0°(w=1.0)
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{ pose: { header: {frame_id: 'map'}, pose: { position: {x: 2.0, y: 1.0, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0} } } }"
# 发送目标点 2:回到起点(x=0.0, y=0.0)
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{ pose: { header: {frame_id: 'map'}, pose: { position: {x: 0.0, y: 0.0, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0} } } }"
现象:
result: {success: True} 表示导航成功。waypoints 列表中的坐标,重启 Launch 文件;核心代码解析(研究切入点):
# 航点列表定义(可修改添加自定义航点)
waypoints = [
(0.0, 0.0, 0.0), # 起点
(1.5, 0.5, 1.57), # 航点 1(x,y,yaw)
(3.0, -0.5, 3.14), # 航点 2
(0.0, 0.0, 0.0) # 终点
]
# Nav2 参数加载(适配 Jazzy 版本)
nav2_params = os.path.join(
get_package_share_directory('webots_ros2_epuck'),
'config',
'nav2_params.yaml'
)
定位航点导航 Launch 文件:
cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/launch
cat rats_life_waypoints_launch.py
打开 Nav2 参数文件:
cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/config
cat nav2_params.yaml
关键参数调优方向:
| 参数模块 | 核心参数 | 调优目的 |
|---|---|---|
amcl | alpha1-alpha5 | 降低定位误差(仿真中可设为 0.1) |
dwb_controller | max_vel_x/min_vel_x | 调整最大/最小线速度 |
dwb_controller | max_vel_theta | 调整最大角速度 |
obstacle_layer | max_obstacle_height | 适配激光雷达高度 |
bt_navigator | default_bt_xml_filename | 更换导航行为树(如添加避障逻辑) |
调优测试:
max_vel_x 从 0.2→0.3,重启导航,观察机器人运动速度变化;alpha1 到 0.5,观察 AMCL 定位误差是否增大(验证噪声敏感度)。Webots 与 ROS 2 的时间同步是核心,验证方法:
# 查看仿真时间
ros2 topic echo /clock --noarr
# 检查节点是否启用 use_sim_time
ros2 param get /amcl use_sim_time # 应返回 true
ros2 param get /webots_ros2_driver use_sim_time # 应返回 true
研究点:
use_sim_time 为 false,导航会出现严重偏差;# 查看机器人 URDF 描述
ros2 topic echo /robot_description --noarr
研究点:
修改 robot_launch.py,添加第二个 e-puck 机器人:
# 在 launch 文件中复制机器人节点,修改命名空间
epuck2_node = Node(
package='webots_ros2_driver',
executable='driver',
namespace='epuck2', # 第二个机器人命名空间
parameters=[
{'robot_description': robot_description},
{'use_sim_time': True},
{'robot_name': 'epuck2'} # Webots 中机器人名称
]
)
验证:
ros2 topic list | grep epuck2 # 应出现/epuck2/cmd_vel 等话题
使用 ROS 2 bag 记录数据,用于离线分析:
# 记录核心话题
ros2 bag record /epuck/laser_scan /epuck/odometry /amcl_pose /map
# 回放数据
ros2 bag play <bag 文件名称>
分析工具:
rqt_bag 可视化 bag 数据;use_sim_time: true,在 Launch 文件中添加:launch.actions.SetParameter(name='use_sim_time', value=True)
amcl 配置中 laser_topic: "/epuck/laser_scan"/epuck/odometry 话题是否有数据webots_ros2 分支不匹配jazzy 分支:cd ~/webots_ws/src/webots_ros2
git checkout jazzy
colcon build --cmake-force-configure
/epuck 命名空间,如 cmd_vel → /epuck/cmd_vel每一步操作后,建议记录'现象 - 原因 - 结论',例如:
min_vel_x 过小;min_vel_x 至 0.1,绕障成功。通过这种方式,可逐步深入理解 Webots 与 ROS 2 的集成逻辑,掌握 e-puck 机器人的仿真与控制核心。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online