Webots 2025a + ROS 2 Jazzy e-puck 机器人教程

Webots 2025a + ROS 2 Jazzy e-puck 机器人教程

Webots 2025a + ROS 2 Jazzy e-puck 机器人分步使用与研究教程

本教程跳过环境安装环节,聚焦实操步骤深度研究维度,从基础仿真启动到核心模块拆解,每一步都标注操作指令、验证方法和研究切入点,帮助你彻底掌握 e-puck 机器人的 ROS 2 集成使用。

前提确认

先执行以下命令验证环境就绪(确保无报错):

bash

运行

# 加载ROS 2环境(若已添加到.bashrc可跳过) source ~/webots_ws/install/setup.bash # 验证功能包存在 ros2 pkg list | grep webots_ros2_epuck # 验证Webots版本 webots --version # 输出应包含2025a 

webots --version

webots --version
webots --version


第一阶段:基础仿真启动与核心通信验证

步骤 1:启动 e-puck 核心仿真

操作指令

bash

运行

# 启动仅包含e-puck机器人的基础仿真 ros2 launch webots_ros2_epuck robot_launch.py 

现象

  • Webots 2025a 自动启动,界面显示 e-puck 机器人在空场景中;
  • 终端无红色报错(黄色警告可忽略,多为参数默认值提示)。

ros2 launch webots_ros2_epuck robot_launch.py 
 

ros2 launch webots_ros2_epuck robot_launch.py 
 
ros2 launch webots_ros2_epuck robot_launch.py 

注意左上角为黑,如何解决?思考?

步骤 2:验证 ROS 2 节点与话题(核心研究点)

新开终端,分步执行以下命令,逐行验证并记录结果(研究机器人与 ROS 2 的通信链路):

(1)查看运行的节点

bash

运行

ros2 node list 

预期输出(核心节点):

plaintext

/epuck/base_controller /epuck/robot_state_publisher /webots_ros2_driver /webots_ros2_epuck_node 

注意差异性。

研究点

  • /webots_ros2_driver:Webots 与 ROS 2 的核心桥接节点,负责传感器 / 执行器数据转发;
  • /epuck/base_controller:机器人运动控制节点,处理速度指令。
(2)查看核心话题列表

bash

运行

ros2 topic list | grep epuck 

预期核心话题

话题名称数据类型作用研究价值
/epuck/cmd_velgeometry_msgs/msg/Twist速度控制指令机器人运动控制入口
/epuck/laser_scansensor_msgs/msg/LaserScan激光雷达数据SLAM / 避障 / 定位核心输入
/epuck/odometrynav_msgs/msg/Odometry里程计数据位姿估计、运动建模
/epuck/joint_statessensor_msgs/msg/JointState关节状态底层轮子运动反馈
/epuck/imusensor_msgs/msg/ImuIMU 数据姿态补正、运动融合

实际效果:

 ros2 topic list /Ros2Supervisor/remove_node /camera/camera_info /camera/image_color /clock /cmd_vel /controller_manager/activity /controller_manager/introspection_data/full /controller_manager/introspection_data/names /controller_manager/introspection_data/values /controller_manager/statistics/full /controller_manager/statistics/names /controller_manager/statistics/values /diagnostics /diffdrive_controller/transition_event /dynamic_joint_states /e_puck/receiver/data /e_puck/receiver/emitter_direction /e_puck/receiver/signal_strength /joint_state_broadcaster/transition_event /joint_states /led0 /led1 /led2 /led3 /led4 /led5 /led6 /led7 /led8 /led9 /ls0 /ls1 /ls2 /ls3 /ls4 /ls5 /ls6 /ls7 /odom /parameter_events /pi_puck_led_0 /pi_puck_led_1 /pi_puck_led_2 /ps0 /ps1 /ps2 /ps3 /ps4 /ps5 /ps6 /ps7 /remove_urdf_robot /robot_description /rosout /scan /tf /tf_static /tof 
(3)实时查看传感器数据(验证通信)

bash

运行

# 查看激光雷达数据(精简输出,仅看关键值) 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 中机器人运动同步;
  • IMU 数据的噪声水平(仿真中可通过 Webots 调整传感器精度)。

步骤 3:手动控制机器人运动

(1)单次速度指令(测试执行器)

bash

运行

# 前进:线速度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 中机器人对应执行前进 / 左转 / 停止动作。

实际:

cmd_vel

(2)持续键盘控制(交互测试)

bash

运行

# 安装键盘控制工具(若未装) 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:调整角速度。

研究点

  • 速度指令的响应延迟(仿真中可通过 Webots 调整 "real time factor");
  • 最大线速度 / 角速度限制(e-puck 物理限制:线速度≤0.3m/s,角速度≤5rad/s);
  • 里程计数据是否与实际运动一致(验证运动模型精度)。

左上角和仿真中摄像头位置对应。

rqt


第二阶段:Rats Life 场景与地图系统研究

步骤 1:启动带地图的 Rats Life 场景

bash

运行

# 启动包含迷宫地图的完整场景 ros2 launch webots_ros2_epuck rats_life_launch.py 

现象

  • Webots 加载 Rats Life 迷宫场景,e-puck 位于场景起点;
  • ROS 2 自动加载地图服务器(map_server),发布 /map 话题。

步骤 2:解析地图配置文件(核心研究)

首先找到地图配置文件路径:

bash

运行

# 定位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,逐行分析:

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对齐) 

研究操作

bash

运行

# 查看地图话题数据(验证地图加载) ros2 topic echo /map --noarr # 可视化地图(需启动RViz2) rviz2 

在 RViz2 中配置:

  1. Fixed Frame 选择 map
  2. 添加 Map 组件,Topic 选择 /map
  3. 添加 RobotModel 组件,Robot Description 选择 /robot_description
  4. 添加 LaserScan 组件,Topic 选择 /epuck/laser_scan现象:RViz2 中显示迷宫地图、机器人模型和激光扫描数据。

步骤 3:场景自定义修改(进阶研究)

  1. 可修改的内容(研究切入点):
    • 添加 / 删除障碍物:在 Webots 中拖拽 “Box” 节点,调整尺寸 / 位置;
    • 修改机器人传感器:选中 e-puck → 双击 “LaserEmitter” → 调整扫描角度 / 精度;
    • 调整地面材质 / 摩擦力:影响机器人运动模型;
  2. 保存修改后,重新启动 rats_life_launch.py 验证效果。

打开 Webots 场景文件:bash运行

cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/worlds webots rats_life.wbt # 直接用Webots打开场景文件 

第三阶段:ROS 2 Control 底层控制研究

步骤 1:解析 ros2_control.yml 配置

打开控制配置文件:

bash

运行

cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/config cat ros2_control.yml 

核心内容解析

yaml

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:控制频率越高,运动越平滑,但占用资源越多;
  • 关节名称必须与机器人 URDF 中的定义一致(可通过 /robot_description 查看)。

步骤 2:底层关节控制测试

bash

运行

# 查看关节状态(确认关节名称和当前速度) 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 航点导航全流程研究

步骤 1:启动导航系统

bash

运行

# 启动包含Nav2的航点导航场景 ros2 launch webots_ros2_epuck rats_life_waypoints_launch.py 

启动后自动加载的模块(研究重点):

模块名称节点 / 话题作用
地图服务器/map提供全局地图
AMCL 定位/amcl_pose基于激光的蒙特卡洛定位
BT 导航器/navigate_to_pose行为树导航逻辑
路径规划器/plan全局 / 局部路径规划
控制器/cmd_vel输出速度指令到机器人

步骤 2:验证 Nav2 核心组件

bash

运行

# 查看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(就绪)。

步骤 3:发送导航目标点(手动测试)

bash

运行

# 安装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} } } }" 

现象

  • Webots 中机器人自动规划路径,避开障碍物到达目标点;
  • 终端显示 result: {success: True} 表示导航成功。

步骤 4:航点导航源码研究(进阶)

  1. 自定义航点修改:
    • 修改 waypoints 列表中的坐标,重启 Launch 文件;
    • 观察机器人是否按新航点移动,分析路径规划逻辑。

核心代码解析(研究切入点):python运行

# 航点列表定义(可修改添加自定义航点) 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 文件:bash运行

cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/launch cat rats_life_waypoints_launch.py 

步骤 5:Nav2 参数调优(核心研究)

打开 Nav2 参数文件:

bash

运行

cd $(rospack find webots_ros2_epuck)/share/webots_ros2_epuck/config cat nav2_params.yaml 

关键参数调优方向

参数模块核心参数调优目的
amclalpha1-alpha5降低定位误差(仿真中可设为 0.1)
dwb_controllermax_vel_x/min_vel_x调整最大 / 最小线速度
dwb_controllermax_vel_theta调整最大角速度
obstacle_layermax_obstacle_height适配激光雷达高度
bt_navigatordefault_bt_xml_filename更换导航行为树(如添加避障逻辑)

调优测试

  • 修改 max_vel_x 从 0.2→0.3,重启导航,观察机器人运动速度变化;
  • 增大 alpha1 到 0.5,观察 AMCL 定位误差是否增大(验证噪声敏感度)。

第五阶段:高级研究与扩展

1. 仿真时间同步研究

Webots 与 ROS 2 的时间同步是核心,验证方法:

bash

运行

# 查看仿真时间 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,导航会出现严重偏差;
  • Webots 的 “real time factor”(实时因子)调整对时间同步的影响。

2. 机器人 URDF 模型解析

bash

运行

# 查看机器人URDF描述 ros2 topic echo /robot_description --noarr 

研究点

  • URDF 中的连杆(link)和关节(joint)定义;
  • 传感器的坐标系(frame_id)是否与 RViz2/Nav2 对齐;
  • 修改 URDF 中的轮子半径,观察里程计精度变化。

3. 多机器人仿真扩展(进阶)

修改 robot_launch.py,添加第二个 e-puck 机器人:

python

运行

# 在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中机器人名称 ] ) 

验证

bash

运行

ros2 topic list | grep epuck2 # 应出现/epuck2/cmd_vel等话题 

4. 数据记录与分析

使用 ROS 2 bag 记录数据,用于离线分析:

bash

运行

# 记录核心话题 ros2 bag record /epuck/laser_scan /epuck/odometry /amcl_pose /map # 回放数据 ros2 bag play <bag文件名称> 

分析工具

  • 使用 rqt_bag 可视化 bag 数据;
  • 用 Python 脚本解析激光雷达 / 里程计数据,绘制运动轨迹。

总结与研究路径建议

  1. 基础层:掌握节点 / 话题 / 参数的通信逻辑,验证传感器 / 执行器数据;
  2. 控制层:对比高层(cmd_vel)和底层(关节控制)的差异,理解运动学模型;
  3. 导航层:拆解 Nav2 的定位 / 规划 / 控制流程,调优参数验证效果;
  4. 扩展层:自定义场景 / 航点 / URDF,研究多机器人仿真和时间同步。

每一步操作后,建议记录 “现象 - 原因 - 结论”,例如:

  • 现象:导航到目标点时机器人绕障失败;
  • 原因:局部规划器的 min_vel_x 过小;
  • 结论:调大 min_vel_x 至 0.1,绕障成功。

通过这种方式,可逐步深入理解 Webots 与 ROS 2 的集成逻辑,掌握 e-puck 机器人的仿真与控制核心。


Webots 2025a + ROS 2 Jazzy e-puck 机器人完整教程

本文基于 webots_ros2_epuck 功能包,详细讲解从环境配置、核心概念到完整案例运行的全流程,覆盖基础启动、地图导航、ROS 2 控制、参数配置等核心场景,适配 Webots 2025a 和 ROS 2 Jazzy 版本。

一、环境前置配置

1. 基础环境要求

  • 操作系统:Ubuntu 24.04(ROS 2 Jazzy 官方推荐)
  • 已安装:
    • ROS 2 Jazzy(完整安装,包含 ros-base + desktop
    • Webots 2025a(官方下载 或通过 apt 安装)
    • webots_ros2 核心包 + webots_ros2_epuck 功能包
    • Nav2 导航栈(Jazzy 版本)

2. 环境安装步骤

(1)安装 Webots 2025a

bash

运行

# 方式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 
(2)安装 webots_ros2 及 e-puck 功能包

bash

运行

# 创建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 # 加载环境变量(每次新开终端都需执行,或添加到.bashrc) source install/setup.bash echo 'source ~/webots_ws/install/setup.bash' >> ~/.bashrc 
(3)安装 Nav2 导航栈(可选,用于导航案例)

bash

运行

sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup ros-jazzy-turtlebot3-navigation2 

二、核心文件解析(理解 launch / 配置文件)

从你提供的命令行补全信息,webots_ros2_epuck 包含以下核心文件,先明确作用:

文件名称核心作用
robot_launch.pye-puck 机器人核心启动文件(加载 Webots 仿真、ROS 2 驱动)
rats_life_launch.pyRats Life 场景启动文件(包含地图、仿真环境)
rats_life_waypoints_launch.py航点导航启动文件(基于 Nav2 实现路径跟踪)
map_rats_life.yamlRats Life 场景地图配置(用于 SLAM / 导航)
nav2_params_iron.yaml/nav2_params.yamlNav2 参数配置(适配 Iron/Jazzy 版本)
ros2_control.ymlROS 2 Control 配置(机器人关节 / 运动控制)
epuck_world_map.yamle-puck 地图相关参数(坐标系、分辨率等)

三、基础案例:启动 e-puck 仿真环境

1. 最简启动:仅加载 e-puck 机器人

bash

运行

# 启动核心机器人仿真 ros2 launch webots_ros2_epuck robot_launch.py 

执行后会自动打开 Webots 2025a 仿真界面,显示 e-puck 机器人在空场景中,同时 ROS 2 节点启动,机器人驱动加载完成。

关键验证:检查 ROS 2 节点 / 话题

新开终端执行以下命令,确认通信正常:

bash

运行

# 查看运行的节点 ros2 node list # 预期输出包含:/webots_ros2_driver /epuck/* 等节点 # 查看机器人话题(激光、里程计、速度指令等) ros2 topic list # 核心话题: # /epuck/laser_scan(激光雷达数据) # /epuck/odometry(里程计数据) # /epuck/cmd_vel(速度控制指令) # /epuck/joint_states(关节状态) # 查看激光雷达数据(验证传感器) ros2 topic echo /epuck/laser_scan --noarr 

2. 启动 Rats Life 场景(带地图的仿真环境)

bash

运行

# 启动包含Rats Life地图的完整场景 ros2 launch webots_ros2_epuck rats_life_launch.py 

此命令会加载带有迷宫 / 障碍物的 Rats Life 场景,e-puck 机器人置于场景中,同时加载地图配置 map_rats_life.yaml

四、进阶案例:e-puck 运动控制

1. 手动控制机器人(通过 ROS 2 话题发布速度指令)

(1)发布速度指令(线速度 + 角速度)

bash

运行

# 方式1:一次性发布(前进,线速度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}}" # 方式2:持续发布(转圈,角速度1rad/s,频率10Hz) ros2 topic pub --rate 10 /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}}" 

执行后可在 Webots 中看到机器人对应运动。

(2)使用键盘控制(ROS 2 teleop 工具)

bash

运行

# 安装键盘控制工具 sudo apt install ros-jazzy-teleop-twist-keyboard # 启动键盘控制(指定话题为/epuck/cmd_vel) ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args -r cmd_vel:=/epuck/cmd_vel 

按终端提示操作键盘(w/x 前进 / 后退,a/d 左转 / 右转,s 停止)。

2. 通过 ROS 2 Control 控制(底层关节控制)

ros2_control.yml 定义了 e-puck 轮子的关节控制配置,可通过以下方式直接控制关节:

bash

运行

# 查看关节状态 ros2 topic echo /epuck/joint_states # 发布关节速度指令(控制左右轮) ros2 topic pub /epuck/joint_velocity_controller/commands std_msgs/msg/Float64MultiArray "{data: [1.0, 1.0]}" 

五、高级案例:Nav2 航点导航

1. 启动导航环境(带 Nav2 的 Rats Life 场景)

bash

运行

# 启动航点导航完整流程(包含地图、Nav2、机器人) ros2 launch webots_ros2_epuck rats_life_waypoints_launch.py 

此命令会自动加载:

  • Webots Rats Life 场景 + e-puck 机器人
  • Nav2 导航栈(基于 nav2_params.yaml 配置)
  • 地图服务器(加载 map_rats_life.yaml
  • 航点导航节点
关键配置文件说明:

map_rats_life.yaml:地图分辨率、坐标系、路径等配置:yaml

image: map_rats_life.pgm # 地图图片(Webots场景对应) resolution: 0.05 # 5cm/像素 origin: [-10.0, -10.0, 0.0] # 地图原点 negate: 0 occupied_thresh: 0.65 free_thresh: 0.196 frame_id: map # 坐标系与Nav2对齐 

nav2_params_jazzy.yaml(若不存在则用 nav2_params.yaml):需适配 Jazzy 版本,核心参数包括:yaml

amcl: ros__parameters: use_sim_time: true # 启用仿真时间(必须与Webots同步) alpha1: 0.2 alpha2: 0.2 alpha3: 0.2 alpha4: 0.2 alpha5: 0.2 base_frame_id: "base_link" global_frame_id: "map" odom_frame_id: "odom" laser_topic: "/epuck/laser_scan" bt_navigator: ros__parameters: use_sim_time: true default_bt_xml_filename: "navigate_w_replanning_and_recovery.xml" 

2. 发送航点导航指令

方式 1:通过 ROS 2 Action 发送目标点

bash

运行

# 安装Nav2命令行工具 sudo apt install ros-jazzy-nav2-cli # 发送导航目标点(x=1.0, y=0.0, yaw=0.0) ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose "{pose: {header: {frame_id: 'map'}, pose: {position: {x: 1.0, y: 0.0, z: 0.0}, orientation: {w: 1.0}}}}" 
方式 2:预定义航点导航

编辑 rats_life_waypoints_launch.py 中的航点列表:

python

运行

waypoints = [ (0.0, 0.0, 0.0), # 起点 (2.0, 1.0, 1.57), # 航点1(x,y,yaw) (4.0, -1.0, 3.14), # 航点2 (0.0, 0.0, 0.0) # 回到起点 ] 

重启 launch 文件后,机器人会自动按航点移动。

3. 导航调试工具

bash

运行

# 查看Nav2状态 ros2 node list | grep nav2 ros2 topic echo /amcl_pose # 查看机器人定位 # 可视化(需安装RViz2) rviz2 -d $(ros2 pkg prefix webots_ros2_epuck)/share/webots_ros2_epuck/config/epuck_nav.rviz 

RViz2 中可查看:

  • 地图(Map)
  • 激光扫描(LaserScan)
  • 机器人位姿(Pose)
  • 规划路径(Path)

六、常用 Launch 参数说明(解决启动参数疑问)

从你的命令行补全信息,以下是关键 Launch 参数的使用方法:

参数作用示例
-a/--print打印 package.xml 信息ros2 launch webots_ros2_epuck robot_launch.py -a
--debug调试模式启动(输出详细日志)ros2 launch webots_ros2_epuck robot_launch.py --debug
--launch-prefix为节点添加启动前缀(如 gdb 调试)ros2 launch webots_ros2_epuck robot_launch.py --launch-prefix "gdb -ex run --args"
-n自定义节点名称ros2 launch webots_ros2_epuck robot_launch.py -n my_epuck
-s/--show-all-subprocesses-output显示所有子进程输出ros2 launch webots_ros2_epuck robot_launch.py -s
--show-args显示 Launch 文件所有可用参数ros2 launch webots_ros2_epuck robot_launch.py --show-args
--noninteractive非交互模式启动(无弹窗)ros2 launch webots_ros2_epuck robot_launch.py --noninteractive

示例:查看 robot_launch.py 的所有可配置参数

bash

运行

ros2 launch webots_ros2_epuck robot_launch.py --show-args 

输出会包含:

plaintext

Arguments (pass arguments as '<name>:=<value>'): 'use_sim_time': Use simulation (Webots) clock if true (default: 'true') 'world': Webots world file path (default: '$(find-pkg-share webots_ros2_epuck)/worlds/epuck_world.wbt') 'rviz': Start RViz2 automatically (default: 'false') 

七、常见问题与解决

1. Webots 启动后机器人无响应

  • 原因:仿真时间未同步(use_sim_time=false)

解决:所有 Nav2 / 机器人节点启用 use_sim_time: true,在 Launch 文件中添加:python运行

launch.actions.SetParameter(name='use_sim_time', value=True) 

2. Nav2 定位漂移

  • 原因:激光雷达话题不匹配 / AMCL 参数错误
  • 解决:
    1. 确认 amcl 配置中 laser_topic: "/epuck/laser_scan"
    2. 调整 AMCL 的 alpha 参数(如 alpha1=0.1)
    3. 检查 /epuck/odometry 话题是否有数据

3. 编译报错(Jazzy 兼容)

  • 原因:webots_ros2 分支不匹配

解决:确保克隆 jazzy 分支:bash运行

cd ~/webots_ws/src/webots_ros2 git checkout jazzy colcon build --cmake-force-configure 

4. 话题名称不匹配

  • 原因:机器人命名空间未统一
  • 解决:所有话题添加 /epuck 命名空间,如 cmd_vel → /epuck/cmd_vel

八、扩展开发

1. 自定义 Webots 场景

  1. 打开 Webots 2025a → 打开 webots_ros2_epuck/worlds/epuck_world.wbt
  2. 添加障碍物、修改地图、调整机器人传感器

保存为自定义 world 文件,通过 Launch 参数加载:bash运行

ros2 launch webots_ros2_epuck robot_launch.py world:=/path/to/your/world.wbt 

2. 自定义 Nav2 行为

  • 添加自定义恢复行为(如避障、重试)

修改 nav2_params.yaml 中的 BT 树(行为树):yaml

bt_navigator: ros__parameters: default_bt_xml_filename: "custom_bt.xml" # 自定义行为树 

3. 传感器扩展

e-puck 支持的传感器可通过 robot_launch.py 启用:

python

运行

# 在launch文件中添加传感器配置 webots_driver_node = Node( package='webots_ros2_driver', executable='driver', parameters=[ {'robot_description': robot_description}, {'sensor_config': { 'camera': True, # 启用摄像头 'imu': True, # 启用IMU 'gps': True # 启用GPS }} ] ) 

九、总结

本教程覆盖了 webots_ros2_epuck 从基础仿真到高级导航的全流程,核心关键点:

  1. 确保 Webots 2025a 与 ROS 2 Jazzy 环境同步(仿真时间、命名空间);
  2. 理解核心 Launch 文件的分工(机器人启动、场景加载、导航配置);
  3. Nav2 导航需重点适配 use_sim_time 和传感器话题;
  4. 调试时优先检查节点、话题、参数三大核心要素。

若需更深入的开发(如 SLAM、多机器人、自定义控制器),可基于 webots_ros2_driver 扩展,或参考 Webots ROS 2 官方文档

Read more

RabbitMQ 创建队列的 5 种方式全解析:从手动到自动,小白也能选对方案(Spring Boot + Java 实战)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂! 在使用 RabbitMQ 开发消息系统时,“队列怎么创建” 是每个开发者都会遇到的问题。有人用管理后台点点点,有人写代码自动建,还有人靠运维提前配好……到底哪种方式更好? 本文将全面对比 RabbitMQ 创建队列的 5 种主流方式,结合 真实场景 + Spring Boot 代码 + 正反案例 + 注意事项,帮你避开“上线就崩”的大坑! 一、为什么“怎么创建队列”这么重要? 🎯 真实需求场景 你正在开发一个订单服务: * 用户下单后,发送消息到 order.queue; * 消费者监听该队列处理业务。 问题来了: 这个 order.queue 谁来创建?什么时候创建?如果没创建会怎样? 后果很严重: * 如果队列不存在,消息会被 直接丢弃(除非

By Ne0inhk

Java 8 中 HashMap 到底有啥不同?

HashMap 是 Java 开发中使用最频繁的集合类之一,它基于哈希表实现 Map 接口,以键值对形式存储数据。在 Java 8 中,HashMap 的实现经历了自诞生以来最大的一次重构,引入了许多重要的优化和改进,旨在解决旧版本中存在的性能瓶颈和潜在问题。本文将从底层数据结构、哈希算法、扩容机制、线程安全性等多个维度,结合源码深入剖析 Java 8 中 HashMap 的变革,带你全面理解这些差异背后的设计思想。 1. HashMap 基础回顾 在深入 Java 8 的改动之前,有必要先回顾一下 HashMap 的基本概念和 Java 7 及之前版本的核心实现。 * 存储结构:HashMap 内部维护一个 Node<K,V>[] table 数组(

By Ne0inhk
JAVA接入本地TTS模型sherpa-onnx实现离线文本转语音

JAVA接入本地TTS模型sherpa-onnx实现离线文本转语音

选择合适的 TTS 大模型 最近博主在负责的一项业务中,需要实现“文字实时转语音”的功能,一开始使用的是 阿里云智能语音合成服务。它的 API 简单易用,接入后很快就能跑通。 然而,随着需求推进,领导提出:在断网环境中也必须正常使用。一些业务现场无法连接外网,而云端 TTS 显然无法满足此要求。 于是博主开始调研可 离线部署的 TTS 大模型。在 AI 小伙伴的协助下,测试了多个可本地运行的模型,包括: * Piper * 百度飞桨 PaddleSpeech * Sherpa-ONNX TTS 最终的选型经历如下: * Piper:多次尝试仍无法成功运行,兼容问题较多 * PaddleSpeech:模型体积较大,部署复杂,与 Java 生态结合不友好 * Sherpa-ONNX:模型轻量、性能不错、部署简单,尤其是提供完整的

By Ne0inhk

Java调用ChatGPT API实战:从SDK选型到生产环境避坑指南

最近在项目中集成了ChatGPT API,整个过程踩了不少坑。从SDK选型到生产环境部署,每个环节都有需要注意的地方。今天就来分享一下我的实战经验,希望能帮到正在或准备集成ChatGPT API的Java开发者。 1. 背景痛点:Java调用ChatGPT API的常见问题 刚开始接触ChatGPT API时,我发现Java生态在这方面确实有些混乱。主要问题集中在以下几个方面: * SDK版本碎片化严重:GitHub上能找到几十个不同版本的Java SDK,有的基于Apache HttpClient,有的用OkHttp,还有的直接用Java原生HttpURLConnection。这些SDK质量参差不齐,有的几个月没更新,已经不支持最新的API版本。 * 同步调用阻塞线程:很多开发者习惯用同步方式调用API,这在低并发场景下没问题。但在生产环境中,ChatGPT API的响应时间通常在2-10秒,同步调用会长时间占用线程,导致线程池耗尽,系统整体性能下降。 * 流式响应解析困难:ChatGPT支持流式响应(Server-Sent Events),这对于实现打字机效果的用户体

By Ne0inhk