Stanely轨迹跟踪与Carsim与Simulink联仿:可改路径,效果极好

stanely轨迹跟踪,carsim与simulink联仿,可改路径,效果极好

最近在搞Stanley轨迹跟踪算法,发现Carsim和Simulink联仿真是真香!特别是当你想测试不同路径下的跟踪效果时,鼠标点几下就能生成新的测试场景,比实车调试省了不知道多少罐红牛。今天给各位展示下咱们实验室自研的这套框架,关键代码直接扒出来遛遛。

先看效果:在Carsim里随便画了个S弯+直角组合路径,方向盘的转角响应跟德芙似的纵享丝滑。横向误差基本控制在10cm内(轮胎没打滑的情况下),这个精度跑市区道路足够用了。

![仿真效果图]

(假装这里有张gif图)

核心算法层就二十行MATLAB代码,Stanley精髓在于前轴投影和航向角纠偏。看这段横向控制的灵魂:

matlab 复制代码
function delta = stanley_control(e, theta_e, vx)
    k = 0.3;  % 玄学参数,别问为啥是0.3
    soft = 0.5; % 防止分母为零的伏地魔
    
    % 前轴距离误差修正
    heading_term = theta_e;
    
    % 横向误差修正
    cross_term = atan(k * e / (vx + soft));
    
    % 方向盘转角合成
    delta = heading_term + cross_term;
    
    % 限制最大转角(防止Carsim报错)
    delta = max(min(delta, pi/6), -pi/6);
end

参数k是调参侠的快乐源泉。实测发现当车速超过60km/h时,k值要跟着车速反比例调整,不然车会像喝醉的蛇一样扭屁股。这里偷懒没做自适应,建议各位加上vx的动态系数。

联仿配置有个坑必须说:Carsim的变量输出频率和Simulink步长不匹配的话,数据会像量子纠缠一样时有时无。推荐在Simulink里加个零阶保持器,就像给数据传输加了安全带:

matlab 复制代码
% 联仿接口配置片段
carsim_block = 'CarsimSFunction';
set_param(carsim_block, 'OutputFcn', 'vs_output');
set_param(carsim_block, 'SampleTime', '0.02'); % 必须和Carsim设置一致
add_block('built-in/ZeroOrderHold', [model_name '/ZOH']);

路径切换功能才是这套框架的王炸。在Simulink里埋了个PathSelector模块,点击按钮就能切换预存的.mat路径文件。实测从环岛切到U型弯只需要三步:

  1. 修改工作区里的path_type变量
  2. 按F5刷新路径数据
  3. 点仿真按钮等结果

当然也可以现场生成新路径。比如用三次样条插值生成随机路径:

matlab 复制代码
% 生成魔鬼S弯
x = [0 10 20 35 50];
y = [0 5  -3 8  0];
t = linspace(0, 1, length(x));
new_t = linspace(0, 1, 200);
new_path = spline(t, [x; y], new_t);

最后说个鬼故事:有次忘记限制方向盘转角速率,仿真时方向盘每秒转720度,Carsim里的虚拟驾驶员当场表演了电光毒龙钻。所以各位记得在输出后面加个rate limiter模块,做人留一线,日后好相见。

相关推荐
5***o5004 天前
PHP在电商中的支付集成
sql·ue5·rizomuv
T***16077 天前
JavaGraphQLAPI
爬虫·objective-c·rizomuv
沟通QQ:688238868 天前
基于Matlab的交通设施识别:从理论到实践
rizomuv
m0_739583622 年前
Mac电脑专业三维模型展UV贴图编辑工具RizomUV RS + VS 2023有哪些特点
贴图·uv·rizomuv