1. 后轮转向技术概述
作为一名参加过多次电子设计大赛智能车比赛的选手,我深刻体会到后轮转向(RWS)技术在特定场景下的巨大优势。与常见的前轮转向(FWS)不同,后轮转向通过改变后轮的转向角度来实现车辆转向,这种设计在低速机动性和狭窄空间操作方面表现尤为出色。
后轮转向的核心价值在于它改变了车辆的转向中心位置。传统前轮转向时,转向中心位于后轴延长线上;而后轮转向则将转向中心移至前轴延长线,这种几何关系的变化带来了完全不同的运动特性。在实际比赛中,我们团队通过对比测试发现,在相同轴距条件下,后轮转向车辆的最小转弯半径可比前轮转向减少约30%,这在需要频繁急转弯的赛道环境中优势明显。
2. 转向方式对比分析
2.1 基本转向方式特性对比
在车辆转向系统设计中,主要存在三种基本转向方式:
-
前轮转向(FWS):
- 最常见的设计方案
- 高速稳定性好
- 转向半径相对较大
- 转向中心位于后轴延长线上
-
后轮转向(RWS):
- 低速机动性极佳
- 可实现更小的转弯半径
- 高速时稳定性较差
- 转向中心位于前轴延长线上
- 叉车、堆高机等特种车辆常用
-
四轮转向(4WS):
- 灵活性最高
- 可实现多种转向模式
- 控制系统复杂
- 成本较高
- 转向中心位置可变
2.2 四轮转向的衍生模式
四轮转向系统通过组合前后轮的转向角度,可以衍生出多种特殊转向模式:
| 转向模式 | 前后轮转向关系 | 特点 | 适用场景 |
|---|---|---|---|
| 同向转向 | 同方向 | 车身侧偏角大 | 高速变道 |
| 反向转向 | 反方向 | 转弯半径极小 | 低速机动 |
| 蟹行模式 | 同角度同向 | 实现斜向移动 | 平行泊车 |
| 原地旋转模式 | 同角度反向 | 转向中心在车辆中心 | 极狭窄空间转向 |
在实际比赛中,我们团队发现反向转向模式在通过急弯时特别有效,而蟹行模式则可以帮助车辆在狭窄的停车区域轻松调整位置。
3. 转向运动学模型
3.1 阿克曼转向几何原理
阿克曼转向几何是车辆转向设计的理论基础,它确保了车辆在转向时所有车轮都能保持纯滚动,避免轮胎打滑。其核心条件包括:
- 所有车轮的瞬时速度方向都指向转向中心
- 内侧轮转角大于外侧轮转角
几何关系表达式:
code复制cot(δ_R) - cot(δ_L) = W / L
R = L / tan(δ)
其中:
- δ_R、δ_L:右轮和左轮转角
- W:轮距
- L:轴距
- R:转弯半径
- δ:等效转向角
3.2 后轮转向运动学方程
后轮转向的运动学模型与前轮转向有显著不同。我们使用自行车模型进行简化,建立如下运动学方程:
c复制typedef struct {
float L; // 轴距
float W; // 轮距
float Lf; // 前轴到质心距离
float Lr; // 后轴到质心距离
} VehicleParams;
typedef struct {
float x, y; // 位置坐标
float theta; // 航向角
float v; // 速度
float delta_f; // 前轮转角
float delta_r; // 后轮转角
} VehicleState;
void rws_kinematics(const VehicleParams *params, VehicleState *state, float dt) {
float v = state->v;
float theta = state->theta;
float delta_r = state->delta_r;
float L = params->L;
float Lr = params->Lr;
// 车身侧偏角
float beta = atanf(Lr * tanf(delta_r) / L);
// 角速度 (绕前轴)
float omega = v * sinf(beta) / Lr;
// 更新状态
state->x += v * cosf(theta + beta) * dt;
state->y += v * sinf(theta + beta) * dt;
state->theta += omega * dt;
// 角度归一化
while (state->theta > M_PI) state->theta -= 2 * M_PI;
while (state->theta < -M_PI) state->theta += 2 * M_PI;
}
这个模型清晰地展示了后轮转向的几个关键特点:
- 车辆绕前轴转动
- 后轴会产生明显的侧向位移
- 低速时转弯半径小
- 高速时容易产生"甩尾"现象
3.3 四轮转向运动学模型
四轮转向模型更加复杂,但提供了最大的灵活性:
c复制void four_wheel_steering_kinematics(const VehicleParams *params,
VehicleState *state, float dt) {
float v = state->v;
float theta = state->theta;
float delta_f = state->delta_f;
float delta_r = state->delta_r;
float L = params->L;
float Lf = params->Lf;
float Lr = params->Lr;
// 车身侧偏角
float beta = atanf((Lf * tanf(delta_r) + Lr * tanf(delta_f)) / L);
// 角速度
float omega = v * cosf(beta) * (tanf(delta_f) - tanf(delta_r)) / L;
// 更新状态
state->x += v * cosf(theta + beta) * dt;
state->y += v * sinf(theta + beta) * dt;
state->theta += omega * dt;
// 角度归一化
while (state->theta > M_PI) state->theta -= 2 * M_PI;
while (state->theta < -M_PI) state->theta += 2 * M_PI;
}
4. 硬件系统设计
4.1 整体架构设计
四驱后轮转向小车的硬件架构主要包括以下几个关键部分:
- 主控制器:通常选用STM32F4或ESP32等高性能微控制器
- 驱动系统:4个直流电机或轮毂电机,配合电机驱动器
- 转向系统:2个转向舵机或步进电机,带转向角反馈
- 传感系统:编码器、IMU、摄像头等
典型的机械参数配置:
- 轴距:200-350mm
- 轮距:150-250mm
- 车轮直径:60-80mm
- 最大转角:±30°
- 最大速度:2-5 m/s
4.2 转向机构设计方案比较
在实际制作中,我们尝试了多种转向机构设计方案:
-
舵机+连杆式:
- 优点:结构简单,成本低
- 缺点:存在间隙,转向精度一般
- 适用:预算有限的中低速场景
-
舵机直驱式:
- 优点:无间隙,精度高
- 缺点:舵机承受侧向力大
- 适用:高精度要求的场合
-
步进电机+同步带:
- 优点:精度最高,扭矩大
- 缺点:成本高,体积大
- 适用:专业级比赛车辆
-
轮毂电机+独立转向:
- 优点:运动最灵活
- 缺点:控制系统复杂
- 适用:高级研究项目
经过多次测试,我们发现对于大多数电子设计大赛的应用场景,舵机+连杆式方案在成本和性能之间取得了较好的平衡。
4.3 舵机控制实现
舵机控制是转向系统的核心,我们实现了以下关键功能:
c复制typedef struct {
TIM_HandleTypeDef *htim;
uint32_t channel;
uint16_t min_pulse; // 最小脉宽 (us)
uint16_t max_pulse; // 最大脉宽 (us)
uint16_t center_pulse; // 中位脉宽 (us)
float min_angle; // 最小角度 (°)
float max_angle; // 最大角度 (°)
float current_angle; // 当前角度
} ServoConfig;
void servo_set_angle(ServoConfig *servo, float angle) {
// 限制角度范围
if (angle < servo->min_angle) angle = servo->min_angle;
if (angle > servo->max_angle) angle = servo->max_angle;
// 角度转脉宽
float range = servo->max_angle - servo->min_angle;
float pulse_range = servo->max_pulse - servo->min_pulse;
uint16_t pulse = servo->min_pulse +
(angle - servo->min_angle) * pulse_range / range;
// 设置PWM
__HAL_TIM_SET_COMPARE(servo->htim, servo->channel, pulse);
servo->current_angle = angle;
}
在实际应用中,我们还实现了舵机平滑移动功能,防止机械冲击:
c复制void servo_move_smooth(ServoConfig *servo, float target_angle, float speed_dps) {
float current = servo->current_angle;
float delta = target_angle - current;
float step = speed_dps * 0.02f; // 假设20ms周期
if (fabsf(delta) <= step) {
servo_set_angle(servo, target_angle);
} else if (delta > 0) {
servo_set_angle(servo, current + step);
} else {
servo_set_angle(servo, current - step);
}
}
5. 四轮驱动控制
5.1 差速计算与实现
四轮驱动控制的关键在于正确计算各轮的速度差。我们基于车辆运动学模型实现了差速计算:
c复制void calc_wheel_speeds(const VehicleParams *params,
float velocity, float delta_f, float delta_r,
float speeds[4]) {
float L = params->L;
float W = params->W;
// 计算转弯半径
float R = calc_turn_radius(params, delta_f, delta_r);
if (isinf(R) || fabsf(R) > 100) {
// 直行情况
speeds[WHEEL_FL] = velocity;
speeds[WHEEL_FR] = velocity;
speeds[WHEEL_RL] = velocity;
speeds[WHEEL_RR] = velocity;
return;
}
// 计算角速度
float omega = velocity / R;
// 各轮到转向中心的距离
float icr_x = 0; // 转向中心x坐标(相对后轴中心)
float icr_y = R; // 转向中心y坐标
// 各轮位置
float wheel_pos[4][2] = {
{L, W/2}, // FL
{L, -W/2}, // FR
{0, W/2}, // RL
{0, -W/2} // RR
};
// 计算各轮速度
for (int i = 0; i < 4; i++) {
float dx = wheel_pos[i][0] - icr_x;
float dy = wheel_pos[i][1] - icr_y;
float r_wheel = sqrtf(dx*dx + dy*dy);
speeds[i] = omega * r_wheel;
}
// 保持平均速度为目标速度
float avg_speed = (speeds[0] + speeds[1] + speeds[2] + speeds[3]) / 4;
float scale = velocity / avg_speed;
for (int i = 0; i < 4; i++) {
speeds[i] *= scale;
}
}
5.2 驱动控制主循环
驱动控制主循环负责协调各轮的速度和方向:
c复制void four_wheel_drive_control(float velocity, float delta_f, float delta_r) {
static VehicleParams params = {
.L = 0.30f,
.W = 0.20f,
.Lf = 0.15f,
.Lr = 0.15f
};
float wheel_speeds[4];
calc_wheel_speeds(¶ms, velocity, delta_f, delta_r, wheel_speeds);
// 设置各轮速度
for (int i = 0; i < 4; i++) {
wheel_set_speed(&wheels[i], wheel_speeds[i]);
}
}
6. 路径跟踪算法
6.1 后轮转向Pure Pursuit控制器
后轮转向的Pure Pursuit算法需要特别设计,因为传统的前视点选择策略不再适用。我们实现了以下改进版本:
c复制typedef struct {
float lookahead_dist;
float min_lookahead;
float max_lookahead;
float lookahead_gain;
} PurePursuitConfig;
float pure_pursuit_rws(const VehicleParams *params,
float x, float y, float theta, float velocity,
float target_x, float target_y) {
// 计算到目标点的向量(车辆坐标系)
float dx = target_x - x;
float dy = target_y - y;
// 转换到车辆坐标系
float cos_th = cosf(-theta);
float sin_th = sinf(-theta);
float local_x = dx * cos_th - dy * sin_th;
float local_y = dx * sin_th + dy * cos_th;
// 计算前视距离
float L_d = sqrtf(local_x * local_x + local_y * local_y);
if (L_d < 0.01f) {
return 0;
}
// 计算后轮转向角
float L = params->L;
float alpha = atan2f(local_y, local_x);
float delta_r = atanf(L * sinf(alpha) / (L_d - L * cosf(alpha)));
// 限制最大转角
float max_angle = 30 * M_PI / 180;
if (delta_r > max_angle) delta_r = max_angle;
if (delta_r < -max_angle) delta_r = -max_angle;
return delta_r;
}
6.2 四轮转向路径跟踪
对于四轮转向系统,我们实现了更智能的转向模式自动选择:
c复制typedef enum {
STEER_MODE_FRONT_ONLY,
STEER_MODE_REAR_ONLY,
STEER_MODE_OPPOSITE,
STEER_MODE_SAME,
STEER_MODE_FRONT_DOMINANT,
STEER_MODE_PIVOT
} SteerMode;
SteerMode auto_select_steer_mode(float velocity) {
float abs_v = fabsf(velocity);
if (abs_v < 0.5f) {
return STEER_MODE_OPPOSITE; // 极低速:反向转向
} else if (abs_v < 2.0f) {
return STEER_MODE_OPPOSITE; // 低速:反向转向
} else if (abs_v < 5.0f) {
return STEER_MODE_FRONT_DOMINANT; // 中速:前轮为主
} else {
return STEER_MODE_SAME; // 高速:同向转向
}
}
7. 实际应用经验与优化建议
7.1 参数调优经验
通过多次比赛实践,我们总结了以下参数调优经验:
-
转向比例系数:
- 低速时后轮转向比例可设为前轮的-0.8~-1.0
- 高速时后轮转向比例设为前轮的0.3~0.5
-
速度阈值设置:
- 模式切换速度阈值建议:
- 极低速模式:<0.5 m/s
- 低速模式:0.5-2.0 m/s
- 中速模式:2.0-5.0 m/s
- 高速模式:>5.0 m/s
- 模式切换速度阈值建议:
-
前视距离调整:
- 低速时:0.3-0.5m
- 高速时:1.0-1.5m
- 动态调整公式:lookahead = min_lookahead + lookahead_gain * velocity
7.2 常见问题与解决方案
在实际应用中,我们遇到了以下典型问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 高速时车辆不稳定 | 后轮转向角度过大 | 降低高速时的后轮转向比例 |
| 转向响应迟缓 | 舵机响应速度慢 | 使用更高性能舵机或步进电机 |
| 路径跟踪精度不足 | 前视距离设置不当 | 根据速度动态调整前视距离 |
| 急转弯时内侧轮打滑 | 差速分配不合理 | 优化差速算法,降低内侧轮速度 |
| 转向机构有间隙 | 机械连接不牢固 | 改用刚性更好的连杆机构 |
7.3 性能优化技巧
-
转向平滑处理:
- 对转向指令进行低通滤波
- 限制转向角变化率
- 实现渐进式转向调整
-
速度自适应控制:
- 根据速度自动调整控制参数
- 低速时提高转向响应速度
- 高速时增强稳定性
-
传感器融合:
- 结合编码器和IMU数据
- 实现更精确的位姿估计
- 提高路径跟踪精度
-
机械结构优化:
- 减轻簧下质量
- 优化转向连杆比例
- 提高结构刚性
8. 扩展应用与未来改进方向
后轮转向技术不仅适用于智能车比赛,在以下领域也有广泛应用前景:
-
AGV自动导引车:
- 狭窄空间内的灵活移动
- 精确的路径跟踪能力
- 多种转向模式适应不同场景
-
服务机器人:
- 室内环境的高机动性
- 避开障碍物的灵活转向
- 精确的位置控制
-
特种车辆:
- 叉车的货物搬运
- 机场行李车的灵活转向
- 狭窄空间作业车辆
未来改进方向包括:
- 引入机器学习算法优化转向策略
- 开发更智能的模式切换逻辑
- 研究新型转向机构设计
- 提高系统可靠性和鲁棒性
在实际比赛中,我们团队通过不断优化后轮转向系统,最终在狭窄赛道项目中获得了显著优势。这种转向技术确实为智能车设计提供了一个全新的思路和解决方案。