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("""
📚
课程 Course
自动控制理论
👨‍🏫
负责人 Supervisor
魏鹏飞
📧
联系方式 Contact
pengfeiwei@nwpu.edu.cn
🎓 西北工业大学 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