软件环境:
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理解上述代码: