使用MATLAB完成一个双轮差速驱动的移动机器人“走8字”的仿真,并生成视频

使用MATLAB完成一个双轮差速驱动的移动机器人“走8字”的仿真,,并生成视频

(一)任务目标
     完成一个双轮差速驱动的移动机器人“走8字”的仿真。
(二)问题描述
   1. 描述机器人运动的微分方程
     差速驱动轮式移动机器人的位置座标和朝向角用 xi,yi,θi 表示,如图1所示。移动机器人的线速率为 vi,转向角速率为wi 。

         图1. 差速驱动移动机器人位姿表示

   根据刚体运动学的原理,可得到以下微分方程,简化描述机器人的运动行为。

    ( 式一)

   2. “8”字轨迹的方程
     期望机器人的运动轨迹为 xd(t)、yd(t) ,具体方程为:

       ( 式二)          

  3. 工作任务
  (1)推导出合适的 vi(t)和 wi(t),即线速率和角速率随时间变化的函数,使得 xi(t)=xd(t), yi(t)=yd(t)。
  (2)根据上一步推导的 vi(t) 和 wi(t),编写MATLAB程序,数值求解式1中的微分方程,并绘制移动机器人走过的路径(看是否是“8”字)、朝向角随时间变化的曲线。
  (3)实现机器人运动过程的可视化,用“圆”代表机器人本体,用“箭头”代表机器人的运动方向。编写matlab程序,实现以下a和b两项功能,建议将画圆和箭头的程序封装成函数(输入一个座标和朝向角,画出对应的圆和箭头)。
  .   a. 在“8”字曲线上选择若干位置,将机器人形状和运动方向绘制下来(选择的位置不要太多,画出的图案容易重叠)
    b. 将机器人运动过程录制成视频文件。(一种思路,等时间间隔选择数据,画一幅一幅figure,再用指令将其连成视频,注意设置帧速率)

步骤及思路(附程序代码):
     (由于第一次在CSDN发文章,排版尚不熟练,以下部分以图片形式展示,图片内容我会放在附件里)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上代码便可以生成matlab的仿真视频,以上步骤我会放在附件中的Word文档中

以下是运用matlab仿真的代码:

out=VideoWriter('robot3.avi');
out.FrameRate=25;
open(out);
syms t;
X=10*sin(t/10);
Y=10*sin(t/20);
X2=10*sin((t+0.1)/10);
Y2=10*sin((t+0.1)/20);
Q=atan((Y2-Y)/(X2-X));
w=diff(Q,1);
t0=[0:0.04:150];
f0=[0.4637,0,0];
[t,x]=ode45('car',t0,f0);
plot(x(:,2),x(:,03),'b')
axis([-13 13 -13 13]); 
axis manual
title('机器人运动轨迹平面图');xlabel('x轴运动分量');ylabel('y轴运动分量');
hold on
for s=1:3750
  figure(s)
  plot(x(:,2),x(:,3),'b')
  axis([-13 13 -13 13]);
  axis manual
  title('机器人运动轨迹平面图');xlabel('x轴运动分量');ylabel('y轴运动分量');
  hold on
  r_x=x(s,2);
  r_y=x(s,3);
  r_Q=x(s,1);
  robot(r_x,r_y,0.5,r_Q)
  F=getframe(gcf);
  writeVideo(out,F);
  close all   %注意此语句不可省略,我第一次没有写导致画出来的figure一直在后台,我的电脑是32G内存,画到1400张左右的时候,内存占用98%,程序被系统杀死了,此语句可以在画下一幅之前把之前画的关掉,释放内存
end
close(out);

以下函数用于构造简易图形组合并将其画出
(x,y,r为圆的圆心座标及半径,Q为当前机器人的运动方向与x轴夹角)

function [] = robot(x,y,r,Q)
%.该函数用于构造简易图形组合并将其画出
%x,y,r为圆的圆心座标及半径,Q为当前机器人的运动方向与x轴夹角
rectangle('Position',[x-r,y-r,2*r,2*r],'Curvature',[1,1],'LineWidth',5),axis equal
hold on
x2=x+1.2*cos(Q);
y2=y+1.2*sin(Q);
Q2=Q-0.46364761;
Q3=Q+0.46364761;
x3=x+0.894427*cos(Q2);
y3=y+0.894427*sin(Q2);
x4=x+0.894427*cos(Q3);
y4=y+0.894427*sin(Q3);
plot([x,x2],[y,y2],'r','LineWidth',5)  
plot([x2,x3],[y2,y3],'r','LineWidth',3)
plot([x2,x4],[y2,y4],'r','LineWidth',3)
end

以下是ode45求解时用到的函数

function r=car(t,x)
r=zeros(3,1);
r(1)=((cos(t/20)/2 - cos(t/20 + 1/200)/2)/(10*sin(t/10) - 10*sin(t/10 + 1/100)) - ((10*sin(t/20) - 10*sin(t/20 + 1/200))*(cos(t/10) - cos(t/10 + 1/100)))/(10*sin(t/10) - 10*sin(t/10 + 1/100))^2)/((10*sin(t/20) - 10*sin(t/20 + 1/200))^2/(10*sin(t/10) - 10*sin(t/10 + 1/100))^2 + 1);
r(2)=((cos(t/10)^2 + cos(t/20)^2/4)^(1/2))*cos(x(1));
r(3)=((cos(t/10)^2 + cos(t/20)^2/4)^(1/2))*sin(x(1));
end

以上代码的matlab文件我也放在了附件中 ,欢迎大家积极交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章