二级倒立摆的matlab模拟,输出倒立摆运动过程角度变化

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       二级倒立摆是一个复杂非线性、强耦合、多变量的自然不稳定系统,它也是双足行走机器人、火箭飞行姿态控制等许多控制对象的最简单模型。倒双摆是一个复杂强耦合、非线性、多变量的自然不稳定系统,它也是双足行走机器人、火箭飞行姿态控制等许多控制对象的最简单模型。对倒立摆机构的控制常常用来检验控制理论的有效性,关于二级倒立摆的研究主要涉及两个问题:一是摆杆在倒立点位置的稳定和镇定控制;二是摆杆从自然悬垂位置摆到倒立点位置的摆起控制。针对二级倒立摆系统的稳定和镇定问题已提出了多种控制方案,应用传统控制理论中的状态反馈和动态观测器理论,分别实现了二级倒立摆的平衡控制。在智能控制领域,应用模糊控制、神经网络控制、拟人控制,都成功地实现了二级倒立摆的平衡稳定。

        倒立摆是控制理论中的典型被控对象,它具有高阶次、非线性、快速、多变量、强耦合、不稳定的特点,通常用来验证某个理论的正确性。在系统设计中,通常引入一个合适的控制方法使得就倒立摆系统成为一个稳定系统,由此来检验控制方法对于不稳定性、非线性、快速性系统的处理能力。倒立摆有三种控制方法在实际应用中较为常见,即线性控制、预测控制和智能 控 制 。

       二级倒立摆系统,其基本结构如下图所示:

       直线型二级倒立摆主要由小车,轨道线路以及两个倒立摆构成。对于二级倒立摆的控制需要根据摆体位置、摆体速度、1号摆杆的坐标、1号摆杆的速度、2号摆杆的坐标、2号摆杆的速度六个参数决定的。假设倒立摆系统中小车的质量为M;1号摆杆的质量为m1;摆杆2的质量为m2;质量块的质量为m3;那么根据二阶倒立摆的拉格朗日计算公式可知:

扫描二维码关注公众号,回复: 14947417 查看本文章

 

二级倒立摆的空间状态状态方程:

 

二、核心程序

..........................................................................
% Convert radians to degrees
ang = Y(:,1:2)*180/pi;

% Set up first frame
figure('Color', 'white')
subplot(2,1,1)
plot(T, ang, 'LineWidth', 2)
hh1(1) = line(T(1), ang(1,1), 'Marker', '.', 'MarkerSize', 20, ...
    'Color', 'b');
hh1(2) = line(T(1), ang(1,2), 'Marker', '.', 'MarkerSize', 20, ...
    'Color', 'r');
xlabel('time (sec)')
ylabel('angle (deg)')

subplot(2,1,2)
hh2 = plot([0, x(1,1);x(1,1), x(1,2)], [0, y(1,1);y(1,1), y(1,2)], ...
    '.-', 'MarkerSize', 20, 'LineWidth', 2);
axis equal
axis([-2*L 2*L -2*L 2*L])
ht = title(sprintf('Time: %0.2f sec', T(1)));

% Get figure size
pos = get(gcf, 'Position');
width = pos(3);
height = pos(4);

% Preallocate data (for storing frame data)
mov = zeros(height, width, 1, length(T), 'uint8');

% Loop through by changing XData and YData
for id = 1:length(T)
    % Update graphics data. This is more efficient than recreating plots.
    set(hh1(1), 'XData', T(id), 'YData', ang(id, 1))
    set(hh1(2), 'XData', T(id), 'YData', ang(id, 2))
    set(hh2(1), 'XData', [0, x(id, 1)], 'YData', [0, y(id, 1)])
    set(hh2(2), 'XData', x(id, :), 'YData', y(id, :))
    set(ht, 'String', sprintf('Time: %0.2f sec', T(id)))
    
    % Get frame as an image
    f = getframe(gcf);
    
    % Create a colormap for the first frame. For the rest of the frames,
    % use the same colormap
    if id == 1
        [mov(:,:,1,id), map] = rgb2ind(f.cdata, 256, 'nodither');
    else
        mov(:,:,1,id) = rgb2ind(f.cdata, map, 'nodither');
    end
end

% Create animated GIF
imwrite(mov, map, 'animation.gif', 'DelayTime', 0, 'LoopCount', inf)
 
up164

三、仿真结论

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/130450971