小车行走途中,对于临时加入的一些障碍物,他会有记忆功能,该障碍物即使移除,但如果不在小车扫描范围内,依旧会将该区域标记为障碍物,那么在规划路径的过程中,就会自动避开该障碍物,这一点对于路径规划很不友好。
那么如何让临时障碍物移除后,及时的被检测到,并且在地图中进行更新,从而使得路径规划更加准确。
起初以为局部地图范围扩大后就可以,但是发现没有影响,因此可能仅仅与障碍物层确定的小车检测障碍物的范围有关系。
l链接参考:
【移动机器人技术】move_base中障碍物无法清除的解决办法.
点击2D pose estimate有时会出现矫正不准确问题
但是此时小车规划的路径就会自动绕开障碍物了,除非小车正向行使到该区域,才会将其进行清除,缺点是会影响到整体的路径规划,因此,需要寻找方法对其没有的临时障碍物进行清除。
解决方案:
局部膨胀半径一定要小于全局膨胀半径才行。全局cost map中的障碍物膨胀半径如果比较大,那么全局规划的路径就不会特别逼近墙壁等固态障碍物,但是全局也不能取太大,否则会导致全局地图中识别到的障碍物膨胀区间偏大,从而占有了其应用的自由空间,只有当车辆移动到该位置附近时才能够识别,显示局部代价地图中的膨胀半径
局部:
inflation_layer:
# The radius in meters to which the map inflates obstacle cost values. (double, default: 0.55)
inflation_radius: 0.30
# A scaling factor to apply to cost values during inflation. The cost function is computed as follows for all cells in the costmap further than the inscribed radius distance and closer than the inflation radius distance away from an actual obstacle: exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1), where costmap_2d::INSCRIBED_INFLATED_OBSTACLE is currently 254. NOTE: since the cost_scaling_factor is multiplied by a negative in the formula, increasing the factor will decrease the resulting cost values. (double, default: 10.0)
cost_scaling_factor: 10.0
全局
inflation_layer:
# The radius in meters to which the map inflates obstacle cost values. (double, default: 0.55)
inflation_radius: 0.50
# A scaling factor to apply to cost values during inflation. The cost function is computed as follows for all cells in the costmap further than the inscribed radius distance and closer than the inflation radius distance away from an actual obstacle: exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1), where costmap_2d::INSCRIBED_INFLATED_OBSTACLE is currently 254. NOTE: since the cost_scaling_factor is multiplied by a negative in the formula, increasing the factor will decrease the resulting cost values. (double, default: 10.0)
cost_scaling_factor: 10.0
可尝试不直接订阅move_base的cmd_vel,订阅局部路径的cmd_vel试试
解决方案:了解下激光雷达扫描范围与高度等相关资料
VLP-16资料参考.
VLP-16激光雷达是Velodyne公司出品的型的3维激光雷达,保留了电机转速可调节的功能。实时上传周围距离和反射率的测量值。VLP-16具有100米的远量程测量距离。精巧的外观设计使得安装非常方便。重量轻,只有830g,非常适合安装在小型无人机和无人驾驶汽车,小型移动机器人上。每秒高达30万个点数据输出。±15°的垂直视场,360°水平视场扫描。IP67的防护等级。支持两次回波接收,可以测量次回波和**一次回波的距离值和反射强度值。
(二)产品特点:
● 16通道
● 0.5米~100米有效距离,测量盲区0~0.5米。
● 30万像素点/秒
● 双回路
● 防护设计
● +/-15度纵向扫描全角
● 360度横向扫描全角
● 103mm*72mm
● 重量830g
● 功耗低
了解后发现可能与move_base中选用的scan层为一线激光雷达有关,因此,打算继续回头修改move_base参数
(1)move_base_params.yaml
1)添加以下参数,原先没有
#在执行恢复行为之前允许计划重试的次数.默认为-1,表示全局规划失败后立即执行恢复模块。
max_planning_retries: -1
2)将该参数由原先的true修改为false
#确定机器人在尝试清理空间时是否尝试原地旋转。注意:此参数仅在使用默认恢复行为时使用,这意味着用户还没有将recovery_behavior参数设置为任何自定义值。(bool,默认值:true)
clearing_rotation_allowed: true
(2)local_costmap_params.yaml
inflation_layer:
# The radius in meters to which the map inflates obstacle cost values. (double, default: 0.55)
# 机器人与障碍物保持的最小距离,inflation_radius:膨胀半径,膨胀层会把障碍物代价膨胀直到该半径为止,一般将该值设置为机器人底盘的直径大小。
# 在这里,我们设置机器人的占用面积或机器人的半径是圆形。在指定占地面积的情况下,假设机器人的中心处于(0.0,0.0),并且支持顺时针和逆时针规格。
# 我们还将设定代价地图的膨胀半径。膨胀半径应设定为在代价地图的与障碍物保持安全的最大距离。例如,将膨胀半径设定为0.55米,意味着机器人针对相同的障碍物获取的所有路径都保持距离障碍物0.55米或更远。
# 如果你的机器人不能很好地通过窄门或其它狭窄的地方,则稍微减小这个值,相反地,如果机器人不断地撞到东西,则尝试增大这个值。
inflation_radius: 0.30 # 多将该值设置为机器人底盘的直径大小
此处将0.3修改为0.2
由0.1修改为0.05
resolution: 0.05 # 0.1 #0.05
(3)dwa_local_planner_params.yaml
# 平移速度最大值绝对值,此处进行了修改
max_trans_vel: 0.5 # 0.3
# x方向最大速度的绝对值,将0.3修改为0.5
max_vel_x: 0.5 #0.3
# x方向最小值绝对值,如果为负值表示可以后退,此处进行了修改,将数值降低了.
min_vel_x: 0.0 # -0.3
# 最小旋转速度的绝对值.路径规划到达点与目标点的角度允许偏差,将1.0修改为0。3
yaw_goal_tolerance: 0.3 #1.0
# 最小旋转速度的绝对值.路径规划到达点与目标点的距离允许偏差,将0.2修改为0.1
xy_goal_tolerance: 0.1 #0.2
# The number of samples to use when exploring the x velocity space (integer, default: 3)
# x方向速度空间的采样点数,将6修改为5.
vx_samples: 5 #6
# The number of samples to use when exploring the theta velocity space (integer, default: 20)
#旋转方向的速度空间采样点数,将5修改为6.
vtheta_samples: 6 # 5
此时需要观察catmap上的障碍物是如何占据栅格地图的
(1)了解栅格地图以及常见的几种地图
参考链接 4 利用激光传感器数据构建占据栅格地图.
读后感:
1)尺度地图:准确标注好了某一点的经纬度信息
2)拓扑地图:基于点与边进行连接构建的地图,多用于路径规划
3)语义地图:位于某一建筑物的哪一个方位,主要用于人机交互
4)占据栅格地图:基于激光传感器构建,实现同时定位与地图构建
(1)基于map下的导航与定位
在已知map情况下,对机器人位置进行估计,采用amcl蒙特卡罗算法,基于param.origin给定的初始位置,进行初始化粒子群——模拟粒子运动——计算粒子评分——模拟粒子重采样方式循环反复实验
导航功能包需要采集机器人的传感器信息,以达到实时避障的效果。这就要求机器人通过ros发布sensor_msgs/LaserScan或sensor_msgs/PointCloud2格式的消息,即二维激光信息或三维点云信息。
(1) 基于velodyne中的1线扫描到的局部代价地图与全局代价地图效果
图1 scan层为1线时构建的全局地图
对应代价地图中的程序为:
obstacle_layer:
max_obstacle_height: 2.0
obstacle_range: 3.0
raytrace_range: 4.0
track_unknown_space: false
footprint_clearing_enabled: true
observation_sources: scan
# scan: {data_type: LaserScan, topic: /scan, marking: true, clearing: true, expected_update_rate: 0, inf_is_valid: true}
scan:
topic: scan #/velodyne_points #scan
data_type: LaserScan #PointCloud2 # LaserScan
inf_is_valid: true
由图可知,scan话题名对应的消息类型为 LaserScan,程序中修改修改scan层的topic与data_type便可以决定是选择一线还是16线
(2)scan层改为16线结果展示
图2 scan层为16线时构建的全局地图
由图可知velodyne_points对应的消息类型为 PointCloud2
其对应程序为:
scan:
topic: velodyne_points #scan
data_type: PointCloud2 # LaserScan
修改scan层的topic与data_type便可以决定是选择一线还是16线
(3)实验结果分析
对比图1可以发现,图2中16线构建的全局地图完整,扫描范围更全面,具体原因为laser scan与PointCloud2的扫描范围不同
,如下图所示。
从图中可发现,1线雷达扫描范围明显低于16线。
#11 激光雷达介绍
多线激光雷达可以识别物体的高度信息并获取周围环境的3D扫描图(3D激光),主要应用于无人驾驶领域。
(1)RPLIDAR
一线激光雷达
(2)velodyne
16线激光雷达,共有5个
(3)镭神
(4)SICK
创客智造介绍比较详细,从安装到使用均进行了介绍
(1)原理介绍:
1)move_base正常工作后发送的twist给cmd_vel,获取机器人期望的前进速度与转弯速度,接着基于callback将其转换为左右轮的期望速度。此部分教程参考
ROS 教程之 navigation : 用 move_base 控制自己的机器人(1)
2)将左右轮速度转化为机器人离起点的x,y坐标和机器人的朝向角yaw,让move_base可以订阅到这个信息并做出相应的路径规划。此部分教程参考
[ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)](https://blog.csdn.net/heyijia0327/article/details/41831529.
(2)目标点的发送
基于程序发送目标点,让其在当前base_link的基础上前进1秒.
pure pursuit代码参考:
https://github.com/RobotnikAutomation/agvs
1 ROS 进阶学习笔记(17):ROS导航2:关于 move_base Package(底盘移动包).
2 路径规划参数解析(一)——move_base参数解析.
3 ROS:move_base参数解析.
4 利用激光传感器数据构建占据栅格地图.
5 costmap_2d 代价地图.
6 自主移动机器人常用的导航定位技术及原理.