码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于LQR算法的一阶倒立摆控制


    1. 一阶倒立摆建模

    在这里插入图片描述

    2. 数学模型

    倒立摆的受力分析网上有很多,这里就不再叙述。直接放线性化后的方程:

    F = (M+m)x″-mLφ″
    (I+mL²)φ″= mLx″+ mgLφ
    
    • 1
    • 2

    (F为外力,x为物块位移,M,m为物块和摆杆的质量,φ为摆杆相对竖直向上方向的角度)

    然后建立状态控制方程:
    在这里插入图片描述

    得到状态矩阵为:

    在这里插入图片描述

    3. python代码

    # lqr.py
    
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import control
    import numpy as np
    
    M = 1.0      # 小车质量
    m = 1.0      # 摆杆质量
    g = 9.8      # 重力加速度
    L = 2.0      # 摆杆长度
    
    I = 1.0 / 3.0 * m * (L*L)      # 均质摆杆转动惯量
    
    print("I is: ", I)
    
    A_23 = -(m*m) * (L*L) * g / (I * (M + m) + M * m * (L*L))
    A_43 = (M + m) * m * g * L / (I * (M + m) + M * m * (L*L))
    
    print("A_23 is: ", A_23)
    print("A_43 is: ", A_43)
    
    B_2 = (I + m * (L*L)) / (I * (M + m) + M * m * (L*L))
    B_4 = -m * L / (I * (M + m) + M * m * (L*L))
    
    print("B_2 is: ", B_2)
    print("B_4 is: ", B_4)
    
    A = np.array([[0, 1, 0,    0], 
                  [0, 0, A_23, 0], 
                  [0, 0, 0,    1], 
                  [0, 0, A_43, 0]])
    
    # B = np.array([[0], [B_2], [0], [B_4]])
    _B = np.array([0, B_2, 0, B_4])
    B = _B.reshape(_B.shape[0],1)
    
    Q = np.array([[100, 0, 0,   0],
                  [0,   1, 0,   0],
                  [0,   0, 100, 0],
                  [0,   0, 0,   1]])
    
    R = 10
    
    K = control.lqr(A, B, Q, R)
    
    print("K is: ", K)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    执行结果:

    $ ./lqr.py 
    I is:  1.3333333333333333
    A_23 is:  -5.880000000000001
    A_43 is:  5.880000000000001
    B_2 is:  0.8
    B_4 is:  -0.30000000000000004
    K is:  (array([[ -3.16227766,  -6.43571648, -83.62359638, -39.56913008]]), array([[  203.5152246 ,   206.59223321,  1251.28576097,   656.32187724],
           [  206.59223321,   292.76442691,  1890.23514953,   995.22902118],
           [ 1251.28576097,  1890.23514953, 15580.3357274 ,  7828.080278  ],
           [  656.32187724,   995.22902118,  7828.080278  ,  3972.91505928]]), array([-2.38935921+0.27045155j, -2.38935921-0.27045155j,
           -0.97172371+0.81464125j, -0.97172371-0.81464125j]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考:
    一阶倒立摆simscape建模

  • 相关阅读:
    【GNN报告】加拿大蒙特利尔唐建:Geometric Deep Learning For Drug Discovery
    当10年程序员是什么体验?存款几位数?
    第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第七节 - Python 中的字符串模板类)
    第二部分—C语言提高篇_12. 动/精态库的封装和使用
    没有可用软件包和yum源问题
    微信
    K8S安装过程九:Kubernetes Worker 节点安装
    三个面试Demo,看完后有股如沐春风的感觉.....哈哈
    如何才能做好单元测试优化?
    Redis避坑指南:为什么要有分布式锁?
  • 原文地址:https://blog.csdn.net/hbuxiaofei/article/details/133067019
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号