download
raw
4.59 kB
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)

Xet Storage Details

Size:
4.59 kB
·
Xet hash:
07f9d4a598fa60220903c918dfe8b7685289cef6daf2a38227d6a14e4e17a608

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.