Package: labvirtual
Universidade Federal do ParáCampus Universitário de TucuruíFaculdade de Engenharia ElétricaLink doPyPi.Compartilhamos aqui alguns conteúdos que estamos desenvolvendo buscando formatar um laboratório virtual para sistemas dinâmicos e controle na Faculdade de Engenharia Elétrica da UFPA-Tucuruí.Documentação da BibliotecaPara ter acesso a documentação da biblioteca acesse:Documentação LabvirtualProjeto no GitHubLink doProjeto no GitHub.Membros✨Rafael Bayma⚡Raphael Teixeira⚡Oséias Farias⚡Yuri Cota⚡Instalação da BibliotecaComo Instalar?Para instalar o LabVirtual você pode usar o pip, conda ou o poetry.A biblioteca está disponível para ser instalada via o gerenciador de pacotes do python, para instalar basta digitar o comando abaixo em seu terminal.Instalação com o pippip install labvirtualInstalação com o condaconda install labvirtualInstalação com o poetrypoetry add labvirtualSistemas de interesse:Sistemas possíveis:1 -Maglev2 -AeropênduloIntroduçãoExemplo de uso:Para testar a biblioteca, você pode instala-lá e criar um arquivo chamadomain.pye copie um dos exemplos abaixo.Exemplo Maglev# -----------------------------------------------------# Universidade Federal do Pará# Campus Universitário de Tucuruí# Faculdade de Engenharia Elétrica# -----------------------------------------------------## Laboratório Virtual Sistemas Dinâmicos e Controle# Simulador: Maglev# Autor: Yuri Cota# Orientadores: Prof. Dr: Raphael Teixeira,#               Prof. Dr: Rafael Bayma## Data: 2023#  ----------------------------------------------------## Bibliotecasimporttimeimportnumpyasnpfromscipy.integrateimportsolve_ivpimportvpythonasvp# Importando o Modelo Matemático do Maglevfromlabvirtual.simulador_maglevimportMaglev# Importando o Compensadorfromlabvirtual.simulador_maglevimportCompensador# Importando Simulador e Gráficofromlabvirtual.simulador_maglevimportSimulacaofromlabvirtual.simulador_maglevimportGraficodefrun_maglev():legenda_1="<b>O cilindro está na posição inicial!</b>"legenda_2="<b>O cilindro está na região de equilíbrio!</b>"legenda_3="<b>O cilindro está fora da região de equilíbrio!</b>"legenda_4="<b>Aguarde o cilindro retonar a posição incial!</b>"# Criação dos objetos da planta e controlador para simularmag=Maglev(m=29e-3,k=9.55e-6,mu=2.19e-3,I0=1)comp=Compensador(mag,[-3*mag.lamda]*3,[-8*mag.lamda]*2)# Criando um Objeto Simulacaosim=Simulacao(mag_x0=mag.x0)grafico=Grafico()# Definindo os sinais de referência para rastreamentodefref_seno(t):return(mag.x0*np.sin(2*vp.pi*t))defref_quad(t):return(mag.x0)*(np.sin(2*vp.pi*t)>=0)# Função para ajustar coordenadas do modelo às coordenadas do VPythondefconverte_posicao(y_maglev):return(sim.bobina_3.pos+vp.vec(0,-y_maglev,0))*4# Função para implementar ruído gaussianodefruido(amp):returnamp*np.random.normal(loc=0,scale=amp)# LOOP -------------------------------------------------------------------# Criando o loop da simulaçãowhileTrue:vp.rate(sim.fps)# Verificação da posição do cilindro antes de executar o programaifsim.cil.pos==vp.vector(12e-2,-3.5e-2,0):grafico.legenda_1.text=legenda_1grafico.legenda_1.color=vp.color.greenelifsim.cil.pos==vp.vector(0,0,0):grafico.legenda_1.text="<b>Cilindo grudado!</b>"grafico.legenda_1.color=vp.color.redelifsim.cil.pos.y<=0andsim.cil.pos.y>=\-0.08andsim.cil.pos.x==0:grafico.legenda_1.text=legenda_2grafico.legenda_1.color=vp.color.cyanelse:grafico.legenda_1.text=legenda_3grafico.legenda_1.color=vp.color.purple# Acionando o botão executarifsim.executar:# O primeiro caso: se o cilindro está na posição inicial o# programa não vai sair da tela inicial.ifsim.cil.pos==vp.vector(12e-2,-3.5e-2,0):sim.cil.pos=vp.vector(12e-2,-3.5e-2,0)grafico.yplot.delete()grafico.rplot.delete()sim.t=0# time.sleep(2)sim.executar=notsim.executarsim.bt1_exe.text="Executar"#  O segundo caso: o cilindro está grudado no eletroimã,# tem que aguardar o programa voltar pra tela inicial.elifsim.cil.pos==vp.vector(0,0,0):time.sleep(3)sim.executar=notsim.executarsim.bt1_exe.text="Executar"sim.cil.pos=vp.vector(12e-2,-3.5e-2,0)# O terceiro caso: o cilindro está na região# de equilíbrio, logo o programa irá rodar normalmente.elifsim.cil.pos.y<=0andsim.cil.pos.y>=\-0.08andsim.cil.pos.x==0:# Atualiza o sinal de referência para enviar para o solvermatchsim.M.index:case0|None:defsinal(t):returnref_seno(sim.sl.value*sim.t)*(sim.sl2.value)case1:defsinal(t):# noqa: F811returnref_quad(sim.sl.value*sim.t)*(sim.sl2.value)# Chama o solver para atualizar os estados do maglevsol=solve_ivp(Maglev.estadosmf,t_span=[sim.t,sim.t+sim.dt],y0=sim.y,args=(sinal,mag,comp))# Recupera os resultados da simulaçãosim.y=sol.y[:,-1]+ruido(1e-6)# Atualiza os gráficosgrafico.yplot.plot(sim.t,sim.y[0])grafico.rplot.plot(sim.t,sinal(sim.t)+mag.x0)# print(y[0])# Atualiza a posição do cilindrosim.cil.pos=converte_posicao(sim.y[0])# Atualiza o temposim.t+=sim.dt# O quarto caso: o cilindro está fora da região de equilíbrio,# logo ele irá cair na mesa e retornar a posição inicial.else:whilesim.cil.pos.y>=-3.5e-2:vp.rate(sim.fps)sim.cil.v=sim.cil.v+sim.g*sim.dtsim.cil.pos=sim.cil.pos+sim.cil.v*sim.dtsim.t=sim.t+sim.dtgrafico.legenda_1.text=legenda_4grafico.legenda_1.color=vp.color.redtime.sleep(4)sim.cil.pos=vp.vector(12e-2,-3.5e-2,0)print(sim.t)if__name__=="__main__":run_maglev()Exemplo Aeropêndulo# -----------------------------------------------------# 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#  ----------------------------------------------------#importvpythonasvpimportnumpyasnpfromlabvirtual.simulador_aeropenduloimport(Graficos,AnimacaoAeropendulo,Interface,ModeloMatAeropendulo,ControladorDiscreto)defrun_aeropendulo():# Instanciando um objeto AeropenduloAaeropendulo()animacao_aeropendulo=AnimacaoAeropendulo()# Instanciando um objeto para plotagem dos gráficos dinâmicos dos# estados do Aeropêndulog=Graficos()graf,plot1,plot2,plot3,plot4=g.graficos()# Instânciando um objeto para solução matemática do sistema Aeropêndulo.Km=0.0296m=0.36d=0.03J=0.0106c=0.0076mma=ModeloMatAeropendulo(K_m=Km,m=m,d=d,J=J,c=c)# Instânciando um objeto ControladorDiscretocontrolador=ControladorDiscreto(referencia=0.01)u=0# Sinal de controle inicial# Instanciando um objeto Interfaceinterface=Interface(animacao_aeropendulo,controlador)ts=1e-2# Condições Iniciais dos estadosx=np.array([0.0,0.0])t=0.0t_ant=0.0# Simulação do SistemawhileTrue:vp.rate(100)ifinterface.EXE:# Calcula as derivadas do sitemadx=mma.modelo_aeropendulo(x,t)dt=t-t_ant# Atualização dos estadosx=x+dt*dx# Pega o Ângulo e envia para o controlador# (Realimentação do sistema)controlador.set_sensor(x[1])# O controlador calcula o sinal de controlecontrolador.control_pi()# Controle proporcional# controlador.controle_proporcional(kp=10.0)# pega o sinal de controle calculado e salva na variável uu=controlador.get_u()# Sinal de controle aplicado a entrada do sistemamma.set_u(u)# print(x[1]*(180/np.pi))t_ant=tt+=ts# Atualiza o ângulo do Aeropênduloanimacao_aeropendulo.aeropendulo.rotate(axis=vp.vec(0,0,1),angle=x[0]*ts,origin=vp.vec(0,5.2,0))# Animação da dinâmica da Héliceanimacao_aeropendulo.update_helice(x[0],ts)# print(x[1] + interface.valor_angle)# Gráfico do ângulo.plot1.plot(t,x[1]+interface.valor_angle)# Gráfico do sinal de referênciaplot2.plot(t,controlador.r+interface.valor_angle)# Gráfico da velocidade ângular.plot3.plot(t,x[0])# Gráfico do sinal de controleplot4.plot(t,u)if__name__=="__main__":run_aeropendulo()