介绍
在本文中,我们将讨论如何创建一个数据记录项目,指示 VEX 机器人使用 VEX Brain 收集数据并将其保存在 SD 卡上的 CSV 文件中以进行数据分析。
数据记录是一个强大的工具,我们可以用它来协助科学研究、进行自己的实验和解决具体问题。 我们可以通过数据记录驱动 VEX 机器人完成各种有趣且令人兴奋的任务。 以下是一些示例:
- 使用距离传感器收集数据以计算机器人的速度
- 驾驶机器人在教室周围行驶,并使用光学传感器收集数据,以观察不同位置的光线变化。
- 让机器人去冒险并记录 GPS 坐标数据以创建地图。
开发数据记录项目所需的编码技能
- 使用各种命令通过 VEX Brain/Sensors 收集数据并将其添加到数据结构中。
- 将数据写入 SD 卡上的逗号分隔值 (CSV) 文件。
数据记录所需的硬件:
- VEX 大脑(IQ、V5、EXP)
- 一张SD卡
- 一个传感器或多个传感器(可选,根据所需数据)
从传感器获取数据
我们可以对 VEX 机器人(IQ、V5、EXP)进行编程,以捕获来自以下传感器的数据:
- 惯性传感器
- 距离传感器
- 光学传感器
- 视觉传感器
- 旋转传感器(V5、EXP)
- GPS传感器(V5)
注意: VEX IQ(第二代)Brain 和 VEX EXP Brain 内置惯性传感器。 我们可以使用这些 VEX Brian 收集惯性传感器数据。
在本文中,我们将开发一个数据记录项目,使用 VEX IQ Brain (2nd) 收集加速度数据并将其存储到 SD 卡中。
首先,我们需要编写一个简短的程序来获取 VEX IQ Brain 内置定时器和惯性传感器的读数(第 2 部分)。
- 在此程序开始时,我们需要导入 Python 模块来控制 VEX IQ Brain (2nd) 并从中获取数据。 因此,首先将这些指令添加到项目中。
- 接下来添加代码声明变量
numOfDataEntries
存储记录的数据条数,声明变量polling_delay_msec
存储读取数据的时间间隔值,创建一个空字符串变量data_buffer
存储从传感器读取的数据。 - 由于我们将使用计时器的当前值将时间戳添加到数据中,因此我们需要在开始收集数据之前将计时器值重置回 0 秒。
- 在使用从VEX IQ Brain(第2)中获取数据并将数据记录到缓冲区的指令之前,我们需要先了解一下它。
以下指令以特定格式将当前定时器值附加到data_buffer
变量。让我们分解一下格式字符串
“%1.3f”
:- “%”:引入转换说明符。
- “1”:表示字符串中出现的最少位数
- “.3”:指定格式化数字中包含的小数位数。
- “f”:表示要格式化的值为浮点数。
因此,我们可以使用格式字符串“%1.3f”来格式化一个最小宽度为1位、精度为3位小数的浮点数。
- 现在,我们可以读取VEX IQ Brain(2nd)中内置的定时器和惯性传感器的加速度值,然后将数据以指定的格式附加到
data_buffer
变量中。注: “\n”是换行符。 它表示该行在此结束并开始新行。
- 然后,为了将一定数量的数据记录到
data_buffer
变量中,我们可以使用for 循环
重复执行获取数据的指令,并将数据追加到data_buffer
变量中,进行多次迭代。 我们的策略是使用变量numOfDataEntries
的值来确定迭代次数。
- 到目前为止,我们的程序已尽可能快地记录数据。 然而,我们希望以特定的时间间隔记录数据。 因此,我们可以在
for循环
中使用wait()
函数来暂停程序,以添加两次读数之间的特定时间间隔。 我们使用变量polling_delay_msec
的值来确定时间间隔的值。
恭喜! 我们已经完成了从 VEX Brain 内置惯性传感器获取读数(加速度数据)的程序。 接下来,我们将探讨如何将数据写入 SD 卡上的 CSV 文件。
将 SD 卡连接到 VEX Brain
将数据写入 SD 卡上的文件之前,请先将 SD 卡插入 VEX Brain 的 SD 卡插槽中。
注: 将SD 卡格式化为FAT32 以便写入数据。 我们建议使用 32GB 或更小的 SD 卡。
为了确保在适当的条件下可以将数据写入 SD 卡上的文件,我们需要添加代码来检查 SD 卡是否正确插入 VEX IQ Brain(第二)。
- 使用
Brain.sdcard.is_inserted()
函数检查SD卡是否插入。 如果未插入SD卡,则VEX IQ Brain屏幕上显示相应消息并按住程序。
注意:如果 SD 卡插入 Brain,则Brain.sdcard.is_inserted()
函数返回 True。
将数据写入 SD 卡上的 CSV 文件
到目前为止,我们的程序可以使用 VEX IQ Brain (2nd) 收集数据。 为了完成数据记录项目,我们需要将数据写入 SD 卡上的逗号分隔值 (CSV) 文件,以供将来检查和分析。
- 当将不同类型的数据写入CSV文件时,我们想知道每列包含哪种类型的数据。 为此,我们可以在记录数据之前将 CSV 标题文本附加到
data_buffer
变量。
因此,添加代码来声明变量csvHeaderText
来存储 CSV 标题文本以指定 CSV 文件的列名称,并声明变量sd_file_name
来保存要写入的 CSV 文件的名称SD卡。
注意: 确保标头的顺序与 data_buffer
变量中存储的数据的顺序相同。
- 接下来,将 CSV 标头文本附加到
for 循环
之前的data_buffer
字符串以进行数据收集。
- 在将数据写入SD卡上的文件之前,我们首先了解如何使用
Brain.sdcard.savefile()
函数。
该指令将存储在data_buffer
变量中的数据写入 SD 卡上的命名 CSV 文件。
我们来分解一下:-
Brain.sdcard.savefile():该函数将字节数组保存到SD卡上的命名文件中。 该函数返回写入文件的字节数。
-
sd_file_name:函数的第一个参数。 指示要写入的文件的名称。 在此项目中,文件名存储在变量
sd_file_name 中。
-
bytearray(datat_buffer,'utf-8'):函数的第二个参数。 表示要写入文件的字节数组。
-
- bytearray():该方法创建一个可变的字节数组。 在此指令中,我们使用它通过指定编码将字符串转换为字节数组。
- data_buffer:该方法的第一个参数。 指示要转换为字节数组的源。 在本项目中,源是变量
data_buffer中存储的数据。
- 'utf-8':该方法的第二个参数。 指示用于对字符串进行编码的指定编码。 该指令中的编码为“utf-8”。
-
-
- 经过
for 循环
进行数据采集后,使用Brain.sdcard.savefile()
函数将data_buffer
变量中存储的数据写入到 SD 卡上的 CSV 文件中。 另外,添加代码来检查Brain.sdcard.savefile()
函数的返回值,以验证数据是否已成功写入文件,并在 VEX IQ Brain 屏幕上显示相应的消息以获取真实信息:时间反馈。
注意:Brain.sdcard.savefile()
函数返回写入文件的字节数。 在本项目中,我们使用它将收集到的数据写入CSV文件,因此写入文件的字节数必须大于零。 换句话说,如果Brain.sdcard.savefile()
函数返回 0,我们可以断定数据尚未成功写入文件。 否则,数据已写入文件中。
恭喜! 我们开发了一个数据记录项目,该项目使用 VEX IQ Brain (2nd) 收集加速度数据并将其存储到 SD 卡上的 CSV 文件中。 接下来我们将探讨如何打开CSV文件进行数据分析。
打开 CSV 文件进行数据分析
将数据写入 SD 卡上的 CSV 文件后,我们可以使用电子表格应用程序打开该文件以读取和分析数据。
注意: 两种最常见的电子表格应用程序是 Google Sheets 和 Microsoft Excel。 在本文中,我们将使用 Google Sheets(基于网络)打开 SD 卡上的 CSV 文件。 使用其他应用程序的过程类似。
- 从 VEX IQ Brain 的 SD 卡插槽中取出 SD 卡。 如果电脑内置Micro SD卡插槽,我们可以将SD卡直接插入该插槽。 否则,请将 SD 卡插入 SD 卡适配器,然后将适配器连接到计算机。
- 登录我们的 Google 帐户并打开 Google 表格。 创建一个新的电子表格。
- 在电子表格中,打开“文件” 菜单,选择 “导入” -> “上传” -> “浏览” 按钮,然后选择计算机上的 CSV 文件。 上传 CSV 文件后,单击“导入数据” 按钮。 导入数据后,点击“立即打开” 可在 CSV 文件中查看收集到的数据。
- (可选)分析数据的一种简单方法是绘制图表,然后查找数据的趋势。 在电子表格中,打开“插入” 菜单并选择“图表” 使用 CSV 文件中的数据绘制图表。 下图是使用VEX IQ Brain(第2)收集的加速度数据的结果。
注: 我们可以使用图表编辑器 选择不同的图表类型或根据需要编辑图表。
到目前为止,我们已经完成了数据记录项目,该项目使用 VEX IQ Brain (2nd) 收集数据并将其保存在 SD 卡上的 CSV 文件中。 此外,我们还学习了如何使用 Google Sheets 读取 SD 卡上的 CSV 文件,甚至创建图表以进行进一步分析。 接下来是什么? 让我们尝试利用VEX机器人进行数据记录来策划更多令人兴奋的实验,观察不断变化的环境因素如何影响各类数据,更深入地了解我们周围的世界。