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

这篇具有很好参考价值的文章主要介绍了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 

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

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

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

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

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

 -。字符串数据格式(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 默认值是8192
                while (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;
            }
        }
    }
}

运行结果:

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

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

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

提取码:ska8 

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

如果这篇文章对你有帮助,就请多多点击,让更多朋友看到,需要进文章来源地址https://www.toymoban.com/news/detail-826055.html

到了这里,关于C# winfrom实例:四路激光测距雷达数据采集和波形图绘制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用扩展卡尔曼滤波(EKF)融合激光雷达和雷达数据(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 大多数自

    2024年02月09日
    浏览(28)
  • liosam 速腾激光雷达数据适配,timestamp位数不够

    首先是时间,RS的点云的时间是绝对时间,所以不能用加法。 自定义一个sensor类型KJW,随便什么名,我后来改为RS32了,因为是robosense32线 修改过后,scan start和end差距过大,六十多秒。 这里的timestamp要double转float,这里有个古老知识要复习,float是32位,有23位是数字,为什么

    2024年02月02日
    浏览(33)
  • 激光雷达和相机数据时间同步的几种方法

    图1图2为数据时间未校准,使用Matlab 2022b相机和激光雷达联合标定工具箱进行的联合标定(图1为使用4对jpg和pcd文件时的联合标定效果,图2为使用15对jpg和pcd文件时的联合标定效果);图3图4为数据时间已校准后,使用Matlab 2022b相机和激光雷达联合标定工具箱进行的联合标定(

    2024年02月03日
    浏览(63)
  • ZYNQ+AD8285高速毫米波雷达数据采集系统设计

    传统的毫米波雷达采用 DSP+FPGA 的处理模 块,通过FPGA 增加采集数据吞吐能力,通过 DSP 器件完成数据处理算法。为满足如今毫米波雷达 低功耗小型化的指标要求,同时保证数据接口的 稳定性和速度,本设计提出一种基于 Xilinx 公司的ZYNQ采集系统,具有高集成度,高可靠性的

    2024年02月03日
    浏览(27)
  • 基于机器学习和OpenCV的激光雷达数据分割和分类

    背景 目前,先进传感器的使用使得在自然资源监测方面能够以高效的方式进行创新,激光雷达技术就是这样一种情况。激光雷达技术是GPS技术、惯性测量单元和激光传感器的集成结果,用于通过收集以三维坐标(x、y、z)呈现的数据来测量可变距离的范围。 这些数据用于定

    2024年03月17日
    浏览(28)
  • TI IWR1642毫米波雷达使用串口原始数据采集与分析

    本文编辑:调皮哥的小助理 如果文章能够给你带来价值,希望能够关注我。 如果文章能够让你学习到知识,希望你能够点个赞! 好了下面开始今天的学习内容吧。 今天给大家分享的是 《TI 的IWR1642毫米波雷达使用串口原始数据采集与分析》。通常TI的系列雷达如IWR1642、IWR

    2023年04月09日
    浏览(63)
  • Fusion_PointClouds - 多激光雷达点云数据融合

    fusion_pointclouds 主要目的为Ubuntu环境下无人车多激光雷达标定之后, 将多个激光雷达点云话题/坐标系 通过PCL (Point Cloud Library)融合为 一个ros点云话题,以便于后期点云地面分割与地面处理等等。 1.1 应用场景 图1:为了保证激光雷达的360°环境覆盖,我们需要用到多传感器的拼

    2024年02月03日
    浏览(26)
  • IWR6843ISK+DCA1000EVM毫米波雷达波形数据采集

    IWR6843ISK+DCA1000EVM毫米波雷达波形数据采集 1.DCA1000EVM的开关情况如下图: 2.IWR6843ISK的开关情况如下图: 3.连接情况 使用下图所示的60pin线连接两块板子: 其中IWR6843ISK连接的为下图中上方接口: 4、供电情况 IWR6843ISK需要使用USB线连接至电脑,DCA1000EVM需要使用USB线连接至电脑,

    2024年02月09日
    浏览(27)
  • 使用KITTI数据集的激光雷达数据(数据预处理+数据集制作+训练)

    目录 1.前言 2. 数据集简介 2.1采集区域 2.2采集平台 3. 激光雷达数据位置 4. 激光雷达数据标签含义 5. 数据预处理与训练 5.1配置openpcdet 5.2数据预处理 5.2.1数据集目录整理 5.2.2数据集格式转化 5.3训练 做激光雷达感知相关工作离不开数据集,激光雷达数据标注价格较高,可选的开

    2024年02月09日
    浏览(29)
  • 利用ArcGISPro/GeoScenePro从激光雷达数据中提取 3D 建筑物

            在本课程中,您将从激光雷达数据中提取信息。 激光雷达(激光探测及测距)是一项遥感技术,它利用激光对地球表面进行密集采样,以产生高精度的 x, y, z 点测量。 这些点的集合称为点云。         要从激光雷达数据中提取 3D 建筑物形状,您首先需要对点

    2024年04月26日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包