Webots调用MATLAB实时绘制图像。

软件环境:

Webots R2022a

MATLAB R2020a

Visual Studio 2019

系统环境变量配置 :

fcb71435e961446aaacb610aa31893e6.png

870d3d1c8ce7453cab55610ac4d712c3.png

在最后加上自己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 变量的值。

最后这是调用效果:

7dd78a9818be4367a3a0681f3d2c6387.png

可以看到电机力矩随时间变化图像。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值