C#-思岚激光雷达A1使用

目录

一、使用测试软件和激光雷达连接测试

1、使用思岚调试激光雷达测试软件。

(1)运行激光雷达软件

 (2)激光雷达开启扫描功能

 (3)方向和距离定义

二、使用串口调试助手和激光雷达连接测试

1、使用串口调试助手测试

 (1)打开串口

 (2)激光雷达扫描

(3)雷达返回数据解析

(4)激光雷达其它控制指令 

三、C#程序工程创建

1、界面和功能

2、雷达图绘制

3、激光雷达扫描和数据获取

4、串口接收的数据解析

5、数据点在极坐标雷达图中显示

四、资料下载

1、雷达资料和软件下载

2、C#程序工程下载

3、C#程序,激光雷达数据解析


一、使用测试软件和激光雷达连接测试

1、使用思岚调试激光雷达测试软件。

(1)运行激光雷达软件

 (软件打开前和打开后雷达都是转动的)

 (2)激光雷达开启扫描功能

点击菜单栏上的扫面按钮,扫描出周围的环境轮廓

 (3)方向和距离定义

以下图雷达安装位置所示,极坐标系。

雷达数据为方位角、距离。

 测试完成,关闭雷达测试软件。

二、使用串口调试助手和激光雷达连接测试

1、使用串口调试助手测试

测试A1系列的雷达,调试助手软件必须有DTR功能。

 (1)打开串口

打开前保持复选框DTR选中,再打开串口。打开串口前雷达转动,打开串口后雷达停止转动。

 (2)激光雷达扫描

 功能码是16进制(HEX)的:A5 20

 点击发送,接收到返回的报文:A5 5A 05 00 00 40 81 。

(串口调试助手中清除窗口)

此时去掉DTR勾选,雷达转动,串口调试助手接收到雷达返回的数据

通过解析返回的雷达数据结构,得到空间距离和角度位姿数据。 

(3)雷达返回数据解析

雷达返回的数据结构为:

 

(4)激光雷达其它控制指令 

①停止

        功能码是16进制(HEX)的:A5 25。发送停止指令后,雷达不在输出数据。(此时雷达还是转动的)

②再次扫描

         重复步骤(1),勾选DTR、发送A5 20。接收到报文:A5 5A 05 00 00 40 81 ,该报文清除掉。再去掉DTR,接收雷达的位姿报文数据。

 ③复位

        功能码是16进制(HEX)的:A5 40

④获取测量时间

        功能码是16进制(HEX)的:A5 59

        返回报文:A5 5A 04 00 00 00 15 F4 01 FA 00 

三、C#程序工程创建

1、界面和功能

2、雷达图绘制

极坐标系雷达图绘制,参见博客:

C# GDI绘图显示 极坐标_c# 有没有绘图空间 获取坐标-CSDN博客

3、激光雷达扫描和数据获取

打开串口后,DTR选中。然后进行雷达扫描,收到正确的返回报文后,取消DTR选中,即可接收到雷达扫描到点数据。

        private void btnScan_Click(object sender, EventArgs e)
        {
            isScan = true;
            timer1.Start();

            Thread.Sleep(50);

            byte[] buff = new byte[2];
            buff[0] = 0xA5;
            buff[1] = 0x20;

            _comm.DiscardInBuffer();                //清空串口当前缓存数据
            _comm.Write(buff, 0, buff.Length);
        }

4、串口接收的数据解析

        private void Comm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            _comm = (SerialPort)sender;     //类型转换
            try
            {
                int count = _comm.BytesToRead;
                byte[] buffer = new byte[count];
                _comm.Read(buffer, 0, count);

                string strScanRecv = "";
                if (isScan)
                {
                    //收到A5 20指令,返回的报文——A5 5A 05 00 00 40 81
                    if (checkDTR.Checked)
                    {
                        if (count == 7)
                        {
                            for (int i = 0; i < buffer.Length; i++)
                            {
                                string strData = Convert.ToString(buffer[i], 16);   //byte转换成16进制格式的字符串
                                strData = buffer[i].ToString("X2");                 //转换后的字符串字母大写
                                strPortRecv = strPortRecv + strData + " ";
                            }
                            strPortRecv = strPortRecv + "\r\n";
                        }
                    }
                    else
                    {
                        byte[] newBuff = new byte[buffer.Length + nLastReduceDatas];
                        for (int i = 0; i < nLastReduceDatas; i++)
                        {
                            //newBuff[i] = newBuff[newBuff.Length - nLastReduceDatas + i];
                            newBuff[i] = lastRedueceBuffer[i];
                        }                        
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            newBuff[i + nLastReduceDatas] = buffer[i];
                        }
                        nLastReduceDatas = (buffer.Length + nLastReduceDatas) % 5;
                        int rows = newBuff.Length / 5;
                        for (int i = 0; i < rows; i++)
                        {
                            nRandDatasAddTemp++;
                            string lines = "";

                            string strDistanceHex1 = "", strDistanceHex2 = "";
                            string strAngleHex1 = "", strAngleHex2 = "";

                            for (int j = 0; j < 5; j++)
                            {
                                string strData = Convert.ToString(newBuff[i*5+j], 16);          //byte转换成16进制格式的字符串
                                strData = newBuff[i * 5 + j].ToString("X2");                    //转换后的字符串字母大写
                                lines = lines + strData + " ";

                                //雷达扫描圈数统计
                                if (j == 0)
                                {
                                    bool[] bArray = myMath.HexToBools(strData);
                                    if (bArray.Length > 2)
                                    {
                                        //新的一圈
                                        if (bArray[0] == true)
                                        {
                                            nRandCount++;
                                            
                                            nRandCircleDatas = nRandDatasAddTemp;
                                            nRandDatasAddTemp = 0;
                                            strScanRecv = "";
                                        }
                                    }
                                }
                                //
                                if (j == 1)
                                {
                                    strAngleHex1 = strData;
                                }
                                //
                                if (j == 2)
                                {
                                    strAngleHex2 = strData;
                                }
                                //
                                if (j == 3)
                                {
                                    strDistanceHex1 = strData;
                                }
                                //
                                if (j == 4)
                                {
                                    strDistanceHex2 = strData;
                                }
                            }
                            //角度
                            string strAngleHex = strAngleHex2 + strAngleHex1;
                            bool[] angleArrayTemp = myMath.HexToBools(strAngleHex);
                            if(angleArrayTemp.Length==16)
                            {
                                angleArrayTemp[15] = false;
                            }
                            bool[] angleArray = new bool[16];
                            for (int j = 1; j < angleArrayTemp.Length; j++)
                            {
                                angleArray[j - 1] = angleArrayTemp[j];
                            }
                            int nAngleTemp = myMath.BoolsToInt(angleArray);
                            float angle = (float)nAngleTemp / 64.0f;

                            //距离
                            string strDistanceHex = strDistanceHex2 + strDistanceHex1;
                            int ndistanceTemp = myMath.HexToInt(strDistanceHex);
                            float distance = (float)ndistanceTemp / 4.0f;

                            //保存到数据点的:距离数组、角度数组中
                            if (nRandDatasAddTemp<500)
                            {
                                distancePoints[nRandDatasAddTemp] = distance;
                                anglePoints[nRandDatasAddTemp] = angle;
                            }
                            strScanRecv =strScanRecv+ lines + "\r\n";
                        }
                    }
                }
                else
                {
                    if (count > 0)
                    {
                        for (int i = 0; i < buffer.Length; i++)
                        {
                            string strData = Convert.ToString(buffer[i], 16);   //byte转换成16进制格式的字符串
                            strData = buffer[i].ToString("X2");                 //转换后的字符串字母大写
                            strPortRecv = strPortRecv + strData + " ";
                        }
                        strPortRecv = strPortRecv + "\r\n";
                    }                    
                }
                this.Invoke(updateText, new string[] { strScanRecv });
            }
            catch (Exception ce)
            {
                MessageBox.Show(ce.Message);
            }

        }

5、数据点在极坐标雷达图中显示

解析计算好后雷达距离、角度数据,距离单位是毫米、角度单位是度。极坐标雷达图数据点单位,距离是米、方位角是度。

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            //绘制极坐标面板
            polarCood.DrawingBoardWidth = pictureBox1.Width;
            polarCood.DrawingBoardHeight = pictureBox1.Height;
            polarCood.g = e.Graphics;
            polarCood.DrawBoard();

            //测试数据点
            for (int i = 0; i < 500; i++)
            {
                //polarCood.DrawPoint(7, (float)i / 1.0f);        //绘制极坐标的坐标点
                polarCood.DrawPoint(distancePoints[i]/1000.0f, anglePoints[i]);        //绘制极坐标的坐标点                
            }

            txtRecv.Text = strPortRecv;
            txtRandCount.Text = nRandCount.ToString();
            txtRandDataPoints.Text = nRandCircleDatas.ToString();
            this.Refresh();         //刷新界面
        }

四、资料下载

1、雷达资料和软件下载

雷达资料和串口调试工具下载链接思岚A1激光雷达测试说明和工具软件_思岚a1-制造文档类资源-CSDN下载

2、C#程序工程下载

程序代码下载链接

https://download.csdn.net/download/panjinliang066333/89484592

3、C#程序,激光雷达数据解析

程序代码下载链接

https://download.csdn.net/download/panjinliang066333/89484886

  • 4
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
思岚激光雷达A1的教程可以分为以下几个步骤: 1. 下载并安装相关软件和驱动。你可以从SLAMTEC公司的官方网站上下载激光雷达的驱动和控制软件。同时,你也可以从GitHub上找到一些开源的ROS包来支持思岚激光雷达使用。 2. 建立工作空间。你可以在Linux系统上的任意位置创建一个工作空间,用于存放你的项目文件。通过使用以下命令,在终端中创建工作空间并进入到src目录中: ``` $ mkdir -p ~/your_workspace_name/src $ cd ~/your_workspace_name/src ``` 3. 下载思岚激光雷达的ROS驱动。在src目录中,使用以下命令来克隆思岚激光雷达的ROS驱动: ``` $ git clone https://github.com/ncnynl/rplidar_ros.git ``` 4. 编译和安装驱动。在工作空间的根目录中,使用以下命令来编译驱动: ``` $ cd ~/your_workspace_name $ catkin_make ``` 5. 配置ROS环境变量。在终端中执行以下命令,将您的工作空间添加到ROS环境变量中: ``` $ source ~/your_workspace_name/devel/setup.bash ``` 6. 运行示例程序。在终端中执行以下命令,启动思岚激光雷达的示例程序: ``` $ roslaunch rplidar_ros rplidar.launch ``` 7. 查看激光雷达数据。通过使用rviz或其他ROS工具,你可以查看和分析思岚激光雷达返回的数据。 请注意,这只是一个基础的上手教程,详细的操作和应用还需要根据具体的项目需求进行调整和学习。希望对你有所帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值