实验四:Follow-the-Gap 避障算法

目标:在未知环境中寻找生路

文档目录

  1. FTG 算法核心思想
  2. 三步决策决策逻辑
  3. 关键调参指南
  4. 实战练习流程
  5. 安全保障守则

1 FTG 算法核心思想

1.1 什么是反应式避障?

比喻:就像在茂密的树林中跑校,你不需要地图。

  • 你只盯着前面的树(障碍物)
  • 哪里空隙大,你就往哪里钻
  • 核心:不靠地图,全凭雷达肉眼观察。

1.2 为什么叫 Follow-the-Gap?

  • Gap (空隙):指障碍物之间足够宽、可通行的区域。
  • 算法的目标就是不仅要避开树,还要冲向最开阔的地带

2 三步决策逻辑

2.1 避障口诀

  1. 过滤危险点:把太近的东西都看成障碍物。
  2. 寻找最大空隙:在视野里找最长的一段安全区。
  3. 选定方向:对准空隙的最中央,打方向盘冲过去!

2.2 逻辑示意图

说明:算法自动忽略小缝隙,选择最宽敞的通道。

3 关键调参指南

3.1 核心参数对应

概念 代码变量/作用 调教建议
安全距离阈值 threshold (米) 越大越保守,越早开始绕行
转向灵敏度 P 系数 越高转向越猛,太高会蛇形
避障余量 avoidance_angle 给车身留出的安全宽度

3.2 速度是风险放大器

  • 目前默认速度:1.7 m/s
  • 黄金法则:先调稳方向,再考虑提升速度。
  • 宁可跑得慢而稳,不要跑得快而碎。

4 运行与操作

4.1 核心运行方法

# 1. 启动避障控制节点
roslaunch tianracer_navigation follow_the_gap.launch

# 2. 交互观察终端输出
rostopic echo /ackermann_cmd_stamped

4.2 核心代码直觉

follow_the_gap.py 中:

# 第一步:把小于 threshold 的点标记为障碍
lis = [1 if a > threshold else 0 for a in dis_list]

# 第二步:寻找最长连续为 1 的区域
gap_list = get_gap(dis_list, threshold)
target_angle = (end_idx + start_idx) / 2 # 取中央

# 第三步:映射到转向指令
steering_angle = - target_angle * P

5 实践任务流程

B1 空隙观察体验 (8min)

  1. 站在场地外,肉眼观察障碍物布局。
  2. 每一个组员指一个你认为最空的方向。
  3. 思考:如果雷达扫到这边,距离数值是变大还是变小?

B2 示例程序试跑 (15min)

  1. 放置少量锥桶(间距拉大)。
  2. 启动程序,手指放在遥控切换开关上。
  3. 观察:车子是直接撞上去,还是优雅地绕开了?
  4. 异常即停:如果发现车子自杀式冲锋,立即接管!

B3 参数优化 (12min)

  1. 变量控制:一次只改一个参数(如只改 threshold)。
  2. threshold 从 0.5 变到 1.5,观察车子是不是更胆小了?
  3. P 系数调小,观察车子转弯是不是变温柔了?

B4 无碰撞挑战 (5min)

  1. 加密障碍物,布置一个丛林场景。
  2. 全程不准手动干预。
  3. 达标标准:不碰倒一个锥桶,跑完全程。

6 安全第一

6.1 观察员准则

  • 手柄不离手:时刻握着遥控器,拇指扣在模式切换键。
  • 眼神不离车:不要看电脑屏幕,盯着车的每一个动作。
  • 安全裕量:不要等快撞了才接管,早接管、早保命。

6.2 常见问题救场

  • 车左右猛摆(蛇形):降低转向灵敏度 P
  • 车反应太迟钝:增大安全距离阈值。
  • 传感器异常:报错或无响应时,先断电重启,再查话题。

感谢学习!

本课产出检查点:

  1. 能说出 FTG 的三步走逻辑。
  2. 成功完成一次丛林场景无碰撞通关。
  3. 提交一份包含 3 次调参对比的记录表。
反应式避障