分享

MathorCup 2022 C题无人驾驶泊车问题.3(代码浅读)

 云深无际 2022-04-17
就是

半夜了,我好激动看着男神的代码和算法,久久不能忘怀,俺什么时候也能这么骚。

先看一个简单泊车的模型

创建一个图形化的窗口

后面跟着的参数

figure('position', [50, 50, 900, 600])

就像这样的

名称值参数的形式,后面会频繁的出现这个用法,就是多个组的参数

我们的具体的场景函数选择就是在这里设置

这样选择

使用这样的分支结构

最终的结尾

大量的出现了@函数

方括号可以用来构造数组创建空数组删除数组元素数组的串联以及将函数的多个输出参数括起来

当方括号出现在赋值符号"="右侧时,表示为一个数组,括号内是数组的所有元素。如果方括号内没有数就表示为空数组。将数组的部分元素赋值为空数组,即表示删除了这些元素。同时,方括号内除了数字,也可以是其它已有数组变量,这时,表示将已有的数组变量串联起来。(注意,数组的维度要能串联起来,否则会报错。)

冒号是MATLAB矩阵操作最常见的符号之一。主要用途包括:生成固定间隔的行向量对数组某个维度的部分/所有元素进行索引将数组重构为列向量

这里就

Ackerman转向机构

% 轴距和车宽L = 6.10; W = 5.54;
% 车胎轮廓xt = 0.4*[0.60, 0.90, 1.00, 1.00, 0.90, 0.60,-0.60,-0.90,-1.00,-1.00,-0.90,-0.60 0.60]';yt = 1.4*[1.00, 0.98, 0.95,-0.95,-0.98,-1.00,-1.00,-0.98,-0.95, 0.95, 0.98, 1.00 1.00]';
% 绘制后车轮plot(xt+[-W, W]/2, yt-[L, L]/2,'b',... [-W, W]/2, -[L,L]/2, 'b') % 这个是语法,X,Y,LineSpec,后面是线型('blue')hold on

rlx0 = -W*[1,0.733,0.628]'/2; % 左前轮转向连杆坐标,第二个点为转轴点rly0 =  L*[1,1.000,0.703]'/2;
rrx0 = W*[1,0.733,0.628]'/2; % 右前轮转向连杆坐标,第二个点为转轴点rry0 = L*[1,1.000,0.703]'/2;
% 绘制前轴plot([rlx0(2); rrx0(2)], [rly0(2);rry0(2)], 'b');

% 轴距和车宽L = 6.10; W = 5.54;
% 车胎轮廓xt = 0.4*[0.60, 0.90, 1.00, 1.00, 0.90, 0.60,-0.60,-0.90,-1.00,-1.00,-0.90,-0.60 0.60]';yt = 1.4*[1.00, 0.98, 0.95,-0.95,-0.98,-1.00,-1.00,-0.98,-0.95, 0.95, 0.98, 1.00 1.00]';
% 绘制后车轮plot(xt+[-W, W]/2, yt-[L, L]/2,'b',... [-W, W]/2, -[L,L]/2, 'b') % 这个是语法,X,Y,LineSpec,后面是线型('blue')hold on
rlx0 = -W*[1,0.733,0.628]'/2; % 左前轮转向连杆坐标,第二个点为转轴点rly0 = L*[1,1.000,0.703]'/2;
rrx0 = W*[1,0.733,0.628]'/2; % 右前轮转向连杆坐标,第二个点为转轴点rry0 = L*[1,1.000,0.703]'/2;
% 绘制前轴plot([rlx0(2); rrx0(2)], [rly0(2);rry0(2)], 'b');
% 绘制前轮转向曲轴hr = plot([rlx0, rrx0], [rly0, rry0], 'o-r', 'linewidth',2);
% 绘制前车轮wlx0 = xt-W/2; wly0 = yt+L/2; % 左前轮wrx0 = xt+W/2; wry0 = yt+L/2; % 右前轮hw = plot([wlx0 wrx0], [wly0 wry0],'r');
% 绘制前轮转向连杆hc = plot([rlx0(3); rrx0(3)], [rly0(3);rry0(3)], 'b');
% 绘制参考线xc = rlx0(2)-L/tand(0); yc = -L/2;hl = plot([rlx0(1),xc,-W/2],[rly0(1),yc,-L/2],'o:k', ... [rrx0(1),xc ],[rry0(1),yc ],'o:k');
axis imageaxis([-3*W W*0.75 -L L])

先紧紧贴贴

设置一下框子的大小

axis imageaxis([-3*W W*0.75 -L L])

最终的一个Akerman的车型就出来了,接着就是让它动起来

左轮,左轴要动起来,要设计一个变换的函数


function [x, y] = rotxyd(x0, y0, xc, yc, deg)%% 坐标系转换:将点 (x0, y0) 绕 (xc, yc) 旋转 deg 度x = (x0-xc)*cosd(deg) - (y0-yc)*sind(deg) + xc; y = (x0-xc)*sind(deg) + (y0-yc)*cosd(deg) + yc;

输入的是要转的点,和要绕的点,以及转的角度,输出的是转换过的点

用了几个函数的变换

相关的三角函数

动起来的关键是使用drawnow函数

要明确一点为什么,可以动。因为底层的绘图函数其实就是很简单的接收一个在为什么位置绘制什么图。如果一帧都是和上一帧有一点不一样的地方,那就会变化。

使用循环以后,角度的微小变化给了这个转换函数的角度参数,很好理解吧!

其余的变化都一样,都是传递变化的参数

其实我本来可以搞个新的文章,可惜了,读者也不喜欢看,我这里就继续写.

xb = [-5, 8, 8,14,14,20,20.0,25.0,25,20,20, 3,3,-5];yb = [-3,-3,10,10,-3,-3, 6.5, 6.5,10,10,16,16,3, 3];plot(xb,yb,'b')

生成边界的样子

yb = [-3,-3,10,10,-3,-3, 6.5, 6.5,10,10,16,16,3, 3];

是这样的一个输出的样子

函数的样子

l = 2.959;R = l/tand(20);z0 = [0,-R, 0];% 边界xb = 1.5*[-1, 1, 1, -1, -1]*R;yb = 1.5*[-1, -1, 1, 1, -1]*R; plot(xb,yb,'b')

绘制的边界图

t=0:0.1:30;v=t.*(t<10)+10*(t>=10 & t<20)+(30-t).*(t<30 & t>=20);plot(t,v);axis([0 32 0 12]);

分段函数

痛,太痛了,得自己想办法输出这个数据,给点希望总比啥也没有强

还有这东西,垃圾,上次组委会都贴出来了,还出来蹦跶

漂亮

连点比赛的公德也没有

又一个土狗

这个是轨迹圆的算法,呵,我去年是2等奖,为什么抄你的

这种东西不能多看,看多了,饶人心性。

抄袭没有回头路

笔记若干

https://ww2.mathworks.cn/help/matlab/ref/matlab.ui.figure-properties.html
https://ww2.mathworks.cn/help/matlab/ref/figure.html?s_tid=doc_ta
https://ww2.mathworks.cn/videos/evaluating-path-planner-and-vehicle-controller-for-automated-parking-1558953411786.html
https://ww2.mathworks.cn/products/automated-driving.html#refapp

使用这个工具箱

https://ww2.mathworks.cn/company/events/conferences/automotive-conference-michigan/2019.html

需要注意的是,最低支持版本是2020A,所以我的下篇文章安装新版

https://github.com/Pandas-Team/Automatic-Parking
http://www.donkeycar.com/
https://github.com/manfreddiaz/awesome-autonomous-vehicles
https://github.com/yrlu/quadrotor

matlab四旋翼的路径规划

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多