一、概念
机器人导航是指机器人在环境中自主地从一个地点移动到另一个地点的过程。这个过程涉及到多个关键技术,包括定位、路径规划、避障等。机器人导航通常包括以下几个重要部分。
1. 定位(Localization)
定位是机器人确定自己在环境中的位置的过程。常用的定位方法包括:
(1)GPS定位:适用于室外环境,利用卫星信号确定机器人的位置。
(2)里程计(Odometry):根据轮子的转动来估算机器人的位置,但容易受到误差累积的影响。
(3)激光雷达(Lidar)/传感器定位:利用激光扫描仪或其他传感器获取环境数据,进行位置修正。常用的方法有:①粒子滤波(Particle Filter):常用于基于激光雷达的定位。扩展②卡尔曼滤波(EKF):用于融合多个传感器数据。
(4)视觉定位(SLAM):通过相机和其他传感器(如激光雷达)进行同时定位与地图构建。
2. 地图构建(Mapping)
地图构建是机器人在运动过程中逐步建立和更新其所处环境的地图。常见的地图构建方法包括:
(1)SLAM(Simultaneous Localization and Mapping):结合定位和地图构建,是一种实时的在线建图技术。
(2)网格地图(Grid Map):环境划分为一系列的栅格,机器人通过传感器的输入来判断哪些区域是障碍物,哪些是自由的。
3. 路径规划(Path Planning)
路径规划是机器人从起点到目标点之间寻找一条最佳路径的过程。路径规划可以分为以下几种:
(1)全局路径规划(Global Path Planning)
基于整个环境地图进行路径规划,常用的算法包括:A*算法:最经典的路径搜索算法,常用于寻找静态障碍物环境中的最短路径。Dijkstra算法:一种基于图的路径搜索算法,适用于所有权重为正的图。
(2)局部路径规划(Local Path Planning)
在全局路径的基础上,考虑动态障碍物和环境变化,进行局部避障。常见的局部规划方法包括:动态窗口法(Dynamic Window Approach):通过考虑机器人的速度和加速度限制,在当前环境下快速生成可行路径。VFH(Vector Field Histogram):基于当前环境的危险度图生成避障路径。
4. 避障(Obstacle Avoidance)
避障是指机器人在移动过程中实时检测并避免与障碍物发生碰撞。常见的避障方法有:
- 基于传感器的避障:使用激光雷达、超声波传感器等实时感知环境,检测障碍物并通过调整路径避免碰撞。
- 基于人工势场的避障:通过构建一个“虚拟势场”来模拟目标吸引力和障碍物的排斥力,机器人会向低势场的区域运动。
- 基于动态窗口法的避障:基于机器人的速度和加速度限制,动态生成避障路径。
二、常用工具和传感器
激光雷达(LiDAR):用于生成环境的高精度地图。
RGBD相机:能够提供深度信息的相机,用于地图构建和障碍物检测。
超声波传感器:常用于短距离的障碍物检测。
IMU(惯性测量单元):用于机器人姿态估计。
轮式里程计(Odometry):通过机器人轮子的转动估算机器人的位置和姿态。
三、相关功能包
1.navigation
导航功能包
navigation
是 ROS 系统自带的一个官方导航包,它提供了完整的机器人导航功能,包括路径规划、定位、避障等。这个包是 ROS 中最常用的一个包,特别适用于移动机器人,需要进行自主导航的场景。navigation
包的关键节点功能如下。
(1)move_base
这是导航过程中的核心节点,负责全局路径规划和局部路径规划。它能够根据目标位置和当前地图生成一条路径,并通过避障算法进行动态调整,确保机器人能够顺利到达目标。
(2)amcl
(Adaptive Monte Carlo Localization)该节点用于通过粒子滤波算法进行机器人定位。它结合激光雷达数据和地图信息,估算机器人在环境中的位置。通过
amcl
节点,机器人可以在已知地图中进行定位,适应环境变化,并根据当前位置进行路径规划。
(3)costmap_2d
这是代价地图,用于表示环境中每个位置的“成本”。每个区域会根据障碍物的距离、机器人行驶的安全性等因素,分配不同的代价。
costmap_2d
对于路径规划和避障非常重要,它帮助move_base
生成可行路径。
(4)map_server
用于加载和保存地图的工具。通常在启动时加载一个地图(如
.pgm
格式的地图),以便进行路径规划和定位。命令:rosrun map_server map_saver -f map
(5)
base_local_planner
这是局部路径规划器,负责在给定的全局路径基础上,计算如何局部避障并规划实际的运动轨迹。
2. gmapping建图功能包
gmapping
是一种基于粒子滤波算法的 SLAM工具,它可以帮助机器人在未知环境中创建地图的同时定位自己。具体来说,
gmapping
是 ROS 中实现激光SLAM的一个软件包,它结合了激光扫描器数据和机器人运动信息,实时生成并更新地图。常用在需要通过激光雷达进行建图的机器人系统中,尤其适用于移动机器人、无人车等场景。
gmapping
包含了完成 SLAM所需的所有核心算法,它会自动利用激光扫描数据和机器人的运动信息来进行地图构建和位置估算。只要你正确配置了相关参数和话题,就可以通过启动gmapping
节点来实现SLAM功能,而不必从头实现复杂的 SLAM 算法。下载:
gmapping
并不是 ROS 系统自带的核心组件,而是一个额外的 ROS 软件包。通常在使用 ROS 时,gmapping
需要单独安装并配置。sudo apt-get install ros-<ros_version>-gmapping
其中,<ros_version> 需要替换为你使用的 ROS 版本名称(如 melodic、noetic 等)。
四、实验
1. SLAM 建图
(1)配置gmapping(launch文件)
功能:下面这段代码的主要功能是启动
gmapping
节点,使用激光雷达和机器人自身的运动数据来进行 SLAM(同步定位与地图构建)。具体来说,它通过激光扫描获取环境信息,并将这些信息转化为地图,同时估算机器人在该地图中的位置。通过 SLAM,机器人可以在没有事先地图的情况下自动探索并创建自己的环境地图。要完成的工作:我们只需要配置好机器人坐标系和激光数据的相关参数。启动
gmapping
节点。让机器人在环境中移动,gmapping
会实时构建地图并定位机器人,它会帮你自动完成 SLAM 的工作。目录: 在功能包的launch目录下编写gmapping_slam.launch文件,如下所示:
<!-- 启动 gmapping 节点进行SLAM建图 --> <node pkg="gmapping" type="slam_gmapping" name="gmapping" output="screen"> <!-- 设置基本坐标框架 --> <param name="base_frame" value="$(arg set_base_frame)"/> <!-- 设置里程计坐标框架 --> <param name="odom_frame" value="$(arg set_odom_frame)"/> <!-- 设置地图坐标框架 --> <param name="map_frame" value="$(arg set_map_frame)"/> <!-- 设置地图更新的时间间隔(单位:秒) --> <param name="map_update_interval" value="2.0"/> <!-- 设置最大激光扫描距离 --> <param name="maxUrange" value="5.0"/> <!-- 设置激光噪声模型的标准差 --> <param name="sigma" value="0.05"/> <!-- 设置高斯滤波的核大小 --> <param name="kernelSize" value="1"/> <!-- 设置激光扫描的最小步长 --> <param name="lstep" value="0.05"/> <!-- 设置角度步长 --> <param name="astep" value="0.05"/> <!-- 设置迭代次数 --> <param name="iterations" value="5"/> <!-- 设置局部地图更新时的标准差 --> <param name="lsigma" value="0.075"/> <!-- 设置扫描增益 --> <param name="ogain" value="3.0"/> <!-- 设置跳过的局部地图更新数 --> <param name="lskip" value="0"/> <!-- 设置地图匹配的最低得分 --> <param name="minimumScore" value="50"/> <!-- 设置机器人运动噪声的标准差 --> <param name="srr" value="0.1"/> <param name="srt" value="0.2"/> <param name="str" value="0.1"/> <param name="stt" value="0.2"/> <!-- 设置线性和角度更新的阈值 --> <param name="linearUpdate" value="1.0"/> <param name="angularUpdate" value="0.2"/> <!-- 设置时间更新的阈值 --> <param name="temporalUpdate" value="0.5"/> <!-- 设置重采样的阈值 --> <param name="resampleThreshold" value="0.5"/> <!-- 设置粒子滤波的粒子数 --> <param name="particles" value="100"/> <!-- 设置地图边界 --> <param name="xmin" value="-10.0"/> <param name="ymin" value="-10.0"/> <param name="xmax" value="10.0"/> <param name="ymax" value="10.0"/> <!-- 设置地图分辨率 --> <param name="delta" value="0.05"/> <!-- 设置激光采样器的范围和步长 --> <param name="llsamplerange" value="0.01"/> <param name="llsamplestep" value="0.01"/> <param name="lasamplerange" value="0.005"/> <param name="lasamplestep" value="0.005"/> <!-- 将扫描话题重映射为传入的扫描话题名称 --> <remap from="scan" to="$(arg scan_topic)"/> </node> </launch>
代码中做了以下几件事:
①设置坐标系:定义了机器人、里程计(机器人位置数据)、和地图之间的坐标关系。
②配置 SLAM 参数:包括地图更新频率、激光扫描最大范围、噪声标准差、地图分辨率等。这些参数影响到地图的精度、更新速度以及机器人对环境的感知。
③设置激光传感器的行为:通过设置激光扫描的步长、增益、采样范围等来调整扫描的精度。
④重映射扫描话题:将接收到的激光数据从指定的
scan_topic
输入到slam_gmapping
,用于创建地图。
(2)启动机器人仿真(含机器人以及传感器)
(3)启动rviz可视化工具。
使用命令:rviz启动。启动完成后需要添加以下组件。
(4)运行gmapping节点
使用代码:roslaunch my_package gmapping_slam.launch simulation:=true