Problem with Using codegen commands to generate C++ code on NLMPC Code Generation Tutorial

19 次查看(过去 30 天)
I am trying to use the codegen funciton in MATLAB to chagne the code provided in the NLMPC Code Generation Turtorial so that it generates code in C++ instead of MEX files. When I run the tutorial with the original codegen functions it generates the MEX file completely fine but after changing the codegen arguments to generate C++ I continue to get an error. Below is the code I am running (note that my problem is at the very bottom):
nlobj = nlmpc(4,2,1);
Ts = 0.1;
nlobj.Ts = Ts;
nlobj.PredictionHorizon = 10;
nlobj.ControlHorizon = 5;
nlobj.Model.StateFcn = "pendulumDT0";
nlobj.Model.IsContinuousTime = false;
nlobj.Model.NumberOfParameters = 1;
params = {Ts};
nlobj.Model.OutputFcn = "pendulumOutputFcn";
nlobj.Weights.OutputVariables = [3 3];
nlobj.Weights.ManipulatedVariablesRate = 0.1;
nlobj.OV(1).Min = -10;
nlobj.OV(1).Max = 10;
nlobj.MV.Min = -100;
nlobj.MV.Max = 100;
x0 = [0.1;0.2;-pi/2;0.3];
u0 = 0.4;
validateFcns(nlobj,x0,u0,[],params);
EKF = extendedKalmanFilter(@pendulumStateFcn,@pendulumMeasurementFcn);
x0 = [0;0;-pi;0];
y0 = [x0(1);x0(3)];
EKF.State = x0;
mv0 = 0;
[coreData,onlineData] = getCodeGenerationData(nlobj,x0,mv0,params);
onlineData.ref = [0 0];
mv = mv0;
y = y0;
x = x0;
Duration = 10;
xHistory = x0;
for ct = 1:(Duration/Ts)
% Correct previous prediction
xk = correct(EKF,y);
% Compute optimal control move
[mv,onlineData] = nlmpcmoveCodeGeneration(coreData,xk,mv,onlineData);
% Predict prediction model states for the next iteration
predict(EKF,[mv; Ts]);
% Implement first optimal control move
x = pendulumDT0(x,mv,Ts);
% Generate sensor data
y = x([1 3]) + randn(2,1)*0.01;
% Save plant states
xHistory = [xHistory x];
end
%%%%%%This is where I am having problems:%%%%%%
func = 'nlmpcmoveCodeGeneration';
funcOutput = 'testingC';
codegen -config:lib -lang:c++ func;
cfg = coder.config('dll');
cfg.TargetLang = 'C++';
codegen -config cfg func;
Please let me know if there is anyway to format/utilize codegen differnetly to generate this C++ code.

回答(1 个)

Emmanouil Tzorakoleftherakis
编辑:Emmanouil Tzorakoleftherakis 2023-3-24
You did not specify what kind of error you were seeing? In my case, doing the following worked:
func = 'nlmpcmoveCodeGeneration';
funcOutput = 'nlmpcmoveMEX';
Cfg = coder.config('lib');
Cfg.TargetLang = 'C++';
Cfg.DynamicMemoryAllocation = 'off';
codegen('-config',Cfg,func,'-o',funcOutput,'-args',...
{coder.Constant(coreData),xk,mv,onlineData});

类别

Help CenterFile Exchange 中查找有关 Code Generation 的更多信息

产品


版本

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by