import gradio as gr
from assets.knowledge_cards_html import (
TIME_DOMAIN_KNOWLEDGE,
FREQUENCY_DOMAIN_KNOWLEDGE,
ROOT_LOCUS_KNOWLEDGE
)
def create_header():
"""创建页面顶部的标题、横幅和在线计数器"""
gr.HTML("
自动控制理论AI+数智平台
")
gr.HTML("✨ 交互式控制系统分析与设计工具 | 时域·频域·根轨迹·AI问答 ✨
")
online_counter = gr.HTML(elem_id="online-counter")
gr.HTML("""
🎓
西北工业大学
Northwestern Polytechnical University
2025年校级本科生建设项目资助
""")
return online_counter
def create_time_domain_tab():
"""创建时域分析选项卡的UI组件"""
ui_dict = {}
with gr.Row():
with gr.Column(scale=1):
with gr.Group():
gr.HTML("🔧 系统模型
")
ui_dict["tf_display"] = gr.Markdown(label="当前传递函数", elem_classes="output-display")
with gr.Row():
ui_dict["confirm_button"] = gr.Button("✓ 显示传递函数", variant="secondary", scale=1)
ui_dict["analyze_button"] = gr.Button("🚀 开始分析", variant="primary", scale=1, elem_classes="primary-btn")
with gr.Group():
gr.HTML("📈 动态性能指标
")
ui_dict["output_metrics"] = gr.Textbox(
label="Performance Metrics", lines=8, interactive=False, elem_classes="output-metrics"
)
with gr.Column(scale=2):
ui_dict["output_plot"] = gr.Plot(label="时域响应曲线", elem_classes="plot-container")
# 知识卡片
gr.HTML(f"""
{TIME_DOMAIN_KNOWLEDGE}
""")
return ui_dict
def create_frequency_domain_tab():
"""创建频域分析选项卡的UI组件"""
ui_dict = {}
with gr.Row():
with gr.Column(scale=1):
with gr.Group():
gr.HTML("🎚️ 调整系统增益
")
ui_dict["log_k_slider"] = gr.Slider(minimum=-4, maximum=4, value=1, step=0.01, label="对数增益 log₁₀(K)", info="💡 拖动滑块查看实时变化")
ui_dict["k_number_display"] = gr.Number(value=10.0, label="当前增益 K", interactive=False, elem_classes="gain-display")
with gr.Group():
gr.HTML("🔧 当前系统模型
")
ui_dict["tf_display"] = gr.Markdown(label="含增益K的开环传递函数", elem_classes="output-display")
with gr.Group():
gr.HTML("📊 稳定裕度分析
")
ui_dict["metrics_display"] = gr.Textbox(label="Stability Margins", lines=4, interactive=False, elem_classes="output-metrics")
ui_dict["stability_display"] = gr.Markdown(elem_classes="stability-result")
with gr.Column(scale=2):
ui_dict["plot_output"] = gr.Plot(label="频域响应图", elem_classes="plot-container")
# 知识卡片
gr.HTML(f"""
{FREQUENCY_DOMAIN_KNOWLEDGE}
""")
return ui_dict
def create_root_locus_tab():
"""创建根轨迹分析选项卡的UI组件"""
ui_dict = {}
with gr.Row():
with gr.Column(scale=1):
with gr.Group():
gr.HTML("🎚️ 调整系统增益
")
ui_dict["log_k_slider"] = gr.Slider(minimum=-4, maximum=4, value=1, step=0.01, label="对数增益 log₁₀(K)", info="💡 拖动滑块观察极点移动")
ui_dict["k_number_display"] = gr.Number(value=10.0, label="当前增益 K", interactive=False, elem_classes="gain-display")
with gr.Group():
gr.HTML("📍 闭环极点位置
")
ui_dict["poles_display"] = gr.Textbox(label="Closed-Loop Pole Locations", lines=6, interactive=False, elem_classes="output-metrics")
with gr.Column(scale=2):
ui_dict["plot_output"] = gr.Plot(label="根轨迹图")
gr.HTML(f"""
{ROOT_LOCUS_KNOWLEDGE}
""")
return ui_dict
def create_case_demo_tab():
"""创建算例演示选项卡的UI组件"""
ui_dict = {}
with gr.Row():
with gr.Column(scale=1):
with gr.Group():
gr.HTML("🧪 算例参数设置
")
ui_dict["profile"] = gr.Dropdown(
choices=["起飞-巡航-降落", "高机动阶跃", "经济巡航"],
value="起飞-巡航-降落",
label="工况模板"
)
ui_dict["sim_time"] = gr.Slider(minimum=20, maximum=180, value=60, step=5, label="仿真时长 (s)")
ui_dict["dt"] = gr.Dropdown(choices=[0.02, 0.05, 0.1], value=0.02, label="仿真步长 (s)")
ui_dict["initial_soc"] = gr.Slider(minimum=20, maximum=90, value=60, step=1, label="初始SOC (%)")
ui_dict["initial_engine_power"] = gr.Slider(minimum=20, maximum=250, value=50, step=5, label="初始发动机功率 (kW)")
ui_dict["rpm_scale"] = gr.Slider(minimum=0.6, maximum=1.4, value=1.0, step=0.05, label="目标转速缩放系数")
ui_dict["load_scale"] = gr.Slider(minimum=0.6, maximum=1.4, value=1.0, step=0.05, label="负载转矩缩放系数")
ui_dict["run_button"] = gr.Button("🚀 运行混动算例", variant="primary", elem_classes="primary-btn")
with gr.Group():
gr.HTML("📝 结果解读
")
ui_dict["summary"] = gr.Markdown()
with gr.Column(scale=2):
ui_dict["plot"] = gr.Plot(label="混动系统响应图")
ui_dict["table"] = gr.Dataframe(
headers=["时间(s)", "目标转速", "实际转速", "发动机功率(kW)", "电池功率(kW)", "SOC(%)"],
label="关键时刻数据",
interactive=False
)
return ui_dict
def create_chatbot_tab():
"""创建AI问答选项卡的UI组件"""
ui_dict = {}
ui_dict["chatbot"] = gr.Chatbot(
label="🎓 自控原理AI助教",
type="messages",
avatar_images=("https://img.icons8.com/fluency/96/user-male-circle.png", "https://img.icons8.com/fluency/96/chatbot.png"),
height=650,
latex_delimiters=[
{"left": "$$", "right": "$$", "display": True},
{"left": "$", "right": "$", "display": False},
{"left": "\\[", "right": "\\]", "display": True},
{"left": "\\(", "right": "\\)", "display": False}
],
elem_classes="modern-chatbot",
show_copy_button=True
)
with gr.Row():
ui_dict["chat_input"] = gr.Textbox(label="", placeholder="💬 输入您的问题...", scale=4, lines=2, max_lines=4)
with gr.Column(scale=1, min_width=120):
ui_dict["send_button"] = gr.Button("📤 发送", variant="primary", size="lg")
ui_dict["clear_button"] = gr.Button("🗑️ 清空", variant="secondary", size="lg")
gr.Examples(
examples=["什么是传递函数?", "如何判断系统稳定性?", "解释Bode图的物理意义", "PID控制器各参数的作用"],
inputs=ui_dict["chat_input"],
label="💡 试试这些问题:"
)
return ui_dict