加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

小车单摆的Matlab动画仿真S函数

(2008-10-08 23:52:49)
标签:

matlab

单摆

动画

s函数

it

分类: Matlab实例

程序的主体用了Matlab Central的博客Seth on Simulink提供的函数,对其中的画图部分及参数设置做了修改,可接入Simulink模型仿真,后续给出例子。小车单摆的Matlab动画仿真S函数

function [sys,x0,str,ts] = SimpPendAnimation(t,x,u,flag,pausetime)
%=====================================================================
%小车单摆 S-function.
%参考seth的倒立摆动画模型,做了一些修改。
%author:xianfa110
%http://blog.sina.com.cn/xianfa110
%=====================================================================
switch flag,

  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;

  case 2,
    sys=mdlUpdate(t,x,u,pausetime);

  case { 1, 3, 4, 9 },
    sys = [];
   
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 0;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0.1 0];
LocalPendInit;

%=============================================================================
% mdlUpdate
% Update the pendulum animation.
%=============================================================================
function sys=mdlUpdate(t,x,u,pausetime)
fig = get_param(gcbh,'UserData');
if ishandle(fig),
  if strcmp(get(fig,'Visible'),'on'),
    ud = get(fig,'UserData');
    LocalPendSets(t,ud,u,pausetime);
  end
end;
sys = [];
% end mdlUpdate

%=============================================================================
% LocalPendSets
% Local function to set the position of the graphics objects in the
% inverted pendulum animation window.
%=============================================================================
function LocalPendSets(time,ud,u,pausetime)
u = u([1 2]);
XDelta   = 2;
XPendTop = u(1) + 10*sin(u(2));
YPendTop = -10*cos(u(2));
set(ud.Cart,...
  'XData',ones(2,1)*[u(1)-XDelta u(1)+XDelta]);
set(ud.Pend,...
    'XData',[u(1),XPendTop],...
    'YData',[1,YPendTop]);
set(ud.Head,...
    'XData',XPendTop,...
    'YData',YPendTop);
set(ud.TimeField,...
  'String',num2str(time));
% Force plot to be drawn
pause(pausetime);
drawnow;
% end LocalPendSets

%
%=============================================================================
% LocalPendInit
% Local function to initialize the pendulum animation.  If the animation
% window already exists, it is brought to the front.  Otherwise, a new
% figure window is created.
%=============================================================================
function LocalPendInit
sys = get_param(gcs,'Parent');
TimeClock = 0;
RefSignal = 0;
XCart     = 0;
Theta     = 0;
XDelta    = 2;
XPendTop  = XCart + 10*sin(Theta);
YPendTop  = -10*cos(Theta);
Fig = get_param(gcbh,'UserData');
if ishandle(Fig),
  FigUD = get(Fig,'UserData');
  set(FigUD.TimeField,...
      'String',num2str(TimeClock));
  set(FigUD.Cart,...
      'XData',ones(2,1)*[XCart-XDelta XCart+XDelta]); 
  % bring it to the front
  figure(Fig);
  return
end
FigureName = 'Metronome Visualization';
Fig = figure(...
  'Units',           'pixel',...
  'Position',        [100 100 500 300],...
  'Name',            FigureName,...
  'NumberTitle',     'off',...
  'IntegerHandle',   'off',...
  'Resize',          'off');
AxesH = axes(...
  'Parent',  Fig,...
  'Units',   'pixel',...
  'Position',[50 50 400 200],...
  'CLim',    [1 64], ...
  'Xlim',    [-12 12],...
  'Ylim',    [-10 2],...
  'Visible', 'off');
Cart = surface(...
  'Parent',   AxesH,...
  'XData',    ones(2,1)*[XCart-XDelta XCart+XDelta],...
  'YData',    [0 0; 2 2],...
  'ZData',    zeros(2),...
  'CData',    ones(2),...
  'EraseMode','xor');
line([-10,10],[0,0],'linewidth',3);
Pend = line([XCart,XPendTop],[1,YPendTop],'color','b','linestyle','-','linewidth',2,'erasemode','xor');
Head = line(XPendTop,YPendTop,'color','r','linestyle','.',...
    'erasemode','xor','markersize',40);
uicontrol(...
  'Parent',             Fig,...
  'Style',              'text',...
  'Units',              'pixel',...
  'Position',           [150 0 100 25], ...
  'HorizontalAlignment','right',...
  'String',             'Time: ');
TimeField = uicontrol(...
  'Parent',             Fig,...
  'Style',              'text',...
  'Units',              'pixel', ...
  'Position',           [250 0 100 25],...
  'HorizontalAlignment','left',...
  'String',             num2str(TimeClock));
FigUD.Cart         = Cart;
FigUD.Pend         = Pend;
FigUD.TimeField    = TimeField;
FigUD.Head         = Head;
FigUD.Block        = get_param(gcbh,'Handle');
set(Fig,'UserData',FigUD);
drawnow
% store the figure handle in the animation block's UserData
set_param(gcbh,'UserData',Fig);
% end LocalPendInit

%========================================

% 转载请注明出处,http://blog.sina.com.cn/xianfa110 谢谢小车单摆的Matlab动画仿真S函数

%========================================

相关文章:

有趣的现象:单摆均衡(matlab/simulink)

小车单摆Matlab/Simulink仿真

基于Matlab/Simulink的倒立摆仿真(视频)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有