我正在使用fminsearch方法对模拟机器人的步行进行优化。我所做的是创建一个函数(目标函数),它将行走参数(fminsearch的输入)写入文本文件,打开模拟器(在webots中),将模拟结果写入文本文件并自行关闭然后,目标返回该文本文件中的值。总而言之 - 目标函数得到一个8x12的腿部位置矩阵,并返回一个标量,表明步行有多好。 这是有效的,位置值确实改变了每次迭代,并且确实改善了目标值。 但问题是 - 我想在每次迭代中遵循函数的值(最好是通过绘图),当我这样做时,我在第一次迭代时只得到函数的值,我无法理解为什么。
以下是代码:
options= optimset( 'PlotFcns', @optimplotfval);
[position,fval] = fminsearch(@callWebots,pos_start,options);
我也尝试显示结果并且出现了同样的问题(它只显示了第一次迭代):
options= optimset(options, 'Display', 'iter-detailed');
我甚至尝试编写一个输出函数,它将绘制fval并发生同样的问题。
如果您有任何想法,我将不胜感激......
先谢谢你
这是目标函数:
function [objFun]=callWebots(pos)
%Open Motion File
filePath= fullfile('C:\Users\student\Documents\Webots\worlds', 'motion_trot_opt.motion');
data=convertToData(pos,filePath);
fout=fopen(filePath,'w');
%Write Motion File
for row=1:size(data,1)
for col=1:size(data,2)
if(col>1)
fprintf(fout, ',');
end
fprintf(fout, '%s', data{row,col});
end
fprintf(fout,'\n');
end
fclose(fout);
system('C:\Users\student\Documents\Webots\worlds\robot_full_withGPSLighter.wbt');
% Get result and return to main function
resfilePath= fullfile('C:\Users\student\Documents\Webots\worlds', 'result.txt');
fres=fopen(resfilePath);
result = textscan(fres, '%f');
fclose(fres);
objFun=cell2mat(result);
对目标函数的调用:
function [position,fval]=optCall()
%Read Initial Motion File Into CELL
filePath= fullfile('C:\Users\student\Documents\Webots\worlds', 'motion_trot_opt.motion');
fin=fopen(filePath);
ii = 1;
while 1
tline = fgetl(fin);
if (tline == -1)
break;
end
SplitedRow(ii,:) = regexp(tline, ',', 'split');
ii = ii+1;
end
fclose(fin);
%Convert from double to Data
[n,m] = size(SplitedRow);
pos_start = cellfun(@str2double,SplitedRow(2:end,3:end));
options= optimset( 'PlotFcns', @optimplotfval);
options= optimset(options, 'Display', 'iter-detailed');
[position,fval] = fminsearch(@callWebots,pos_start,options);