机器人视觉导航ros

99ANYc3cd6 机器人 1

什么是机器人视觉导航?

就是让机器人利用摄像头作为主要传感器,在未知或已知的环境中自主移动,并能到达指定的目标位置

相比于使用激光雷达(LiDAR)的导航,视觉导航具有成本更低、信息维度更丰富(可以识别物体、颜色、纹理等)的优点,但同时也带来了计算量大、对光照和纹理变化敏感、尺度不确定性等挑战。


ROS视觉导航的核心思想:SLAM + 导航

机器人视觉导航并非单一的技术,而是一个系统工程的集合,其核心是两大技术的结合:

  1. SLAM (Simultaneous Localization and Mapping) - 同时定位与地图构建

    • 目标:在机器人移动的过程中,同时构建出环境的地图,并实时确定机器人在地图中的位置和姿态。
    • 输入:传感器数据(视觉、激光雷达等)。
    • 输出
      • 地图:对环境的表示。
      • 机器人的位姿:机器人在地图中的坐标和朝向。
  2. 导航

    • 目标:基于已知的地图和机器人的实时位姿,规划出一条从当前位置到目标位置的无碰撞路径,并控制机器人沿着该路径移动。
    • 输入
      • 地图
      • 起始位置(机器人自身位姿)
      • 目标位置(用户指定)
    • 输出:给机器人的运动速度指令(线速度和角速度)。

工作流程简述: 机器人启动后,首先运行SLAM模块,它在移动的过程中,一边用摄像头“看”并构建一张地图(比如map),一边实时更新自己在地图上的位置,地图构建完成后,将其保存下来,之后,用户在地图上点击一个目标点,导航模块加载这张地图,结合机器人的实时位置,开始规划路径并控制机器人前往目标。


ROS视觉导航的关键组件

ROS的导航功能主要由一个名为 navigation 的功能包提供,它包含了一系列的节点和算法,以下是视觉导航中最重要的组件:

组件名称 功能描述 在视觉导航中的角色
map_server 提供静态地图服务。 用于加载和保存由SLAM创建的地图(如.pgm.yaml文件)。
amcl (Adaptive Monte Carlo Localization) 定位模块,基于粒子滤波的概率定位算法。 当机器人开机或需要重新定位时,amcl会利用激光雷达或视觉里程计的数据,在已加载的地图上匹配机器人的位置。
move_base 导航核心,一个集成了路径规划、路径平滑、避障等功能的行动执行器。 它是整个导航系统的“大脑”,接收目标点,调用全局路径规划器和局部路径规划器,最终生成速度指令发给机器人底盘。
costmap_2d 代价地图,将传感器数据(如障碍物信息)转换成机器人可理解的、用于规划的栅格地图。 维护两个代价地图:
全局代价地图:基于静态地图,用于全局路径规划。
局部代价地图:基于实时传感器数据,用于局部避障和路径平滑。
planners (路径规划器) 负责计算路径。 move_base会调用它来寻找从起点到终点的最优路径,常用的是global_plannernavfn/NavfnROS
local_planners (局部规划器) 负责实时避障和轨迹跟踪。 move_base会调用它来执行全局路径,并根据实时传感器数据(如突然出现的障碍物)进行动态调整,常用的是base_local_planner(DWA)和teb_local_planner

视觉里程计 - 视觉导航的“眼睛”

在纯视觉SLAM中,我们缺少激光雷达那样的直接距离测量,我们需要一个关键组件来替代它:

视觉里程计

  • 功能:通过分析连续摄像头图像之间的变化(特征点的追踪),来估算机器人自身的相对运动(平移和旋转)。
  • 作用:它为SLAM系统提供了机器人的“运动模型”,是机器人进行自我定位的基础。
  • 常用工具
    • ORB-SLAM2 / ORB-SLAM3:非常经典和强大的开源SLAM系统,支持单目、双目和RGB-D相机,可以直接集成到ROS中使用。
    • VINS-Fusion:基于紧耦合的视觉-惯性里程计,性能更鲁棒,需要IMU数据辅助。
    • RTAB-Map:一个基于外观的SLAM系统,特别适合构建长期、大规模的地图。

视觉里程计的输出(通常是/camera/pose话题)是连接视觉传感器和ROS导航框架的桥梁。


一个典型的视觉导航工作流程(以ROS为例)

假设你已经有一台安装了摄像头的机器人,并且ROS环境已经配置好。

地图构建

  1. 启动ROS核心

    roscore
  2. 启动相机驱动: 假设你使用USB摄像头,可以使用uvc_camerausb_cam功能包。

    roslaunch usb_cam usb_cam-test.launch
  3. 启动视觉SLAM节点: 这里以ORB-SLAM3为例。

    # 你需要编译好ORB-SLAM3的ROS版本
    # 然后根据你的相机参数,修改并运行.launch文件
    roslaunch ORB_SLAM3 mono_tum.launch
    • ORB-SLAM3会订阅/camera/image_raw话题,并发布/camera/pose话题(机器人的位姿)和/map话题(点云地图)。
  4. 启动RViz进行可视化

    rviz

    在RViz中,添加Pose显示源,订阅/camera/pose话题,你就能看到机器人位置的实时更新。

  5. 启动地图服务器并保存地图map_server需要一张空的地图作为初始模板。

    # 生成一个100x100米,分辨率为0.05米的空白地图
    map_saver -f ~/my_map

    这会在你的家目录下生成my_map.pgm(图像文件)和my_map.yaml(参数文件),这就是你的第一张地图。

  6. 手持机器人,在环境中缓慢移动,覆盖所有需要导航的区域

    • 观察ORB-SLAM3的终端,确保它没有跟踪失败。
    • 观察RViz中地图的构建情况。
  7. 地图构建完成后,再次运行map_saver保存最终地图

导航

  1. 启动ROS核心和相机驱动(同上)。

  2. 加载已构建的地图

    rosrun map_server map_server ~/my_map.yaml
  3. 启动定位模块

    roslaunch amcl amcl.launch
    • amcl会加载地图,并根据视觉里程计的数据(需要通过robot_localization等节点进行融合和发布)来初始化机器人的位置。
  4. 启动导航核心

    roslaunch move_base move_base.launch

    这会启动路径规划、局部规划、代价地图管理等所有导航功能。

  5. 启动RViz: 在RViz中,你需要添加:

    • Map 显示源,加载my_map.pgm
    • Global PlanLocal Plan 显示源,查看规划的路径。
    • Pose 显示源,查看机器人位姿。
    • Costmap 显示源,查看障碍物信息。
  6. 发送导航目标

    • 在RViz的工具栏中,选择 "2D Nav Goal" 工具(一个带箭头的圆圈)。
    • 在地图上点击你想要机器人去的位置,机器人就会开始自动规划路径并移动过去。

常用工具和功能包推荐

  • SLAM系统
    • ORB-SLAM3: 目前最流行、最稳健的视觉SLAM之一,功能全面。
    • RTAB-Map: 适合构建大型、循环闭合的地图,外观词汇库是其特色。
    • Cartographer (视觉模式): Google的SLAM库,也支持基于2D激光雷达的视觉里程计。
  • 相机驱动:
    • usb_cam: 用于USB摄像头。
    • uvc_camera: 另一个USB摄像头驱动。
    • realsense-ros: 用于Intel RealSense深度相机。
  • 坐标变换:
    • robot_localization: 非常重要!用于融合来自多个传感器的数据(如视觉里程计、IMU、轮式里程计),发布一个精确的、统一的/odometry/filtered话题给amcl使用。
  • 仿真:
    • Gazebo: ROS官方的物理仿真器,可以在仿真环境中测试你的视觉导航算法,无需真实硬件。
    • TurtleBot3: 一个非常流行的教育机器人,有仿真和真实硬件版本,是学习ROS导航的最佳平台之一。

面临的挑战与总结

  • 挑战

    • 尺度不确定性:单目相机无法直接获得深度信息,导致地图尺度可能不正确。
    • 动态环境:场景中移动物体会干扰SLAM和定位。
    • 纹理匮乏区域:如白墙、玻璃,难以提取特征点,导致跟踪失败。
    • 光照变化:强烈的明暗变化会影响图像质量。
    • 计算资源消耗大:SLAM和导航算法对CPU/GPU要求较高。
  • 机器人在ROS中的视觉导航是一个将计算机视觉机器人运动控制紧密结合的复杂系统,它以SLAM为基石,解决了“我在哪?”和“环境长什么样?”的问题;以navigation包为核心,解决了“我该怎么去?”的问题,掌握这个流程和关键组件,是通往更高级机器人应用(如物体抓取、人机交互)的必经之路。

抱歉,评论功能暂时关闭!