C# winfrom实例:四路激光测距雷达数据采集和波形图绘制

 
 1.所述产品 产品型号:TFmini Plus

相关资料下载地址:http://www.benewake.com/download

产品名称:TFmini Plus激光雷达模组
制造商
公司:北醒(北京)光子科技有限公司 

2.产品功能:TFmini Plus是基于TFmini的升级项目,它是一款小型化,单点测距的产品,基于TOF(飞行 时间)原理,配合独特的光学、电学、算法设计,主要实现稳定、精准、高灵敏度和高速的距离测 量的功能。产品本身除了具有TFmini的低成本、小体积、测距远等特点外,还增加了IP65等级防 护,测距精度更高,对于室外强光、不同温度、不同反射率等不同环境下适应性更强,更低功耗, 探测频率也更加灵活。产品同时兼容UART和I2C通信接口,可通过指令进行切换

3. 串口数据通信 TFmini Plus串口数据通信,详见表 66。
                      表 6 TFmini Plus数据通信协议——UART 

7091e51866a36ff389754f5ac1258e53.png

通信接口 UART 默认波特率 115200 数据位 8 停止位 1 奇偶校验 None
4. 串口数据输出格式及编码 

TFmini Plus 有两种数据输出格式,标准数据输出格式和字符串数据格式,两种格式可通过指 令代码相互切换。 

-。标准数据输出格式(默认) :  数据结构:数据帧长度为9字节。包含距离信息(Distance)、信号强度信息(Strength)、温度 (Temp)、数据校验字节(Checksum)等。数据格式为16进制(HEX)。具体数据编码详见下表:

7211d9c2d1d9550cbbc21975879bdda9.png

 -。字符串数据格式(Pix Mode) 以字符串形式输出,单位为m,比如测距为1.21m,则输出字符串1.21,后跟转义字符\r\n。此数据格式针对Ardupilot固件版本v3.6.2以下。如果您的Ardupilot固件版本大于或等于v3.6.2 可以直接使用标准数据格式。
5 输出数据说明

 Dist(Distance):

代表TFmini Plus测量输出的距离值,默认单位为cm,解析为十进制的值范围 为0-1200。实际使用过程中,当信号强度值Strength<100或等于65535时,Dist的测量值被认为不 可信,默认输出0。 

Strength:

指信号强度,默认输出值会在0-65535之间。当测距档位一定时,测距越远,信号 强度越低;目标物反射率越低,信号强度越低。当Strength大于100且不等于65535时,认为Dist 的测量值可信,客户可以根据使用场景自行调整。 

Temp(Temperature):

表征芯片内部温度值。摄氏度 = Temp / 8 - 256

实例说明:开启四个线程分别接收四路激光测距雷达的数据并生成chart波形图

实例代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;namespace lidarTest
{public partial class mainForm : DevComponents.DotNetBar.Office2007Form{public mainForm()
{this.DoubleBuffered = true;//设置本窗体SetStyle(ControlStyles.UserPaint, true);SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲this.EnableGlass = false;InitializeComponent();InitChart();}private Queue<double>[] dataQueue = new Queue<double>[4];//把Queue<double>看成一个类型 int[] a=new int [8]bool isStart = false;private void mainForm_Load(object sender, EventArgs e)
{dataQueue[0] = new Queue<double>(100);dataQueue[1] = new Queue<double>(100);dataQueue[2] = new Queue<double>(100);dataQueue[3] = new Queue<double>(100);//this.WindowState = FormWindowState.Normal;//this.FormBorderStyle = FormBorderStyle.Sizable;//this.Top = 0;//this.Left = 0;//this.Width = Screen.PrimaryScreen.WorkingArea.Width;//this.Height = Screen.PrimaryScreen.WorkingArea.Height;Start();}// 防止闪屏        protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= 0x02000000;return cp;}}public void Start()
{Thread t1 = new Thread(StartDataRevThread1);             t1.Start();t1.IsBackground = true;Thread t2 = new Thread(StartDataRevThread2);t2.Start();t2.IsBackground = true;Thread t3 = new Thread(StartDataRevThread3);t3.Start();t3.IsBackground = true;Thread t4 = new Thread(StartDataRevThread4);t4.Start();t4.IsBackground = true;}private void StartDataRevThread1()
{try{UdpClient client = new UdpClient(8021);//IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);//IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.30"), 8008);//client.Client.ReceiveBufferSize = 40960;//40960 默认值是8192while (true){Byte[] recv = client.Receive(ref endpoint);string stringData = "0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();this.Invoke((EventHandler)delegate{//richTextBoxEx1.Text += stringData + "\r\n";chartShow( recv[2] + (recv[3]<<8),1);});}}catch(Exception ex){MessageBox.Show(ex.Message + "\n" + ex.StackTrace) ;}}private void StartDataRevThread2()
{try{UdpClient client = new UdpClient(8022);IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.40"), 8008);while (true){Byte[] recv = client.Receive(ref endpoint);string stringData = "0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();this.Invoke((EventHandler)delegate{//richTextBoxEx2.Text += stringData + "\r\n";chartShow(recv[2] + (recv[3] << 8),2);});}}catch (Exception ex){MessageBox.Show(ex.Message + "\n" + ex.StackTrace);}}private void StartDataRevThread3()
{try{UdpClient client = new UdpClient(8023);IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 8008);while (true){Byte[] recv = client.Receive(ref endpoint);string stringData = "0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();this.Invoke((EventHandler)delegate{//richTextBoxEx3.Text += stringData + "\r\n";chartShow( recv[2] + (recv[3] << 8),3);});}}catch (Exception ex){MessageBox.Show(ex.Message + "\n" + ex.StackTrace);}}private void StartDataRevThread4()
{try{UdpClient client = new UdpClient(8024);IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.200"), 8008);while (true){Byte[] recv = client.Receive(ref endpoint);string stringData = "0x" + BitConverter.ToString(recv).Replace("-", " 0x").ToLower();this.Invoke((EventHandler)delegate{//richTextBoxEx4.Text += stringData + "\r\n";chartShow( recv[2] + (recv[3] << 8),4);});}}catch (Exception ex){MessageBox.Show(ex.Message + "\n" + ex.StackTrace);}}private void InitChart()
{Chart[] ch = new Chart[4] { chart1, chart2, chart3, chart4};for (int i = 0; i < 4; i++){ch[i].ChartAreas.Clear();ChartArea chartArea1 = new ChartArea("C1");ch[i].ChartAreas.Add(chartArea1);//定义存储和显示点的容器ch[i].Series.Clear();Series series1 = new Series("S1");series1.ChartArea = "C1";ch[i].Series.Add(series1);ch[i].ChartAreas[0].AxisY.IsStartedFromZero = false;ch[i].Legends[0].Enabled = false;ch[i].ChartAreas[0].AxisX.Interval = 5;ch[i].ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;ch[i].ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;//设置标题ch[i].Titles.Clear();ch[i].Titles.Add("S01");ch[i].Titles[0].Text = "通道" + (i + 1) + " 折线图显示";ch[i].Titles[0].ForeColor = Color.RoyalBlue;ch[i].Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);//设置图表显示样式ch[i].Series[0].Color = Color.Red;//this.chart1.Titles[0].Text = string.Format("{0}折线图显示", );ch[i].Series[0].ChartType = SeriesChartType.Line;ch[i].Series[0].Points.Clear();}}public void chartShow(Double y, int ch)
{Chart[] chNum = new Chart[4] { chart1, chart2, chart3, chart4 };if (ch <= 8)chartDisplay(chNum[ch - 1], ch, y);}delegate void ChartDelegate(Chart chart, int ch, Double y);private void chartDisplay(Chart chart, int ch, Double y)
{if (chart.InvokeRequired){ChartDelegate chartDelegate = chartDisplay;chart.Invoke(chartDelegate, new object[] { chart, ch, y });}else{if (isStart == true)UpdateQueueValue(ch, y);chart.Series[0].Points.Clear();for (int i = 0; i < dataQueue[ch - 1].Count; i++)chart.Series[0].Points.AddXY((i + 1), dataQueue[ch - 1].ElementAt(i));}}private void UpdateQueueValue(int ch, Double y)
{if (dataQueue[ch - 1].Count > 100)//先出列dataQueue[ch - 1].Dequeue();dataQueue[ch - 1].Enqueue(y);}private void btnStart_Click(object sender, EventArgs e)
{if (!isStart){btnStart.Text = @"停止采集";btnStart.DisabledImage = btnStart.Image;btnStart.Image = (Image)btnStart.PressedImage.Clone();isStart = !isStart;}else{btnStart.Text = @"开始采集";btnStart.Image = btnStart.DisabledImage;isStart = !isStart;}}}
}

运行结果:

61872fb739f524c541ca0d8a766bba5e.png

源代码和激光雷达相关说明文档百度网盘下载地址:

链接:https://pan.baidu.com/s/1KmIbP1I9Eq90bcFOiYSI6w 

提取码:ska8 

------------------------------------------------------------------------

如果这篇文章对你有帮助,就请多多点击,让更多朋友看到,需要进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现低功耗设计的嵌入式系统技术

&#xff08;本文为简单介绍&#xff0c;观点来源网络&#xff09; 在嵌入式系统设计中&#xff0c;追求低功耗已成为一个核心指标&#xff0c;旨在延长设备的运行时间并提升能效。实现这一目标的途径是多元的&#xff0c;涉及从硬件选型到软件算法的各个层面。 首先&#xf…

【Py/Java/C++三种语言详解】LeetCode每日一题240217【二叉树BFS】LeetCode429、N叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大厂面…

基于MapVGL的地理信息三维度数据增长可视化

写在前面 工作中接触&#xff0c;简单整理博文内容为 基于MapVGL的地理信息维度数据增长可视化 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都…

市场复盘总结 20240208

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…

第五节笔记:LMDeploy 大模型量化部署实践

大模型部署背景 参数用FP16半精度也就是2字节&#xff0c;7B的模型就大约占14G 2.LMDeploy简介 量化降低显存需求量&#xff0c;提高推理速度 大语言模型推理是典型的访问密集型&#xff0c;因为是decoder only的架构&#xff0c;需要token by token的生成&#xff0c;因…

从代码的层面掌握LLM的路线

原则&#xff1a;从易到难&#xff0c;只用 pytorch 从第一个项目来熟悉 transformer 的使用&#xff1b; 从第二个项目来掌握对训练数据的使用方法及 transformer 的 decoder 的细节&#xff1b; 从第三个项目来理解 LLM 的整个过程&#xff1b; 1&#xff0c;Transformer t…

C++-手把手教你模拟实现string

1.string的成员变量 模拟实现string只需要三个成员变量&#xff0c;capacity&#xff0c;size&#xff0c;_str&#xff0c;也就是容量&#xff0c;数据大小&#xff0c;指向字符串的指针。 2.string的构造函数 2.1 使用字符串构造 使用字符串来构造一个string类的对象&…

Days 33 ElfBoard 固定CPU频率

ELF 1开发板选用的是主频800MHz NXP的i.MX6ULL处理器。根据实际的应用场景&#xff0c;如果需要降低CPU功耗&#xff0c;其中一种方法可以将CPU频率固定为节能模式&#xff0c;下面以这款开发板为例给小伙伴们介绍一下固定CPU频率的方法。 先来介绍一下与CPU频率相关的命令&…

希捷与索尼集团合作生产HAMR写头激光二极管

最近有报道指出&#xff0c;希捷&#xff08;Seagate&#xff09;在生产其采用热辅助磁记录&#xff08;HAMR&#xff09;技术的大容量硬盘时&#xff0c;并非所有组件都在内部制造。根据日经新闻的一份新报告&#xff0c;希捷已与索尼集团合作&#xff0c;由索尼为其HAMR写头生…

重塑高校评价体系,缓解内卷,培养有远见的研究者

重塑高校评价体系&#xff0c;缓解内卷&#xff0c;培养有远见的研究者 摘要&#xff1a;当前高等教育和科研环境中普遍存在的“非升即走”制度&#xff0c;尽管表面上看似激励科研人员努力工作&#xff0c;但实际上反映了学术界的内卷状况。这一制度的设置在人才供过于求的背景…

实验二 物理内存管理-实验部分

目录 一、知识点 1、计算机体系结构/内存层次 1.1、计算机体系结构 1.2、地址空间&地址生成 1.3、伙伴系统&#xff08;Buddy System&#xff09; 2、非连续内存分配 2.1、段式存储 2.2、页式存储 2.3、快表和多级页表 2.4、段页式存储 3、X86的特权级与MMU 3.…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…

乡政府|乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)

乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

视觉设计师的项目评审复盘攻略:如何提升设计质量与效率

视觉设计师的角色是至关重要的&#xff0c;以确保设计项目满足预期的质量和结果。作为一名视觉设计师&#xff0c;有必要进行定期的项目审查&#xff0c;以确保项目在正轨上进行&#xff0c;并尽早解决任何问题。在本文中我们将讨论可视化设计人员如何做好项目评审&#xff0c;…

吴恩达机器学习全课程笔记第一篇

目录 前言 P1 - P8 监督学习 ​无监督学习 P9-P14 线性回归模型 成本&#xff08;代价&#xff09;函数 P15-P20 梯度下降 P21-P24 多类特征 向量化 多元线性回归的梯度下降 P25-P30 特征缩放 检查梯度下降是否收敛 学习率的选择 特征工程 多项式回归 前言…

【沐风老师】3DMAX一键书籍生成插件BookMaker使用方法详解

3DMAX书籍制作者插件BookMaker使用方法 3DMAX一键书籍生成插件BookMaker&#xff0c;是用于在3dMax中创建书籍的插件&#xff0c;可以创建高细节的3D书籍模型&#xff0c;具有不同的书籍类型可以选择。 【适用版本】 3dMax2012 – 2024&#xff08;不仅限于此范围&#xff09;…

问题记录——c++ sort 函数 和 严格弱序比较

引出 看下面这段cmp函数的定义 //按照vector第一个元素升序排序 static bool cmp(const vector<int>& a, const vector<int>& b){return a[0] < b[0]; }int eraseOverlapIntervals(vector<vector<int>>& intervals) {//按区间左端排序…

RK3399平台开发系列讲解(USB篇)USB 枚举和断开过程

🚀返回专栏总目录 文章目录 一、连接与检测二、USB设备枚举三、断开过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍 USB 枚举/断开过程。 一、连接与检测 二、USB设备枚举 USB设备枚举一

Linux:docker的Portainer部署

官网 Portainer: Container Management Software for Kubernetes and Dockerhttps://www.portainer.io/ 1.下载 portainer也是一个docker的镜像直接下载即可 docker pull portainer/portainer 2.运行 直接运行镜像即可直接使用 docker run -d -p 8000:8000 -p 9000:9000 -…