ros导航避障

move_base

它通过订阅激光雷达、map地图、amcl的定位等数据,然后规划出全局和局部路径,再将路径转化为机器人的速度信息,最终实现机器人导航。

move_base包采用action机制接受导航goal,然后移动机器人底座到达指定的goal。 这个过程中move_base node将同时利用局部规划器和全局规划器来完成导航任务:
(1) 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划;
(2) 本地实时规划(local planner):根据附近的障碍物进行躲避路线规划。

支持任何一种继承了nav_core包中nav_core::BaseGlobalPlanner接口的全局规划器和nav_core包中nav_core::BaseLocalPlanner接口的局部规划器。

在此过程中,move_base维护者2个代价地图,一个是用于全局规划器的全局代价地图,另一个是用于局部规划器的局部代价地图。

全局路径规划 和 局部路径规划

目前ROS中可以使用的global planner主要包括:A*和Dijkstra。local planner主要有:dwa、trajectory、teb和eband等。teb local planner效果会好点。
二者如何关联:将global planner作为local planner的一个初始参考或者优化方向。

全局路径规划

在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。 navfn通过Dijkstra等最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。http://www.ros.org/wiki/navfn?distro=fuerte

局部路径规划

本地的实时规划(局部路径规划)是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。

base_local_planner这个包通过地图数据,用算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。 其中,Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下:
(1) 采样机器人当前的状态(dx,dy,dtheta);
(2) 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
(3) 利用一些评价标准为多条路线打分。
(4) 根据打分,选择最优路径。
(5) 重复上面过程。

http://www.ros.org/wiki/base_local_planner?distro=groovy

模块

  • amcl模块是ROS的导航定位模块,amcl通过订阅scan、map和tf信息,发布出机器人的pose,以供move_base使用。(可选)
  • odom,即机器人里程计信息,
  • map,顾名思义,我们需要的先验地图信息,一般通过slam建图后保存。

ROS中主流的slam算法有:

1.gmapping:需要激光雷达scan数据和里程计odom数据,采用的是PF(粒子滤波)。
2.hector :基于优化的算法(解最小二乘问题),优缺点:不需要里程计,但对于雷达帧率要求很高40Hz,估计6自由度位姿,可以适应空中或者地面不平坦的情况。初值的选择对结果影响很大,所以要求雷达帧率较高。
3.Cartographer:累计误差较前两种算法低,能天然的输出协方差矩阵,后端优化的输入项。成本较低的雷达也能跑出不错的效果。
4. rtabmap: RTAB-Map是具有实时约束的RGB-D SLAM方法

  • map_server包通过解析slam建好的地图并发布出去。
  • sensor topic 在局部路径规划时起到作用.

代价地图

costmap为代价地图,目前主要的有inflation_layer、obstacle_layer、static_layer、voxel_layer四个plugins,分别为膨胀层、障碍物层、静态层和体素层。

  • 全局路径一般需要静态层和膨胀层,因为全局规划应该只考虑到地图信息,所以一般都是静态的。
  • 局部路径规划则需要考虑到实时的障碍物信息,所以需要障碍物层和膨胀层

为什么不把静态层放到局部路径规划里呢?因为我们的定位是会存在误差的,比如轮子打滑或其他情况,这个时候amcl会起到纠正作用,如果我们把静态层放到了局部中,这个定位会有问题,而且,假设当前机器人出现了定位的偏差,那么这个引入的静态层肯定是错误的,再加上局部的障碍物层(这里的障碍物层本应该和静态层重合的,但由于定位偏差,不会重合)可能会使得机器人误以为自己在障碍物层内,规划出现问题。

配置文件

move_base使用前需要配置一些参数:运行成本、机器人半径、到达目标位置的距离,机器人移动的速度,这些参数都在配置文件中: base_local_planner_params.yaml ,costmap_common_params.yaml , global_costmap_params.yaml ,local_costmap_params.yaml

local_costmap_params等文件可以配置图层https://blog.csdn.net/qq_41925420/article/details/94379892

https://blog.csdn.net/qq_41925420/article/details/94379892
https://blog.csdn.net/shenghuaijing3314/article/details/80005629
https://www.guyuehome.com/270
https://blog.csdn.net/u013834525/article/details/84627204
http://wiki.ros.org/teb_local_planner/Tutorials

  • 1
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS小车避障策略的核心代码包括以下几个方面: 1. 激光雷达数据获取:使用ROS中的雷达传感器包(laser_scan_matcher)订阅雷达传感器数据,获取激光雷达扫描的距离和角度信息。 2. 障碍物检测:根据激光雷达扫描的距离和角度信息,进行障碍物检测。可以使用简单的阈值法,将距离小于一定值的点视为障碍物,或者使用更复杂的算法,如聚类算法、分割算法等。 3. 路径规划:在检测到障碍物后,需要规划出一条可行的路径以绕过障碍物。可以使用ROS中的导航包(navigation)提供的路径规划功能,或者自己实现路径规划算法。 4. 控制指令生成:根据规划出的路径,生成小车的控制指令,使小车能够按照规划好的路径行驶。可以使用ROS中的控制包(control)提供的控制指令生成功能,或者自己实现控制指令生成算法。 下面是一个简单的示例代码,实现了基于激光雷达的障碍物检测和路径规划功能: ```python import rospy from sensor_msgs.msg import LaserScan from nav_msgs.msg import Path from geometry_msgs.msg import PoseStamped class ObstacleAvoidance: def __init__(self): rospy.init_node('obstacle_avoidance') self.scan_sub = rospy.Subscriber('/scan', LaserScan, self.scan_callback) self.path_pub = rospy.Publisher('/path', Path, queue_size=10) self.path = Path() def scan_callback(self, scan_msg): # 障碍物检测算法 obstacles = [] for i in range(len(scan_msg.ranges)): if scan_msg.ranges[i] < 0.5: obstacles.append((i, scan_msg.ranges[i])) # 路径规划算法 path = Path() for i in range(len(obstacles)): pose = PoseStamped() pose.pose.position.x = obstacles[i][1] * cos(obstacles[i][0] * scan_msg.angle_increment) pose.pose.position.y = obstacles[i][1] * sin(obstacles[i][0] * scan_msg.angle_increment) path.poses.append(pose) # 发布路径消息 self.path_pub.publish(path) def run(self): rate = rospy.Rate(10) while not rospy.is_shutdown(): rate.sleep() if __name__ == '__main__': node = ObstacleAvoidance() node.run() ``` 这个示例代码实现了一个简单的ROS节点,订阅了激光雷达的数据,通过简单的阈值法检测障碍物,并根据障碍物的位置生成一条路径,最后将路径发布出去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值