实验三:巡墙巡航 (Wall Following)

目标:掌握自动驾驶中的贴墙走生存技巧

文档目录

  1. 巡墙算法定义
  2. 核心原理与代码解析
  3. 运行与实车校准
  4. 安全守则与团队分工
  5. 调参记录卡

1 什么是巡墙?

1.1 闭眼走廊实验

想象你闭着眼走在走廊里,用手摸着右边的墙:

  • 手感觉离墙远了 -> 身体往右靠
  • 手感觉离墙近了 -> 身体往左躲

巡墙直觉
在靠近与远离之间通过反馈达到动态平衡。

1.2 核心闭环逻辑

巡墙本质上是一个目标 - 修正的过程:

  1. 目标距离:你想离墙多远(如 0.5 米)
  2. 当前距离:雷达实时测量的距离
  3. 产生误差error = 目标距离 - 当前距离
  4. 执行修正:误差越大,转向修正应该越强。

2 核心原理与代码解析

2.1 极简控制律(P 控制)

转向角 = Kp 误差

  • Kp (比例系数):决定了纠偏的力度。
  • Kp 太大:车会剧烈晃动,甚至撞墙
  • Kp 太小:车修正太慢,转不过弯

2.2 核心代码实现 (几何计算)

wall_following.py 中,我们计算车身相对于墙的角度:

# 获取正右方(b)和右前方(a)的距离
b = get_range(data, -90)
a = get_range(data, -30) # THETA 为 60 度

# 计算车身与墙的夹角 alpha
alpha = np.arctan((a * np.cos(THETA) - b) / (a * np.sin(THETA)))

# 计算垂直距离 AB
AB = b * np.cos(alpha)

2.3 核心代码实现 (预测与控制)

为了防止修正过迟,我们要预测未来的位置:

# 预测未来距离 (LOOK_AHEAD_DIS = 3米)
projected_dis = AB + LOOK_AHEAD_DIS * np.sin(alpha)

# 计算误差并应用比例增益 P
error = TARGET_DIS - projected_dis
steering_angle = P * error

# 发布 Ackermann 控制消息
drive_msg.drive.steering_angle = steering_angle
drive_msg.drive.speed = speed

2.4 速度与转向的关系

核心车感:油门越大,方向盘越灵敏。

  • 同样的转向角,在高速时走线变化更激烈。
  • 直觉:速度是风险放大器,调参前先降速。
  • 目标:通过调参将蛇形变成滑顺的直线。

3 运行与操作

3.1 运行方法

启动巡墙控制节点及其仿真/驱动环境:

# 启动巡墙完整环境
roslaunch tianracer_navigation wall_following.launch

观察重点
小车在直道上是否能维持稳定距离?摆动是否在可接受范围内?

3.2 选扇区:靠墙校准

启动前,必须确认哪个数据代表右墙:

  1. 将小车平行靠近右墙。
  2. 观察终端输出的五扇区数值。
  3. 找出变化最明显的那个数(R 或 RF)。
  4. 决策:锁定该扇区作为算法的眼睛。

4 安全与分工

4.1 角色分工

每组执行任务时必须有三个角色:

  • 电脑员:启动代码、监控输出、记录数据
  • 接管员手不离手柄,随时准备切回手动
  • 复位员:盯着车看(不看屏),负责搬车复位

铁律:异常发生时,先切手动,再查原因。

4.2 停得住验证

落地首跑前必须执行:

  1. 架起车辆(使车轮悬空)。
  2. 切换到自动模式,确认轮子正常转动。
  3. 立刻切回手动接管,确信轮子瞬间停止。
  4. 只有确信急停逻辑百分百可靠,才允许落地。

5 调参记录卡

跑通不是终点,可复现才是!

参数项 记录内容
巡墙侧别 左墙 / 右墙
选用扇区 如 R / RF
目标距离 如 0.5m
运行速度 建议 0.5 ~ 1.0 m/s
增益 (Kp) 初始建议 1.0

救场策略总结

  • 车左右猛摆:降速!降 Kp!
  • 车转向不足(切弯太狠):减小限幅 或 提前感知。
  • 车离墙越来越远:检查误差公式的正负号是否写反。

感谢学习!

本课产出检查点:

  1. 能够用代码解释 alpha 的作用。
  2. 完成一次稳定的巡墙通关。
  3. 提交一份包含有效参数的记录卡。