环境说明
平台: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'));