精华内容
下载资源
问答
  • 哈工大现代控制理论matlab极点配置作业
    2021-04-22 11:18:12

    现代控制理论作业(BTT )

    航天学院 18S018079 程光辉

    BTT 导弹在某个特征点的俯仰/偏航通道自动驾驶仪具有如下形式

    x Ax Bu y Cx Du

    =+??=+? 回答下列问题。

    1.这个系统是否能控?是否能观?

    (1)能控性:能控

    clear;clc;close all;

    load 'abcd.mat';

    U=[B A*B A^2*B A^3*B];

    if rank(U)==length(A)

    disp('能控');

    else

    disp('不能控');

    end

    (2)能观性:能观

    clear;clc;close all;

    load 'abcd.mat';

    U=[C;C*A;C*A^2;C*A^3];

    if rank(U)==length(A)

    disp('能观');

    else

    disp('不能观');

    end

    2.这个系统在李雅普诺夫意义下的稳定性

    (1)李雅普诺夫第一法:系统不稳定

    clear;clc;close all;

    load 'abcd.mat';

    n=length(A);

    Q=eye(n,n); %Q=I

    P=lyap(A,Q); %求解矩阵P

    flag=0;

    for i=1:n

    if det(P(1:i,1:i))<=0

    flag=1;

    更多相关内容
  • 针对一个对象模型,运用现代控制理论,从建立系统模型到分析系统能控能观性,稳定性,状态反馈配置极点,并用MATLAB编程实现,且在SIMULINK中进行仿真。
  • 电机驱动系统+磁盘驱动读取系统 基本要求: (1)针对自己的兴趣...学生提交的大作业必须有包含基本要求,在完成基本要求的基础上,可以进行更加完善的设计。在设计的过程中若使用MATLAB仿真软件,请附上程序代码。
  • 现代控制理论大作业

    2012-07-12 21:34:51
    现代控制理论大作业,用所学控制理论对温度控制过程进行分析
  • b = [0 1 8 20]; a = [1 12 44 48]; [A,B,C,D] = tf2ss(b,a) sys1 = ss(A,B,C,D) csys = canon(sys1,'companion')

    在这里插入图片描述

    b = [10 20];
    a = [1 11 29.25 0];
    [A,B,C,D] = tf2ss(b,a)
    sys1 = ss(A,B,C,D)
    csys = canon(sys1,'companion')
    

    课本课件p62/884有类似的,属于能观标准Ⅰ型

    function   ObserveStandardA()
    %{
    程序功能:
    1、线性系统转换为能观标准I型
    2、
    
    date:2020.05.06
    %}
       clc,clear
    %     A=[1,2,0; 3,-1,1; 0,2,0];
    %     B=[2;1;1];
    %     C=[0,0,1];
        A=[0,1,0; 0,0,1; -2,9,0];
        B=[1;2;12];
        C=[1,0,0];
        n=length(A);
        N=zeros(n,n);
        syms s
        I=eye(n,n);
     
        for i=1:n
            
            N(i,:)=C*A^(i-1);
            
        end
        T=inv(N) ;
        
        if( rank(N)< n )  %能观判别矩阵
            return
            
        end
    
        y=det(  s*I-A ) ;
        a1=sym2poly(y) ;  %从高阶->低阶系数排列
        a=flip(a1)  ; %从低阶->高阶系数排列
        
        A1=zeros(n,n);
         
        for j=2:n
            A1(j-1, j)=1;
            A1(n , j-1)=-a(j-1) ;
                        
        end
        A1(n,n)=-a(n)
             
        B1= inv(T)*B
        C1=zeros(1,n);
        C1(1)=1 
        
        
        %传递函数
      
        
    end
    
    b = [10 20];
    a = [1 11 29.25 0];
    [A,B,C,D] = tf2ss(b,a)
    sys1 = ss(A,B,C,D)
    csys = canon(sys1,'companion')
    ObserveStandardA
    

    里卡提方程在课本322/334

    降维观测器在课本226/334 例题5-10,例题5-11
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    % A = [0 1; -1 0];
    % B = [0; 1];
    % Q = [0 1; 1 0];
    % R = 0.5;
    % [P,l,g] = care(A, B, Q, R)
    A = [0 1 0;0 0 1;0 -29.25 -11];
    B = [20;10;0];
    Q = [1 0 0;0 1 0;0 0 1];
    %R = [1/2 0 0;0 1/2 0;0 0 1/2];
    R=1/2;
    E=[1 0 0;0 1 0;0 0 1];
    S=0;
    %[P,l,g] = care(A, B, Q, R)
    
    [X,L,G] = care(A,B,Q,R,S,E)
    
    %https://www.mathworks.com/help/control/ref/care.html?searchHighlight=care&s_tid=srchtitle
    %https://www.dazhuanlan.com/2020/03/02/5e5c2e7a3c299/
    
    % P =
    %    -1.0000    0.0000
    %     0.0000    0.0000
    %     
    % l =
    %   -0.0000 + 1.0000i
    %   -0.0000 - 1.0000i
    % 
    % g =
    %    1.0e-07 *
    %     0.0000    0.2584
    
    展开全文
  • 程序对应功能: zhuangtaifangchengqiujie%状态方程求解 chuandihanshu%根据状态方程求解传递...教材-现代控制理论为本文程序部分编程基础 部分可参考胡寿松《自动控制原理》 网上最全,不许反驳。可解决实际做题问题
  • Given a DC motor with the following dynamical equations Write the state-space representation of this system, taking as the control input Assess the stability properties of the given systems, use the ...
  • 2020年大连理工大学过程控制工程大作业.rar
  • 北京科技大学自动化学院2019年研究生《线性系统理论》(也称为《现代控制理论》)期末考试试卷,包含证明题,计算题,简答题等类型的题目。考试必备资料。
  • 现代控制理论刘豹第六章答案
  • 现代控制理论作业

    2016-02-24 14:42:31
    现在控制理论的小作业。资源:上海电力学院,电子与通信工程学院。
  • 运用现代控制理论对直流电机的调速系统进行设计与仿真,运用MATLAB/Simulink对电机模型进行数学建模,并对系统的能控性、能观性及稳定性进行分析;为达到设计要求,对系统进行极点配置并引入状态观测器,并对系统...
  • 现代控制理论-大作业-倒立摆.doc
  • 现代控制理论习题解答与Matlab程序示例

    万次阅读 多人点赞 2016-06-09 07:27:09
    部分现代控制理论习题都可以通过计算机辅助解决,如Matlab或Octave Online。 2019更新版课程要求和Matlab简明教程: https://blog.csdn.net/ZhangRelay/article/details/88654172 现代控制理论 第三版 课后...

    现代控制理论习题解答与Matlab程序示例

    大部分现代控制理论习题都可以通过计算机辅助解决,如Matlab或Octave Online。

    2019更新版课程要求和Matlab简明教程:

    https://blog.csdn.net/ZhangRelay/article/details/88654172

    现代控制理论 第三版 课后习题参考解答:

    http://download.csdn.net/detail/zhangrelay/9544934

    掌握这本习题集,满分妥妥的。

    下面给出部分书后习题的Matlab方法求解:

    第一章 状态空间表达式

    1 传递函数转为状态空间表达式和约旦标准型

     

    num=[10,-10];
    den=[1,4,3,0];
    w=tf(num,den);
    se=ss(w)
    [T,J]=jordan(A)

     

    对应习题1-6

     

    2 状态空间表达式转为传递函数

     

    A=[0,1,0;-2,-3,0;-1,1,-3];
    B=[0;1;2];
    C=[0,0,1];
    D=0;
    se=ss(A,B,C,D);
    w=tf(se)

     

    对应习题1-7

     

    第二章 状态空间表达式的解

     

    A=[0,1;0,0];
    B=[0;1];
    C=[1,0];
    D=0;
    se=ss(A,B,C,D);
    [y,t,x]=step(se);
    figure(1);
    plot(t,x);
    figure(2);
    plot(t,y);

     

    对应习题2-6

     

    第三章 能控性和能观性

    1 能控性和能观性判定

     

    A=[-3,1;1,-3];
    B=[1,1;1,1];
    C=[1,1;1,-1];
    M=[B,A*B];
    N=[C;C*A];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
    else
        disp('系统不可控')
    end
    rank(N)
    if rank(N)==n
        disp('系统可观')
    else
        disp('系统不可观')
    end
    [T,J]=jordan(A);
    T'*B
    C*T

    对应习题3-2

     

     

    2 能控标准型

     

    A=[1 -2;3 4];
    B=[1;1];
    C=[0 0];
    D=0;
    G=ss(A,B,C,D);
    M=[B,A*B];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
    else
        disp('系统不可控')
    end
    Qc=ctrb(A,B);
    Cm=[0 1]*inv(Qc);
    Cm2=inv([Cm;Cm*A]);
    sysc=ss2ss(G,inv(Cm2))

    对应习题3-7

     

     

    3 能观标准型

     

    A=[1,-1;1,1];
    B=[2;1];
    C=[-1 1];
    D=0;
    G=ss(A,B,C,D);
    M=[B,A*B];
    N=[C;C*A];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
    else
        disp('系统不可控')
    end
    rank(N)
    if rank(N)==n
        disp('系统可观')
    else
        disp('系统不可观')
    end
    Qc=ctrb(A,B);
    Cm=[0 1]*inv(Qc);
    Cm2=inv([Cm;Cm*A]);
    sysc=ss2ss(G,inv(Cm2))
    Qo=obsv(A,C);
    Om=inv(Qo)*[0;1];
    Om2=[Om A*Om];
    syso=ss2ss(G,inv(Om2))

    对应习题3-8

     

     

    4 传递函数转能控或能观标准型

     

    num=[1,6,8];
    den=[1,4,3];
    [A,B,C,D]=tf2ss(num,den);
    G=ss(A,B,C,D);
    M=[B,A*B];
    N=[C;C*A];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
    else
        disp('系统不可控')
    end
    rank(N)
    if rank(N)==n
        disp('系统可观')
    else
        disp('系统不可观')
    end
    Qc=ctrb(A,B);
    Cm=[0 1]*inv(Qc);
    Cm2=inv([Cm;Cm*A]);
    sysc=ss2ss(G,inv(Cm2))
    Qo=obsv(A,C);
    Om=inv(Qo)*[0;1];
    Om2=[Om A*Om];
    syso=ss2ss(G,inv(Om2))

    对应习题3-9

     

     

    第四章 李雅普诺夫方法和稳定性

    1 李雅普诺夫定理第一方法

     

    A=[-3 -6 -2 -1;1 0 0 0;0 1 0 0;0 0 1 0];
    B=[1;0;0;0];
    C=[0 0 1 1];
    D=[0];
    flag=0;
    [z,p,k]=ss2zp(A,B,C,D,1);
    disp('系统零点,极点和增益为:');
    z
    p
    k
    n=length(A);
    for i=1:n
        if real(p(i))>0
            flag=1;
        end
    end
    if flag==1
        disp('系统不稳定');
    else
        disp('系统稳定');
    end

     

     

    通过极点判定系统是否稳定

     

     

     

    2 李雅普诺夫定理第二方法

     

    A=[-3 -6 -2 -1;1 0 0 0;0 1 0 0;0 0 1 0];
    Q=eye(4,4);
    P=lyap(A,Q);
    flag=0;
    n=length(A);
    for i=1:n
        det(P(1:i,1:i))
        if(det(P(1:i,1:i))<=0)
            flag=1;
        end
    end
    if flag==1
        disp('系统不稳定');
    else
        disp('系统稳定');
    end
     

    通过P是否正定判定系统是否稳定。

     

    第五章 线性系统综合

    1 极点配置

     

    A=[0 1 0;0 0 1;0 -2 -3];
    B=[0;0;1];
    P=[-2 -1+1i -1-1i];
    M=[B,A*B,A*A*B];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
        disp('状态反馈')
        K=acker(A,B,P)
    else
        disp('系统不可控')
        [Ac,Bc,Cc,T,K]=ctrbf(A,B,C)
    end    
    Ac=A-B*K
    disp('配置后极点')
    eig(Ac)

    对应例题5-2

     

     

    num=[1 1 -2];
    den=[1 2 -5 -6];
    [A,B,C,D]=tf2ss(num,den)
    P=[-2 -2 -3];
    M=[B,A*B,A*A*B];
    n=length(A);
    rank(M)
    if rank(M)==n
        disp('系统可控')
        disp('状态反馈')
        K=acker(A,B,P)
    else
        disp('系统不可控')
        [Ac,Bc,Cc,T,K]=ctrbf(A,B,C)
    end    
    Ac=A-B*K
    disp('配置后极点')
    eig(Ac)

    对应习题5-4

     

     


     

     

     

     

     

     

     

     

     

    展开全文
  • 分析和综合方法采用现代控制理论的内容。 1. 引言(1分) 查找资料,论述此种控制方式的应用范围及研究现状。 2. 建立系统的数学模型(17分) 已知装置质量M=0.08kg、元件质量m=0.02kg、弹簧刚度k=4N/m、阻尼系统b=...
  • 研究生现代控制理论PPT及其相关作业练习,适合电力电子学生学习。
  • 最优控制这门选修课的习题答案,题目来源于刘豹的《现代控制理论》第六章的课后题
  • 现代控制理论解决一些解决一些传统控制理论解决不了的问题,主要内容有状态方程,李亚谱诺夫函数,反馈系统设计,优化设计
  • (俞立)现代控制理论-浙江工业大学讲义,考研,学习有用!
  • 之前,现代控制理论,研究过一些倒立摆和自平衡小车,现在用ROS+Gazebo环境尝试一下。 找了一些案例都是kinetic,Gazebo7及以前的版本适用。为了能使melodic和noetic都可适用,做了适当的修改。 当然urdf基本是...

    之前,现代控制理论,研究过一些倒立摆和自平衡小车,现在用ROS+Gazebo环境尝试一下。

    ROS自平衡机器人仿真(机器人操作系统+现代控制理论融合案例)

    找了一些案例都是kinetic,Gazebo7及以前的版本适用。为了能使melodic和noetic都可适用,做了适当的修改。

    当然urdf基本是通用的。最重要的网址:

    丑萌模式:

    唉,不忍直视!!!

    然后更改了配色:

    拖车模式--机器人拖着摆漫游

    平衡模式--摆垂直


    这是一个学习ROS机器人和现代控制理论最高效的案例:

    如需查阅之前资料 :现代控制理论课程专栏


    教程链接,但是为kinetic版本:

    Gazebo 9 API文档:

    Ignition Math文档:


    如果直接编译Github上面的源码,画风是这样的!!!

    基本可以断定与Gazebo版本升级有关,这也是为何博客以Igniton Gazebo更新为主的原因。

    简要分析并调试

    对于GetSimTime这一类报错,查看API文档,已经更新为SimTime,在源码中替换错误接口即可。

    对于math无法找到的原因,查看上图,已经更新为ignition::math::Vector3d。对于修改即可。

    Pose同理,这些都更新到ignition::math。

    恩,问题变了……那么继续吧。依据上述方式修改如Rot(),Pos()。

    经过漫长的一点点修正,最后见到曙光:

    :~/RobTool/rsv_balance_simulator$ catkin_make
    Base path: /home/relaybot/RobTool/rsv_balance_simulator
    Source space: /home/relaybot/RobTool/rsv_balance_simulator/src
    Build space: /home/relaybot/RobTool/rsv_balance_simulator/build
    Devel space: /home/relaybot/RobTool/rsv_balance_simulator/devel
    Install space: /home/relaybot/RobTool/rsv_balance_simulator/install
    ####
    #### Running command: "make cmake_check_build_system" in "/home/relaybot/RobTool/rsv_balance_simulator/build"
    ####
    ####
    #### Running command: "make -j8 -l8" in "/home/relaybot/RobTool/rsv_balance_simulator/build"
    ####
    [  0%] Built target std_msgs_generate_messages_nodejs
    [  0%] Built target std_msgs_generate_messages_lisp
    [ 13%] Built target rsv_balance_gazebo_control
    [ 13%] Built target std_msgs_generate_messages_cpp
    [ 13%] Built target std_msgs_generate_messages_py
    Scanning dependencies of target gazebo_rsv_balance
    [ 13%] Built target std_msgs_generate_messages_eus
    [ 13%] Built target _rsv_balance_msgs_generate_messages_check_deps_SetMode
    [ 13%] Built target _rsv_balance_msgs_generate_messages_check_deps_SetInput
    [ 13%] Built target _rsv_balance_msgs_generate_messages_check_deps_State
    [ 39%] Built target rsv_balance_msgs_generate_messages_nodejs
    [ 39%] Built target rsv_balance_msgs_generate_messages_lisp
    [ 56%] Built target rsv_balance_msgs_generate_messages_eus
    [ 82%] Built target rsv_balance_msgs_generate_messages_cpp
    [ 91%] Built target rsv_balance_msgs_generate_messages_py
    [ 91%] Built target rsv_balance_msgs_generate_messages
    [ 95%] Building CXX object rsv_balance_gazebo/CMakeFiles/gazebo_rsv_balance.dir/src/gazebo_rsv_balance.cpp.o
    [100%] Linking CXX shared library /home/relaybot/RobTool/rsv_balance_simulator/devel/lib/libgazebo_rsv_balance.so
    [100%] Built target gazebo_rsv_balance
    

    但这并非就ok了,在运行时还有如下错误。

    安装:

    • sudo apt install ros-melodic-python-qt-binding

    并修改

    /home/relaybot/RobTool/rsv_balance_simulator/src/rsv_balance_rqt/src/rsv_balance_mode/balance_mode_widget.py:

    #from python_qt_binding.QtGui import QWidget
    from python_qt_binding.QtWidgets import QWidget

    启动平衡车案例:

    :~/RobTool/rsv_balance_simulator$ roslaunch rsv_balance_gazebo simulation_terrain.launch 
    ... logging to /home/relaybot/.ros/log/613e7c6e-fb51-11ea-9752-ba9c53c9fb50/roslaunch-TPS2-30059.log
    Checking log directory for disk usage. This may take a while.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://TPS2:45073/
    
    SUMMARY
    ========
    
    PARAMETERS
     * /gazebo/enable_ros_network: True
     * /robot_description: <?xml version="1....
     * /rosdistro: melodic
     * /rosversion: 1.14.7
     * /use_sim_time: True
    
    NODES
      /
        gazebo (gazebo_ros/gzserver)
        gazebo_gui (gazebo_ros/gzclient)
        robot_state_publisher (robot_state_publisher/robot_state_publisher)
        urdf_spawner (gazebo_ros/spawn_model)
    
    auto-starting new master
    process[master]: started with pid [30073]
    ROS_MASTER_URI=http://localhost:11311
    
    setting /run_id to 613e7c6e-fb51-11ea-9752-ba9c53c9fb50
    process[rosout-1]: started with pid [30084]
    started core service [/rosout]
    process[gazebo-2]: started with pid [30090]
    process[gazebo_gui-3]: started with pid [30096]
    process[robot_state_publisher-4]: started with pid [30101]
    process[urdf_spawner-5]: started with pid [30102]
    [ WARN] [1600613754.174422899]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia.  As a workaround, you can add an extra dummy link to your URDF.
    [ INFO] [1600613754.549975972]: Finished loading Gazebo ROS API Plugin.
    [ INFO] [1600613754.551410505]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting...
    [ INFO] [1600613754.597940953]: Finished loading Gazebo ROS API Plugin.
    [ INFO] [1600613754.599289678]: waitForService: Service [/gazebo_gui/set_physics_properties] has not been advertised, waiting...
    [INFO] [1600613755.167975, 0.000000]: Loading model XML from ros parameter robot_description
    [INFO] [1600613755.172976, 0.000000]: Waiting for service /gazebo/spawn_urdf_model
    [ INFO] [1600613755.599306658]: waitForService: Service [/gazebo/set_physics_properties] is now available.
    [ INFO] [1600613755.620806608]: Physics dynamic reconfigure ready.
    [INFO] [1600613755.777683, 0.000000]: Calling service /gazebo/spawn_urdf_model
    [INFO] [1600613756.714908, 0.001000]: Spawn status: SpawnModel: Successfully spawned entity
    [ INFO] [1600613756.750089801, 0.001000000]: Starting plugin RsvBalancePlugin(ns = //)
    [ WARN] [1600613756.750285869, 0.001000000]: RsvBalancePlugin(ns = //): missing <rosDebugLevel> default is na
    [ INFO] [1600613756.751423093, 0.001000000]: RsvBalancePlugin(ns = //): <tf_prefix> = 
    [ INFO] [1600613756.755910578, 0.001000000]: RsvBalancePlugin(ns = //): Subscribed to cmd_vel!
    [ INFO] [1600613756.759582292, 0.001000000]: RsvBalancePlugin(ns = //): Subscribed to tilt_equilibrium!
    [ INFO] [1600613756.760707215, 0.001000000]: RsvBalancePlugin(ns = //): Advertise odom on odom !
    [ INFO] [1600613756.761440019, 0.001000000]: RsvBalancePlugin(ns = //): Advertise system state on state !
    [ INFO] [1600613756.762112803, 0.001000000]: RsvBalancePlugin(ns = //): Advertise joint_states!
    [urdf_spawner-5] process has finished cleanly
    log file: /home/relaybot/.ros/log/613e7c6e-fb51-11ea-9752-ba9c53c9fb50/urdf_spawner-5*.log
    [ INFO] [1600613764.060165362, 7.205000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613764.257566606, 7.397000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613764.442336366, 7.580000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613764.627132079, 7.762000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613764.929249870, 8.059000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613765.106441473, 8.232000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613765.273507683, 8.396000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613765.449217113, 8.567000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613765.601345806, 8.719000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613765.736628865, 8.852000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613812.917726058, 55.328000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613813.102688301, 55.509000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613813.273348434, 55.677000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613813.432053232, 55.833000000]: RsvBalancePlugin(ns = //): Mode: balance
    [ INFO] [1600613813.722674889, 56.122000000]: RsvBalancePlugin(ns = //): Mode: balance

    使用rqt工具:


    最后,上传一些和现代控制理论密切相关的代码吧。

    A, B, C, D(定义)。

    extern const float g_fWheelRadius;
    extern const float g_fBaseWidth;    // Half of Base width
    extern const float g_fI3;           // I3, horizontal inertia
    
    // System matrices
    extern const float A[4][4];          // A matrix
    extern const float B[4][2];          // B matrix
    extern const float C[4][4];          // C matrix
    extern const float L[4][4];          // L matrix
    extern const float K[2][4];          // K matrix
    extern const float A_BK[4][4];       // A-BK matrix

    平衡控制(算法):

    #include "rsv_balance_gazebo_control/balance_gazebo_control.h"
    
    namespace balance_control
    {
    
    BalanceControl::BalanceControl() {}
    
    /*!
    * \brief Resets all state and control variables.
    *
    * Useful when instantiating and reseting the control.
    */
    void BalanceControl::resetControl()
    {
      t = 0;
      for (int i=0; i < 4; i++)
      {
        x_hat[i] = 0;
        x_adjust[i] = 0;
        x_r[i] = 0;
      }
      u_output[0] = 0.0;
      u_output[1] = 0.0;
    }
    
    /*!
    * \brief Integrates control and models.
    *
    * Integrates control with Euler method.
    * \param dt       Step period.
    * \param x_desired        Input array[4] for goal state
    * \param y_fbk       Array[4] for sensor readings
    */
    void BalanceControl::stepControl(double dt, const double (&x_desired)[4], const double (&y_fbk)[4])
    {
      t += dt;
      //**************************************************************
      // Set reference state
      //**************************************************************
      x_reference[theta]  = x_desired[theta]  + x_adjust[theta];
      x_reference[dx]     = x_desired[dx]     + x_adjust[dx];
      x_reference[dphi]   = x_desired[dphi]   + x_adjust[dphi];
      x_reference[dtheta] = x_desired[dtheta] + x_adjust[dtheta];
    
      //**************************************************************
      // State estimation
      //**************************************************************
      // x_hat - x_ref
      float x_hat_x_ref[4];
      x_hat_x_ref[theta]  = x_hat[theta]  - x_reference[theta];
      x_hat_x_ref[dx]     = x_hat[dx]     - x_reference[dx];
      x_hat_x_ref[dphi]   = x_hat[dphi]   - x_reference[dphi];
      x_hat_x_ref[dtheta] = x_hat[dtheta] - x_reference[dtheta];
    
      // A*(x_hat-x_ref)
      dx_hat[theta]   = A[0][0]*x_hat_x_ref[theta] + A[0][1]*x_hat_x_ref[dx]
                      + A[0][2]*x_hat_x_ref[dphi]  + A[0][3]*x_hat_x_ref[dtheta];
      dx_hat[dx]      = A[1][0]*x_hat_x_ref[theta] + A[1][1]*x_hat_x_ref[dx]
                      + A[1][2]*x_hat_x_ref[dphi]  + A[1][3]*x_hat_x_ref[dtheta];
      dx_hat[dphi]    = A[2][0]*x_hat_x_ref[theta] + A[2][1]*x_hat_x_ref[dx]
                      + A[2][2]*x_hat_x_ref[dphi]  + A[2][3]*x_hat_x_ref[dtheta];
      dx_hat[dtheta]  = A[3][0]*x_hat_x_ref[theta] + A[3][1]*x_hat_x_ref[dx]
                      + A[3][2]*x_hat_x_ref[dphi]  + A[3][3]*x_hat_x_ref[dtheta];
    
      // + B*u_output
      dx_hat[theta]  += B[0][0]*u_output[tauL] + B[0][1]*u_output[tauR];
      dx_hat[dx]     += B[1][0]*u_output[tauL] + B[1][1]*u_output[tauR];
      dx_hat[dphi]   += B[2][0]*u_output[tauL] + B[2][1]*u_output[tauR];
      dx_hat[dtheta] += B[3][0]*u_output[tauL] + B[3][1]*u_output[tauR];
    
      // y - C*x_hat - x_desired
      float yC[4];
      yC[0] = y_fbk[theta]  - (C[0][0]*x_hat[theta] + C[0][1]*x_hat[dx] + C[0][2]*x_hat[dphi] + C[0][3]*x_hat[dtheta]);
      yC[1] = y_fbk[dx]     - (C[1][0]*x_hat[theta] + C[1][1]*x_hat[dx] + C[1][2]*x_hat[dphi] + C[1][3]*x_hat[dtheta]);
      yC[2] = y_fbk[dphi]   - (C[2][0]*x_hat[theta] + C[2][1]*x_hat[dx] + C[2][2]*x_hat[dphi] + C[2][3]*x_hat[dtheta]);
      yC[3] = y_fbk[dtheta] - (C[3][0]*x_hat[theta] + C[3][1]*x_hat[dx] + C[3][2]*x_hat[dphi] + C[3][3]*x_hat[dtheta]);
    
      // L*(y-C*x_hat)
      dx_hat[theta]  += L[0][0]*yC[0] + L[0][1]*yC[1] + L[0][2]*yC[2] + L[0][3]*yC[3];
      dx_hat[dx]     += L[1][0]*yC[0] + L[1][1]*yC[1] + L[1][2]*yC[2] + L[1][3]*yC[3];
      dx_hat[dphi]   += L[2][0]*yC[0] + L[2][1]*yC[1] + L[2][2]*yC[2] + L[2][3]*yC[3];
      dx_hat[dtheta] += L[3][0]*yC[0] + L[3][1]*yC[1] + L[3][2]*yC[2] + L[3][3]*yC[3];
    
      // Integrate Observer, Euler method:
      x_hat[theta]  += dx_hat[theta]*dt;
      x_hat[dx]     += dx_hat[dx]*dt;
      x_hat[dphi]   += dx_hat[dphi]*dt;
      x_hat[dtheta] += dx_hat[dtheta]*dt;
    
      //**************************************************************
      // Reference model
      //**************************************************************
      float x_r_x_ref[4];
      x_r_x_ref[theta]  = x_r[theta]  - x_reference[theta];
      x_r_x_ref[dx]     = x_r[dx]     - x_reference[dx];
      x_r_x_ref[dphi]   = x_r[dphi]   - x_reference[dphi];
      x_r_x_ref[dtheta] = x_r[dtheta] - x_reference[dtheta];
      x_r[theta]   += (A_BK[0][0]*x_r_x_ref[theta] + A_BK[0][1]*x_r_x_ref[dx]
                        + A_BK[0][2]*x_r_x_ref[dphi] + A_BK[0][3]*x_r_x_ref[dtheta])*dt;
      x_r[dx]      += (A_BK[1][0]*x_r_x_ref[theta] + A_BK[1][1]*x_r_x_ref[dx]
                        + A_BK[1][2]*x_r_x_ref[dphi] + A_BK[1][3]*x_r_x_ref[dtheta])*dt;
      x_r[dphi]    += (A_BK[2][0]*x_r_x_ref[theta] + A_BK[2][1]*x_r_x_ref[dx]
                        + A_BK[2][2]*x_r_x_ref[dphi] + A_BK[2][3]*x_r_x_ref[dtheta])*dt;
      x_r[dtheta]  += (A_BK[3][0]*x_r_x_ref[theta] + A_BK[3][1]*x_r_x_ref[dx]
                        + A_BK[3][2]*x_r_x_ref[dphi] + A_BK[3][3]*x_r_x_ref[dtheta])*dt;
    
      // Adjust theta based on reference model
      float e_r_dx;
      // e_r_dx = x_r[dx] - x_hat[dx];
      e_r_dx = x_r[dx] - y_fbk[dx];
      x_adjust[theta] += (.025*e_r_dx)*dt;
    
      //**************************************************************
      // Feedback control
      //**************************************************************
      u_output[tauL] = -(K[0][0]*(x_hat[theta]-x_reference[theta]) + K[0][1]*(x_hat[dx]-x_reference[dx])
                      + K[0][2]*(x_hat[dphi]-x_reference[dphi]) + K[0][3]*x_hat[dtheta]);
      u_output[tauR] = -(K[1][0]*(x_hat[theta]-x_reference[theta]) + K[1][1]*(x_hat[dx]-x_reference[dx])
                      + K[1][2]*(x_hat[dphi]-x_reference[dphi]) + K[1][3]*x_hat[dtheta]);
    }
    
    /*!
    * \brief Set up the output array.
    *
    * Returns the address of the actuator torque array[2]
    */
    double *BalanceControl::getControl()
    {
      return u_output;
    }
    }  // namespace balance_control

    具体模型(参数):

    #include "rsv_balance_gazebo_control/control.h"
    
    const float g_fWheelRadius = 0.19;
    const float g_fBaseWidth   = 0.5;
    const float g_fI3 = .85;
    
    const float A[4][4] = {
      { 0, 0, 0, 1 },
      { -1.2540568855640422, 0, 0, 0 },
      { 0, 0, 0, 0 },
      { 6.059985836147613, 0, 0, 0 }};
    
    const float B[4][2] = {
      { 0.0, 0.0 },
      { 0.1635280961687897, 0.1635280961687897 },
      { -0.09719802837298575, 0.09719802837298575 },
      { -0.15573631660299134, -0.15573631660299134 }};
    
    const float C[4][4] = {
      { 1.0, 0.0, 0.0, 0.0 },
      { 0.0, 1.0, 0.0, 0.0 },
      { 0.0, 0.0, 1.0, 0.0 },
      { 0.0, 0.0, 0.0, 1.0 }};
    
    const float L[4][4] = {
      { 28.04011263,  -2.25919745,  -0.        ,  10.92301101 },
      { -2.25919745,  28.93520042,  -0.        ,   5.07012978 },
      { 0.,  0.,  20.,  0. },
      { 10.92301101,   5.07012978,  -0.        ,   5.48639076 }};
    
    const float K[2][4] = {
      {-117.29162704,  -14.14213562,   -7.07106781,  -53.23791934},
      {-117.29162704,  -14.14213562,    7.07106781,  -53.23791934}};
    
    const float A_BK[4][4] = {
      {  0.        ,   0.        ,   0.        ,   1.        },
      { 37.10689605,   4.62527303,   0.        ,  17.41179119},
      { 0.        ,   0.        ,  -1.3745877 ,   0.        },
      {-30.47314609,  -4.40488822,  -0.        , -16.58215492 }};

    -Fin-


     

    展开全文
  • 文章目录一、线性反馈控制系统的基本结构及特性1.状态反馈2.输出反馈3.输出到状态矢量导数的反馈4.闭环系统的能控性与能观性二、极点配置问题1.用状态反馈能任意配置闭环极点的充要条件是原系统完全能控2.不能采用...
  • 现代控制理论广泛应用于智能驾驶和机器人领域,可自行检索资料学习。 在进行研究探索学习时,推荐如下一些资料。 除了掌握Matlab/C++/Java之外,学习一下Python也是不错的选择。 Python控制系统库是一个Python...
  • chapter2控制系统状态空间表达式的解 2.1线性定常齐次状态方程的解 系统的自由解:系统输入为0时,由初始状态引起的自由运动 当状态方程为齐次微分方程: 给定初始时刻状态 那么上式有唯一解: 若初始时刻从t...
  • 现代控制理论-3.ppt

    2020-12-24 08:28:48
    现代控制理论-3.ppt (77页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.90 积分3 线性控制系统的能控性和能观测性 3.1 能控性和能观测性的概念3.2 连续时间线性定常...
  • 现控倒立摆系统分析

    2020-06-05 00:52:15
    % 变量赋值 m=0.1;M=1; g=10;len=0.5; A=[0 1 0 0 ;0 0 -m*g/M 0;0 0 0 1;0 0 (m+M)*g/(M*len) 0]; b=[0;1/M;0;-1/(M*len)]; c=[1 0 0 0]; d=0; % 能控性分析 M=ctrb(A,b); P=rank(M); N=size(A,1);...
  • 本项目主要工作为以二阶模拟水箱为模型,对其构建无差别实际电路模型,并在实际电路模型中通过使用Matlab及Simulink仿真工具和部分工具箱利用所学自动控制原理、过程控制工程、现代控制理论等理论知识对上述实际电路...
  • 现代控制理论成绩构成为如下四个部分: 总成绩根据平时成绩(包括考勤、作业、课堂测试等占30%)、编程考核30%、创新实践报告10%、期末考试(占30%)综合评定。期末考试形式采用闭卷笔试。 创新实践报告模版:...
  • 车辆控制理论作业

    2012-03-05 12:07:34
    围绕影响、改善和提高汽车控制系统性能方面展开,学会正确地建立车辆控制系统的数学模型,初步掌握用经典控制理论和现代控制理论分析、设计车辆控制系统,学会对控制系统进行仿真分析,为进一步学习、研究和处理汽车...
  • 上海交通大学自动化本科课程现代控制理论PPT
  • 现代控制理论与工程-MATLAB应用题库

    千次阅读 多人点赞 2020-04-15 14:50:45
    (真佩服我自己) 本题库主要记录了高向东主编的《现代控制理论与工程》第2、3、4章的课后题(也就是老师出的作业题),分别为: 第2章 线性控制系统的状态空间描述 第3章 控制系统状态空间的特性 第4章 系统的稳定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,388
精华内容 3,355
关键字:

现代控制理论大作业