简体   繁体   English

如何将结构传递到 Matlab 中重新集成的自动生成的 C++ 代码中

[英]How to pass structures into re-integrated autogenerated C++ code in Matlab

I am trying to test some code that has been generated from Matlab into C++.我正在尝试测试一些从 Matlab 生成到 C++ 的代码。

To do this I am attempting to integrate and run the generated C++ code back into Matlab.为此,我尝试将生成的 C++ 代码集成并运行回 Matlab。

Here's the function I am trying to use (in Matlab pre-autogen)这是我正在尝试使用的 function(在 Matlab pre-autogen 中)

function out = getRotationMatrix(aStruct)

out = aStruct.bank_rad*aStruct.heading_rad+aStruct.pitch_rad;

end

I autogenerate it using this...我用这个自动生成它......

function varargout = AutoGenCode(varargin)
% Here we are attempting to generate a C++ class from a matlab function via a
% hosting function

% initialise
varargout = {};

% create instance of  config object
cfg = coder.config('LIB');
% config options
cfg.MaxIdLength                  = int32(64);
cfg.TargetLang                   = 'C++';
cfg.CppPreserveClasses           = 1;
cfg.EnableCustomReplacementTypes = true;
cfg.ReplacementTypes.uint32      = 'uint32_t';
cfg.CppInterfaceStyle            = 'Methods';
cfg.CppInterfaceClassName        = 'FrameTransformation';
cfg.FilePartitionMethod          = 'MapMFileToCFile'; % or 'MapMFileToCFile' SingleFile
cfg.EnableVariableSizing         = false;
%cfg.PreserveVariableNames        = 'UserNames'; % Worse
%cfg.IncludeInitializeFcn         = true;
cfg.PassStructByReference        = true;

thisStruct.bank_rad = 2.1;
thisStruct.heading_rad = 3.1;
thisStruct.pitch_rad = 3.1;

codegen -config cfg getRotationMatrix -args {thisStruct} -report -preservearraydims -std:c++11

end

To move to another area (\unzipped) I use packNGo要移动到另一个区域(\解压缩),我使用 packNGo

load([pwd,'\codegen\lib\getRotationMatrix\buildInfo.mat'])

packNGo(buildInfo,'packType', 'hierarchical','fileName','portzingbit')

Now when i try to re-integrate it i am using clib现在,当我尝试重新集成它时,我正在使用 clib

cd 'D:\thoros\Components\Frame Transformation Service\FT_V2\unzippedCode'
clibgen.generateLibraryDefinition('FrameTransformation.h','Libraries',{'getRotationMatrix.lib'})
build(defineFrameTransformation)
addpath('D:\thoros\Components\Frame Transformation Service\FT_V2\unzippedCode\FrameTransformation')

Where I had to define the < SHAPE > parameter in the defineFrameTransformation.mlx manually to be 1我必须在 defineFrameTransformation.mlx 中手动将 < SHAPE > 参数定义为 1

When i try and use the function I cant pass a structure without an error当我尝试使用 function 时,我无法无错误地传递结构

A = clib.FrameTransformation.FrameTransformation()
thisStruct.bank_rad = 2.1;
thisStruct.heading_rad = 3.1;
thisStruct.pitch_rad = 3.1;
>> A.getRotationMatrix(thisStruct)

I get the following error我收到以下错误

Unrecognized method, property, or field 'getRotationMatrix' for class 'clib.FrameTransformation.FrameTransformation'.

The problem disappears if rewrite and regenerate the function to accept non-structure input eg double.如果重写并重新生成 function 以接受非结构输入(例如双精度),问题就会消失。

By using the summary function i can see that the call to getRotationMatrix should be of type clib.FrameTransformation.struct0_T通过使用摘要 function 我可以看到对 getRotationMatrix 的调用应该是 clib.FrameTransformation.struct0_T 类型

However i can't seem to create a variable of this type.但是我似乎无法创建这种类型的变量。

summary(defineFrameTransformation)

MATLAB Interface to FrameTransformation Library

Class clib.FrameTransformation.struct0_T

  No Constructors defined

  No Methods defined

  No Properties defined

Class clib.FrameTransformation.FrameTransformation

  Constructors:
    clib.FrameTransformation.FrameTransformation()
    clib.FrameTransformation.FrameTransformation(clib.FrameTransformation.FrameTransformation)

  Methods:
    double getRotationMatrix(clib.FrameTransformation.struct0_T)

  No Properties defined

So how is one supposed to pass structures to C++ libraries in Matlab???那么应该如何将结构传递给 Matlab 中的 C++ 库? what am i doing wrong.我究竟做错了什么。

Note Matlab 2020B, windows, Visual studio 2019注意 Matlab 2020B,windows,Visual Studio 2019

Ah, you were so close to the solution:)啊,你是如此接近解决方案:)

There was a small catch there.那里有一个小问题。

When you are using clibgen.generateLibraryDefinition() you have to make sure that all the type definition are included in the header file.当您使用clibgen.generateLibraryDefinition()时,您必须确保所有类型定义都包含在 header 文件中。 In your case the definition of struct0_T was presnet inside getRotationMatrix_types.h file.在您的情况下, struct0_T 的定义是struct0_T文件中的getRotationMatrix_types.h

So you will have to include both the headers using below command:因此,您必须使用以下命令包含两个标题:

clibgen.generateLibraryDefinition(["FrameTransformation.h","getRotationMatrix_types.h"],"PackageName","mylib",'Libraries',{'getRotationMatrix.lib'})

Now you will have to fill the additional details required in the definition file.现在您必须填写定义文件中所需的其他详细信息。

Once you finish that step, you can use below commands to successfully use the interface完成该步骤后,您可以使用以下命令成功使用该界面

build(definemylib)
addpath('\\mathworks\home\dramakan\MLAnswers\CLIB_With_Codegen\ToPort\portzingbit\mylib')
A = clib.mylib.FrameTransformation
s = clib.mylib.struct0_T
s.bank_rad =2.1;
s.heading_rad =3.1;
s.pitch_rad=3.1;
A.getRotationMatrix(s)

I could get below output in R2021b我可以在 R2021b 中低于 output

    >> A.getRotationMatrix(s)

ans =

    9.6100

Additionally check if you can use MATLAB Coder MEX instead of doing all these circus.另外检查您是否可以使用 MATLAB Coder MEX 而不是做所有这些马戏团。 You can call the generated code directly in MATLAB using MEX.您可以使用 MEX 在 MATLAB 中直接调用生成的代码。 You can refer below documentation: https://www.mathworks.com/help/coder/gs/generating-mex-functions-from-matlab-code-at-the-command-line.html您可以参考以下文档: https://www.mathworks.com/help/coder/gs/generating-mex-functions-from-matlab-code-at-the-command-line.html

If you have Embedded Coder (the line cfg.ReplacementTypes.uint32 = 'uint32_t' suggests you do), then you can use SIL to do what you're proposing with just a few lines of code:如果您有 Embedded Coder(行cfg.ReplacementTypes.uint32 = 'uint32_t'建议您这样做),那么您可以使用 SIL 执行您所提议的操作,只需几行代码:

cfg.VerificationMode = 'SIL';

thisStruct.bank_rad = 2.1;
thisStruct.heading_rad = 3.1;
thisStruct.pitch_rad = 3.1;

codegen ...

% Now test the generated code. This calls your actual generated code
% and automatically does all of the necessary data conversion. The code
% is run in a separate process and outputs are returned back
% to MATLAB
getRotationMatrix_sil(thisStruct)

More info is in the doc .更多信息在文档中。 If you have tests / scripts already exercising your MATLAB code, you can reuse those with SIL by checking out coder.runTest and the codegen -test option.如果您有测试/脚本已经在执行您的 MATLAB 代码,您可以通过检查coder.runTest和 codegen codegen -test选项来重用这些与 SIL。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM