本节主题:在MATLAB中设计设计GUI页面(建议大家直接在Simulink中做GUI,博主写第五节文章的时候发现自己掉坑里了)

本节日志的学习视频链接如下(有两个系列),UP主是PHD在读,MATLAB和图像处理方面的宝藏Up,感兴趣的同学建议去关注一下。

1. APP页面设计构思

设计APP的原因是在上一节的学习中,youtuber说要下一节我们做一个APP来控制机器人。(但是半年了都没有发第二扒的视频。。。所以只能找其他资源了)经过实践我也确实感受到了操作的不便,所以是很有必要做一个GUI来控制我们机器人的关节运动。

设计之前我们首先要知道机器人关节的顺序:

首先,我们通过在命令行中输入以下代码,打开APPdesigner。

appdesigner

然后新建一个空白页面。

然后,我们针对机械臂的操作特性和运用时常用到的功能来设计APP的GUI。最容易想到的功能就是手动的来调节我们机器人每一个关节的角度。那么我们用 J 来代表Joint(关节),M代表 Manupilator(末端执行器),先为每一个关节以及末端执行器添加用来显示当前角度的数字显示器,以及用来调整角度的按键和滑动控制器。

那么我们开始具体操作:
先从左边的library中拖过来一个Panel作为我们APP的操作区,再放一个label作为我们的标题(Robot Arm Control Panel),以及我们需要操控的关节Label,如图:

我们要为这些关节和执行器添加值和滑动控制器。首先把edit field拖过来,然后是slider。最后为这些组添加一个Label作为列标题。

2. 为页面添加相应的功能

首先,我们需要让APP页面的slider可以控制机器人的关节运动。我们回到design view的页面,为slider添加changing function callback。(注意不要错用changed function callback,因为我们要做到实时控制)

然后在code页面中,我们输入:

% 将当前值赋值给J1in变量
J1in = event.Value;
% 分配J1in变量,到base(工作空间),并命名为J1in,调用的是J1in的值
assignin("base","J1in",J1in);
% 将J1in变量的值传递给Editfield,既让slider的数值显示在前面的数字方框中
app.EditField.value = J1in;

以及在左下角处inspector的地方设置slider的行程,按照每一个关节可运动的范围设置(除了J3是-155到155,其他的都是-360到360)

我们为每一个Joint Controller都设置好callback,为了方便操作,我们直接用左上角的callbacks处的加号添加功能,具体操作如下

然后add callback,就可以再code页面看到刚刚添加的函数了。

最终成型的样子就是下图所示。

做完之后我们run一下这个app进行测试:

从视频里我们可以看到,测试还算成功,但是滑块无法做到精确的调控,这样的APP对我们的机器人控制是不利的,所以我们还要在添加用于精确调控的按键。

调整后的APP的UI如下:

然后我们为按键添加功能,每按一下 +/- 滑块所指的数值就增加/减少 2。

code如下:

然后我们来测试一下:

我们发现当我们按动减号的时候,滑块在移动,但是Joint Angle的数值并不发生变化。那么可能的原因有什么呢?这里我先简单分析一下。

1) 之前写slier用到的变量都是event(暂时存储的变量)而button用到的是变量本身的名称,如:app.Slider.Value

2) 从整体上来说,我们的ButtonPushed函数在SliderValueChanging函数的下面导致先无法将已经变化的slider value传入到J1in之类的变量中。

3) 将Button Pushed函数加入slider的exiting callback

做出以上尝试后还是不行,那么在尝试直接在buttonpushed函数中写入数值变化的code。

结果成功!

视频见原文:

https://zhuanlan.zhihu.com/p/386669457

目前还在学习如何使用Github,以后我也会逐渐把整个项目上传到我的github上,但目前先用百度网盘将就一下吧。(以下文件请从MATLAB的开发环境中打开)

下一节将APP与Simscape的机器人联动起来。提前”好耶“!


自我纠错:
“Panle” 我打错了,是 panel。