File size: 4,592 Bytes
774e2a4 | 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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import linalg
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import time
from simulation import run_simulation
def show_robot_tp():
"""Interface pour le TP du robot souple"""
st.header("🤖 TP - Pilotage d'un Robot Souple")
# Description du système
st.markdown("""
### Système étudié : Poutre encastrée-libre
**Caractéristiques** :
- Longueur : 500 mm
- Section : 5×5 mm
- Matériau : Aluminium (E=70 GPa)
- Point d'action : A (effort appliqué)
- Point de mesure : B (déplacement désiré)
**Objectif** : Commander la trajectoire de B en utilisant uniquement la mesure en A
""")
# Paramètres de simulation
col1, col2, col3 = st.columns(3)
with col1:
st.markdown("### Paramètres géométriques")
nstep = st.slider("Nombre de pas", 100, 2000, 1000)
delta = st.slider("Pas de temps", 0.001, 0.1, 0.01, 0.001)
L = st.slider("Longueur (mm)", 100, 1000, 500)
a = st.slider("Largeur section", 1, 10, 5)
b = st.slider("Hauteur section", 1, 10, 5)
nx = st.slider("Nombre d'éléments", 5, 20, 10)
with col2:
st.markdown("### Paramètres de contrôle")
control_type = st.selectbox("Type de contrôle",
["pid", "kalman", "pid_kalman"],
format_func=lambda x: {"pid": "PID seul", "kalman": "Kalman seul", "pid_kalman": "PID + Kalman"}[x])
meas_location = st.selectbox("Position de mesure", ["A", "B"],
format_func=lambda x: f"Point {x}")
Kp = 0.5
Ki = 0.1
Kd = 0.01
if control_type in ['pid', 'pid_kalman']:
Kp = st.slider("Kp", 0.0, 1.0, 0.5, 0.01)
Ki = st.slider("Ki", 0.0, 1.0, 0.1, 0.01)
Kd = st.slider("Kd", 0.0, 1.0, 0.01, 0.001)
with col3:
st.markdown("### Bruit")
q = st.slider("Bruit force (q)", 1e-6, 1e-3, 1e-4, 1e-6, format="%.2e")
r = st.slider("Bruit mesure (r)", 1e-6, 1e-3, 1e-4, 1e-6, format="%.2e")
E = st.slider("Module Young (MPa)", 10000, 100000, 70000)
rho = st.slider("Densité", 1e-9, 1e-8, 2.7e-9, 1e-10, format="%.2e")
cy = st.slider("Amortissement", 1e-5, 1e-3, 1e-4, 1e-5, format="%.2e")
# Simulation
if st.button("🚀 Lancer la simulation", type="primary"):
time0, ixe, u, v, a_sim, e_set, fA = run_simulation(nstep, delta, q, r, T=3, Kp=Kp if 'Kp' in locals() else 0.5,
Ki=Ki if 'Ki' in locals() else 0.1, Kd=Kd if 'Kd' in locals() else 0.01,
mu=0.01, beta=0.25, gamma=0.5, L=L, a=a, b=b, E=E, rho=rho, cy=cy, nx=nx,
control_type=control_type, meas_location=meas_location)
# Visualisation
fig = make_subplots(rows=2, cols=1,
subplot_titles=("Configuration finale", "Déplacement pointe vs temps"),
vertical_spacing=0.15)
# Configuration finale
fig.add_trace(go.Scatter(x=ixe, y=u[::2, -1], name='Déplacement u',
line=dict(color='blue')),
row=1, col=1)
fig.add_trace(go.Scatter(x=ixe, y=u[1::2, -1], name='Rotation θ',
line=dict(color='red')),
row=1, col=1)
# Déplacement pointe
fig.add_trace(go.Scatter(x=time0, y=u[-1, :], name='Pointe',
line=dict(color='blue')),
row=2, col=1)
fig.add_trace(go.Scatter(x=time0, y=fA, name='Référence',
line=dict(color='red', dash='dash')),
row=2, col=1)
fig.update_layout(height=600, showlegend=True)
st.plotly_chart(fig, use_container_width=True)
if control_type in ['pid', 'pid_kalman']:
# Erreur
fig_error = go.Figure()
fig_error.add_trace(go.Scatter(x=time0, y=e_set, name='Erreur',
line=dict(color='green')))
fig_error.update_layout(title="Erreur de suivi", xaxis_title="Temps (s)", yaxis_title="Erreur")
st.plotly_chart(fig_error, use_container_width=True) |