Unity2019.4.30f1c1


1.在github上下载MissionPlanner-master(https://github.com/ArduPilot/MissionPlanner)工程
2.编译MissionPlanner-master\ExtLibs\Mavlink,生成Mavlink.dll(经测试net461和netstandard2.0版本都可以用)
3.在Mavlink.dll复制到Unity工程中Plugins文件夹。
4.将Newtonsoft.Json(https://github.com/JamesNK/Newtonsoft.Json)复制到Unity工程中Plugins文件夹。
4.使用串口的话需要在PlayerSetting中将Api Compatibillity Level设为.NET 4.x

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using UnityEngine;
using UnityEngine.UI;public class ComPortControl : MonoBehaviour
{[Header("------COM串口------")]public Image imgComStatus;public Dropdown dropdownComList;public Button bntOpenCom;[Header("------参数------")]public Button btnParamRequestList;public Button btnRequestParam;public InputField inputParamValue;public Button btnSetParam;SerialPort serialPort1 = null;MAVLink.MavlinkParse mavlink = new MAVLink.MavlinkParse();bool armed = false;// locking to prevent multiple reads on serial portobject readlock = new object();// our target sysidbyte sysid;// our target compidbyte compid;// Use this for initializationvoid Start(){//打开串口bntOpenCom.onClick.AddListener(new UnityEngine.Events.UnityAction(delegate (){ClosePort();OpenPort(dropdownComList.options[dropdownComList.value].text);}));string[] portNames = System.IO.Ports.SerialPort.GetPortNames();dropdownComList.AddOptions(new List<string>(portNames));btnParamRequestList.onClick.AddListener(OnClickParamRequestList);btnRequestParam.onClick.AddListener(RequestParam);btnSetParam.onClick.AddListener(OnClickSetParam);if (portNames.Length > 0){//OpenPort(portNames[0]);}}void OnClickParamRequestList(){if (serialPort1 == null || !serialPort1.IsOpen){Debug.Log("请先打开串口");return;}MAVLink.mavlink_param_request_list_t req = new MAVLink.mavlink_param_request_list_t();req.target_system = 1;req.target_component = 1;byte[] packet = mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINK_MSG_ID.PARAM_REQUEST_LIST, req);Console.WriteLine("PARAM_REQUEST_LIST send");serialPort1.Write(packet, 0, packet.Length);}void OnClickSetParam(){if (serialPort1 == null || !serialPort1.IsOpen){Debug.Log("请先打开串口");return;}MAVLink.mavlink_param_set_t req = new MAVLink.mavlink_param_set_t();byte[] ArrData3 = new byte[16];string strParamId = "RC3_MAX";byte[] ArrData2 = System.Text.Encoding.Default.GetBytes(strParamId);ArrData2.CopyTo(ArrData3, 0);req.target_system = 1;req.target_component = 1;req.param_type = (byte)(4);req.param_id = ArrData3;req.param_value = float.Parse(inputParamValue.text);byte[] reqPacket = mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINK_MSG_ID.PARAM_SET, req);Debug.Log("PARAM_SET send");serialPort1.Write(reqPacket, 0, reqPacket.Length);}void RequestParam(){if (serialPort1 == null || !serialPort1.IsOpen){Debug.Log("请先打开串口");return;}MAVLink.mavlink_param_request_read_t req = new MAVLink.mavlink_param_request_read_t();byte[] ArrData3 = new byte[16];string strParamId = "RC3_MAX";byte[] ArrData2 = System.Text.Encoding.Default.GetBytes(strParamId);ArrData2.CopyTo(ArrData3, 0);req.target_system = 1;req.target_component = 1;req.param_index = -1;req.param_id = ArrData3;byte[] reqPacket = mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINK_MSG_ID.PARAM_REQUEST_READ, req);Debug.Log("PARAM_Request send");serialPort1.Write(reqPacket, 0, reqPacket.Length);}IEnumerator WriteCOMData(){if (serialPort1 != null){for (int i = 0; i < 15; i++){Byte[] TxData = { 0xF3, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3F };serialPort1.Write(TxData, 0, 8);Debug.Log(i + "次发串口指令成功");yield return new WaitForSeconds(0.1f);}}else{Debug.Log("发串口指令失败");}}#region 创建串口,并打开串口public void OpenPort(string portName){string openPortName = portName;//创建串口int comNum = int.Parse(portName.Substring(3));if (comNum > 9){openPortName = "\\\\.\\" + portName;}try{serialPort1 = new SerialPort(openPortName, 9600, Parity.None, 8, StopBits.One);serialPort1.ReadTimeout = 50;serialPort1.Open();if (serialPort1 != null && serialPort1.IsOpen){Debug.Log(portName + "串口已打开");PlayerPrefs.SetString("IceBreakerComPort", portName);imgComStatus.sprite = Resources.Load<Sprite>("Textures/greencircle");StartCoroutine(DataReceiveFunction());}else{imgComStatus.sprite = Resources.Load<Sprite>("Textures/redcircle");Debug.Log(portName + "串口未打开");}}catch (Exception ex){Debug.Log(ex.Message);}}#endregionIEnumerator DataReceiveFunction(){while (serialPort1.IsOpen){try{MAVLink.MAVLinkMessage packet;lock (readlock){// read any valid packet from the portpacket = mavlink.ReadPacket(serialPort1.BaseStream);// check its validif (packet == null || packet.data == null)continue;}// check to see if its a hb packet from the comportif (packet.data.GetType() == typeof(MAVLink.mavlink_heartbeat_t)){var hb = (MAVLink.mavlink_heartbeat_t)packet.data;// save the sysid and compid of the seen MAVsysid = packet.sysid;compid = packet.compid;// request streams at 2 hzvar buffer = mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINK_MSG_ID.REQUEST_DATA_STREAM,new MAVLink.mavlink_request_data_stream_t(){req_message_rate = 2,req_stream_id = (byte)MAVLink.MAV_DATA_STREAM.ALL,start_stop = 1,target_component = compid,target_system = sysid});serialPort1.Write(buffer, 0, buffer.Length);buffer = mavlink.GenerateMAVLinkPacket10(MAVLink.MAVLINK_MSG_ID.HEARTBEAT, hb);serialPort1.Write(buffer, 0, buffer.Length);}// from here we should check the the message is addressed to usif (sysid != packet.sysid || compid != packet.compid)continue;//Debug.Log(packet.msgtypename);if (packet.msgtypename == "PARAM_VALUE"){var ack = (MAVLink.mavlink_param_value_t)packet.data;string id = System.Text.Encoding.Default.GetString(ack.param_id).Trim('\0');Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}", ack.param_count, ack.param_index, ack.param_type, id, ack.param_value));//if (id == "RC3_MAX")//{//    Debug.Log(string.Format("-------{0}, {1}, {2}, {3}, {4}", ack.param_count, ack.param_index, ack.param_type, id, ack.param_value));//}}}catch (Exception ex){//Debug.LogError(ex.Message);}yield return null;}}#region 程序退出时关闭串口public void ClosePort(){if (serialPort1 == null)return;try{serialPort1.Close();//dataReceiveThread.Abort();}catch (Exception ex){Debug.Log(ex.Message);}}#endregion/// 查找最后一个字符出现的索引/// </summary>/// <param name="buffer"></param>/// <param name="b"></param>/// <returns></returns>private int ByteArrayReverseIndex(byte[] buffer, byte b){int index = -1;for (int i = 0; i < buffer.Length; i++){if (buffer[i] == b){index = i;}}return index;}void OnDestroy(){ClosePort();}/// <summary>/// 获取下拉列表某项的索上/// </summary>/// <param name="dd">下拉列表</param>/// <param name="str">某项文字</param>/// <returns>索引</returns>public static int GetDropdownIndex(Dropdown dd, string str){int i = 0;int index = 0;foreach (var op in dd.options){if (op.text.Equals(str)){index = i;break;}i++;}return index;}private static string byteToHexStr(byte[] bytes, int length){string returnStr = "";if (bytes != null){for (int i = 0; i < length; i++){returnStr += bytes[i].ToString("X2");}}return returnStr;}
}

Unity读写飞控参数mavlink相关推荐

  1. unity 粒子系统面板参数释义

    **unity 粒子系统面板参数释义** 如何在Unity中实现粒子效果? 首先,右键点击 Hierarchy栏,选择effects->Particle System,这样你就新建了一个粒子系统 ...

  2. Unity 材质球参数修改

    Unity 材质球参数修改 Transparent / Cutout / Diffuse 透明镂空漫反射 1.修改材质UV的重复率和偏移 设置Standard材质的tiling值和offset值 pu ...

  3. C语言文件读写模式参数

    C语言文件读写模式参数 r: 以只读方式打开文件,该文件必须存在. r+: 以可读写方式打开文件,该文件必须存在. rb+: 读写打开一个二进制文件,只允许读写数据. rt+: 读写打开一个文本文件, ...

  4. python中文件读写mode参数

    文件读写: 数据存储需要文件的支撑,很多时候我们需要将一些数据保存下来,比如日志文件, json文件等等. Python自带 open() 方法用于打开一个文件,并返回文件对象. 语法: file = ...

  5. Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿

    前言 最近会在B站刷到一些关于 30帧暴涨90帧! 高 中 低端显卡运行3A大作优化指南[干货向] 游戏画质设置教程 等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝 ...

  6. Python读写文件参数详解 open read write

    一.打开文件 open方法 python打开一个文件用open()方法,返回一个文件对象,它是可迭代的: f=open('file.txt', mode='r') mode参数表示对文件的操作方式,读 ...

  7. Unity 之 打包参数 -- Player面板属性详解

    Unity 之 Project Setting -- Player 面板属性详解 前言 一,Player 1.1 属性说明 1.2 效果展示 二,ICON(图标) 2.1 属性说明 2.2 使用示例 ...

  8. unity改变材质参数

    这里在做的是一个player受伤闪烁的效果,用的是standard shader的自发光参数: 首先确定需要的变量: [Header("Hurt Flash---")]public ...

  9. PyTorch模型读写、参数初始化、Finetune

    使用了一段时间PyTorch,感觉爱不释手(0-0),听说现在已经有C++接口.在应用过程中不可避免需要使用Finetune/参数初始化/模型加载等. 模型保存/加载 1.所有模型参数 训练过程中,有 ...

最新文章

  1. 第二阶段_第二小节_C#调试
  2. vscode中experimentaldecorators报错
  3. Maven 系列 1:Maven 安装与环境变量的配置完整步骤及需要注意的问题(以 jdk1.8、Maven 3.6.2 和 win10 为例,附下载地址)
  4. OSSIM中快速部署HIDS
  5. 数组的冒泡排序快速上手
  6. 2016计算机二级公共知识,2016计算机二级《公共基础知识》章节训练与答案
  7. python输出99乘法表_如何用python输出99乘法表
  8. 数据中心安全及应对策略
  9. Padavan完整编译教程
  10. exe应用程序无法启动,因为应用程序的并行配置不正确
  11. matlab 地址中有变量,在matlab中符号变量
  12. 11款国外免费主机空间推荐_测试可用
  13. 线条边框简笔画图片大全_植物简笔画素材大全赶紧收藏起来,一定用的上!
  14. [QTV] 如何在 AWS F1 实例中使用 Vivado IPI
  15. IDC机房维护的成本,和托管的成本对比
  16. php preg_PHP Preg简介
  17. 请问软件设计师证在找工作中有多大用呢?
  18. Matlab函数bwmorph简介 图像处理
  19. 最神秘公司Magic Leap全新Demo曝光 深度长文揭秘增强现实黑科技
  20. 索尼 Sensor 基本概念,及曝光相关的计算

热门文章

  1. linux 2.6.39 ext3 ext4 更快 tf,ext3,ext4,xfs,jfs,reiserfs和btrfs文件系统性能对比(转载)...
  2. 利用css的before和after属性,实现类似QQ对话框效果
  3. 3322linux自动更新ip,ubuntu开机自动运行动态域名更新
  4. OKR考核系统是怎么制定的?一文带你学会OKR制定标准流程
  5. 高速数字PCB板设计中的信号完整性分析
  6. 信号完整性分析学习--17--反射
  7. js刷新页面之前弹出提示
  8. NVIDIA DALI从入门到放弃之四:Multiple GPU
  9. 自学Java大概需要多长时间可以入门呢?
  10. C语言求一元二次方程的根。