软件环境:
Webots R2022a
MATLAB R2020a
Visual Studio 2019
系统环境变量配置 :
在最后加上自己MATLAB对应文件夹的路径。完成后重启电脑!!!
VS配置:
按照网上介绍的方法在VS项目里进行配置:
设置好VS中的include路径:
项目->属性->配置属性->VC++目录->包含目录,添加 D:\Matlab_R2020b\extern\include
设置好VS中的lib路径:
项目->属性->配置属性->VC++目录->库目录,添加 D:\Matlab_R2020b\extern\lib\win64\microsoft
在VS 的project 加入需要的库文件*.lib:
项目->属性->配置属性->链接器->输入->附加依赖项,增加:libeng.lib;libmx.lib;libmat.lib(这里加上自己程序中所需要用到的lib)
代码中增加头文件和预编译库:
// 增加头文件和预编译库
#include"engine.h"
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmat.lib")
代码示例:
#include <webots/robot.h>
// 增加头文件和预编译库
#include"engine.h"
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmat.lib")
controller(&torque);
int main(int argc, char** argv) {
/* necessary to initialize webots stuff */
wb_robot_init();
double torque = 0.0;
Engine* ep = engOpen(NULL); //打开matlab Engine
engEvalString(ep, "t = [0]");//初始化时间向量t
engEvalString(ep, "torque = 0");//初始化参数
engEvalString(ep, "p = plot(t, torque)");//创建图表,p为其句柄
mxArray* temp = mxCreateDoubleMatrix(1, 1, mxREAL);//创建一个1x1的双精度实数矩阵
*mxGetPr(temp) = 0;//将 temp 中第一个元素的值设为 0。
engPutVariable(ep, "temp", temp);//将 temp 这个 mxArray 对象传递给 MATLAB 引擎会话(通过 MATLAB 引擎指针 ep),并在 MATLAB 工作空间中创建一个名为 temp 的变量,其值即为该 mxArray 对象所代表的数据。
engEvalString(ep, "n = 0");//在 MATLAB 引擎会话中执行字符串命令,这里是将 MATLAB 工作空间中的变量 n 的值设为 0。
while (wb_robot_step(TIME_STEP) != -1)
{
controller(&torque);
engEvalString(ep, "n =n+ 1");//递增变量 n 的值。
engEvalString(ep, "t = [t 0.001*n]");//更新时间向量 t。
*mxGetPr(temp) = torque;//这里利用了 mxArray 对象的指针访问功能,将 torque 的值写入了 temp 的数据中。
engPutVariable(ep, "temp", temp);//将 mxArray 对象 temp 传递给 MATLAB 引擎会话,并在 MATLAB 工作空间中创建一个名为 temp 的变量,其值即为 temp 中的数据。
engEvalString(ep, "torque = [torque temp]");// 这行代码将 temp 中的值添加到 MATLAB 工作空间中的 torque 向量中。实际上是在 torque 向量的末尾添加一个新的元素。
engEvalString(ep, "set(p, {'XData'}, {t}, {'YData'}, {torque})");//在 MATLAB 中执行字符串命令,更新图表 p 的数据。具体来说,将 X 轴的数据设为时间向量 t,Y 轴的数据设为 torque 向量。
engEvalString(ep, "drawnow"); //立即绘制更新后的图表。
};
wb_robot_cleanup();
return 0;
}
代码中的controller(&torque)为自己的函数,通过传递变量地址,修改 torque 变量的值。
最后这是调用效果:
可以看到电机力矩随时间变化图像。