Unity读写飞控参数mavlink
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相关推荐
- unity 粒子系统面板参数释义
**unity 粒子系统面板参数释义** 如何在Unity中实现粒子效果? 首先,右键点击 Hierarchy栏,选择effects->Particle System,这样你就新建了一个粒子系统 ...
- Unity 材质球参数修改
Unity 材质球参数修改 Transparent / Cutout / Diffuse 透明镂空漫反射 1.修改材质UV的重复率和偏移 设置Standard材质的tiling值和offset值 pu ...
- C语言文件读写模式参数
C语言文件读写模式参数 r: 以只读方式打开文件,该文件必须存在. r+: 以可读写方式打开文件,该文件必须存在. rb+: 读写打开一个二进制文件,只允许读写数据. rt+: 读写打开一个文本文件, ...
- python中文件读写mode参数
文件读写: 数据存储需要文件的支撑,很多时候我们需要将一些数据保存下来,比如日志文件, json文件等等. Python自带 open() 方法用于打开一个文件,并返回文件对象. 语法: file = ...
- Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿
前言 最近会在B站刷到一些关于 30帧暴涨90帧! 高 中 低端显卡运行3A大作优化指南[干货向] 游戏画质设置教程 等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝 ...
- Python读写文件参数详解 open read write
一.打开文件 open方法 python打开一个文件用open()方法,返回一个文件对象,它是可迭代的: f=open('file.txt', mode='r') mode参数表示对文件的操作方式,读 ...
- Unity 之 打包参数 -- Player面板属性详解
Unity 之 Project Setting -- Player 面板属性详解 前言 一,Player 1.1 属性说明 1.2 效果展示 二,ICON(图标) 2.1 属性说明 2.2 使用示例 ...
- unity改变材质参数
这里在做的是一个player受伤闪烁的效果,用的是standard shader的自发光参数: 首先确定需要的变量: [Header("Hurt Flash---")]public ...
- PyTorch模型读写、参数初始化、Finetune
使用了一段时间PyTorch,感觉爱不释手(0-0),听说现在已经有C++接口.在应用过程中不可避免需要使用Finetune/参数初始化/模型加载等. 模型保存/加载 1.所有模型参数 训练过程中,有 ...
最新文章
- 第二阶段_第二小节_C#调试
- vscode中experimentaldecorators报错
- Maven 系列 1:Maven 安装与环境变量的配置完整步骤及需要注意的问题(以 jdk1.8、Maven 3.6.2 和 win10 为例,附下载地址)
- OSSIM中快速部署HIDS
- 数组的冒泡排序快速上手
- 2016计算机二级公共知识,2016计算机二级《公共基础知识》章节训练与答案
- python输出99乘法表_如何用python输出99乘法表
- 数据中心安全及应对策略
- Padavan完整编译教程
- exe应用程序无法启动,因为应用程序的并行配置不正确
- matlab 地址中有变量,在matlab中符号变量
- 11款国外免费主机空间推荐_测试可用
- 线条边框简笔画图片大全_植物简笔画素材大全赶紧收藏起来,一定用的上!
- [QTV] 如何在 AWS F1 实例中使用 Vivado IPI
- IDC机房维护的成本,和托管的成本对比
- php preg_PHP Preg简介
- 请问软件设计师证在找工作中有多大用呢?
- Matlab函数bwmorph简介 图像处理
- 最神秘公司Magic Leap全新Demo曝光 深度长文揭秘增强现实黑科技
- 索尼 Sensor 基本概念,及曝光相关的计算
热门文章
- linux 2.6.39 ext3 ext4 更快 tf,ext3,ext4,xfs,jfs,reiserfs和btrfs文件系统性能对比(转载)...
- 利用css的before和after属性,实现类似QQ对话框效果
- 3322linux自动更新ip,ubuntu开机自动运行动态域名更新
- OKR考核系统是怎么制定的?一文带你学会OKR制定标准流程
- 高速数字PCB板设计中的信号完整性分析
- 信号完整性分析学习--17--反射
- js刷新页面之前弹出提示
- NVIDIA DALI从入门到放弃之四:Multiple GPU
- 自学Java大概需要多长时间可以入门呢?
- C语言求一元二次方程的根。