陀螺仪结合Unity姿态孪生Demo演示 硬件使用:MPU6050,MPU9250。 MCU使用:ESP8266。 自备串口TTL读取工具。 固件选择:MicroPython&NodeMCU。 拷贝Assets\ESP8266Program中对应脚本到MCU内存中运行即可,连接串口后,串口收到消息时,打开Unity运行对应程序即可看到陀螺仪模块的姿态孪生(旋转角度会和陀螺仪保持一致)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

101 lines
2.7 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
using UnityEngine;
using LitJson;
public class MyMagneticSerialPort : MonoBehaviour
{
private SerialPort serialPort;
private Thread readPortData;
//public List<byte> listReceive = new List<byte>();
public string jsonData = "";
//根据磁场数据反射磁场针转向
public Transform MagneticNeedle;
// Use this for initialization
void Start()
{
//Application.targetFrameRate = 120;
try
{
serialPort = new SerialPort("COM4", 115200);
serialPort.ReadTimeout = 500;
if (!serialPort.IsOpen)
{
serialPort.Open();
}
readPortData = new Thread(new ThreadStart(readData));
readPortData.IsBackground = true;
readPortData.Start();
}
catch (Exception)
{
throw;
}
}
// Update is called once per frame
void Update()
{
if (jsonData != "")
{
MPUMagneticData mpudata_ = JsonMapper.ToObject<MPUMagneticData>(jsonData);
MagneticNeedle.localEulerAngles = new Vector3(((float)mpudata_.MagneticX-5)*4, ((float)mpudata_.MagneticY-67)*4, ((float)mpudata_.MagneticZ - 5) * 4);
//Debug.LogWarning("Temperature = " + mpudata_.Temperature);
//print("x=" + mpudata_.GyroX + "||y=" + mpudata_.GyroY + "||z=" + mpudata_.GyroZ + "____Ax=" + mpudata_.AccelX + "||Ay=" + mpudata_.AccelY + "||Az=" + mpudata_.AccelZ + "-----" + Time.deltaTime);
//MpuBoardTrans.transform.localPosition += new Vector3(speedX/1000, 0, 0);
//print("speed="+speedY);
}
}
//结束后关闭串口
private void OnDestroy()
{
if (serialPort.IsOpen)
serialPort.Close();
readPortData.Abort();
}
//弧度转角度
private float TransRadToAngle(double rad)
{
//return -(float)rad * 180 / Mathf.PI;
return (float)rad * 90;
}
/// <summary>
/// 读取数据
/// </summary>
private void readData()
{
try
{
while (serialPort != null && serialPort.IsOpen)
{
byte addr = Convert.ToByte(serialPort.ReadByte());
serialPort.DiscardInBuffer();
//listReceive.Add(addr);
//print("{"+serialPort.ReadLine());
jsonData = "{" + serialPort.ReadLine();
}
}
catch (Exception)
{
throw;
}
}
private void caculateSpeed(float accelSpeed)
{
}
}