Python仿真二级倒立摆

1. 简介

二级倒立摆(Double Inverted Pendulum)是一种常见的控制系统问题,它包含两个相互垂直的杆,每个杆上都有一个质点。该系统的目标是通过控制杆的角度,实现倒立摆的平衡。

在本文中,我们将使用Python来模拟二级倒立摆的运动,并通过控制系统的设计,使其保持平衡。我们将使用常见的控制方法,例如PID控制器和LQR控制器,来控制倒立摆的角度。

2. 模拟二级倒立摆运动

2.1 物理模型

二级倒立摆由两个杆组成,每个杆上都有一个质点。我们可以使用牛顿第二定律来描述摆的运动。

对于第一个杆,我们可以得到以下运动方程:

m1 * l1 * d^2(theta1)/dt^2 = -m1 * g * sin(theta1) - c * d(theta1)/dt + u1

对于第二个杆,我们可以得到以下运动方程:

m2 * l2 * d^2(theta2)/dt^2 = -m2 * g * sin(theta2) - c * d(theta2)/dt + u2

其中,m1m2是质点的质量,l1l2是杆的长度,g是重力加速度,c是阻尼系数,u1u2是杆上施加的控制力。

2.2 数值计算

为了模拟二级倒立摆的运动,我们可以使用数值计算方法,例如欧拉法或Runge-Kutta法。

首先,我们需要将运动方程转化为一阶微分方程。定义x为状态向量,其中x = [theta1, d(theta1)/dt, theta2, d(theta2)/dt]。我们可以得到以下状态方程:

dx/dt = [d(theta1)/dt,
          (-m1 * g * sin(theta1) - c * d(theta1)/dt + u1) / (m1 * l1),
          d(theta2)/dt,
          (-m2 * g * sin(theta2) - c * d(theta2)/dt + u2) / (m2 * l2)]

然后,我们可以使用数值计算方法来逐步计算状态的变化。以下是使用欧拉法进行模拟的示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 参数定义
m1 = 1.0
m2 = 1.0
l1 = 1.0
l2 = 1.0
g = 9.8
c = 0.1

# 控制器参数
Kp = 1.0
Ki = 0.0
Kd = 0.0

# 时间参数
dt = 0.01
t = np.arange(0, 10, dt)

# 初始化状态
theta1 = np.pi / 2
theta2 = 0
dtheta1_dt = 0
dtheta2_dt = 0

# 保存状态的数组
theta1_history = np.zeros_like(t)
theta2_history = np.zeros_like(t)

# 模拟运动
for i in range(len(t)):
    # 计算控制力
    u1 = Kp * (0 - theta1) + Kd * (0 - dtheta1_dt) + Ki * sum(theta1_history)
    u2 = Kp * (0 - theta2) + Kd * (0 - dtheta2_dt) + Ki * sum(theta2_history)
    
    # 计算加速度
    ddtheta1_dt = (-m1 * g * np.sin(theta1) - c * dtheta1_dt + u1) / (m1 * l1)
    ddtheta2_dt = (-m2 * g * np.sin(theta2) - c * dtheta2_dt + u2) / (m2 * l2)
    
    # 更新状态
    theta1 += dtheta1_dt * dt
    theta2 += dtheta2_dt * dt
    dtheta1_dt += ddtheta1_dt * dt
    dtheta2_dt += ddtheta2_dt * dt
    
    # 保存状态
    theta