Webots调用MATLAB引擎实时绘制图像。

软件环境:

Webots R2021a,控制器用的C语言

MATLAB R2022a

此表格后续会用到,先不做解释

Makefile配置

Webots项目c语言控制器目录下有一个Makefile文件,打开,找到这几行代码。

### ---- Linked libraries ----
### if your program needs additional libraries:
### INCLUDE = -I"/my_library_path/include"
### LIBRARIES = -L"/path/to/my/library" -lmy_library -lmy_other_library

修改INCLUDE和LIBRARIES这两行代码,保存。INCLUDE对应Matlab引擎头文件.h路径,LIBRARIES对应Matlab引擎库文件.dll路径,后续代码示例里用到了eng和mx开头的函数,所以这里是-llibeng -llibmx。

### ---- Linked libraries ----
### if your program needs additional libraries:
INCLUDE = -I"D:\program files\MATLAB\R2022a\extern\include"
LIBRARIES = -L"D:\program files\MATLAB\R2022a\bin\win64" -llibeng -llibmx

这些配置非常必要,否则Webots编译时会报错。

Path环境变量配置 

添加这四个路径,然后重启电脑。 

这四个缺一不可,否则Webots编译时会报错。

 代码示例

有一些文章讲的很详细,这里不做过多解释,只提供一个成功运行的案例。

#include <webots/robot.h>
#include "engine.h"    //按道理需要engine.h和matrix.h,但是engine.h头文件代码里已经有了matrix.h

int main()
{
    wb_robot_init();
    float velocity = 1;

    Engine *ep = engOpen(NULL);
    engEvalString(ep, "t = [0]");
    engEvalString(ep, "velocity = 0");
    engEvalString(ep, "p = plot(t, velocity)");
    mxArray* temp = mxCreateDoubleMatrix(1,1,mxREAL);
    *mxGetPr(temp) = 0;
    engPutVariable(ep, "temp", temp);
    engEvalString(ep, "i = 0");

    while(wb_robot_step(TIME_SETP) != -1)
    {
        engEvalString(ep, "i += 1");
        engEvalString(ep, "t = [t 0.001*i]");
        *mxGetPr(temp) = velocity;
        engPutVariable(ep, "temp", temp);
        engEvalString(ep, "velocity = [velocity temp]");
        engEvalString(ep, "set(p, {'XData'}, {t}, {'YData'}, {velocity})");
        engEvalString(ep, "drawnow");
    };
};

效果演示

这个是我仿真平衡车时绘制出来的图像,有了这个方便多了。

ChatGPT4

用ChatGPT4理解上述代码:

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以在VC++中调用MATLAB引擎实时绘制spline插值曲线。以下是一个简单的示例代码,演示了如何在VC++中实现这个功能: 1. 首先,确保您已经安装了MATLAB软件,并且在VC++中配置了MATLAB引擎。 2. 在VC++项目中,包含 `matlab/engine.h` 头文件,以便能够使用MATLAB引擎的功能。 3. 编写VC++代码来调用MATLAB引擎。以下是一个示例: ```cpp #include <iostream> #include <engine.h> int main() { // 启动MATLAB引擎 Engine* ep; if (!(ep = engOpen(NULL))) { std::cout << "无法启动MATLAB引擎" << std::endl; return 1; } // 定义输入数据 double x[] = { 1, 2, 3, 4, 5 }; double y[] = { 2, 4, 1, 5, 3 }; int n = sizeof(x) / sizeof(x[0]); // 创建MATLAB变量并将数据传递给MATLAB mxArray* mxX = mxCreateDoubleMatrix(n, 1, mxREAL); mxArray* mxY = mxCreateDoubleMatrix(n, 1, mxREAL); memcpy((void*)mxGetPr(mxX), (void*)x, n * sizeof(double)); memcpy((void*)mxGetPr(mxY), (void*)y, n * sizeof(double)); // 在MATLAB调用spline函数进行插值 engPutVariable(ep, "x", mxX); engPutVariable(ep, "y", mxY); engEvalString(ep, "s = spline(x, y);"); // 从MATLAB中获取插值结果 mxArray* mxS = engGetVariable(ep, "s"); double* s = mxGetPr(mxS); // 绘制插值曲线 engEvalString(ep, "plot(x, y, 'o', linspace(min(x), max(x), 100), ppval(s, linspace(min(x), max(x), 100)));"); engEvalString(ep, "grid on;"); // 销毁MATLAB变量和引擎 mxDestroyArray(mxX); mxDestroyArray(mxY); mxDestroyArray(mxS); engClose(ep); return 0; } ``` 这个示例代码会在VC++中调用MATLAB引擎,将输入数据传递给MATLAB的 `spline` 函数进行插值,然后在VC++的图形界面中绘制插值曲线。 请注意,您需要根据自己的环境和需求进行适当的修改和调整。此示例代码仅供参考,您可能需要根据您的具体情况进行进一步的定制和优化。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值