首页 > 范文大全 > 正文

浅谈利用传感器参数还原消防车工作臂姿态三维图像

开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈利用传感器参数还原消防车工作臂姿态三维图像范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

【摘要】 消防车的安全检测中经常需要伸展至大于30米的规定工作高度,因此经常在室外进行安全检测,该情况下的检测以检验人员目测,主观判断为主,无法提供进一步的数据支持,一方面不尽客观,不符合检验要求,另一方面对检验人员的专业素质要求较高,本文旨在讨论利用Unity3D配合VisualStudio开发能还原消防车工作情况的软硬件系统。

【关键词】 Unity3D 传感器 三维图像 消防车

一、前言

时至今日,三维成像技术早已在工业、科研、教育娱乐等众多领域中广泛应用,在工业和科研中以往许多以波形、图表、参数来显示的现场工作状况早已被替换成直观的三维图像,也使得人们对现场状态的判断也更加准确快速。在消防车安全检测领域中,由于工作状态下的消防车工作高度经常大于30米,很多时候,检测人员只能通过目测来进行检验。从精确度和有效性上讲这样的方法缺陷较大。因此,本文旨在探讨用传感器和Unity3D三维图像引擎开发一个能够实时反应消防车工作臂工作状态的软硬件系统。

二、整体系统说明

系统说明如图1所示。数据采集器采集陀螺仪和激光测距传感器的参数,再通过RS232发送到上位机,上位机软件将收集到的数据加工后送至Unity3D开发的三维显示界面,与此同时将相应的数据信息显示在屏幕上。

2.1硬件部分

加速度计陀螺仪采用市面上常见的MPU6050模块,数据包分为加速度包、角速度包和角度包。用于三维现场还原时,主要用角度包当中的俯仰角数据,用来体现消费车工作臂的抬起角度。

激光传感器采用KAKRU公司的HPS-L1-V系列拉绳传感器。用于三维现场还原时,拉绳传感器用来提供工作臂伸长的长度。返回的数据用4个字节的数据来表示长度。

2.2软件部分

软件分为两大部分,第一部分上位机主体,主要为软件主界面,包括串口循环读取模块,数据处理模块和参数传递模块。此部分在VisualStudio中开发完成。

第二部分为Unity3D三维图像显示控件,主要功能为接受后台的数据处理模块传递过来的参数,还原成现场的情况。此部分在Unity3D开发环境中开发完成。

2.2.1软件主界面

1.串口循环读取模块

功能:由计时器(Timer)为主体,Timer每一次触发,读取串口缓冲区的数据,在解析之前,需要先进行搜索数据包头的操作。

搜索方法主要由依次遍历匹配实现,此次设计采用的硬件中,代表包头的数据内容为“0x55”,则搜索数据包头操作说明即为:将串口缓冲区的数据读取至一个字节数组,对该数组第一位进行判断,若为“0x55”,则程序继续执行,否则对该数组下一个字节的数据进行匹配。

由MPU6050使用说明书可知,找到包头之后,若包头之后的一个字节的数据为“0x53”,则代表该包为角度包,此时数据编号为“4”和“5”的数据(即包头之后第四和第五个字节)即为角度包的高位值和低位值。

该模块主要代码如下(buf为字节数组,用于存储串口数据):

private void timerSerialData_Tick(object sender, EventArgs e)

{serialPort1.Read(buf, 0, 66);

for (m = 0; m < 33; m++)

{if ((buf[m] == 0x55) && (buf[m + 1] == 0x53))

DataAnalysis();

}}}

2.数据处理模块

功能:该模块主要将串口循环读取模块读取到的数据进行解析,解析出来的数据用于计算Unity3D引擎中需要显示的各个模块的参数。

以一组两节工作臂的消防车为例,在空间坐标中,假定工作臂在空间坐标中的X正方向上抬起、放下,在已知抬起的角度a(即俯仰角)及工作臂伸长的长度L,即可通过简单的三角函数计算出工作臂的第一节臂和第二节臂的中心位置和姿态角度,计算方法在此不在赘述。

相关代码如下:

变量说明:

LA一一Scale为缩放值,即现实中工作臂的长度换算为三维模型时的比例,LA为该缩放值下的工作臂长度。

DataAnalysis();

{a = (Convert.ToInt32(buf[m + 5]

L = Convert.ToInt32((buf[m + 11]

3.参数传递模块

功能:Unity3D开发的三维模块可以以控件的形式加载,用SendMessage方法来传递参数,此时需要定义一个简单通讯协议,通讯协议如下:

参数按顺序依次为第一节臂中心点位置(p_x1, p_y1, p_z1),工作臂第一节姿态角度(0 , a , 0),工作臂第二节中心点位置( p_x2, p_y2, p_z2)工作臂第二节姿态角度(0 , a , 0)。将参数依次放进字符串a并用逗号隔开后,直接使用SendMessage即可

代码如下:

axUnityWebPlayer1.SendMessage(“FireEngine”,“CallUnity”, a);

代码中最后一行的”FireEngine”为Unity3D中需要调用脚本的对象,”CallUnity”为调用的脚本。

2.2.2 Unity3D三维图像显示控件

1.三维图像模块

此模块用于三维模型显示,在Unity3D开发平台开发,消防车的三维模型可以使用3Dmax软件制作,在Unity3D开发平台中加载消防车的三维模型即可。为了计算简便,我们将消防车三维模型中消防臂的底端移至场景中空间坐标的(0,0,0)点,并将消防臂朝向X轴的正方向,此时记录下消防臂第一节臂的中心点在X轴上的坐标值L1X,这个值的两倍除以现实世界中消防车的工作臂长度即为本文之前提到的Scale缩放值。

即 Scale= 2*L1X / (现实中消防车工作臂长度)

之后在Unity3D中新建一个脚本,名为“CallUnity”,脚本的对象为消防车“FireEngine”。

2.参数拆包模块

此模块对应2.1.3的参数传递模块。SendMessage中的字符串a中包含所有控制参数,因此先用Spilt方法分割参数,然后将分割的参数由字符串类型改变为浮点型,存入数组data,代码不在此赘述。

3.模型控制模块

此模块的功能主要为调用控制参数控制消防车的两节工作臂。控制主要通过Unity3D的transform方法实现,代码如下(arm1、arm2分别为第一、第二节工作臂):

void OnGUI()

{

Arm1.transform.position = Vector3(data[0], data[1], data[2]);

Arm1.transform.rotation = Vector3(data[3], data[4], data[5]);

Arm2.transform.position = Vector3(data[6], data[7], data[8]);

Arm2.transform.rotation = Vector3(data[9], data[10], data[11]);

}

这段代码每执行一次,都会将工作臂的第一节和第二节臂的模型移动至计算好的位置上,并调整成相应的姿态角。因此即可实现现场还原。

最终三维图像的效果如下图:

三、总结与展望

许多消防车的工作臂顶端会连接一个工作斗,这套系统在工作斗上也可以安装一个陀螺仪,采集工作斗的调平数据,对该数据计算累计时间即可反应出工作斗调平响应时间等测试指标。即可简化测试员在该情况下的测试工作。

该软件系统可以添加数据库功能,数据库中存如现场采集到的数据,只需简单的逐行调用即可实现现场情况再次重现的功能,为测试员重复观察提供了极大便利。

这样的系统开发简单,软硬件成本低,且功能可以根据不同类型传感器、用户需求、算法实现不同的功能。可应用于诸如教学,机械装置状况反馈等多种场合。