目录
一、使用测试软件和激光雷达连接测试
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