一、 实验背景与环境准备
在 ROS 2 Humble 版本中,我们利用TurtleBot3机器人完成从环境感知到自主决策的闭环实验。
环境依赖:
- ROS 2版本: Humble
- 仿真插件: Gazebo, Rviz2
- 机器人模型: Burger (或 Waffle)
初始化环境变量(核心步骤):
每次打开新终端,务必先声明机器人模型,否则会报错。
exportTURTLEBOT3_MODEL=burgersource/opt/ros/humble/setup.bash二、 任务一:SLAM 实时地图构建
我们使用Cartographer算法进行同步定位与建图。
1. 启动仿真世界
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py2. 开启 SLAM 节点与 Rviz2 可视化
# 新终端exportTURTLEBOT3_MODEL=burger ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True3. 遥控小车扫描地图
# 新终端ros2 run turtlebot3_teleop teleop_keyboard提示:通过键盘控制小车在 Gazebo 慢慢走动,直到 Rviz2 中的地图轮廓清晰、完整。
4. 保存地图
ros2 run nav2_map_server map_saver_cli-f~/my_map(这会生成my_map.yaml和my_map.pgm两个关键文件)
三、 任务二:自主导航 (Nav2) 部署
基于上一步生成的地图,让机器人实现“指哪走哪”。
1. 启动导航堆栈
# 关闭之前的 SLAM 终端,保留 GazeboexportTURTLEBOT3_MODEL=burger ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/my_map.yaml2. 初始化定位 (Initial Pose)
在 Rviz2 顶部工具栏点击2D Pose Estimate,在地图上标出机器人当前在 Gazebo 里的位置。
3. 设定目标 (Nav2 Goal)
点击Nav2 Goal,在地图任意位置点击。机器人将自动规划出一条绿色全局路径并开始行驶。
四、 任务三:核心突破——导航算法参数动态调优
这是博文的灵魂。我们将直接干预DWB (Dynamic Window Approach)局部规划器的决策过程。
1. 查看实时参数列表
导航运行时,可以输入以下指令查看“大脑”里有哪些可以调的开关:
ros2 param list /controller_server2. 实验对比 A:物理性能边界测试(修改速度)
为了提高运输效率,我们将机器人最高速度提升 50%:
# 实时生效,无需重启ros2 paramset/controller_server FollowPath.max_vel_x0.3- 观察点:小车冲刺明显变快,但在急转弯处惯性增大。
3. 实验对比 B:算法偏好测试(修改路径贴合权重)
在 DWB 算法中,我们通过调整Critics (评分插件)来改变它的性格。我们希望它更死板地贴合全局规划线:
# 修改路径对齐评分权重ros2 paramset/controller_server FollowPath.PathAlign.scale50.0- 原理分析:
PathAlign.scale值越高,机器人就越不敢偏离预设的绿线。 - 成功反馈:终端若显示
Set parameter successful,说明算法权重已实时重写。
五、 实验总结:2D 导航与 3D 环境的哲学
虽然我们在Gazebo 三维仿真环境中运行,但核心逻辑依然属于2D 导航:
- 输入:2D 激光雷达的平面扫描数据。
- 载体:.pgm 格式的二维栅格地图。
- 输出:(vx,ω)(v_x, \omega)(vx,ω)两个维度的运动指令。
结论:对于轮式机器人,将 3D 世界投影到 2D 平面进行导航是最高效的工业级方案。通过本次实验,我深刻理解了如何通过调整DWB 评分系统的权重,在机器人的“效率”与“平稳度”之间找到平衡。
🔗 避坑贴士
- 如果
ros2 param set提示not declared,请先运行ros2 param list确认你的参数完整路径,不同版本的参数嵌套命名可能略有差异。 - 确保
use_sim_time:=True,否则 Rviz2 的时钟会与 Gazebo 脱节导致定位失败。
希望这篇教程能帮到正在学习 ROS 2 的你!欢迎在评论区交流。