环境说明

平台:Windows

matlab版本:R2023a,64位

C++库说明:MSVC2017 64位编译器编译的dll库

构建MATLAB与C++库的接口

1、在MATLAB中运行以下指令查询c++编译器配置

我这里使用MSVC2017的编译器,根据C++库的版本选择就可以。

mex -setup c++ -v

可能会报错mex-setup未找到支持的编译器或 SDK,根据打印信息判断,是否有安装可用的编译器。通过修改VS的安装大概率可以解决这个问题。

2、生成定义文件

使用clibgen.generateLibraryDefinition接口生成定义文件,该接口具体参数可在MATLAB文档中查看学习。生成定义文件https://www.mathworks.com/help/matlab/ref/clibgen.generatelibrarydefinition.html#responsive_offcanvas

如下所示,设置头文件、包含其他头文件的文件夹以及已编译库文件的完整路径,设置Verbose为true以显示不支持的类型。

% 生成定义文件

hFile = fullfile('H:\RM_API\rm_api_source\RM_Service' , "rm_service.h" );

iPath = fullfile('H:\RM_API\rm_api_source\RM_Base' );

libFile = fullfile('H:\RM_API\build-RM_API-Desktop_Qt_5_14_2_MSVC2017_64bit-Release\RM_Service\release\', 'RM_Service.lib');

clibgen.generateLibraryDefinition(hFile, IncludePath=iPath, Libraries=libFile, Verbose=true)

生成的文件:

输出信息:

警告信息:

会有部分不支持的类型无法添加成功,例如二维数组:

部分重构的C++函数也无法全部添加,提示成员函数1遮蔽了成员函数2,所以需要添加的成员函数在头文件中可以写到上面,如下所示:

更多不支持的类型可查看:C/C++支持的限制

3、完成定义

完成定义文件中部分定义并被注释的接口,可参考MMATLAB文档

定义缺失的 SHAPE 参数定义缺失的 MLTYPE 参数定义缺失的 DIRECTION 参数

例如下方未定义完全的接口,根据文档补全缺失的MLTYPE及SHAPE参数:

4、构建接口

定义文件完成之后,运行以下命令构建接口

build(definerm_service)

构建成功输出以下信息:

使用生成的MATLAB接口库

1、将所依赖的c++库RM_Service.dll与rm_serviceInterface.dll放在同一路径下,如下图。或者,将依赖库添加到系统路径。

2、调用addpath包含接口文件的文件夹。

例如:接口文件位于“H:\Desktop\MATLAB API”,则调用以下命令包含接口文件。

addpath('H:\Desktop\MATLAB API')

3、设置库的执行模式。

执行模式,指是在与 MATLAB 相同的进程中还是在外部进程中加载​​ C++ 接口,指定为inprocess或 outofprocess。

clibConfiguration('rm_service','ExecutionMode','outofprocess')

4、使用help或者doc函数可获取库中函数的帮助提示。

例如:运行以下命令查看RM_Service类中的方法。

doc clib.rm_service.RM_Service

运行以下命令查看Service_RM_API_Init 的帮助。

help clib.rm_service.RM_Service.Service_RM_API_Init

5、使用MATLAB clib包加载库,创建“RM_Service”类的实例,控制机械臂。

例如创建一个名为“robot”的对象,该对象属于RM_Service类

robot = clib.rm_service.RM_Service()

6、调用接口函数。

% API初始化

RetVal = robot.Service_RM_API_Init(65, clib.type.nullptr);

% 连接机械臂

IP = '192.168.1.18'

revtime = 200

handle = robot.Service_Arm_Socket_Start(IP, 8080, revtime);

% API版本

ver = robot.Service_API_Version()

% 关节运动

fjoint = [0,0,0,0,90,0,0]

robot.Service_Movej_Cmd(handle, fjoint, 50, 0, true)

7、卸载库。

% 卸载库

unload(clibConfiguration('rm_service'));