步骤 11:扩展任务与总结
前置条件:完成步骤 10。 本步目标:把移动机器人平台扩展到感知、建图、导航和综合实验。 预计时间:按扩展任务选择。
1. 已完成的能力
完成前 10 步后,你已经拥有:
- 一个可参数化的两轮差速移动机器人;
- 一个可重复启动的 Gazebo 世界;
- 差速驱动、里程计和 TF 数据链;
- 激光雷达和 RGB 相机;
- 命令行和自动轨迹控制能力;
- 一套基于话题、TF、日志和物理现象的调试方法。
2. 扩展任务清单
| 扩展 | 新增加的内容 | 学习目标 |
|---|---|---|
| IMU | imu_link 与 IMU 插件 |
多传感器融合 |
| 键盘控制 | teleop_twist_keyboard |
手动调试运动 |
| 障碍物 | 墙、箱子、柱体 | 测试激光和避障 |
| 深度相机 | depth camera 插件 | 三维视觉 |
| 状态可视化 | rviz 配置 | TF、激光和轨迹显示 |
| rosbag | 录制与回放 | 故障复现 |
| SLAM | gmapping / Cartographer | 构建地图 |
| 导航 | AMCL / move_base | 路径规划和避障 |
| 多机器人 | 命名空间与多模型 | 系统扩展 |
3. rosbag 复现
录制核心话题:
rosbag record -O mybot_test.bag /cmd_vel /odom /joint_states /scan /tf /tf_static
查看 bag:
rosbag info mybot_test.bag
回放:
rosparam set use_sim_time true
rosbag play --clock mybot_test.bag
回放调试的价值:
- 不依赖 Gazebo 实时运行;
- 可以反复重现同一个问题;
- 能对控制、TF 和传感器对齐关系进行复盘。
4. 接入 SLAM
前提:
/scan频率稳定;odom -> base_link正常;- 激光
frame_id与 TF 一致; - 场景有足够结构特征。
建图数据流:
graph LR
S[/scan/] --> SLAM[gmapping]
O[/odom/] --> SLAM
T[TF] --> SLAM
SLAM --> M[/map/]
SLAM --> MT[map -> odom]
建图步骤:
roslaunch mybot_gazebo mybot_gazebo.launch
rosrun gmapping slam_gmapping scan:=/scan
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
保存地图:
rosrun map_server map_saver -f ~/mybot_map
5. 接入自主导航
导航依赖:
- 已保存地图;
- AMCL 定位;
- 全局和局部代价地图;
/cmd_vel控制链接;- 完整 TF 链。
graph LR
M[map] --> AMCL
S[/scan/] --> AMCL
AMCL --> MO[map -> odom]
MB[move_base] --> CV[/cmd_vel/]
CV --> D[diff_drive]
D --> O[/odom/]
建议顺序:
- 先加载地图并确认 AMCL 定位;
- 再在 rviz 中手动指定小目标;
- 调整代价地图和机器人 footprint;
- 最后使用程序发送多个航点。
6. 总结
本教程不是一次跑完的命令集合,而是一条从模型到传感器的构建链:
环境 -> 功能包 -> URDF -> 差速插件 -> 传感器插件 -> world/launch -> 首次运行 -> 手动控制 -> 自动控制 -> 调试和扩展
每一步都留下一个可验证的结果,最终才形成完整仿真平台。
继续学习时,建议始终遵守以下原则:
- 先确认模型和 TF,再调试算法;
- 先检查话题和频率,再修改控制器;
- 先保存 rosbag,再反复改参数;
- 先跑小场景,再扩大地图和传感器范围;
- 先量化成功率,再追求轨迹美观。
7. 参考文献
- ROS Wiki:URDF、TF、rqt 和 rosbag
- Gazebo Classic 文档:SDF、物理引擎、传感器
- ROS Noetic
gazebo_ros:差速驱动、激光和相机插件 - OpenHUTB/ros2 仓库:catkin 功能包与实验文档组织方式
- 上一步:参数调整与故障排查
- 返回教程总览
- 返回第 4 章机器人仿真