carsim+simulink联合仿真实现变道 包含路径规划 carsim+simulink联合仿真实现变道 包含路径规划算法+mpc轨迹跟踪算法 可选simulink版本和c++版本算法 可以适用于弯道道路,弯道车道保持,弯道变道 carsim内规划轨迹可视化 Carsim2020.0 Matlab2017b (可赠送安装包)

在自动驾驶领域,车辆的变道操作是一个关键研究点,涉及到路径规划与轨迹跟踪等多个重要算法。今天就来聊聊如何利用Carsim和Simulink实现弯道场景下的车辆变道联合仿真。

一、联合仿真环境搭建

我们选用Carsim2020.0和Matlab2017b版本。这两个版本的配合相对稳定,能较好地满足我们此次联合仿真的需求。如果有小伙伴需要安装包,我可以提供哦😃。

二、路径规划算法

路径规划在车辆变道中起着引导方向的作用。在弯道场景下,路径规划需要更加精细,要考虑弯道的曲率等因素。

Simulink版本路径规划算法

在Simulink中,可以通过一系列模块搭建路径规划系统。以简单的基于几何模型的路径规划为例,我们可以利用一些基本的数学运算模块来计算出变道所需的轨迹点。

carsim+simulink联合仿真实现变道 包含路径规划 carsim+simulink联合仿真实现变道 包含路径规划算法+mpc轨迹跟踪算法 可选simulink版本和c++版本算法 可以适用于弯道道路,弯道车道保持,弯道变道 carsim内规划轨迹可视化 Carsim2020.0 Matlab2017b (可赠送安装包)

假设我们已经知道弯道的曲率半径R,车辆当前位置(x0, y0),要变到目标车道,我们可以利用以下简单的几何关系来初步规划路径。比如,以圆弧路径为例:

% 假设车辆在弯道内侧车道,要变到外侧车道
% 定义相关参数
R = 100; % 弯道曲率半径
delta_y = 3; % 车道宽度,假设为3米
theta = linspace(0, pi/4, 100); % 变道过程中的角度变化
x = R * sin(theta) + x0;
y = R * cos(theta) + y0 + delta_y;

上述代码通过给定的弯道半径R,车道宽度delta_y,以及角度变化theta,计算出了车辆变道过程中的x和y坐标,这就是一个简单的路径规划示例。在Simulink中,我们可以将这些数学运算用相应的模块实现,通过设置参数来调整路径。

C++版本路径规划算法

在C++中实现路径规划算法,需要更多的面向对象编程思想。我们可以定义一个PathPlanner类来处理路径规划相关的操作。

#include <iostream>
#include <vector>
#include <cmath>

class PathPlanner {
public:
    PathPlanner(double r, double dy) : R(r), delta_y(dy) {}
    std::vector<std::pair<double, double>> planPath(double x0, double y0, double start_theta, double end_theta, int num_points) {
        std::vector<std::pair<double, double>> path;
        double d_theta = (end_theta - start_theta) / num_points;
        for (int i = 0; i < num_points; ++i) {
            double theta = start_theta + i * d_theta;
            double x = R * sin(theta) + x0;
            double y = R * cos(theta) + y0 + delta_y;
            path.emplace_back(x, y);
        }
        return path;
    }
private:
    double R;
    double delta_y;
};

在这个类中,构造函数接受弯道半径R和车道宽度delta_y作为参数。planPath函数则根据给定的起始位置(x0, y0),起始和结束角度,以及点的数量来计算路径点。

三、MPC轨迹跟踪算法

有了规划好的路径,就需要MPC(模型预测控制)算法来让车辆尽可能精确地跟踪这条路径。

Simulink版本MPC轨迹跟踪算法

在Simulink中,可以使用MPC Designer工具来设计MPC控制器。首先,需要建立车辆的动力学模型。以一个简单的自行车模型为例:

% 自行车模型参数
m = 1500; % 车辆质量
lf = 1.2; % 前轴到质心距离
lr = 1.4; % 后轴到质心距离
Iz = 2500; % 转动惯量

% 状态空间模型 A矩阵
A = [0 1 0 0;
     0 -2*(lf+lr)*2.85e4/(m*90) 2*(lf+lr)*2.85e4/(m*90) 0;
     0 0 0 1;
     0 -2*(lf^2*2.85e4+lr^2*2.85e4)/(Iz*90) 2*(lf^2*2.85e4+lr^2*2.85e4)/(Iz*90) 0];

% B矩阵
B = [0 0;
     2*2.85e4/m 2*2.85e4/m;
     0 0;
     2*lf*2.85e4/Iz -2*lr*2.85e4/Iz];

上述代码定义了自行车模型的状态空间模型矩阵A和B。然后在MPC Designer中,可以根据这个模型以及路径规划得到的参考轨迹来设计MPC控制器,调整相关参数,如预测时域、控制时域等,使得车辆能够跟踪路径。

C++版本MPC轨迹跟踪算法

在C++中实现MPC,通常需要借助一些优化库,比如CasADi。这里简单介绍一下大致思路,首先也需要定义车辆动力学模型,然后构建目标函数,目标是最小化车辆实际轨迹与参考轨迹的偏差。

// 这里仅给出大致框架,实际实现需要引入CasADi库等
class MPC {
public:
    MPC(double m, double lf, double lr, double Iz) : mass(m), l_front(lf), l_rear(lr), inertia(Iz) {}
    std::vector<double> computeControlInput(const std::vector<std::pair<double, double>>& ref_path, const std::vector<double>& current_state) {
        // 构建车辆动力学模型
        // 构建目标函数
        // 调用优化求解器求解控制输入
        // 这里省略具体实现,实际需要使用CasADi等库来完成
        std::vector<double> control_input(2, 0);
        return control_input;
    }
private:
    double mass;
    double l_front;
    double l_rear;
    double inertia;
};

这个MPC类的构造函数接受车辆参数,computeControlInput函数则根据参考路径和当前车辆状态计算控制输入,不过具体的优化求解部分需要借助专业库来完成。

四、Carsim内规划轨迹可视化

在Carsim中,我们可以将在外部规划好的轨迹导入并进行可视化。在Carsim的道路编辑模块中,可以选择导入轨迹点数据。将我们通过路径规划算法得到的轨迹点,按照Carsim规定的格式整理好,就可以导入。这样就能直观地看到车辆规划的变道路径在Carsim场景中的呈现,方便我们进一步验证和调整算法。

通过Carsim和Simulink的联合仿真,以及结合路径规划和MPC轨迹跟踪算法,我们可以有效地实现弯道场景下车辆的变道仿真,为自动驾驶技术的研究提供有力的支持。希望这篇博文对大家有所帮助,有问题欢迎留言交流😄。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐