0

我正在使用 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);
4

0 回答 0