概述
基于鲁班猫1S与2D激光雷达,在ROS2 Iron下对正阿克曼结构测试车(300mm×195mm,速100mm/s)进行了动态窗口法和规则式避障法的测试
动态窗口避障法
原理
动态窗口法(Dynamic Window Approach, DWA)通过评估车辆在当前速度空间内的多个可能轨迹,选择最优的无碰撞路径。本实现针对低速场景进行了优化,专注于前方400mm内的障碍物检测。
算法实现(简化)
def check_obstacle(ranges, safety_distance):
"""
检查是否有障碍物
输入:
- ranges: 激光雷达距离数组
- safety_distance: 安全距离阈值
输出:
- 布尔值,True表示检测到障碍物,False表示无障碍物
"""
return np.min(ranges) < safety_distance
def find_safe_direction(ranges, angles, safety_distance):
"""
寻找安全方向
输入:
- ranges: 激光雷达距离数组
- angles: 对应的角度数组(弧度)
- safety_distance: 安全距离阈值
输出:
- 安全方向的角度值(弧度),从中心向左右两侧搜索,找到第一个安全的方向
"""
for direction in [-1, 1]:
for center_offset in range(0, len(angles)//2, 5):
center_idx = len(angles)//2 + direction * center_offset
if 0 <= center_idx < len(angles) and ranges[center_idx] > safety_distance:
return angles[center_idx]
return 0.0 # 默认直行
规则式避障法
原理
规则式避障法将车辆前方区域划分为多个扇区,根据障碍物所在扇区应用预定义的避障规则。这种方法计算量小,响应快,适合资源受限的嵌入式系统。
算法实现(简化)
def detect_sector_obstacles(ranges, angles, safety_distance, sectors):
"""
检测各扇区是否有障碍物
输入:
- ranges: 激光雷达距离数组
- angles: 对应的角度数组(弧度)
- safety_distance: 安全距离阈值
- sectors: 扇区定义字典,键为扇区名称,值为角度范围元组(min_angle, max_angle)
输出:
- 字典,键为扇区名称,值为布尔值,True表示该扇区有障碍物
"""
obstacles = {sector: False for sector in sectors}
for i, dist in enumerate(ranges):
if dist < safety_distance:
angle = angles[i]
for sector, (min_angle, max_angle) in sectors.items():
if min_angle <= angle <= max_angle:
obstacles[sector] = True
break
return obstacles
def apply_avoidance_rules(obstacles, max_speed):
"""
根据障碍物位置应用避障规则
输入:
- obstacles: 各扇区障碍物检测结果字典
- max_speed: 最大行进速度
输出:
- 字典,包含线速度和角速度控制指令
"""
# 前方无障碍物,直行
if not obstacles['front']:
return {'linear': max_speed, 'angular': 0.0}
# 前方有障碍物,但左右前方无障碍物
if not obstacles['left_front'] and not obstacles['right_front']:
linear = max_speed * 0.7
angular = 0.5 if not obstacles['left'] else -0.5
return {'linear': linear, 'angular': angular}
# 左前方有障碍物
if obstacles['left_front'] and not obstacles['right_front']:
return {'linear': max_speed * 0.6, 'angular': -0.7}
# 右前方有障碍物
if obstacles['right_front'] and not obstacles['left_front']:
return {'linear': max_speed * 0.6, 'angular': 0.7}
# 左右前方都有障碍物
linear = -max_speed * 0.5
angular = 0.5 if not obstacles['left'] else -0.5
return {'linear': linear, 'angular': angular}
扇区划分示意
- 左扇区: 90° ~ 120°
- 左前扇区: 120° ~ 160°
- 前扇区: -160° ~ 200°
- 右前扇区: 200° ~ 240°
- 右扇区: 240° ~ 270°
避障规则
- 前方无障碍物:直行
- 前方有障碍物,但左右前方无障碍:选择障碍物较少的一侧转向
- 左前方有障碍物:向右转向避开
- 右前方有障碍物:向左转向避开
- 左右前方都有障碍物:后退并转向障碍物较少的一侧
性能评估与优化
计算复杂度
- 动态窗口法: O(n) + O(m),其中n是激光点数,m是搜索窗口数
- 规则式避障法: O(n),其中n是激光点数
实时性考虑
两种算法均设计为在鲁班猫1S上实时运行,计算延迟小于100ms,满足100mm/s速度的避障需求。
优缺点分析
1. 动态窗口法 (Dynamic Window Approach - DWA)
优点:
- 动态性与灵活性:核心优势在于它是一个局部规划器,不是简单的反应式行为。它会在速度空间 (v, ω) 中采样多个未来轨迹,并从中选出最优的一条,因此能生成更平滑、更合理的路径。
- 符合动力学约束:生成的轨迹基于当前速度,考虑了机器人的加减速能力和最大速度,理论上更安全,更符合实际机器人的运动特性。
- 目标导向:可以很容易地将全局目标(如一个目标点)作为评价函数的一部分,使得局部避障行为始终服务于到达最终目的地这个大目标。
- 应对复杂场景:在拥挤、动态变化的环境中表现更好,因为它持续地评估多条未来路径。
缺点:
- 计算复杂度较高:需要实时采样和评估大量轨迹,对计算资源有一定要求。虽然在现代处理器上不是问题,但在资源极其受限的嵌入式平台(如低端MCU)上可能是个挑战。
- 参数调优复杂:性能高度依赖于评价函数中各个权重参数(目标朝向、速度、安全距离等)的 tuning,需要经验才能调到最佳状态。
- 局部极小值问题:和所有局部规划器一样,容易陷入“U”形或狭长走廊等局部极小值场景,导致机器人来回振荡或停止,需要上层 recovery behaviors(如 recovery_sm)来拯救。
- 依赖环境感知质量:如果传感器(激光雷达)出现大量噪声、丢失数据或检测不到某些障碍物(如玻璃、黑色物体),规划出的轨迹可能不安全。
2. 规则式(反应式)避障法 (Reactive Rule-Based)
优点:
- 计算效率极高:逻辑简单,基本是
if-else条件判断,计算开销极小,响应延迟极低,非常适合计算能力弱的硬件平台。 - 简单可靠,易于实现和调试:逻辑清晰直观,出现问题时非常容易定位和修复。行为是可预测的。
- 实时性最强:因为它几乎是对传感器数据的直接反射,没有任何复杂的规划过程,所以反应速度最快。
- 资源消耗低:不依赖复杂的数据结构和算法,内存和CPU占用都很少。
缺点:
- 行为短视且可能不优:缺乏前瞻性。可能产生“短视”行为,例如在狭窄通道中左右摇摆,或者选择一条能立即避开但会导致后续更麻烦的路径(如死胡同)。
- 难以融入全局目标:很难让机器人的行为与一个遥远的全局目标协调一致。它可能为了避开正前方的障碍物而转向,却完全背离了目标方向。
- 规则组合爆炸:为了处理所有可能的复杂场景(如多个障碍物以特定方式组合),需要编写的规则会非常多,且规则之间可能产生冲突,系统会变得难以维护。
- 运动可能不平滑:行为基于离散的扇区和规则,可能导致控制输出突变,使机器人运动不够平滑。
总结对比
| 特性 | 动态窗口法 (DWA) | 规则式避障法 |
|---|---|---|
| 本质 | 局部轨迹规划 | 反应式行为 |
| 计算量 | 中~高 | 极低 |
| 平滑性 | 高(连续优化) | 低(可能突变) |
| 前瞻性 | 有(模拟轨迹) | 无(仅当前状态) |
| 目标导向 | 容易实现 | 难以实现 |
| 参数调优 | 复杂 | 简单 |
| 代码复杂度 | 中 | 低 |
| 适用场景 | 复杂、动态环境 | 简单、结构化环境或算力受限 |
结论
动态窗口法适合复杂环境下的精细避障,而规则式避障法适合简单环境下的快速响应。 实际部署时,可根据具体应用场景选择合适的避障策略,或结合两种方法的优点实现自适应避障系统。
零零散散,磕磕绊绊自学,我的ROS机器人需要完善的地方还有很多啊!!!!!
问题
- 缺乏多传感器融合,仅依赖激光雷达。
- 没有与全局规划器配合,是一个纯粹的局部避障节点,无法完成从A点到B点的自主导航。
- 可能没有使用分层代价地图,而是直接处理激光数据。
改进构思
1. 传感器融合 (Sensor Fusion)
- 融合视觉(摄像头):激光雷达提供精确的距离但缺乏纹理和语义信息。摄像头可以识别障碍物的类型(是人、车、还是草?)、读取交通标志、检测可穿越区域(如草地)。在动态环境中,视觉还能帮助区分动态和静态障碍物。
- 融合深度相机:如 奥比中光Gemini Pro,能解决激光雷达对地面以上障碍物(如桌角、伸出的树枝)检测的盲区问题。
- 融合IMU和轮式里程计:提供更可靠的状态估计。
2. 算法优化与升级
- Timed-Elastic-Band (TEB) 局部规划器:DWA进化版。直接优化整个未来的轨迹序列,同时考虑时间戳。生成的路径更优、更平滑,能明确优化到达时间,并且更好地遵守机器人的动力学约束。