使用Arduino机器人绘制一个MATLAB Logo

描述

 

引言:

随着学习和研究的不断深入,在仿真模拟的基础上引入硬件设备变得越来越流行,也越来越重要,MATLAB/Simulink 在硬件支持方面应用广泛,提供了上百个硬件支持包来满足使用者的需求,下载安装好之后,可以很方便地使用封装好的函数和模块对硬件进行控制。依靠 MATLAB 强大的代码生成功能,可以灵活部署到 Arduino、Raspberry Pi、NVIDIA Jetson 等嵌入式设备中。MATLAB 现在支持生成 C/C++ 代码、用于 FPGA 的 VHDL 代码以及 NVIDIA GPU 的 CUDA 代码等,并且所生成的代码针对相应的算法也进行了优化,对于不具备相应手写代码经验的用户来说,极大地降低了学习成本,可以将更多的精力放在模型或算法本身的设计当中。

今天我们就从 Arduino 入手,通过一个简单的示例介绍 MATLAB 在硬件支持方面的一些初步应用,以及这些内容可以如何应用到教学当中。Arduino 有多个不同型号的开发板,因为成本低廉简单易学被广泛应用。在之前的文章 “MATLAB/Simulink × Arduino Engineering Kit | 机电一体化虚拟实操课程”中我们已经了解到 Arduino Engineering Kit(AEK)在课堂教学中的应用。AEK 是 MathWorks 与 Arduino 公司合作开发的工程套件,套件除了基本的开发板还包含配套的电机、传感器等组件,通过组装调试,用户可以搭建成三个不同的机器人。同时套件还包含完整的学习材料和 MATLAB/Simulink 代码模型,非常适合控制类相关领域的初学者学习以及课堂教学。

下面我们将通过对 AEK 组装调试“墙壁绘图机器人”过程的详细介绍,展示 MATLAB 在硬件支持、电机控制、以及图像处理等方向的应用,无论之前是否有相关基础都可以快速上手。

1. 组装机器人

          C++

AEK 套件中包含了组装绘图机器人所需的全部零部件,包括一款型号为 Nano 33 IoT 的 Arduino 开发板、扩展板、三个电机以及其他配件。在安装视频的指导下,通常 1~2 个小时就可以组装好。

C++

机器人的工作原理是将两个滑轮固定在竖直放置的白板顶部两端,滑轮与两个直流电机相连,通过控制机器人在白板上移动来进行绘图,此外机器人还配有伺服电机来控制记号笔的起落。所有的控制和调试都可以在 MATLAB 中进行。

2. 图像处理

我们绘制的图形以简笔画为主,以下图(1)所示的 MATLAB logo 为例,你可以在 MATLAB 中连接摄像头进行拍照,也可以将已有的照片导入 MATLAB 中。要将照片转化成机器人可以识别的数据格式并用于进一步的复现绘制,需要对图片进行一系列处理。MATLAB Image Processing Toolbox 中包含了大量成熟的函数和算法可以直接调用,通过运行以下代码可将图(1)处理成图(2)的形式:

 

img2 = rgb2gray(img);
img3 = ~imbinarize(img2,'adaptive','ForegroundPolarity','dark');
img4 = bwmorph(img3,'clean');
img5 = bwmorph(img4,'thin',inf);

 

此时图片中已经只包含绘图所需的轮廓线,但我们还需要做进一步的处理来获取对应的坐标。使用递归的方法调用 bwboundaries 函数以及数据处理可以获得图(3)所示曲线的一系列坐标值。最后将曲线进行合理的分段、合并形成图(4)所示的三组坐标值,分别用三种颜色表示,这也意味着要完成绘制需要画三笔。

至此我们已经准备好绘图需要的数据,接下来可以连接硬件对电机进行控制了。

 

(1)

 

(2)

C++

(3)

C++

(4)

3. 连接硬件

          C++

MathWorks 官方提供了近 200 个硬件支持包,此外还有大量用户自己开发上传的支持包。点击 MATLAB 中“附加功能”->“获取硬件支持包”,搜索 Arduino,即可下载 “MATLAB Support Package for Arduino Hardware”。下载完成后通过 USB 将机器人与电脑连接,根据支持包提示进行驱动的安装与配置,然后就可以在 MATLAB 中控制直流电机和伺服电机的运动了。

在 MATLAB 中运行如下命令:

 

a = arduino

 

可以看到工作区中生成了一个类型为 arduino 的对象 a,包含如下属性:

C++

在此基础上可进一步连接扩展板:

 

carrier = motorCarrier(a)

 

更多支持的函数可参考帮助文档:arduino。因为电机与扩展板相连,现在我们可以通过 carrier 连接伺服电机:

 

s = servo(carrier,3);

 

设置 pos 的值,调用 writePosition 函数即可控制电机转动角度即记号笔的位置:

 

pos = 0.3; %Change this value as per your requirements
writePosition(s,pos)

 

与伺服电机类似,你也可以通过简单几行命令控制直流电机的运动,并且我们可以通过开环和闭环两种方式实现。开环的方式通过 dcmotor 函数连接电机:

 

mL = dcmotor(carrier,'M2');
mR = dcmotor(carrier,'M1');

 

设置好速度后即可通过 start 和 stop 控制电机的运转:

 

start(mL)
start(mR)
pause(3) % Wait 3 seconds
stop(mL)
stop(mR)

 

相对应的,闭环控制的方式是通过 pidMotor 实现,你可以通过调节 PID 参数获得更精确的控制:

 

pidML = pidMotor(carrier,2,'position',3,[0.18 0.0 0.01]); % Modify the PID gains [Kp Ki Kd] as per your requirements
pidMR = pidMotor(carrier,1,'position',3,[0.18 0.0 0.01]);

 

设置好目标角位移 theta 即可通过 writeAngularPosition 控制运转:

 

writeAngularPosition(pidML,theta,'rel');
writeAngularPosition(pidMR,theta,'rel');

 

在下文中我们将通过闭环控制的方式进行绘图。

以上所有控制函数列表都可以在帮助文档中查到,与电机类似,你也可以配置自己的传感器开发更多新的功能。

4. 对图像数据做进一步处理

现在我们已经得到要绘制的曲线的一系列坐标,也可以对电机进行控制。但是坐标值是基于图片生成的真实数据,要想在白板上绘制,需要将曲线坐标缩放成合适的大小,并在此基础上将坐标的变化准确地转换成电机转动的角度。

我们需要测量白板的基本尺寸,并通过查阅电机最大扭矩等参数,基于基本的力学分析,将可绘制的区域找出,并进一步设定想要绘制的区域大小,结果如下图所示。其中云图标识了根据扭矩计算出的机器人在白板移动时的可行域,可以看到当机器人接近白板顶端时扭矩将会变大,这也符合实际情况。红色区域为我们选定的最终的绘图区,根据此区域的大小我们可以将图像坐标按比例缩放为适合的范围。

C++

由于绘制的过程是控制机器人沿一系列坐标点移动,当点过于密集时不仅会花费更多时间,甚至可能会降低精度。我们可以设置一个最小移动距离,遍历所有的坐标点将小于该距离的中间点移除,经过实验这里取为 2mm。

最后即可根据机器人的尺寸、初始位置以及电机参数通过三角函数将坐标值转化成机器人每一步移动时电机需要转动的角位移。

5.控制机器人进行绘图

现在我们可以控制机器人进行绘图了,如前文介绍,绘制的图像分为三条曲线,首先通过伺服电机将记号笔抬起,移动至第一条曲线的起点,然后将笔落下绘制,结束后再抬起笔移动至第二条曲线依次完成。

我们来通过视频看一下最终的绘制过程:

6. 总结与展望

通过调试一个简单的绘图机器人,我们可以了解图像处理、硬件连接、控制以及数学等多个领域的基础知识,快速上手 MATLAB 在这些方向的应用。在此基础上,你可以开发更为复杂的算法,处理实际拍摄的照片而非简笔画,你也可以利用两只记号笔绘制彩色图案,关于绘图机器人还有更多应用和功能等着你来解锁。除了绘图机器人,你还可以将 AEK 组装为移动漫游车或者自平衡小车,三种机器人形态会共享 Arduino 开发板、电机以及部分零部件,详细信息可以在 MATLAB 或 Arduino 官网上查看。

AEK 套件因为简单易上手、功能完整等特点,被很多老师选择用于控制类课程的教学,学生可以作为团队的形式完成整个项目,也可以根据实际需求侧重某一个应用方向来进行拓展。

对于手边没有 AEK 完整套件的同学,只需要一个 Arduino 开发板,以及摄像头、传感器等一些外设,同样可以参考 AEK 的代码和模型以及 MATLAB 的帮助文档开发自己的应用,使用方法和上文类似,大家可以充分发挥自己的想象力进行一些有趣的尝试。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分