基于MATLAB的智能车仿真程序——程序篇

智能车仿真程序

昨天,大概试了下程序,可以运行,仿真效果还是可以的。下面是几个记录的仿真数据的图像。
在这里插入图片描述
这个是车辆行驶过程中摄像头拍摄到的图像,生成的gif。因为只是测试仿真效果,没有写出完整的pid的控制,上面这个图像是在电机恒定功率输出,舵机只用p调控的效果,图像是动的很快,但实际速度只有0.16m/s。最后还冲出了赛道。下面是赛车行驶曲线与实际赛道中心线的对比图。
在这里插入图片描述
蓝色是是实际赛道中心线,橙色是智能车的行驶轨迹。跑的效果不怎样,不过我们看的是仿真效果,路线连续,没有折点,仿真的原理上应该是没有大问题了,至于真实还原度,因为困在家里,没有实际数据给我做对比,不好判断,但看图,应该是不错的。
下面是程序的截图
在这里插入图片描述
程序的设计思想大概如下吧,手残,字不好,画工也不好,见谅哈。
在这里插入图片描述
可以看出最后是仿真程序和控制程序之间的一个闭环控制。
以下是程序中的main.m的内容,整个程序我都上传到了资源文件,大家可以先下载下来用

clc;clear;
%%仿真步长参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dt=0.001;% 仿真时间间隔 单位米
ds=0.001;% 地图采样点间距 单位米
%%车身及电机参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
m=1;%车重 单位 千克
p0=2;%车辆启动所需功率 单位 瓦
power=2.5;%启动时刻电机总功率,后续变化由控制程序决定。
kf=0.5;%摩擦系数
g=9.8; %重力系数
u=0.8;%电机效率
L=0.3;%车长 单位米
W=0.12;%车宽 单位米
v_c=0;%车速 单位 米/秒
x0=0;y0=0;%车辆起始点
a0=0;%当前轮转角 初始为0 后续由程序和舵机机械性能共同决定。
a=0; %下一刻前轮转角 初始为0 后续由程序和舵机机械性能共同决定。
wheel_angle=0;%初始时刻程序输出目标转角。
turn_force=pi;%转向能力设置 单位 角度/秒
full_angle=pi/4;%前轮最大转向角,相对车身中轴线。
CA0=0;%起始车身角度,相对于x轴正方向
%%摄像头参数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hc=0.2;%摄像头放置高度 单位米
near_point=0.2;%摄像头图像近点距离 单位米
far_point=1.2;%摄像头图像远点距离 单位米
camera_angle=pi/2;%摄像头的角度
pixel_w=60;%摄像头像素 宽
pixel_h=80;%摄像头像素 高
%%摄像头参数计算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[dh,dw]=cal_camera(hc,far_point,near_point,camera_angle,pixel_w,pixel_h);
%%程序性能(仿真图像帧数)设置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FPS=60;%帧率
fps_time=floor((1/FPS)*1000)/1000;%每帧图像之间的时间间隔
%%初始化赛道程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
load('map.mat');%下载地图
[track_x,track_y]=creat_track(ds);%%赛道中心线轨迹
image=get_image(x0,y0,CA0,dw,dh,IMAGE,pixel_h,pixel_w);%初始化摄像头图像

figure(1);
imh=imshow(image); 
set(imh, 'erasemode', 'none'); 

gif_num=1;%图像序列号(及第几帧)
i=1;
for time=0:dt:300
    [x(i),y(i)]=run(CA0,v_c,x0,y0,dt);
    x0=x(i);
    y0=y(i);
    
    if(mod(time*1000,fps_time*1000)==0)%%%由设置的程序性能(图像帧数)判断是否进入控制程序
    [image,black_pixel_num]=get_image(x0,y0,CA0,dw,dh,IMAGE,pixel_h,pixel_w);
    [power,wheel_angle]=control(v_c,image);
    set(imh, 'cdata', image);
    %%%%%%%%%%不需要生成GIF,将以下代码屏蔽。此代码很影响程序执行速度%%%%%%%%%%%%%%%%%%%%%%%
%     if(mod(time*1000,100)==0)
%     picname=['./picture/',num2str(gif_num),'.fig'];
%     saveas(gcf,picname);
%     gif_num=gif_num+1;
%     end
    %%%%%%%%%%不需要生成GIF,将以上代码屏蔽。此代码很影响程序执行速度%%%%%%%%%%%%%%%%%%%%%%%
    end
 
    if(black_pixel_num>4500) %%%判断赛车是否冲出赛道
    break;
    end
    
    a=frontwheel_angle(wheel_angle,full_angle,turn_force,a0,dt);
    v(i)=speed_model(v_c,power,dt,m,p0,kf,g,u);% current speed; power ; dt.
    CA(i)=turn_model(CA0,v_c,a,dt,L,W);% current body angle;current speed;wheel angle;dt
    v_c=v(i);
    CA0=CA(i);
    a0=a;
    i=i+1;
    pause(0.001)
end

figure(2);
time=0:dt:100;
axis([-3 3 -1 4]);
hold on;
grid on;
plot(track_x,track_y);
hold on;
plot(x,y);

前面就是一些参数的设置,因为后面编写代码的时候没有太注意我的参数是不是已经设置了,或者使用参数,所以有些参数是不能改的,参数的含义我也都有注明,我试过了大多数参数都是可以改的,大家也可以自己试试。

关于程序的使用

程序中共有main.m;creat_gif.m,creat_map.m三个可执行程序(test.m大家不用管,那是我写程序时打的草稿)。下面一一介绍。

main.m

就是仿真的程序的主函数,但是它的使用的前提必须由地图信息,也是我之前截图中的map.mat文件。整个程序的中的大多数子函数都是为它服务的,子函数的作用我在子函数的注释行也有说明,点进去看就行了,完全开源的。大家也可以随意修改。

creat_map.m

这个就是前面所说的map.mat的生成程序,它至于create_track.m的子函数关联,是用来生成地图文件的,修改create_track.m里面的数据就可以修改地图,但是这个文件就是我之前所说的我忘记我已经设置参数了,所以地图的大小必须是5m*6m(坐标轴中一个单位长度1m)。然后运行creat_map.m就可以生成地图信息。

creat_gif.m

用来记录智能车的行驶情况的,这个文件可以运行的前提是将mian.m中关于生成gif的代码解除屏蔽,之后运行一次,生成的每帧图片会保存在picture文件夹,最中需要的gif,会命名为run.gif保存在当前文件夹。也就是我开头放的那个gif图像。这几行代码因为需要写入操作,很影响程序的执行,大家看需要决定是否使用。

程序还有很多不完善的地方,大家多多见谅,也欢迎大家一起讨论,共同进步。谢谢大家。

发布了2 篇原创文章 · 获赞 5 · 访问量 797

猜你喜欢

转载自blog.csdn.net/weixin_42208428/article/details/104342473
今日推荐