Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simulação em malha Fechada Adicionada #23

Open
wants to merge 100 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
0c19b37
repositorio atualizado
Oseiasdfarias Mar 14, 2023
7a2fff1
Merge branch 'dev' of github.com:Oseiasdfarias/LabVirtual into dev
Oseiasdfarias Mar 14, 2023
2cacbc0
repositorio atualizado
Oseiasdfarias Mar 14, 2023
1828187
repositorio atualizado
Oseiasdfarias Mar 14, 2023
ec8e293
repositorio atualizado
Oseiasdfarias Mar 14, 2023
1c8427c
repositorio atualizado
Oseiasdfarias Mar 14, 2023
7b765ef
repositorio atualizado
Oseiasdfarias Mar 15, 2023
13f9acb
repositorio atualizado
Oseiasdfarias Mar 20, 2023
32a0873
repositorio atualizado
Oseiasdfarias Mar 27, 2023
8077666
repositorio atualizado
Oseiasdfarias Mar 27, 2023
c097999
repositorio atualizado
Oseiasdfarias Mar 27, 2023
1f8f4f5
repositorio atualizado
Oseiasdfarias Mar 27, 2023
4f11adf
repositorio atualizado
Oseiasdfarias Mar 28, 2023
7adf155
repositorio atualizado
Oseiasdfarias Mar 30, 2023
04e989b
repositorio atualizado
Oseiasdfarias Mar 30, 2023
fc04191
repositorio atualizado
Oseiasdfarias Mar 30, 2023
0ac8446
repositorio atualizado
Oseiasdfarias Mar 30, 2023
272531f
repositorio atualizado
Oseiasdfarias Mar 31, 2023
01039cc
repositorio atualizado
Oseiasdfarias Mar 31, 2023
abf84fa
repositorio atualizado
Oseiasdfarias Mar 31, 2023
1d7a53d
repositorio atualizado
Oseiasdfarias Mar 31, 2023
3ba6833
repositorio atualizado
Oseiasdfarias Mar 31, 2023
e34e54e
repositorio atualizado
Oseiasdfarias Mar 31, 2023
6627104
repositorio atualizado
Oseiasdfarias Mar 31, 2023
8c9d173
repositorio atualizado
Oseiasdfarias Mar 31, 2023
fb495a4
repositorio atualizado
Oseiasdfarias Mar 31, 2023
ef7f8e6
repositorio atualizado
Oseiasdfarias Mar 31, 2023
d18c406
repositorio atualizado
Oseiasdfarias Mar 31, 2023
a519e8f
repositorio atualizado
Oseiasdfarias Mar 31, 2023
18cc8f3
repositorio atualizado
Oseiasdfarias Mar 31, 2023
f1b3ce8
repositorio atualizado
Oseiasdfarias Mar 31, 2023
7acdcdf
repositorio atualizado
Oseiasdfarias Mar 31, 2023
b6ab770
repositorio atualizado
Oseiasdfarias Mar 31, 2023
123e6aa
repositorio atualizado
Oseiasdfarias Mar 31, 2023
fc2b786
repositorio atualizado
Oseiasdfarias Mar 31, 2023
f4766d0
repositorio atualizado
Oseiasdfarias Mar 31, 2023
af46afa
repositorio atualizado
Oseiasdfarias Mar 31, 2023
9ab7a32
repositorio atualizado
Oseiasdfarias Apr 1, 2023
ec9592b
repositorio atualizado
Oseiasdfarias Apr 1, 2023
ef329ef
repositorio atualizado
Oseiasdfarias Apr 1, 2023
5fe8cde
repositorio atualizado
Oseiasdfarias Apr 1, 2023
9065185
repositorio atualizado
Oseiasdfarias Apr 1, 2023
991d081
repositorio atualizado
Oseiasdfarias Apr 1, 2023
f72589a
repositorio atualizado
Oseiasdfarias Apr 1, 2023
a9ea66c
repositorio atualizado
Oseiasdfarias Apr 1, 2023
fdc663d
repositorio atualizado
Oseiasdfarias Apr 2, 2023
6f03bb2
repositorio atualizado
Oseiasdfarias Apr 2, 2023
3ad5a55
repositorio atualizado
Oseiasdfarias Apr 2, 2023
748ef8a
repositorio atualizado
Oseiasdfarias Apr 2, 2023
ea62ce2
repositorio atualizado
Oseiasdfarias Apr 2, 2023
a01b553
repositorio atualizado
Oseiasdfarias Apr 2, 2023
0d8ec97
repositorio atualizado
Oseiasdfarias Apr 3, 2023
95138f3
repositorio atualizado
Oseiasdfarias Apr 3, 2023
0edb94e
repositorio atualizado
Oseiasdfarias Apr 3, 2023
5fd1fb0
repositorio atualizado
Oseiasdfarias Apr 3, 2023
672c00c
repositorio atualizado
Oseiasdfarias Apr 3, 2023
5c4030b
repositorio atualizado
Oseiasdfarias Apr 3, 2023
9699c78
repositorio atualizado
Oseiasdfarias Apr 3, 2023
3268942
repositorio atualizado
Oseiasdfarias Apr 3, 2023
b5a1302
repositorio atualizado
Oseiasdfarias Apr 6, 2023
53bd42a
repositorio atualizado
Oseiasdfarias Apr 7, 2023
e4b9c04
repositorio atualizado
Oseiasdfarias Apr 7, 2023
77238c5
repositorio atualizado
Oseiasdfarias Apr 7, 2023
b5312b9
repositorio atualizado
Oseiasdfarias Apr 7, 2023
95b4709
repositorio atualizado
Oseiasdfarias Apr 7, 2023
6cabd6b
repositorio atualizado
Oseiasdfarias Apr 7, 2023
14323a6
repositorio atualizado
Oseiasdfarias Apr 7, 2023
13a643f
repositorio atualizado
Oseiasdfarias Apr 7, 2023
8f87c77
repositorio atualizado
Oseiasdfarias Apr 7, 2023
84e169a
repositorio atualizado
Oseiasdfarias Apr 7, 2023
1c25452
repositorio atualizado
Oseiasdfarias Apr 7, 2023
0b6ca25
repositorio atualizado
Oseiasdfarias Apr 7, 2023
790818c
repositorio atualizado
Oseiasdfarias Apr 12, 2023
3200126
repositorio atualizado
Oseiasdfarias Apr 12, 2023
595d9b6
repositorio atualizado
Oseiasdfarias Apr 12, 2023
154648b
repositorio atualizado
Oseiasdfarias Apr 12, 2023
d67f66c
repositorio atualizado
Oseiasdfarias Apr 21, 2023
ad2c469
repositorio atualizado
Oseiasdfarias Apr 21, 2023
1a85a8f
repositorio atualizado
Oseiasdfarias Apr 21, 2023
a0cdb6f
repositorio atualizado
Oseiasdfarias Apr 21, 2023
ac1021f
repositorio atualizado
Oseiasdfarias Apr 21, 2023
a422b5c
repositorio atualizado
Oseiasdfarias Apr 21, 2023
55d581e
repositorio atualizado
Oseiasdfarias Apr 21, 2023
b8323d5
repositorio atualizado
Oseiasdfarias Apr 21, 2023
e200442
repositorio atualizado
Oseiasdfarias Apr 21, 2023
4d253dc
repositorio atualizado
Oseiasdfarias Apr 21, 2023
8f2b3ef
repositorio atualizado
Oseiasdfarias Apr 21, 2023
685d8be
repositorio atualizado
Oseiasdfarias Apr 21, 2023
78b6268
repositorio atualizado
Oseiasdfarias Apr 21, 2023
257b698
repositorio atualizado
Oseiasdfarias Apr 21, 2023
a1acf95
repositorio atualizado
Oseiasdfarias Apr 21, 2023
805c232
repositorio atualizado
Oseiasdfarias Apr 21, 2023
bf56d13
repositorio atualizado
Oseiasdfarias May 4, 2023
a584de3
repositorio atualizado
Oseiasdfarias May 4, 2023
cba375f
repositorio atualizado
Oseiasdfarias May 5, 2023
7c7e64d
repositorio atualizado
Oseiasdfarias May 5, 2023
b05d4e9
repositorio atualizado
Oseiasdfarias May 5, 2023
185aca0
repositorio atualizado
Oseiasdfarias May 5, 2023
072ab7c
repositorio atualizado
Oseiasdfarias May 5, 2023
fd4ee26
repositorio atualizado
Oseiasdfarias May 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ Sistemas possíveis:
- 1 - [Maglev](/simulacao_maglev/README.md)
- 2 - [Pêndulo invertido](/simulacao_pendulo_invertido/README.md)
- 3 - pêndulo de múltiplos estágios
- 4 - [Aeropêndulo](/simulacao_modelagem_aeropendulo/README.md)
- 4 - [Aeropêndulo](/simulacao_modelagem_aeropendulo/aeropendulo_doc.html)
- 5 - [Motor DC](/simulacao_motor_dc/README.md)
- 5 - Massa mola (múltiplas massas)
- 6 - suspensão de veículo
- 7 - ball beam
- 8 - ball plate
- 9 - drone (precisa mais informação)
- 10 - Motor DC ou Indução


3,580 changes: 3,513 additions & 67 deletions simulacao_modelagem_aeropendulo/Modelagem_matematica_do_aeropendulo.ipynb

Large diffs are not rendered by default.

409 changes: 327 additions & 82 deletions simulacao_modelagem_aeropendulo/README.md

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions simulacao_modelagem_aeropendulo/aeropendulo/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# -----------------------------------------------------
# Universidade Federal do Pará
# Campus Universitário de Tucuruí
# Faculdade de Engenharia Elétrica
# -----------------------------------------------------
#
# Laboratório Virtual Sistemas Dinâmicos e Controle
# Tema: Simulação Aeropêndulo
# Autor: Oséias Farias
# Orientadores: Prof. Dr: Raphael Teixeira,
# Prof. Dr: Rafael Bayma
#
# Data: 2023
# ----------------------------------------------------
#
from .graficos_aeropendulo import Graficos # noqa: F401
from .animacao_aeropendulo import AnimacaoAeropendulo # noqa: F401
from .interface_interativa import Interface # noqa: F401
from .modelo_mat_aeropendulo import ModeloMatAeropendulo # noqa: F401
from .implementacao_controlador import ControladorDiscreto # noqa: F401


__version__ = "0.1.0"
220 changes: 220 additions & 0 deletions simulacao_modelagem_aeropendulo/aeropendulo/animacao_aeropendulo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
# -----------------------------------------------------
# Universidade Federal do Pará
# Campus Universitário de Tucuruí
# Faculdade de Engenharia Elétrica
# -----------------------------------------------------
#
# Laboratório Virtual Sistemas Dinâmicos e Controle
# Tema: Simulação Aeropêndulo
# Autor: Oséias Farias
# Orientadores: Prof. Dr: Raphael Teixeira,
# Prof. Dr: Rafael Bayma
#
# Data: 2023
# ----------------------------------------------------
#
import vpython as vp


class AnimacaoAeropendulo:
"""
Classe que implementa a aminação do Aeropêndulo.

Atributo:
comprimento_braco: tamanho do braço do Aeropêndulo.
"""
def __init__(self, comprimento_braco=4.4) -> None:
# Parâmetros do Aeropêndulo
self.comprimento_braco = comprimento_braco
self.scene = vp.canvas(title="<center><h1>Aeropêndulo</h1><center/>",
width=650,
height=580, align="left", autoscale=0, range=5,
center=vp.vec(0, 3, 0),
background=vp.vector(1.7, 0.7, 0.9),
color=vp.vec(1, 0.6, 0.6),
forward=vp.vec(-0.3, 0, -1))
self.scene.range = 6
# chamando a função para criar a aminação gráfica do Aeropêndulo.
self.aeropendulo = self.__aminacao()
self.__helice()

def __aminacao(self) -> vp.compound:
"""
Classe que implementa o Aeropêndulo.

Args:
comprimento_braco: tamanho do braço do Aeropêndulo.
Returns:
Retorna um objeto (vpython) que contêm a estrutura do Aeropêndulo.
"""
self.base = vp.box(pos=vp.vec(0, -0.85, 0), size=vp.vec(30, 0.2, 15),
texture=vp.textures.wood)
self.parede = vp.box(pos=vp.vec(0, 7.1, -7.55),
size=vp.vec(30, 16, 0.2),
color=vp.vec(0.1, 0.1, 0.1), shininess=0.01)
self.sitio = vp.text(pos=vp.vec(0, 8.1, -7.45),
text="AEROPÊNDULO", color=vp.vec(1, 0.6, 0.6),
align='center', depth=0)

self.__desenhar_pendulo()

# Eixo de sustentação.
self.eixo = vp.cylinder(pos=vp.vec(0, 5.2, 0.3), radius=0.09,
axis=vp.vec(0, 0, -2),
color=vp.vec(0.7, 0.4, 0.1))

# Estrutura de sustentação do aeropêndulo.
self.b1 = vp.box(pos=vp.vec(0, 1.7, -2), size=vp.vec(3, 8, 0.6),
color=vp.vec(0.8, 0.8, 0.8))

self.b2 = vp.box(pos=vp.vec(0, -0.6, -1.5), size=vp.vec(4.5, 0.4, 2.5),
color=vp.vec(0.8, 0.8, 0.8))

self.logo = vp.box(pos=vp.vec(0, 2.5, -1.799),
texture="https://i.imgur.com/D2xnkpF.png",
size=vp.vec(2, 2, 0.2))

self.ufpa = vp.text(pos=vp.vec(0, 3.7, -1.7), text="UFPA",
color=vp.vec(1, 0.6, 0.6), height=0.5,
align='center', depth=0)

return self.pendulo

def __helice(self) -> None:
self.helice = vp.box(pos=vp.vec(0.8, 0.6, 0),
size=vp.vec(0.05, 0.2, 2),
color=vp.vec(1, 1, 0))

self.helice1 = vp.box(pos=vp.vec(0.8, 0.6, 0),
size=vp.vec(0.05, 0.2, 2),
color=vp.vec(1, 1, 0))
self.helice1.axis = self.pendulo.axis
self.helice1.size = vp.vec(0.05, 0.2, 2)
self.helice1.rotate(axis=vp.vec(1, 0, 0),
angle=vp.pi/4)

self.helice2 = vp.box(pos=vp.vec(0.8, 0.6, 0),
size=vp.vec(0.05, 0.2, 2),
color=vp.vec(1, 1, 0))
self.helice2.axis = self.pendulo.axis
self.helice2.size = vp.vec(0.05, 0.2, 2)
self.helice2.rotate(axis=vp.vec(1, 0, 0),
angle=vp.pi/2)

self.helice3 = vp.box(pos=vp.vec(0.8, 0.6, 0),
size=vp.vec(0.05, 0.2, 2),
color=vp.vec(1, 1, 0))
self.helice3.axis = self.pendulo.axis
self.helice3.size = vp.vec(0.05, 0.2, 2)
self.helice3.rotate(axis=vp.vec(1, 0, 0),
angle=3*vp.pi/4.)
self.helice1.visible = False
self.helice2.visible = False
self.helice3.visible = False

def pause_giro(self) -> None:
self.helice1.visible = True
self.helice2.visible = True
self.helice3.visible = True

def girar_helice(self) -> None:
self.helice1.visible = False
self.helice2.visible = False
self.helice3.visible = False

def set_posicao_helice(self, angle):
self.helice.rotate(axis=vp.vec(0, 0, 1),
angle=angle,
origin=vp.vec(0, 5.2, 0))
self.helice.size = vp.vec(0.05, 0.2, 2)

self.helice1.rotate(axis=vp.vec(0, 0, 1),
angle=angle,
origin=vp.vec(0, 5.2, 0))
self.helice1.size = vp.vec(0.05, 0.2, 2)

self.helice2.rotate(axis=vp.vec(0, 0, 1),
angle=angle,
origin=vp.vec(0, 5.2, 0))
self.helice2.size = vp.vec(0.05, 0.2, 2)

self.helice3.rotate(axis=vp.vec(0, 0, 1),
angle=angle,
origin=vp.vec(0, 5.2, 0))
self.helice3.size = vp.vec(0.05, 0.2, 2)

def update_helice(self, angle, ts) -> None:

self.helice.size = vp.vec(0.05, 0.2, 2)
self.helice1.size = vp.vec(0.05, 0.2, 2)
self.helice2.size = vp.vec(0.05, 0.2, 2)
self.helice3.size = vp.vec(0.05, 0.2, 2)

self.helice.axis = self.pendulo.axis
self.helice.size = vp.vec(0.05, 0.2, 2)
self.helice1.axis = self.pendulo.axis
self.helice1.size = vp.vec(0.05, 0.2, 2)
self.helice2.axis = self.pendulo.axis
self.helice2.size = vp.vec(0.05, 0.2, 2)
self.helice3.axis = self.pendulo.axis
self.helice3.size = vp.vec(0.05, 0.2, 2)

self.helice.rotate(axis=vp.vec(0, 0, 1),
angle=angle*ts,
origin=vp.vec(0, 5.2, 0))
self.helice.size = vp.vec(0.05, 0.2, 2)

self.helice1.rotate(axis=vp.vec(0, 0, 1),
angle=angle*ts,
origin=vp.vec(0, 5.2, 0))
self.helice1.size = vp.vec(0.05, 0.2, 2)

self.helice2.rotate(axis=vp.vec(0, 0, 1),
angle=angle*ts,
origin=vp.vec(0, 5.2, 0))
self.helice2.size = vp.vec(0.05, 0.2, 2)

self.helice3.rotate(axis=vp.vec(0, 0, 1),
angle=angle*ts,
origin=vp.vec(0, 5.2, 0))
self.helice3.size = vp.vec(0.05, 0.2, 2)

# obs tentando ajustar o diro das hélices apenas para um lado ....
# if x[1] + interface.valor_angle < np.pi/2:
# ag = 0.3
# else:
# ag = -0.8

self.helice.rotate(axis=vp.vec(1, 0, 0), angle=0.09)
self.helice1.rotate(axis=vp.vec(1, 0, 0), angle=0.09)
self.helice2.rotate(axis=vp.vec(1, 0, 0), angle=0.09)
self.helice3.rotate(axis=vp.vec(1, 0, 0), angle=0.09)

def __desenhar_pendulo(self) -> None:
# Braço do Aeropêndulo.
self.barra = vp.box(pos=vp.vec(0, -1.4, 0),
size=vp.vec(0.2, self.comprimento_braco, 0.2),
color=vp.vec(0.5, 0.5, 0.95))

# Base que acopla o motor ao braço.
self.base_motor = vp.cylinder(pos=vp.vec(-0.2, -4, 0), radius=0.4,
axis=vp.vec(0.4, 0, 0),
color=vp.vec(0.5, 0.5, 0.95))
# Armadura do motor.
self.base2_motor = vp.box(pos=vp.vec(0.4, -4, 0),
size=vp.vec(0.4, 0.4, 0.4),
color=vp.vec(1, 1, 0))

# Eixo que da hélice do motor
self.base_helice = vp.cylinder(pos=vp.vec(0.4, -4, 0), radius=0.05,
axis=vp.vec(0.4, 0, 0),
color=vp.vec(0.5, 0.5, 0.8))

# Motor completo.
self.motor = vp.compound([self.base_motor,
self.base2_motor,
self.base_helice])

# Aeropêndulo
self.pendulo = vp.compound([self.barra, self.motor])
self.pendulo.pos = vp.vec(0.31, 2.7, 0)
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# -----------------------------------------------------
# Universidade Federal do Pará
# Campus Universitário de Tucuruí
# Faculdade de Engenharia Elétrica
# -----------------------------------------------------
#
# Laboratório Virtual Sistemas Dinâmicos e Controle
# Tema: Simulação Aeropêndulo
# Autor: Oséias Farias
# Orientadores: Prof. Dr: Raphael Teixeira,
# Prof. Dr: Rafael Bayma
#
# Data: 2023
# ----------------------------------------------------
#
import vpython as vp
from typing import Tuple


class Graficos:
"""
Gráfico para polagem dos dados dos estados do Aeroèndulo.
"""
def __init__(self, largura=650, altura=400):
self.width = largura
self.height = altura

def graficos(self) -> Tuple:
"""
Método que cria os Gráfico.

Returns:
Retorna uma tupla contendo o objeto do gráfico e da curvas.
"""
titulo = "Gráficos dos estados do Aeropêndulo"
self.grafico = vp.graph(title=titulo, align="right",
xtitle='tempo (s)', fast=True,
width=self.width, height=self.height,
center=vp.vector(0, 12, 0), scroll=True,
xmin=0, xmax=14, ymin=-0.5, ymax=6, dot=True,
background=vp.vector(0.95, 0.95, 0.95))

self.curva1 = vp.gcurve(color=vp.color.blue, width=3,
markers=False, label="Posição Angular (rad)",
dot=True, dot_color=vp.color.blue)

self.curva2 = vp.gcurve(color=vp.color.black, width=3, markers=False,
label="Referência Angular(rad)", dot=True,
dot_color=vp.color.black)

self.curva3 = vp.gcurve(color=vp.color.red, width=3, markers=False,
label="Velocidade Angular (rad/s)", dot=True,
dot_color=vp.color.red)

self.curva4 = vp.gcurve(color=vp.color.orange, width=3, markers=False,
label="Sinal de Controle (V)", dot=True,
dot_color=vp.color.orange)

return self.grafico, self.curva1, self.curva2, self.curva3, self.curva4
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# -----------------------------------------------------
# Universidade Federal do Pará
# Campus Universitário de Tucuruí
# Faculdade de Engenharia Elétrica
# -----------------------------------------------------
#
# Laboratório Virtual Sistemas Dinâmicos e Controle
# Tema: Simulação Aeropêndulo
# Autor: Oséias Farias
# Orientadores: Prof. Dr: Raphael Teixeira,
# Prof. Dr: Rafael Bayma
#
# Data: 2023
# ----------------------------------------------------
#

class ControladorDiscreto:
def __init__(self, referencia=1, T=0.0625):
self.uk = 0
self.uk1 = 0
self.ek = 0
self.ek1 = 0
self.yout = 0
self.k = 0
self.r = referencia
self.T = T

# Pega o sinal do sensor
def set_sensor(self, yout):
self.yout = yout

# disponibiliza o sinal de controle
def get_u(self):
return self.uk

# Calcula o sinal de controle Proporcional Integral
def control_pi(self):
self.ek = self.r - self.yout
self.uk = self.uk1 + 0.2165 * self.ek - 0.2087 * self.ek1
self.ek1 = self.ek
self.uk1 = self.uk
self.k = self.k + 1

# Calcula o sinal de controle Proporcional
def controle_proporcional(self, kp=1.0):
self.ek = self.r - self.yout
self.KP = kp
self.uk = self.KP * self.ek
Loading