使用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文件我也放在了附件中 ,歡迎大家積極交流

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