1 Star 6 Fork 5

辰汐/PID-Example

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
PID-Test-Live-All.py 7.21 KB
一键复制 编辑 原始数据 按行查看 历史
辰汐 提交于 2023-04-17 10:44 +08:00 . update
import dearpygui.dearpygui as dpg
from threading import Thread
import time
from PID import Pid
import random
dpg.create_context()
# settings
samplerate_time = 0.03
adjustment_range = 500
plot_size_x = 200
auto_fit = True
run = True
# create deault data
input_val = 0
datax = list(float(i) / 10 for i in range(plot_size_x))
data_pid_y = [0] * plot_size_x
data_setVal_y = [0] * plot_size_x
datax_test = []
datay_test = []
def update_data_test():
global datax_test, datay_test, pid
Kp = dpg.get_value("Kp")
Ki = dpg.get_value("Ki")
Kd = dpg.get_value("Kd")
datax_test = list(range(5))
datay_test = [0 for _ in range(5)]
# update data
pid_test = Pid(Kp, Ki, Kd, input_val, dt=1 / samplerate_time)
pid_test.now_val += dpg.get_value("noise")
pid.now_val += dpg.get_value("noise")
for i in range(5, 100):
datax_test.append(i)
datay_test.append(pid_test.calculate())
dpg.set_value("series_TestModel", [datax_test, datay_test])
dpg.fit_axis_data("x_axis_TestModel")
dpg.fit_axis_data("y_axis_TestModel")
def update_data():
global pid, datax, data_pid_y, data_setVal_y, input_val
pid = Pid(0, 0, 0, dt=1 / samplerate_time)
while True:
if run:
pid.now_val += dpg.get_value("continuous_noise") * random.randint(-10, 10)
pid.exp_val = input_val
pid.KP = dpg.get_value("Kp")
pid.KI = dpg.get_value("Ki")
pid.KD = dpg.get_value("Kd")
# update data
data_pid_y.pop(0)
data_pid_y.append(pid.calculate())
data_setVal_y.pop(0)
data_setVal_y.append(input_val)
dpg.set_value("series_setVal", [datax, data_setVal_y])
dpg.set_value("series_pid", [datax, data_pid_y])
if auto_fit:
dpg.fit_axis_data("x_axis")
dpg.fit_axis_data("y_axis")
dpg.set_axis_limits("x_axis", 0, float(plot_size_x / 10))
dpg.set_axis_limits("y_axis", 0, 500)
time.sleep(samplerate_time)
def reset_config():
global pid
dpg.set_value("Kp", 0.04)
dpg.set_value("Ki", 0.7)
dpg.set_value("Kd", 0.015)
def set_val():
global pid, input_val
input_val = dpg.get_value("Sv")
update_data_test()
def set_run(sender):
global run
run = dpg.get_value(sender)
def set_auto_fit(sender):
global auto_fit
auto_fit = dpg.get_value(sender)
if not auto_fit:
dpg.set_axis_limits_auto("x_axis")
dpg.set_axis_limits_auto("y_axis")
with dpg.window(tag="Primary Window", height=-1):
with dpg.theme(tag="plot_theme_pid"):
with dpg.theme_component(dpg.mvLineSeries):
dpg.add_theme_color(
dpg.mvPlotCol_Line, (255, 255, 50), category=dpg.mvThemeCat_Plots
)
dpg.add_theme_style(
dpg.mvPlotStyleVar_Marker,
dpg.mvPlotMarker_Square,
category=dpg.mvThemeCat_Plots,
)
dpg.add_theme_style(
dpg.mvPlotStyleVar_MarkerSize, 2, category=dpg.mvThemeCat_Plots
)
with dpg.theme(tag="plot_theme_setVal"):
with dpg.theme_component(dpg.mvLineSeries):
dpg.add_theme_color(
dpg.mvPlotCol_Line, (0, 180, 255), category=dpg.mvThemeCat_Plots
)
with dpg.theme(tag="plot_theme_TestModel"):
with dpg.theme_component(dpg.mvLineSeries):
dpg.add_theme_color(
dpg.mvPlotCol_Line, (255, 150, 50), category=dpg.mvThemeCat_Plots
)
dpg.add_theme_style(
dpg.mvPlotStyleVar_Marker,
dpg.mvPlotMarker_Square,
category=dpg.mvThemeCat_Plots,
)
dpg.add_theme_style(
dpg.mvPlotStyleVar_MarkerSize, 2, category=dpg.mvThemeCat_Plots
)
with dpg.plot(label="Simulate", height=300, width=-1):
# optionally create legend
dpg.add_plot_legend()
# REQUIRED: create x and y axes
dpg.add_plot_axis(dpg.mvXAxis, label="x", tag="x_axis")
dpg.add_plot_axis(dpg.mvYAxis, label="y", tag="y_axis")
# series belong to a y axis
dpg.add_line_series(
datax, data_setVal_y, label="Set Val", parent="y_axis", tag="series_setVal"
)
dpg.add_line_series(
datax, data_pid_y, label="PID Out", parent="y_axis", tag="series_pid"
)
dpg.bind_item_theme("series_setVal", "plot_theme_setVal")
dpg.bind_item_theme("series_pid", "plot_theme_pid")
with dpg.plot(label="Test Model", height=300, width=-1):
# REQUIRED: create x and y axes
dpg.add_plot_axis(dpg.mvXAxis, label="x", tag="x_axis_TestModel")
dpg.add_plot_axis(dpg.mvYAxis, label="y", tag="y_axis_TestModel")
# series belong to a y axis
dpg.add_line_series(
datax, data_setVal_y, parent="y_axis_TestModel", tag="series_TestModel"
)
dpg.bind_item_theme("series_TestModel", "plot_theme_TestModel")
with dpg.group(horizontal=True):
dpg.add_button(label="Reset", tag="Btn_Reset", callback=reset_config)
dpg.add_checkbox(
label="Run", tag="Radio_Run", default_value=True, callback=set_run
)
dpg.add_checkbox(
label="Auto Fit",
tag="Radio_AutoFit",
default_value=True,
callback=set_auto_fit,
)
with dpg.group(horizontal=True):
dpg.add_text("Val")
dpg.add_slider_int(
tag="Sv",
default_value=0,
max_value=adjustment_range,
width=-1,
callback=set_val,
)
with dpg.group(horizontal=True):
dpg.add_text("Kp")
dpg.add_slider_float(
tag="Kp",
default_value=0.04,
min_value=-2,
max_value=2,
width=-1,
callback=lambda: update_data_test(),
)
with dpg.group(horizontal=True):
dpg.add_text("Ki")
dpg.add_slider_float(
tag="Ki",
default_value=0.7,
min_value=-2,
max_value=2,
width=-1,
callback=lambda: update_data_test(),
)
with dpg.group(horizontal=True):
dpg.add_text("Kd")
dpg.add_slider_float(
tag="Kd",
default_value=0.015,
min_value=-2,
max_value=2,
width=-1,
callback=lambda: update_data_test(),
)
with dpg.group(horizontal=True):
dpg.add_text("noise")
dpg.add_slider_float(
tag="noise",
default_value=0,
min_value=-100,
max_value=100,
width=-1,
callback=lambda: update_data_test(),
)
with dpg.group(horizontal=True):
dpg.add_text("continuous noise")
dpg.add_slider_float(
tag="continuous_noise",
default_value=0,
min_value=0,
max_value=5,
width=-1,
callback=lambda: update_data_test(),
)
Thread(target=update_data, daemon=True).start()
dpg.create_viewport(title="PID Simulate", width=900, height=820)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("Primary Window", True)
dpg.start_dearpygui()
dpg.destroy_context()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/chenxi2000/pid-example.git
git@gitee.com:chenxi2000/pid-example.git
chenxi2000
pid-example
PID-Example
master

搜索帮助