!apt update -y
!apt install ffmpeg -y
import numpy as np
import matplotlib.pyplot as plt
import sympy
from matplotlib.animation import FFMpegWriter
from matplotlib.patches import Circle
g = 9.8
m1 = 1
m2 = 2
li = 1
k = 10
L = 1
dt=0.001
t_vec=np.arange(0,10,dt)
x_vec=np.zeros(len(t_vec))
dx_vec=np.zeros(len(t_vec))
th_vec=np.zeros(len(t_vec))
dth_vec=np.zeros(len(t_vec))
x_vec[0]=0
dx_vec[0]=0
th_vec[0]=1
dth_vec[0]=0
for i in range (1, len(t_vec)):
A= np.array([[(m1*L**2), 0], [0, m2]])
b = np.array([0, 0])
#Dummy variables
C =(3*L*np.sin(th_vec[i-1])) - (2*L*np.cos(th_vec[i-1])*x_vec[i-1])
H = L**2 - (3*L*np.cos(th_vec[i-1])) + 2.25 + (L*2*np.sin(th_vec[i-1])*x_vec[i-1]) + x_vec[i-1]**2
F =(-2*L*np.sin(th_vec[i-1])) + (2*(x_vec[i-1]))
b[0] = (-m1*g*L*(np.sin(th_vec[i-1]))) - 0.5*k*(C - li*(C/(np.sqrt(H))))
b[1]= -0.5*k*(F - li*(F/(np.sqrt(H))))
[ddth, ddx] = np.linalg.solve(A,b)
x_vec[i]=x_vec[i-1] + dx_vec[i-1]*dt
th_vec[i]=th_vec[i-1] + dth_vec[i-1]*dt
dx_vec[i]=dx_vec[i-1]+ddx*dt
dth_vec[i]=dth_vec[i-1]+ddth*dt
plt.plot(t_vec,x_vec)
plt.show()
plt.plot(t_vec, th_vec)
plt.show()
# Set # Setup Figure: Initialize Figure / Axe Handles
fig, ax = plt.subplots() # Initialize Figure and Axes
p, = ax.plot([], [], color='cornflowerblue') # Initialize Empty Plot
ax.axis('equal')
ax.set_xlim([-3, 3]) # X Lim
ax.set_ylim([-3, 3]) # Y Lim
ax.set_xlabel('X') # X Label
ax.set_ylabel('Y') # Y Label
ax.set_title('Simulation 2:') # Plot Title
video_title = "simulation 2" # name of the mp4up figure for drawing
# Initialize Patch 1- the pendulum:
p1= Circle((0, 0), radius=0.1, color='cornflowerblue') # Draws a circle of radius 0.1 at (X, Y) location (0, 0)
ax.add_patch(p1) # Add the patch to the axes
# Patch 2 -cart:
p2 = Circle((0,0), radius=0.1,color='cornflowerblue')
ax.add_patch(p2)
# Draw Static Objects:
pin_joint = Circle((0, 0), radius=0.05, color='black', zorder=10)
ax.add_patch(pin_joint)
# Setup Animation Writer:
FPS = 20 # Frames per second for the video
sample_rate = int(1 / (dt * FPS)) # Rate at which we sample the simulation to visualize
dpi = 300 # Quality of the Video
writerObj = FFMpegWriter(fps=FPS) # Video Object
# Initialize Array:
simulation_size = len(t_vec) # We use this alot, so lets store it.
x_pend = np.zeros(simulation_size)
y_pend = np.zeros(simulation_size)
x_cart = np.zeros(simulation_size)
y_cart = np.zeros(simulation_size)
# Find the X and Y trajectories :
for i in range(0, simulation_size):
x_pend[i] = 0 + L*np.sin(th_vec[i])
y_pend[i] = 0 - L*np.cos(th_vec[i])
x_cart[i] = 0 + x_vec[i]
y_cart[i] = -1.5
with writerObj.saving(fig, video_title+".mp4", dpi):
for i in range (0,simulation_size, sample_rate):
x_pendarm = [0, x_pend[i],x_cart[i]]
y=pendarm = [0, y_pend[i],y_cart[i]]
p.set_data(x_pend,y_pend)
p1_center = x_pend[i], y_pend[i]
p2_center = x_cart[i], y_cart[i]
p1.center = p1_center
p2.center = p2_center
fig.canvas.draw()
writerObj.grab_frame()
from IPython.display import Video
Video("/work/"+video_title+".mp4", embed=True, width=640, height=480)