⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfgui.m

📁 particle filter 粒子滤波器 matlab工具箱
💻 M
字号:
function pfgui
% Starts the GUI!

% Toolbox for nonlinear filtering.
% Copyright (C) 2005  Jakob Ros閚 <jakob.rosen@gmail.com>
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

myfont='default';

filter_types=pfgui_config('filter_types');

%% Generate the menu
filter_number=length(filter_types);
filter_objects=cell(1,filter_number);
filter_descriptions=cell(1,filter_number);
for i=1:filter_number
	filter_objects{i}=eval(filter_types{i});
	filter_descriptions{i}=get(filter_objects{i},'description');
end;
filter_menu=cell2str(filter_descriptions);

disp('Generating models');
[model_objects, model_names]=pfgui_example_models;
disp('Models generated...');

animate_states=[1 2];
animate_axes=[1 1];
graph_states=1;
rmse_runs=1;
runs=1;
simulation_steps=10;

%% Generate the menu
%model_number=length(model_objects);
%model_descriptions=cell(model_number+1,1);
%model_descriptions{1}='Select a model';
%for i=1:model_number
%%	model_descriptions{i}=[model_names{i},' [',class(model_objects{i}),'] ',num2str(length(model_objects{i}.x0)),' states'];
%	model_descriptions{i+1}=['[',class(model_objects{i}),'] ',model_names{i},' (',num2str(length(model_objects{i}.x0)),' states)'];
%end;
%model_menu=cell2str(model_descriptions);
model_menu=' ';


% Create the main window
hf=figure('Name','Main','Units','Normalized');
%hf=figure('Name','Main','NumberTitle','off','Units','Centimeters','Position',[1 3 15 10],'Units','Normalized','PaperUnits','Centimeters','PaperPosition',[0.25 3 18 12]);

%% For printing
%uicontrol(hf,'Style','Frame','Units','normalized','Position',[-0.1 -0.1 1.2 1.2]);

p=-0.08;
% Frame + Model text
%simulator_tooltip='Before we can do any filtering, we need data to filter. This is usually generated by a simulator, which generates a realization of data according to a certain model. This data is then sent to the filter, in step 2.';
simulator_tooltip='Before we can do any filtering, we need data to filter. This data is generated by a simulator.';
uicontrol(hf,'Style','Frame','Units','normalized','Position',[0.02 p+0.79 0.96 0.24],'TooltipString',simulator_tooltip);
uicontrol(hf,'Style','Text','String','Step 1 - Configure the input','Units','normalized','Position',[0.05 0.06+p+0.95 0.44 0.04],'TooltipString',simulator_tooltip,'FontName','FixedWidth');

% Radio Buttons
uicontrol(hf,'Style','Text','String','Mode:','Units','normalized','Position',[0.05 p+0.95 0.26 0.04],'TooltipString',simulator_tooltip,'HorizontalAlign','Left','FontName',myfont);
uicontrol(hf,'Style','RadioButton','String','Simulator','Value',1,'Units','Normalized','Position',[0.35 p+0.95 0.2 0.04],'Tag','sim_radio_1','Callback',['pfgui_action(''sim_radio_1'',',num2str(hf),')'],'FontName',myfont);
uicontrol(hf,'Style','RadioButton','String','Data from workspace','Value',0,'Units','Normalized','Position',[0.6 p+0.95 0.35 0.04],'Tag','sim_radio_2','Callback',['pfgui_action(''sim_radio_2'',',num2str(hf),')'],'FontName',myfont);

% Simulator model selector (visible by default)
simulator_steps_tooltip='Defines the amount of discrete steps (samples) that will be simulated each run.';
simulator_model_tooltip='The model that will be used for simulating data.';
uicontrol(hf,'Style','PopUp','String',model_menu,'Value',1,'Units','normalized','Position',[0.05 p+0.88 0.9 0.05],'Callback',['pfgui_action(''filt_model'',',num2str(hf),')'],'Tag','sim_model','TooltipString',simulator_model_tooltip,'Visible','on','FontName',myfont);
uicontrol(hf,'Style','Text','String','Simulation steps:','Units','normalized','Position',[0.05 p+0.81 0.26 0.05],'HorizontalAlign','Left','TooltipString',simulator_steps_tooltip,'Tag','sim_steps_text','Visible','on','FontName',myfont);
uicontrol(hf,'Style','Edit','String',num2str(simulation_steps),'Units','normalized','Position',[0.35 p+0.81 0.15 0.05],'Callback',['pfgui_action(''simulation_steps'',',num2str(hf),')'],'Tag','sim_steps','TooltipString',simulator_steps_tooltip,'Visible','on','FontName',myfont);

% Simulator data selector (invisible by default)
uicontrol(hf,'Style','Text','String','Name of y(t) matrix to be processed:','Units','normalized','Position',[0.05 p+0.88 0.58 0.04],'HorizontalAlign','Left','Tag','sim_y_text','Visible','off','FontName',myfont);
uicontrol(hf,'Style','Edit','String','','Units','normalized','Position',[0.6 p+0.88 0.15 0.05],'Callback',['pfgui_action(''y_import'', ', num2str(hf), ')'],'Tag','sim_y_edit','Visible','off','FontName',myfont);
uicontrol(hf,'Style','Text','String','[No data]','Units','normalized','Position',[0.78 p+0.88 0.17 0.05],'Tag','sim_y_size','HorizontalAlign','Left','Visible','off','FontName',myfont);

uicontrol(hf,'Style','Text','String','Name of true x(t) matrix [optional]:','Units','normalized','Position',[0.05 p+0.81 0.58 0.04],'HorizontalAlign','Left','Tag','sim_x_text','Visible','off','FontName',myfont);
uicontrol(hf,'Style','Edit','String','','Units','normalized','Position',[0.6 p+0.81 0.15 0.05],'Callback',['pfgui_action(''x_import'', ', num2str(hf), ')'],'Tag','sim_x_edit','Visible','off','FontName',myfont);
uicontrol(hf,'Style','Text','String','[No data]','Units','normalized','Position',[0.78 p+0.81 0.17 0.05],'Tag','sim_x_size','HorizontalAlign','Left','Visible','off','FontName',myfont);

p=-0.36;
%p=-0.22;
% Frame + Filter text
filter_tooltip='The data from the simulator is sent to the filter to be processed.';
uicontrol(hf,'Style','Frame','Units','normalized','Position',[0.02 p+0.77 0.96 0.26],'TooltipString',filter_tooltip);
uicontrol(hf,'Style','Text','String','Step 2 - Filter data','Units','normalized','Position',[0.05 p+1.00 0.3 0.04],'TooltipString',filter_tooltip,'FontName','FixedWidth');

% Filter model selector
filter_model_tooltip='The model that will be used for filtering the data from step 1.';
filter_type_tooltip='The desired filter type.';
filter_edit_tooltip='Configure the selected filter.';
uicontrol(hf,'Style','PopUp','String',model_menu,'Value',1,'Units','normalized','Position',[0.05 0.20+p+0.74 0.9 0.05],'Callback',['pfgui_action(''filt_model'',',num2str(hf),')'],'Tag','filt_model','TooltipString',filter_model_tooltip,'FontName',myfont);
uicontrol(hf,'Style','PopUp','String',filter_menu,'Value',1,'Units','normalized','Position',[0.05 0.20+p+0.67 0.5 0.05],'Callback',['pfgui_action(''filt_type_select'',',num2str(hf),')'],'Tag','filt_type_select','TooltipString',filter_type_tooltip,'FontName',myfont);
uicontrol(hf,'Style','Pushbutton','String','Edit filter properties','Units','normalized','Position',[0.57 0.20+p+0.67 0.38 0.05],'Callback',['pfgui_action(''filt_edit_button'',',num2str(hf),')'],'Tag','filt_edit_button','TooltipString',filter_edit_tooltip,'FontName',myfont);

uicontrol(hf,'Style','Text','String','Number of runs:','Units','normalized','Position',[0.05 0.20+p+0.60 0.26 0.05],'HorizontalAlign','Left','Tag','filt_runs_text','FontName',myfont);
uicontrol(hf,'Style','Edit','String',num2str(runs),'Units','normalized','Position',[0.28 0.20+p+0.60 0.1 0.05],'Callback',['pfgui_action(''edit_runs'',',num2str(hf),')'],'Tag','filt_runs_edit','FontName',myfont);
uicontrol(hf,'Style','Checkbox','String','xhat','Units','normalized','Position',[0.57 0.20+p+0.60 0.12 0.05],'Value',1,'HorizontalAlign','Left','Tag','xhat_check','FontName',myfont);
uicontrol(hf,'Style','Checkbox','String','xpred','Units','normalized','Position',[0.68 0.20+p+0.60 0.12 0.05],'Value',0,'HorizontalAlign','Left','Tag','xpred_check','FontName',myfont);


uicontrol(hf,'Style','Pushbutton','String','FILTER!','Units','normalized','Position',[0.83 0.20+p+0.60 0.12 0.05],'Callback',['pfgui_action(''filter'',',num2str(hf),')'],'Tag','filt_button','FontName',myfont);


p=-0.78;
% Frame + Operations text
op_tooltip='After configuring step 1 and 2, we must select an operation. There are three of them.';
uicontrol(hf,'Style','Frame','Units','normalized','Position',[0.02 p+1.02 0.96 0.13],'TooltipString',op_tooltip,'FontName',myfont);
uicontrol(hf,'Style','Text','String','Step 3 - Choose an operation','Units','normalized','Position',[0.05 p+1.12 0.42 0.04],'TooltipString',op_tooltip,'FontName','FixedWidth');


% RMSE
rmse_button_tooltip='Generates the RMSE for a specified amount of runs.';
uicontrol(hf,'Style','Pushbutton','String','RMSE','Value',1,'Units','normalized','Position',[0.05 0.46+p+0.6 0.2 0.05],'Callback',['pfgui_action(''rmse_button'',',num2str(hf),')'],'Tag','rmse_button','TooltipString',rmse_button_tooltip,'FontName',myfont);

% Graph
graph_button_tooltip='Generates a 2d-graph of the simulated data and the filtered result.';
uicontrol(hf,'Style','Pushbutton','String','Graph','Value',1,'Units','normalized','Position',[0.3 0.46+p+0.6 0.2 0.05],'Callback',['pfgui_action(''graph_button'',',num2str(hf),')'],'Tag','graph_button','TooltipString',graph_button_tooltip,'FontName',myfont);

% Export
export_button_tooltip='Exports your favourite data';
uicontrol(hf,'Style','Pushbutton','String','Export','Value',1,'Units','normalized','Position',[0.55 0.46+p+0.6 0.2 0.05],'Callback',['pfgui_action(''export_button'',',num2str(hf),')'],'Tag','export_button','TooltipString',export_button_tooltip,'FontName',myfont);

p=-0.23;

% Frame + Model text
additional_tooltip='Additional parameters that might be useful in some cases.';
uicontrol(hf,'Style','Frame','Units','normalized','Position',[0.02 p+0.32 0.96 0.11],'TooltipString',additional_tooltip);
uicontrol(hf,'Style','Text','String','Additional parameters','Units','normalized','Position',[0.05 p+0.40 0.34 0.04],'TooltipString',additional_tooltip,'FontName','FixedWidth');

% u(t)
u_tooltip='Import u(t) from the workspace';
u_text_tooltip='The dimensions of the actual u(t) data';
uicontrol(hf,'Style','Text','String','Workspace matrix:','Units','normalized','Position',[0.05 p+0.34 0.3 0.04],'HorizontalAlign','Left','TooltipString',u_tooltip,'FontName',myfont);
uicontrol(hf,'Style','Edit','String','','Units','normalized','Position',[0.32 p+0.34 0.15 0.05],'Callback',['pfgui_action(''u_edit'', ', num2str(hf), ')'],'Tag','u_edit','TooltipString',u_tooltip,'FontName',myfont);
uicontrol(hf,'Style','Text','String','[No u(t)]','Units','normalized','Position',[0.5 p+0.34 0.3 0.04],'HorizontalAlign','Left','Tag','u_text','TooltipString',u_text_tooltip,'FontName',myfont);

% Time
time_tooltip='The time of the first step.';
uicontrol(hf,'Style','Text','String','Time (t):','Units','normalized','Position',[0.7 p+0.34 0.15 0.04],'HorizontalAlign','Left','TooltipString',time_tooltip,'FontName',myfont);
uicontrol(hf,'Style','Edit','String','0','Units','normalized','Position',[0.85 p+0.34 0.1 0.05],'Callback',['pfgui_action(''t_edit'', ', num2str(hf), ')'],'Tag','t_edit','TooltipString',time_tooltip,'FontName',myfont);

% Edit models
uicontrol(hf,'Style','Pushbutton','String','Edit models','Value',1,'Units','normalized','Position',[0.02 0.01 0.22 0.05],'Callback',['pfgui_action(''models_button'',',num2str(hf),')'],'Tag','models_button','FontName',myfont);

%% Diskop
%uicontrol(hf,'Style','Edit','String','','Value',1,'Units','normalized','Position',[0.56 0.00 0.2 0.05],'Tag','diskop_edit','FontName',myfont);
%uicontrol(hf,'Style','Pushbutton','String','Load','Value',1,'Units','normalized','Position',[0.78 0.00 0.1 0.05],'Callback',['pfgui_action(''diskop_load'',',num2str(hf),')'],'Tag','diskop_load','FontName',myfont);
%uicontrol(hf,'Style','Pushbutton','String','Save','Value',1,'Units','normalized','Position',[0.88 0.00 0.1 0.05],'Callback',['pfgui_action(''diskop_save'',',num2str(hf),')'],'Tag','diskop_save','FontName',myfont);

handles=guihandles(hf);
handles.model_objects=model_objects;
handles.model_names=model_names;
handles.filter_objects=filter_objects;
handles.filtobj=filter_objects{1};
handles.t=0;
handles.u=[];
handles.y=[];
handles.xtrue=[];
handles.xhat=[];
handles.xpred=[];
handles.Ts=[];
handles.runs=runs;
handles.steps=[];
handles.varsize=[0 0 0 0 0];	% x t u w e
handles.simulation_steps=simulation_steps;
handles.simulator_mode=true;

guidata(hf,handles);
pfgui_menu_select(hf,1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -