(s,sdot)相图轨迹规划

看到知乎上一篇【轨迹规划】考虑动力学的轨迹规划问题

https://zhuanlan.zhihu.com/p/89718348

感觉有点意思。

preview

假设你驾驶一辆小车想要尽快回家看一场比赛直播。你家离你有1km 远,回家的路是笔直的。如上图所示,这条路在第 0.3km 到  0.7km 间限速 100km/h 。我们用  \theta 来表示小车在路上的位置,令  \theta 为关于位置参数  s\in \left [ 0,1 \right ] 的函数,即  \theta :\left [ 0,1 \right ]\rightarrow \left [ 0\textup{km},1\textup{km} \right ]。显然,小车位置满足如下函数:

\theta (s)=s(\textup{km})

小车的动力学方程为:

\ddot{\theta }=u-b\dot{\theta }^{2}

其中u是汽车发送机(为正)或刹车(为负)所能提供的加速度。-b\dot{\theta }^{2} 是空气阻力等因素所形成的非线性阻尼。由于汽车发动机的动力和刹车阻力是有限的,因此加速度需要满足如下约束:u\in \left [ -3.6\times 10^5,9\times10^4 \right ]\mathrm{km/h^2},且非线性阻尼常数b=1.4\mathrm{km}^{-1}.

对于题目已知的加速度的限制,在 (s,\dot{s}) 平面上可以表示为下图

preview

假如有这样的轨迹规划任务:已知物体要通过一条确定的路径,要求规划该物体在每个位置处的速度和加速度。我们用位置参数  s\in \left [ 0,1 \right ]  表示运动物体在整个路径中所处的位置。  s=0 表示物体处于路径起点,  s=1 表示物体处于路径终点。相应的  \dot{s} 表示速度,  \ddot{s} 表示加速度。则我们可以利用所谓  (s,\dot{s}) 相图来进行该轨迹规划任务。

下图为一个典型的  (s,\dot{s})  相图,其横轴为位置参数  s ,纵轴为速度参数  \dot{s}  。其上有一条曲线,连接了位置起点  s=0 和终点   s=1 ,并表示出了轨迹上各位置点处的速度。可以看到,曲线的起点和终点纵坐标均为0,说明该运动从静止状态出发,最终刚好停在终点处。

进一步考虑运动的加速度限制。我们任取一点  (s,\dot{s})  的切线,\frac{\mathrm{d} \dot{s}}{\mathrm{d} s} = \frac{\mathrm{d} \dot{s}}{\mathrm{d} t}\frac{\mathrm{d} t}{\mathrm{d} s}=\frac{\mathrm{d} \ddot{s}}{\mathrm{d} \dot{s}}, 由动力学方程可得

\frac{\mathrm{d} \ddot{s}}{\mathrm{d} \dot{s}}=\frac{u - b\dot{s}^2 }{\mathrm{d} \dot{s}}

令 y=\dot{s},x=s,则有\frac{u - by^2 }{y}=\frac{\mathrm{d} y}{\mathrm{d} x},得 \left | u-by^2 \right |=e^{-2b(x+c)}.

写了个matlab程序作了下图

clear
close all
u = 9.0*10^4;
b = 1.4;
x0 = 0:0.05:1;
x0 = x0(:);
y0 = zeros(length(x0),1);
c = abs(u - b*y0.^2)./exp(-2*b.*x0);
figure
axis([0 1 0 300])
xlabel('s(km)')
ylabel('sdot(km/h)')
hold on
for j = 1:length(x0)
    x = [];
    y = [];
    k = 1;
    for i = 1:100
        if i*0.01 > x0(j)
            x(k) = i*0.01;
            y(k) = sqrt(abs(u - c(j)*exp(-2*b*x(k)))/b);
            k = k+1;
        end
    end
    x = [x0(j) x ];
    y = [y0(j) y ];
    plot(x, y)
    
end

u = -3.6*10^5;
c = (u - b*y0.^2)./exp(-2*b.*x0);
for j = 1:length(x0)
    x=[]; y = [];k = 1;
    for i = 1:100
        if i*0.01 < x0(j)
            x(k) = i*0.01;
            y(k) = sqrt(abs(u - c(j)*exp(-2*b*x(k)))/b);
            k = k+1;
           
        end
    end
    x = [ x x0(j)];
    y = [ y y0(j)];
    plot(x, y)   
end


  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
滑模控制是一种基于滑动面和滑动模式的控制方法,具有较强的鲁棒性和适应性,适用于多种工业应用和机器人控制等领域。在Matlab,可以用如下代码实现滑模控制的轨迹跟踪: 1. 定义系统模型 首先需要建立被控制的系统模型,例如简单的二阶系统: ``` % 系统模型 m = 1; % 质量 k = 10; % 弹性系数 f = 0.2; % 摩擦系数 A = [0 1; -k/m -f/m]; B = [0; 1/m]; C = [1 0; 0 1]; D = [0; 0]; ``` 其,A、B、C、D分别为系统状态方程、输入方程、输出方程、直接转移矩阵。 2. 设计滑动面和滑动模式 根据系统模型,可以设计滑动面和滑动模式,以控制系统的状态跟踪目标轨迹。例如定义一个位置误差滑动面: ``` % 滑动面 s = @(x) C*(x - xd); % 滑动模式 sd = @(x) C*xdotd; ``` 其,x为系统状态,xd为目标轨迹状态,xdotd为目标轨迹速度。 3. 设计控制器 根据滑动面和滑动模式,可以设计控制器。滑模控制器具有“滑动模式+滑动面”两个部分组成,其滑动面部分可以设计为PD控制,滑动模式部分可以设计为比例控制,如下: ``` % PD控制器 Kp = 10; % 比例系数 Kd = 1; % 导数系数 sdot = @(x) C*A*(x - xd) + C*B*(sd(x) - xdotd); u = @(x) -Kp*s(x) - Kd*sdot(x); % 比例控制器 K = 20; % 比例系数 v = @(x) K*s(x); % 滑模控制器 x0 = [0;0]; % 初始状态 T = 5; % 控制时长 [t,x] = ode45(@(t,x) (A+B*u(x))', [0 T], x0); % 数值求解ODE u_sl = @(x) u(x) + v(x); ``` 其,u为PD控制器,v为比例控制器,u_sl为滑模控制器,x0为初始状态,T为控制时长,ode45为Matlab内置的数值求解器。 4. 根据控制器进行轨迹跟踪 通过滑模控制器u_sl,可以对系统进行控制,使得输出状态x趋近于目标状态xd。如下代码给出了轨迹跟踪的结果可视化: ``` % 轨迹跟踪 x_sl = zeros(size(x)); for i=1:length(x) x_sl(i,:) = x(i,:) + [0 1/K]*s(x(i,:))'; end figure; subplot(2,1,1); plot(x(:,1),x(:,2),'r-',xd(:,1),xd(:,2),'b--'); xlabel('Position'); ylabel('Velocity'); grid on; title('System Trajectory and Target Trajectory'); subplot(2,1,2); plot(x_sl(:,1),x_sl(:,2),'r-',xd(:,1),xd(:,2),'b--'); xlabel('Position'); ylabel('Velocity'); grid on; title('Sliding Mode Trajectory and Target Trajectory'); ``` 其,x_sl为滑模控制器控制下的状态轨迹,xd为目标轨迹,subplot为Matlab的多图绘制函数。 通过以上代码,可以实现基于滑模控制的轨迹跟踪,调节各个参数可以得到不同精度、速度、响应等特性的控制效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值