我正在使用 fminsearch 方法对模拟机器人的行走进行优化。我所做的是创建一个函数(目标函数),将行走参数(fminsearch 的输入)写入文本文件,打开模拟器(在 webbots 中),将行走结果写入文本文件并自行关闭,然后然后目标返回该文本文件中的值。总而言之,目标函数得到一个 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);