0%

ROS2自动巡航:基于深度相机的智能导航系统

本文将详细介绍如何使用ROS2系统和深度相机实现机器人的自动巡航功能。整个系统通过鲁班猫(使用ubuntu22.04系统)深度相机获取环境信息,结合SLAM算法进行地图构建,最后利用Nav2导航系统实现自主导航。

1. 系统硬件与数据流

1.1 硬件连接

通过 USB 连接鲁班猫深度相机,并启动 ROS 2 驱动节点 astra_camera,该节点会产生以下核心数据流:

1.2 核心数据类型

(1) 深度图 (sensor_msgs/Image)

  • 格式:灰度图像
  • 数据含义:每个像素的值代表距离(如 1000 代表 1000毫米)
  • 作用:提供环境的深度信息,用于3D重建和障碍物检测

(2) RGB彩色图 (sensor_msgs/Image)

  • 格式:普通彩色摄像头画面
  • 作用:提供环境的视觉信息,用于视觉识别和地图标注

(3) 点云数据 (sensor_msgs/PointCloud2)

  • 数据内容:驱动底层将深度图与彩色图对齐合成后输出的3D点云
  • 包含信息:X、Y、Z三维坐标和颜色信息
  • 作用:提供完整的三维环境信息,用于SLAM和导航

(4) 相机内参 (sensor_msgs/CameraInfo)

  • 数据格式:描述镜头畸变、焦距等光学参数的矩阵文件
  • 作用:供后续算法进行图像校准和畸变校正

1.3 RTABMAP算法集成

使用ROS2系统中的 rtabmap 节点功能,将上述数据以及巡检小车的位移数据通过消息订阅方式传递给RTABMAP算法。RTABMAP通过消息发布方式输出以下数据:

  • 2D栅格地图:二维平面地图,用于路径规划
  • 3D全局彩色点云地图:完整的三维环境模型
  • 节点信息:SLAM过程中的关键帧和位姿信息
  • 误差修正后的小车坐标值:经算法优化后的精确位置信息

2. Nav2导航实现流程

2.1 初次建图阶段

步骤1:启动基础控制程序

1
2
# 启动机器人的基础控制节点
ros2 launch my_robot_bringup my_robot.launch.py

步骤2:启动深度相机驱动

1
2
# 启动Astra深度相机
ros2 launch astra_camera astra_camera.launch.py

此时,深度相机开始产生三维点云信息,为SLAM提供数据源。

步骤3:点云数据转换

1
2
# 将3D点云转换为2D激光扫描数据
ros2 run pointcloud_to_laserscan pointcloud_to_laserscan_node

这一步将复杂的3D点云数据转换为Nav2可以处理的2D激光扫描数据格式。

步骤4:SLAM建图

1
2
# 使用slam_toolbox进行地图构建
ros2 launch slam_toolbox async_slam_toolbox.launch.py

系统读取2D点云数据进行数据采集,实时构建环境地图。

步骤5:保存地图

1
2
# 保存构建好的地图
ros2 run nav2_map_server map_saver_cli -f ~/map_navigation

将构建的地图保存为文件,然后关闭slam_toolbox节点。

2.2 自动导航阶段

2.2.1 系统配置

由于Nav2默认是2D导航,需要配置Nav2以支持处理3D点云数据作为障碍物源。主要配置文件包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# nav2_params.yaml
obstacle_layer:
enabled: true
observation_sources: scan point_cloud
scan:
sensor: scan
max_obstacle_height: 2.0
min_obstacle_height: 0.0
min_z: 0.0
max_z: 3.0
clearing: true
marking: true
point_cloud:
sensor: point_cloud
max_obstacle_height: 2.0
min_obstacle_height: 0.1
min_z: 0.1
max_z: 3.0
clearing: true
marking: true

2.2.2 启动导航系统

1
2
# 使用保存的地图启动Nav2
ros2 launch nav2_bringup navigation.launch.py map:=~/map_navigation.yaml

此时,系统具备了实时避障能力,小车可以根据地图进行自主导航。

3. 自动导航实现机制

3.1 导航指令发送

服务器需要发送巡检的位置坐标和角度信息给小车端。数据格式如下:

1
2
3
4
5
6
7
8
9
# 导航目标数据结构
from nav2_msgs.action import NavigateToPose

goal_msg = NavigateToPose.Goal()
goal_msg.pose.header.frame_id = 'map'
goal_msg.pose.pose.position.x = 3.5 # 目标位置X坐标
goal_msg.pose.pose.position.y = 2.0 # 目标位置Y坐标
goal_msg.pose.pose.position.z = 0.0 # Z坐标(2D导航通常为0)
goal_msg.pose.pose.orientation.w = 1.0 # 朝向角度

3.2 导航流程

  1. 数据打包:将位置信息打包为 nav2_msgs/action/NavigateToPose 数据类型
  2. 消息发送:将数据包在本地发送到Nav2算法自动监听的动作接口 /navigate_to_pose
  3. 路径规划:Nav2收到目标后,自动进行全局路径规划和局部路径规划
  4. 实时导航:小车根据规划路径自动向目标方向进行导航,同时实时避障

4. 总结

基于ROS2和深度相机的自动巡航系统充分利用了现代机器人感知和导航技术。通过鲁班猫深度相机获取环境信息,结合RTABMAP进行SLAM建图,最后利用Nav2实现智能导航,整个系统具有高精度、实时性和鲁棒性的特点,为各种自动化应用场景提供了可靠的解决方案。

系统的模块化设计使其具有良好的扩展性,可以根据具体需求添加更多的感知模块和功能模块,进一步提升系统的智能化水平。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment