APP下载

六轴陀螺仪MPU6050的虚拟3D模型角度控制*

2018-01-04

单片机与嵌入式系统应用 2017年12期
关键词:线程串口端口

(山东科技大学 计算机科学与工程学院,青岛 266590)

六轴陀螺仪MPU6050的虚拟3D模型角度控制*

韩进,许雯雯

(山东科技大学 计算机科学与工程学院,青岛 266590)

基于六轴陀螺仪MPU6050和集成WiFi芯片的Arduino设计,搭建了对Unreal Engine4(虚幻引擎)中3D模型进行角度姿态控制的硬件设备,该设备可嵌入到实际物体与虚拟3D模型进行实时交互。空间角度数据由DMP姿态解算器分析处理,MPU6050与Arduino等用串口通信,将数据打包,通过UDP协议将数据上传至Unreal Engine4(虚幻引擎)独立线程处理。测试结果表明,硬件设备与3D模型可以实现实时角度姿态控制,以低成本的投入提高了用户的体验感与沉浸感。

Unreal Engine4;Arduino;MPU6050;姿态控制;六轴陀螺仪

引 言

本文在传统硬件如鼠标、键盘交互基础上,提出一种可嵌入到实际物体中的硬件交互方式[1],体现出虚拟现实3D特性。使用集成了WiFi芯片ESP8266的Arduino 开发板来与上位机进行WiFi通信与数据传输,芯片MPU6050完成姿态数据的采集与计算。Unreal Engine4基于Poco网络库接收端口姿态数据进行分析与处理,分别将X、Y、Z三个方向的速度、加速度与角速度分别传送至控制家居模型角度的setRotation()函数,实现实时720°姿态控制,加强了系统的交互性体验与沉浸感。

1 系统总体架构

图1 系统结构框图

系统结构框图如图1所示,系统由两部分组成:数据采集传输部分选用基于ESP8266芯片的Arduino开发板和MPU6050模块,数据接收分析部分通过Unreal Engine4完成。硬件Arduino与MPU6050通过串口传输数据,Arduino板与Unreal Engine4之间的通信则是通过WiFi芯片ESP8266基于UDP协议进行WiFi连接。Unreal Engine4在一个独立的线程里通过接收端口8000传送的MPU6050传感器数据进行解析后,传送至蓝图,在蓝图中实时更新Actor的位置参数,从而实现实时角度姿态的控制。

2 硬件设计

2.1 硬件接口电路

MPU6050模块的输出电压范围为3~6 V,TTL电平输出,通过串口与Arduino开发板连接,引脚接线如图2所示。

图2 MPU6050引脚接线图

2.2 MPU6050芯片

MPU6050是一个集成六轴运动处理器的芯片,包含三轴MEMS陀螺仪和三轴MEMS加速度计,免除了组合陀螺仪与加速度时间轴之差的问题,节约了大量封装空间。MPU6050的数据写入和读出均通过其芯片内部的寄存器实现,这些寄存器的地址为1个字节,即8位寻址空间。查阅寄存器手册可知加速度和角速度位于表1的寄存器地址中。

表1 MPU6050寄存器地址及含义

系统所用的MPU6050模块发送的每帧数据为包含加速度包、角速度包和角度包的数据包,3个数据包按顺序依次输出,不同波特率下发包的间隔时间不同,软件端通过检测包头即可判断数据类型。系统波特率为115 200,每隔10 ms输出1帧数据。区分3种包的数据内容标识如表2所列。

以加速度计算公式为例,数据是short类型,在乘以表示的量程之前,除以short类型表示的数据范围为-32 768~32 768,加速度的计算公式如下所示:

ax=((AxH<<8)|AxL)/32768×16g

ay=((AyH<<8)|AyL)/32768×16g

az=((AzH<<8)|AzL)/32768×16g

式中,_H和_L分别表示其高、低字节位。

表2 数据内容标识

3 软件设计

3.1 DMP姿态解算

MPU6050在实际应用中,需要根据原始数据得到三轴的欧拉角(即俯仰角)、滚仰角和偏航角确定姿态。MPU6050内部集成的数字运动处理器DMP(Digital Motion Processor)基于自身运动处理演算算法处理数据后并自动生成角度值,直接输出格式为q30的四元数,反三角函数运算后得到三个欧拉角。姿态解算过程图如图3所示。

图3 姿态解算过程图

欧拉角确定物体姿态需要旋转角度和旋转顺序,地理坐标系与载体坐标系的转换用到四元数旋转矩阵,可以有效避免万向节锁。四元数q表示为:

旋转的四元数为单位四元数且模为1,可表示为:

“四元数表示”可转为“欧拉角表示”,α为Z轴的偏航角,φ为Y轴的俯仰角,θ为X轴的滚转角。

3.2 通信与数据传输

硬件设备与上位机WiFi通信将经过姿态解算的欧拉角数据打包发送至上位机,具体步骤如下:配置Arduino IDE,导入与WiFi芯片ESP8266相关的库文件,获取硬件信息的端口号,设置波特率为115 200。在Arduino IDE平台编写代码,流程如下:

① Serial.begin(115200),设置ESP8266波特率,波特率要和Arduino以及MPU6050保持一致。

② 调用函数WiFi.begin(ssid, password),ssid为路由器的WiFi名称,password为其密码。WiFi连接成功后,执行udp.begin(serverPort),serverPort指进行通数据传输的端口。

图5 数据包判断解析图

③ 串口发来的原始传感器数据,每11个字节为一帧,通过UDP协议发送到上位机的8000端口。Serial.avai;able()>0判定串口是否接收了数据,Serial.read()函数读取串口接收的数据。0x55表示包头信息,是判断一帧数据传输完成的标识。bufferIndex归零后,准备下一帧数据的接收。

WiFi通信与数据传输流程图如图4所示。

图4 WiFi通信与数据传输流程图

3.3 Unreal Engine4数据接收及解析

Unreal Engine4是一个开源的纯C++引擎,硬件设备与Unreal Engine4通信,即Unreal Engine4实时获取基于UDP协议从电脑端口8000传送来的MPU6050姿态数据。需使用开源的Poco库,Poco C++库是侧重于网络应用程序的类库,该系统主要使用了Poco的Net类库和用于多线程的Mutex类库以及Thread类库。

基于Visual C++平台具体实现步骤:

① 绑定8000端口,获取MPU6050数据信息。Poco::Net::SocketAddress(8000)函数用来绑定端口号并确认IP网络连接的端点,在这里给定的端口必须是十进制端口号或者是服务名。获取相应端口后进行绑定来获取数据信息,这里用到Poco::Net::DatagramSocket.bind()函数。DatagramSocket类用来发送和接收UDP数据包,使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例。

② Unreal Engine4要与硬件设备进行网络通信,为了不阻塞主线程和提高CPU的使用率。在绑定相应端口后开辟一个独立线程来处理数据。即用Poco::Thread,在Poco中将入口函数抽象为一个Runable类,用户需要继承至该类来实现自定义的入口函数,同时Poco也将线程抽象为一个thread对象,调用strat方法,并传入一个Runnable对象来启动线程。

③ 解析姿态数据。获取三个X、Y、Z三轴上的加速度、旋转角速度与角度,判断解析如图5所示。

图6 Unreal Engine4接收处理数据流程图

④ 更新数据至蓝图。在接收MPU6050数据的MPUServe类和绑定数据到蓝图MPUActor类中用到一个接口,即MPUInterface。此外,在进行实时更新数据的同时,要先获取Actor当前的位置信息,包括X、Y、Z三个方向上的旋转角度以及加速度,用到UE4底层提供的函数,即getLocation()和getRotation()函数。需要实时更新Actor的姿态数据,“Poco:Mutex”可用于线程间同步或者是同一线程中不同进程间的同步;“Poco:Mutex:ScopedLock()”是一个模板类,在函数构造的时候会自动获取锁,在函数退出的时候则自动释放锁。

Unreal Engine4接收处理数据流程图如图6所示。

⑤ 重写Blueprints的BeginPlay()等方法。因为在虚幻引擎中有着自己一套编码规范与规则,比如在游戏开始前需要先调用BeginPlay()方法,而Tick()方法则表示在每一帧都要进行刷新。在这里要对这两个方法进行重写,从而保证其数据传输的实时性。

//Called when the game starts or when

//spawned

void AMPU6050Actor∷BeginPlay(){

Super∷BeginPlay()

mpuServer=new MPU6050Server(8000,this);

}

//Called every frame

void AMPU6050Actor∷Tick(float DeltaTime)|

Super∷Tick(DeltaTime)

CurrentPosition = actorPose.GetLocation();

CurrentPotation = actorPose.GetRotation();

}

3.4 Blueprint实现模型控制

这部分工作主要在Unreal Engine4引擎的可视化脚本Blueprints中完成。在VC++中定义以及重写的部分函数进行调用及传参,调用重写的Tick()函数,每一帧都要获取到所操作模型的Current Rotation()以及Current Position()。同时也要把传感器的数据分为Roll、Pitch、Yaw三个方向传送给所操作模型,实现用setRelativeRotation()实时确定模型姿态位置。

4 测试结果

① ESP8266 WiFi连接测试结果如图7所示,波特率为115 200,端口COM3,与电脑成功进行了WiFi连接。

图7 WiFi测试结果

② MPU6050数据测试结果,将MPU6050模块与ESP8266模块进行串口连接,在成功进行WiFi通信后,对MPU6050的数据传输进行测试。旋转模块,用MiniIMU进行数据监测以及接收,加速度、角速度以及角度测试结果如图8所示。

图8 陀螺仪MPU6050测试结果

③ 姿态追踪测试结果。在前两步测试无误的基础上,现对虚幻引擎中模型进行姿态控制测试,这里采用的模型为日常生活中随处可见的电热水壶,旋转硬件设备,测试结果如图9所示。

测试结果无误后,将芯片嵌入于一个电烧水壶底部,测试结果表明,沉浸感以及体验感增强,达到了预期结果,测试结果如图10所示。

图9 角度控制测试

图10 模块嵌入测试结果

结 语

[1] 关丽坤,俞国印,任学平.嵌入式转动角度采集系统[J].测控技术,2014,33(10):155-158.

[2] 李景辉,杨立才.基于多传感器信息融合的人体姿态解算算法[J].山东大学学报:工学版,2013,5(43):49-54.

[3] 叶锃峰,冯恩信.基于四元数和卡尔曼滤波的两轮车姿态稳定方法[J].传感技术学报,2010,25(4):524-528.

[4] 崔阳,张维华.一种基于Arduino的智能家居控制系统[J].电子技术应用,2014(4):123-125.

[5] 刘秀玲,李明昭,耿佳,等,真车信号采集的虚拟驾驶交互控制研究[J].计算机工程与设计,2012,33(8):3154-3158.

[6] 马敏,吴海超.基于四元数自补偿四旋翼飞行器姿态解算[J].制造业自动化,2013,35(12):18-21.

[7] Jing Li, Wei Zhang, Bing Xu.Design of Two-Wheeled Self-Balancing Robot Control System[J].Trans Tech,2014(1044):774-777.

[8] Qing Hui Wang, Dan Li,Lei Chang.The Design of Strapdown Inertial AHRS Based on MEMS[J].TransTech,2013(756-759):518-522.

韩进(硕士生导师),主要研究方向为嵌入式计算机控制、计算机系统结构、电子电路;许雯雯(硕士研究生),主要研究方向为嵌入式系统技术。

结 语

参考文献

[1] 彭晓曦.嵌入式Linux下文件系统的研究与实现[D].成都:电子科技大学,2007.

[2] 郭玉东.Linux操作系统结构分析[M].西安:西安电子科技大学出版社,2002.

[3] 新设计团队.Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理[M].北京:机械工业出版社,2011.

[4] Chan T.UNIX System Programming Using C++[M]. Upper Saddle River:Prentice-Hall,1997.

[5] 高剑林.Linux内核探秘:深入解析文件系统和设备驱动的架构与设计[M].北京:机械工业出版社,2014.

[6] 程仲汉.多核环境下的操作系统并行性能问题研究[D].南京:南京大学,2015.

[7] Cheng J.FILE SYSTEM, AND METHOD AND DEVICE FOR RETRIEVING,WRITING,MODIFYING OR DELETING FILE:WO,CN 102184211 A[P].2011.

[8] 赵俊化,胡金霞.LRU页面置换算法的改进与实现[J].计算机工程,2012,38(17):24-27.

周俊杰(副教授),主要研究方向为大数据分析、嵌入式系统等;柯跃(硕士研究生),主要研究方向为大数据分析与应用、嵌入式系统。

Virtual3DModelAngleControlBasedonSix-axisGyroscopeMPU6050

HanJin,XuWenwen

(College of Computer Science and Engineering,Shandong University of Science and Technology,Qingdao 266590,China)

In the paper,a hardware device is built based on MPU6050 and Arduino,which can control the 3D model angle attitude of Unreal Engine4,and the hardware device can be embedded into real object and real-time interaction with 3D model.The spatial angle data is analyzed and processed by the DMP gesture solver.The MPU6050 communicates with the Arduino serial port to upload the data to the Unreal Engine 4 independent thread processing via the UDP protocol.The test results show that the hardware device and the 3D model can realize the real-time angle attitude control.The interactive way of the hardware greatly enhances the user's sense of experience and immersion with low-cost investment.

Unreal Engine4;Arduino;MPU6050;attitude control;six-axis gyroscope

资助:国家自然科学基金(41572244);山东省自然科学基金项目(ZR2015DM013);山东科技大学优秀教学团队支持计划(JXTD20170503)。

TP399

A

杨迪娜

2017-08-11)

2017-08-08)

猜你喜欢

线程串口端口
一种端口故障的解决方案
浅谈AB PLC串口跟RFID传感器的通讯应用
基于国产化环境的线程池模型研究与实现
端口阻塞与优先级
浅谈linux多线程协作
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
8端口IO-Link参考设计套件加快开发速度
线程池技术在B/S网络管理软件架构中的应用
卫星三端口DC-DC变换器技术综述