基于凸优化的车辆运动规划

工具:matlab、cvx(凸优化工具箱)

初始可行解

然后出现障碍物后

这是根据(时间差)每次求出的路径

最终得出的新的轨迹。

对于多个车辆(n大于等于2)时

将避障条件变为

即每辆车之间要满足这个条件:

这是两个车初始路径。

最后优化轨迹:

第一辆车从(2,5)到(8,5),第一辆车从(5.2)到(5.8),依次对应每个点。

本文优化目标只用了距离,同时可以加时间模型和角度变化等模型,加权起来求最优。约束只加了位置和速度约束,同时可以加上加速度的约束,以及地形约束等。

对于凸型障碍物则采用“大M法”规划。

出现部分冲突则是因为步长原因。

第一部分实验

T =20;                           
d = 2;                            
E = 0.001;                        
N = 2;                            
v_max = 0.8;                                          
 x_i = [2;5]; y_i = [5;2];
 v_x_i = [0;0]; v_y_i = [0;0];
 x_f = [8;5]; y_f = [5;8];
for n=1:N
    p_final{n} = repmat([x_f(n) y_f(n)],T, 1);
end
P=[];
V=[];

for n=1:N
    cvx_begin
        variables p(T,2) v(T,2) 
        minimize( norm( p - p_final{n}, 1 ))
        subject to
            p(1,:) == [x_i(n) y_i(n)]
            v(1,:) == [v_x_i(n) v_y_i(n)]
            for k = 1:T-1
                p(k+1,:) == p(k,:) + v(k,:)
                abs(v(k,1)) <= v_max
                abs(v(k,2)) <= v_max
            end
    cvx_end
   
    P{n} = p;
    V{n} = v;  
end
figure (1)
axis([0 10 0 10])
grid on
hold on
for n=1:N   
         plot( P{1}(:,1),P{1}(:,2),'o-','Color','k') 
         plot( P{2}(:,1),P{2}(:,2),'o-','Color','b') 
          hold on
end
%  th=0:pi/24:2*pi;
%     X=2*cos(th)+5;
%     Y=2*sin(th)+5;
% scatter(X,Y,'.k');
%     hold on
figure(2)
axis([0 10 0 10])
grid on
hold on
for a = 2:N                          
    for n = 1:a-1 
        I = 0;                                   
        for k = 1:T-1                             
            if( norm( P{a}(k,:)-P{n}(k,:)) < d)   
                I = k  ;                        
                break                          
            end                                   
        end
        while I ~= 0
            cvx_begin
                variables p_new(T,2) v_new(T,2)
                minimize( norm(p_new-p_final{a},1 )+ norm( p_new - P{a},1 ))
                subject to
                    p_new(1,:) == [x_i(a) y_i(a)]
                    v_new(1,:) == [v_x_i(a) v_y_i(a)]
                    for k = 1:T-1
                        p_new(k+1,:) == p_new(k,:) + v_new(k,:)*(k+1-k)
                        abs(v_new(k,1)) <= v_max
                        abs(v_new(k,2)) <= v_max                       
                    end  
                
                     ((p_new(I,:) - P{n}(I,:))*((P{a}(I,:)- P{n}(I,:))' / (norm(P{a}(I,:)-P{n}(I,:))))) >= d 
            cvx_end

            P{a} = p_new;
            V{a} = v_new;
            I=0;
            for k = 1: T-1                            
                if( norm( P{a}(k,:)-P{n}(k,:)) < d) 
                    I = k;                            
                    break                            
                end                                  
            end   

             hold on
         plot( p_new(:,1),p_new(:,2),'o-', 'color', 'r') 
         clear p_new v_new f_new
        end
    end   
end
%       plot( p_new(:,1),p_new(:,2),'o-', 'color','r')
figure(3)
axis([0 10 0 10])
grid on
hold on
for n=1:N  
     plot( P{n}(:,1),P{n}(:,2),'o-','Color',[0.0 (n/N) 1.0])
     hold on
end

第二部分实验

clc
clear

T =50;                                                
N = 1;                            
v_max = 0.2;                                          
 x_i = [10]; y_i = [5];
 v_x_i = [0]; v_y_i = [0];
 x_f = [5]; y_f = [7];
for n=1:N
    p_final{n} = repmat([x_f(n) y_f(n)],T, 1);
end
P=[];
V=[];
ob=[7,8,3,8];
M=10000;

    cvx_begin quiet
         variables p(T,2) v(T,2) 
         variable o(T-1,4) binary
        minimize( norm( p - p_final{n}, 1 ))
        subject to
            p(1,:) == [x_i(n) y_i(n)]
            v(1,:) == [v_x_i(n) v_y_i(n)]
            for k = 1:T-1
                p(k+1,:) == p(k,:) + v(k,:)
                abs(v(k,1)) <= v_max
                abs(v(k,2)) <= v_max
                sum(o(k,:))<=3
                p(k+1,1)<=ob(1)+M*o(k,1)
                -p(k+1,1)<=-ob(2)+M*o(k,2)
                p(k+1,2)<=ob(3)+M*o(k,3)
                -p(k+1,2)<=-ob(4)+M*o(k,4)
            end
    cvx_end
   
    P{1} = p;

axis([4 10 2 10])
grid on
hold on
for n=1:N   
         plot( P{1}(:,1),P{1}(:,2),'o-','Color','k') 
          hold on
end
ax=7;
ay = 3;

l = 1;
w = 5;
x = [ax,ax+l,ax+l,ax,ax];
y = [ay,ay,ay+w,ay+w,ay];
line(x,y)

 

### MPC 中轨迹跟踪算法中的凸优化方法 在模型预测控制(MPC)中,为了使车辆能够沿着预定路径行驶并保持稳定性和准确性,通常会采用基于运动学模型的轨迹跟踪控制器设计[^1]。对于此类控制系统而言,核心在于求解最优控制序列的问题可以被转化为一个有限时间范围内的最优化问题。 当涉及到具体实现时,该过程往往可以通过引入约束条件下的线性或二次规划来解决,这正是凸优化发挥作用的地方。通过合理设置目标函数以及状态变量、输入量之间的关系表达式,可以使原本复杂的非线性问题简化为易于处理的标准形式之一——即所谓的“凸”问题。这类问题的特点是在全局范围内只有一个极值点,从而保证了找到的是真正的最小化/最大化解决方案而不是局部最优解。 #### 构建成本函数与约束条件 在一个典型的MPC框架下,针对轨迹跟随任务的成本函数可能包含以下几个方面: - **位置误差惩罚项**:衡量当前时刻实际位置偏离理想路线的程度; - **速度偏差平方和**:用于维持恒定的速度或者按照指定加减速曲线变化; - **转向角速率限制**:防止过度调整方向盘造成不稳定现象发生; 这些因素共同构成了一个多维空间上的评价体系,其目的是引导系统逐步逼近预期的行为模式。与此同时,还需要考虑物理层面的实际可行性,比如最大允许转矩、轮胎抓地力极限等硬件特性所带来的边界条件限制。 ```python import numpy as np from cvxpy import Variable, Parameter, Minimize, Problem, quad_form def mpc_controller(x0, u_prev, N, Q, R, A, B, ref_traj): """ 定义MPC 控制器 参数: x0 (numpy.ndarray): 初始状态向量 u_prev (numpy.ndarray): 上一步的控制输入 N (int): 预测步数长度 Q (numpy.ndarray): 状态权重矩阵 R (numpy.ndarray): 输入权重矩阵 A (numpy.ndarray): 系统状态转移矩阵 B (numpy.ndarray): 输入影响系数矩阵 ref_traj (list of tuples): 参考轨迹列表 返回: optimal_u (numpy.ndarray): 计算得到的最佳控制序列的第一部分作为即时指令发出 """ n_x = len(A[0]) # 状态维度大小 n_u = len(B[0]) # 输入维度大小 X = Variable((n_x, N+1)) # 所有未来的状态估计 U = Variable((n_u, N)) # 将要施加的所有未来控制动作 cost = 0.0 constraints = [] for t in range(N): cost += quad_form(X[:,t]-ref_traj[t], Q) + quad_form(U[:,t], R) if t > 0: constraints.append(X[:,t] == A @ X[:,t-1] + B @ U[:,t-1]) # 终端代价 cost += quad_form(X[:,N]-ref_traj[N], Q*1e2) prob = Problem(Minimize(cost), constraints) try: prob.solve() if prob.status not in ['optimal', 'optimal_inaccurate']: raise Exception('Solver did not converge.') return U.value[:,0] except Exception as e: print(f'Error during optimization: {str(e)}') return None ``` 此代码片段展示了如何使用`cvxpy`库来进行简单的MPC计算。这里定义了一个名为`mpc_controller()` 的函数,接受初始状态 `x0`,上一次使用的控制命令`u_prev`以及其他参数如预测窗口长度`N`、状态权衡因子`Q` 和输入权衡因子`R`等等。最终返回的结果是经过优化后的最佳控制序列的第一个元素,也就是即将执行的具体操作建议。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值