这次的活动内容中,我们要示范如何用威栗camera和威栗板,并用AprilTag辨识功能来控制一台自动小车。
共包含四个步骤:连接威栗camera和PC,设定威栗camera以及用Grove连接器,把它连到威栗板,以CZL智能传感器工具训练威栗camera,同时将程序上传到安装于自动小车的威栗板上。
步骤1
用Micro USB线将威栗camera连接至电脑。
步骤2
点击下方连接下载AprilTag 16H5图档,并将其打印出来http://cdn.viaembedded.com/Pixetto/Demo/AprilTags.pdf
点击下载链接压缩文档:http://mls.pixetto.ai/files/SmartSensor-1.0.9.zip
步骤3
打开CZL智能传感器工具,将「功能」设定为「AprilTag(16h5)」,并训练威栗camera镜头辨识打印出来的AprilTag。
训练完毕记得关闭智能传感器工具。
步骤4
连接威栗camera和自动小车。
第一,你需要连接Grove将威栗camera连接到威栗板。
确认Grove线连至扩展板,且扩展板已连至威栗板。
将原本连接着威栗camera的Micro USB线拔除,并改为连接电脑与自动小车上的威栗板。
步骤 5
如果还没安装Arduino IDE,请先去Arduino官网下载。
https://www.arduino.cc/en/main/software。
打开Arduino IDE。
在上方工具列中,选择「草稿码」并在列表中点选「汇入程序库」接着选择「加入.zip程序库」。
在弹出视窗中,选择先前下载好的SmartSensor程序库压缩档。
接着在上方工具条中选择「工具」,在「序列埠」中选择有显示Arduino开发板名称的序列埠。例如:COM 7 (Arduino UNO)
现在我们可以开始撰写程序了!
步骤 6
首先,要汇入这个程序会用到的程序库。
SmartSensor.h 是用来使用威栗camera镜头回传的数据。
Servo.h 是用来控制伺服马达的内建程序库。
现在我们要来创建个全局变数。
•focal_length:型态float,代表威栗camera镜头的焦距(单位:pixel),赋值为43。
•real_diag:型态float,代表AprilTag的实际对角线长度。请测量打印来的AprilTag的边长(单位:公分)并乘以根号二来计算对角线长度。
•cam_diag:型态float,代表通过威栗camera镜头成像的AprilTag的对角线长度(单位:pixel)。
•dist:型态float,代表自动小车上的威栗camera镜头与实际AprilTag的距离(单位:公分)。
•lt_bool:型态bool,赋值为false。
指定管脚0和1将威栗板与威栗camera连接,并在setup函数里面将其初始化。
接着,宣告一个Servo型态的变数来控制伺服马达,并在setup函式里面将完成对其的设置。
•attach函式后面的数字是依照伺服马达连接的Grove接口编号(例如:D9)。
•在程序开始时,将伺服马达转向90度让无人车前轮面向正前方。
接着,让自动小车以50的速度开始前行。
步骤7
接着,我们要来撰写loop函数中的程序。
利用一个if条件式来确认威栗camera有识别到AprilTag,再来我们要赋值给两个之前定义的变数,利用威栗camera回传关于识别对象的信息。
变数diag代表AprilTag经威栗camera镜头成像的对角线长度,因此运用侦测到AprilTag的边长,以及计算对角线的公式可以计算出成像的对角线长度。
利用刚刚的计算出来的成像的对角像长度,以及已知的AprilTag实际大小与威栗camera焦距,来计算目前侦测到的ArilTag跟镜头的距离。
接着,在上面两行的赋值中下方加入控制自动小车的速度,让速度维持在50。
步骤8
现在,我们要让自动小车在威栗camera辨识到特定编号的AprilTag时,做出指定动作:停止,右转,左转。
因此会需要三个情况条件式,利用一个if条件式跟两个else if条件式来确认三
个特定的编号。
如果要让自动小车在编号0的AprilTag前30公分处停止的话,只要运用两个简单if条件式。
辨识对象的编号,也就是AprilTag的编号等于0的话,自动小车将会在与tag的距离小于30公分将马达的转速设为0。
如果要让自动小车在编号1的AprilTag前进行右转的话,需要运用到一个if条件式以及变数turn_bool。
turn_bool可以让自动小车在每次辨识到编号1的AprilTag时,进行一次右转而不会重复执行。
turn_bool初始的值为false,当自动小车辨识到编号1的AprilTag且距离小于60公分时,确认turn_bool为false(自动小车已无右转动作)。将turn_bool设为true并开始右转。直到自动小车转回直行时,再将turn_bool设回false,等待下次右转。
辨识对象的编号,也就是AprilTag的编号等于0的话,自动小车将会在与tag的距离小于30公分将马达的转速设为0。
如果要让自动小车在编号1的AprilTag前进行右转的话,需要运用到一个if条件式以及变数turn_bool。
turn_bool可以让自动小车在每次辨识到编号1的AprilTag时,进行一次右转而不会重复执行。
turn_bool初始的值为false,当自动小车辨识到编号1的AprilTag且距离小于60公分时,确认turn_bool为false(自动小车已无右转动作)。将turn_bool设为true并开始右转。直到自动小车转回直行时,再将turn_bool设回false,等待下次右转。
以上执行转弯的距离,角度以及持续时间需要依照每台自动小车进行调整。
让自动小车在辨识到编号2的AprilTag前进行左转需要的程序跟上一个步骤右转时类似,只需要将if条件式里确认的编号换成2以及角度125换成35度。
以上执行转弯的距离,角度以及持续时间需要依照每台自动小车进行调整。
最后在确认威栗camera是否有辨识到