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);