You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.1 KiB
7.1 KiB
🤖 Final Navigation - 融合导航系统
📋 项目简介
融合导航系统结合了 Task_1 和 Task_3 的优点,创建了一个稳定、高效的 ROS2 导航解决方案。
🎯 设计原理
| 组件 | 来源 | 原因 |
|---|---|---|
| 机器人设计 | Task_1 | 四轮后驱,稳定性好 |
| 激光雷达配置 | Task_3 | 无 always_on 标签,避免崩溃 ✅ |
| 世界环境 | Task_3 | 房屋环境,真实场景 |
| SLAM 配置 | Task_3 | 建图效果验证良好 |
| Nav2 配置 | Task_1 | 导航效果验证良好 |
| 分步启动 | Task_1 | 流程清晰,易于调试 |
🔑 关键发现
为什么 Task_3 可以正常运行而 Task_1 崩溃?
- Task_1 的激光雷达有
<always_on>true</always_on>标签 - Task_3 没有这个标签
- 这个标签在虚拟机环境中导致 Gazebo 图形渲染冲突
- 融合版本采用 Task_3 的配置,完全避免崩溃
🚀 快速开始
1️⃣ 编译项目
cd ~/ros2_ws/src
# 将 task_final/final_navigation 复制到这里
cd ~/ros2_ws
colcon build --packages-select final_navigation
source install/setup.bash
2️⃣ 步骤1:验证环境
# 启动 Gazebo 环境
ros2 launch final_navigation step1_gazebo.launch.py
# 新终端:测试键盘控制
ros2 run teleop_twist_keyboard teleop_twist_keyboard
验证成功:
- ✅ Gazebo 显示房屋环境
- ✅ 机器人正常加载
- ✅ 键盘可以控制移动
3️⃣ 步骤2:SLAM 建图
# 启动建图
ros2 launch final_navigation step2_mapping.launch.py
# 新终端:键盘控制建图
ros2 run teleop_twist_keyboard teleop_twist_keyboard
# 建图 3-5 分钟后,新终端保存地图
cd ~/ros2_ws
source install/setup.bash
ros2 run nav2_map_server map_saver_cli -f install/final_navigation/share/final_navigation/maps/house_map
建图技巧:
- 慢速移动(线速度 0.2 m/s)
- 沿墙壁移动
- 探索所有房间
- 回到起点触发回环闭合
4️⃣ 步骤3:自主导航
# 启动导航
ros2 launch final_navigation step3_navigation.launch.py
# 在 RViz2 中:
# 1. 点击 "2D Pose Estimate" 设置初始位姿
# 2. 点击 "Nav2 Goal" 设置目标点
# 3. 观察机器人自动导航
🤖 机器人配置
四轮后驱设计(Task_1)
- 驱动轮:后左轮 + 后右轮(黑色,μ=1.0)
- 从动轮:前左轮 + 前右轮(白色,μ=0.1)
- 底盘:0.5m × 0.3m × 0.1m
- 轮距:0.3m
- 轴距:0.35m
- 车轮半径:0.06m
激光雷达配置(Task_3)
- 更新率:40 Hz
- 采样点:720
- 扫描范围:360度
- 距离范围:0.1-30m
- 关键:无
always_on标签 ✅
🏠 环境配置
房屋世界(Task_3)
- 房间1:5m × 4m(左侧)
- 走廊:2m × 6m(中间)
- 房间2:5m × 4m(右侧)
- 障碍物:3个咖啡桌
- 特点:真实室内环境,适合导航测试
📂 项目结构
final_navigation/
├── README.md # 项目说明
├── package.xml # ROS2 包配置
├── setup.py # Python 包配置
├── setup.cfg # 安装配置
│
├── final_navigation/ # Python 包
│ └── __init__.py
│
├── launch/ # 启动文件(分步设计)
│ ├── step1_gazebo.launch.py # 步骤1:验证环境
│ ├── step2_mapping.launch.py # 步骤2:SLAM 建图
│ └── step3_navigation.launch.py # 步骤3:Nav2 导航
│
├── urdf/ # 机器人模型
│ └── fusion_robot.urdf.xacro # 融合机器人(四轮后驱 + Task_3激光)
│
├── worlds/ # 仿真环境
│ └── house_world.world # 房屋世界(Task_3)
│
├── config/ # 配置文件
│ ├── slam_params.yaml # SLAM 配置(Task_3)
│ └── nav2_params.yaml # Nav2 配置(Task_1)
│
├── rviz/ # 可视化配置
│ ├── slam_view.rviz # SLAM 视图
│ └── nav_view.rviz # 导航视图
│
├── maps/ # 地图保存目录
│ └── (保存的地图文件)
│
└── resource/ # 资源标记
└── final_navigation
🛠️ 技术栈
| 组件 | 版本/说明 |
|---|---|
| ROS2 | Humble |
| 仿真 | Gazebo 11 |
| SLAM | SLAM Toolbox(Task_3 配置) |
| 定位 | AMCL |
| 导航 | Nav2 Navigation Stack(Task_1 配置) |
| 可视化 | RViz2 |
| 遥操作 | teleop_twist_keyboard |
✅ 成功标志
步骤1(环境验证)
- ✅ Gazebo 正常显示房屋环境
- ✅ 机器人正常加载
- ✅ 键盘控制响应
步骤2(SLAM 建图)
- ✅ RViz2 地图从灰色变黑白
- ✅ 所有房间清晰可见
- ✅ 地图文件保存成功
步骤3(自主导航)
- ✅ 机器人自动移动到目标
- ✅ 避开障碍物
- ✅ 到达目标点停止
🔧 常见问题
Q: Gazebo 或 RViz2 崩溃?
A: 这就是为什么我们创建融合版本!
- 融合版本使用 Task_3 的激光雷达配置(无
always_on标签) - 如果仍然崩溃,检查虚拟机 3D 加速是否关闭
- 或使用环境变量:
export LIBGL_ALWAYS_SOFTWARE=1
Q: 地图不更新?
A:
- 确保机器人在移动
- 检查
/scan话题:ros2 topic hz /scan - 查看 SLAM 日志是否有错误
Q: 导航不工作?
A:
- 必须先设置初始位姿(2D Pose Estimate)
- 确保地图已正确加载
- 检查 Nav2 服务器状态:
ros2 lifecycle get /controller_server
🎯 项目优势
- ✅ 稳定性:使用 Task_3 的激光雷达配置,不崩溃
- ✅ 性能:Task_1 的四轮后驱设计,稳定性好
- ✅ 真实性:Task_3 的房屋环境,接近真实场景
- ✅ 完整性:SLAM + 导航完整流程
- ✅ 易用性:分步启动,流程清晰
📊 配置对比
激光雷达配置
| 参数 | Task_1 | Task_3 | Fusion |
|---|---|---|---|
| update_rate | 20 Hz | 40 Hz | 40 Hz |
| always_on | ✅ 有(崩溃) | ❌ 无 | ❌ 无(稳定) |
| samples | 720 | 720 | 720 |
机器人设计
| 参数 | Task_1 | Task_3 | Fusion |
|---|---|---|---|
| 驱动方式 | 后驱 | 前驱 | 后驱 |
| 车轮数 | 4轮 | 4轮+万向轮 | 4轮 |
| 稳定性 | 高 | 中 | 高 |
📚 相关文档
- task_1/ - 原始四轮后驱项目
- task_3/ - 原始房屋导航项目
- 项目创建进度.md - 融合项目创建记录
🎉 总结
Final Navigation 是一个经过验证的稳定导航系统,结合了两个项目的优点:
- 🚗 Task_1 的稳定机器人设计
- 🏠 Task_3 的真实环境和稳定配置
- 🗺️ 完整的 SLAM 建图流程
- 🎯 可靠的 Nav2 导航功能
立即开始使用吧! 🚀