三维姿态显示上位机 C#+WPF+HID+Unity3D技术
在毕业设计中做了一个基于AHRS的设计,涉及了姿态融合算法,为了调试算法参数性能,需要用到姿态显示上位机用来显示验证算法的效果。在收集了很多资料后,决定自己做一个三维姿态显示上位机。由于本人学识浅薄,程序中可能有很多目前没有发现的BUG,如有纰漏,敬请指正。
下面介绍一下我开发的大致方法:
1、HID数据传输,在开发的过程中,采用无线传输的方式将单片机的数据传输到电脑的USB端,再采用HID协议将USB端点的数据上传到电脑。
2、在电脑上位机中检测上传到电脑的数据,当检测到数据后,通过TCP协议与Unity3D通讯,Unity3D作为服务器,根据通信内容执行相关操作。
3、上位机UI采用开源的PanuonUI进行开发。
该上位机的优劣:
优点:开发简单,不用使用OpenGL开发,仅使用C#语言就可以完成开发;界面美观,贴图和背景相比OpenGL开发效果好很多;运行中Unity3D使用了GPU渲染,相比软渲染流畅度更好。
缺点:Unity3D的EXE文件较大,比采用C++开发的上位机体量大很多;可以作为学习和实验使用,距离商用还有很大差距。
由于整个上位机的开发过程叙述起来比较麻烦,这里直接放出源码供需要的人下载使用。
源码下载
关键代码:
HID对接收数据进行转换:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Windows.Interop;
using System.Windows.Threading;
using HID;
using System.Runtime.InteropServices;
using Panuon.UI.Silver;
namespace CubeAttitudeShow
{
public partial class MainWindow : WindowX
{
#region HID_协议定义与实现
/*定义HID数传的内容*/
public Hid myHid = new Hid();
public IntPtr myHidPtr = new IntPtr();
string IMUKeyNum;
int temp;
public bool BiaoDingFlag = false;
public bool BiaoDingFlag2 = false;
double MagX,MagY,MagZ;
string SmagX, SmagY, SmagZ;
public string Dis1;
public string Dis2;
public string Yaw;
public string Pitch;
public string Roll;
/***************************************************************************/
/// <summary>
/// 数据到达事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void myhid_DataReceived(object sender, report e)
{
if (lianjieflag)
{
RecDataBuffer = e.reportBuff;
for (int a = 0; a < 6; a++)
TransformData[a] = RecDataBuffer[a + 5];
WpfServer.SendMessage(TransformData);
/*把数据显示到列表框*/
IMUKeyNum = RecDataBuffer[0].ToString();//按键信息
temp = 0;
if (RecDataBuffer[1] >= 0x80) //判定是否是负数
temp = 0 - ((RecDataBuffer[1] & 0x7f) * 256 + RecDataBuffer[2]);
else
temp = (RecDataBuffer[1]) * 256 + RecDataBuffer[2];
Dis1 = temp.ToString();//基站 1 距离
temp = 0;
if (RecDataBuffer[3] >= 0x80) //判定是否是负数
temp = 0 - ((RecDataBuffer[3] & 0x7f) * 256 + RecDataBuffer[4

1471

被折叠的 条评论
为什么被折叠?



