基于MPU6050姿态控制外设开发记录

基于MPU6050姿态控制外设开发记录

简介

在电玩城里见过一种枪型的外设,一直想自己实现一个类似的东西。最近比较闲,终于有空来折腾一下。

外设的原理其实很简单,只需要实时跟踪玩家手里枪的姿态,动态更新游戏中去,精度要求也不是很高。

最终的效果,可以查看下面的视频链接

视频链接

硬件选型

如果只是跟踪姿态的话,三轴陀螺仪就够了。想着后续还想试着做3D tracking,选了MPU6050,有三轴陀螺仪、三轴加速度,因为没有磁力计,所以姿态的Yaw是一个相对值,使用的时候需要校准Z轴的角度。淘宝上搜MPU6050,出来一堆,我选择的是厂家开发好带串口的模块,贵是贵点,好处是姿态数据是过滤好的,不用自己在原始数据里折腾。参考价¥46。

主控板,用的是基于ESP8266芯片的Arduino开发板,参考价¥20。淘宝也是一堆。

焊接,组装好的硬件,像这样:

接杜邦线不方便操作,所以,我用的洞洞板焊上排针排母,插到Arduino的排座上,固定的结实,也方便插拔。后续可以加上2个按钮,一个用作扳机,一个用作校准方向。

Arduino软件设计

#include 
#include 

const char* ssid     = "xxxxxxx";
const char* password = "xxxxxxx";

const char* serverHost = "10.0.0.3";
const int   serverPort = 8000;

const int   packetLength = 11;
uint8_t buffer[64] = { 0 };
int bufferIndex = 0;

WiFiUDP udp;

void setup() {
    Serial.begin(115200);
    delay(3000);

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected");  
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    udp.begin(8000);
}

void loop() {
    if(Serial.available()> 0)
    {
        int nRet = Serial.read();
        if (nRet == 0x55)
        {
            bufferIndex = 0;
        }
        buffer[bufferIndex++] = nRet;

        if (bufferIndex >= packetLength)
        {
            //One Package finished, send it.
            udp.beginPacket(serverHost, serverPort);
            udp.write(buffer, packetLength);
            udp.endPacket();
        }
    }
}

代码就不详细解释了,比较简单,读取串口发来的原始的传感器数据,每11个字节为一帧,直接通过UDP发送到上位机的8000端口。

UnrealEngine 4 上位机软件设计

我在一个独立的线程里接收通过UDP端口8000传送来的传感器数据,解析出姿态数据之后,传送到蓝图中去,在蓝图中实时更新Actor的姿态。具体的实现代码就不贴出来,读者可以参考文章最后贴出的代码库中的代码。

这里只说一下,我遇到的一个坑。不可以在网络线程里更新UE4 Actor对象的状态。有一定几率程序崩溃。

源代码

项目的源代码,我整理好了,也开源了出来,读者可以在下面的链接查看到:

https://git.oschina.net/cloudsource/mpu6050_posecontroller.git

MPU6050Wifi 是Arduino程序的代码

MPU6050Test 是UE4的一个测试项目,编译需要Poco库,读者自己编译一个吧。

后续

原型没问题之后,后面考虑把板子做小,自己画个PCB,用单片机当主控。3D打印机打印个外壳。等有空,继续填坑吧。

你可能感兴趣的:(Unreal,Engine4)