基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

发布者:科技创新实践者最新更新时间:2023-10-25 来源: elecfans关键字:STM32开发板  激光雷达 手机看文章 扫描二维码
随时随地手机看文章

前言

一个朋友在做服务机器人项目,用到思岚的激光雷达,于是便把淘汰的A1M8雷达送我一个,本着拿到啥就玩啥的态度,必须整一波。其实激光雷达还是搭配ROS才能发挥最大的作用,奈何资源有限,实力不足,只能依靠STM32开发板做一个及其简陋的地图扫描。

思岚A1M8激光雷达

这款激光雷达属于低成本的360度激光扫描测距雷达,外置电机,使用皮带带动雷达转台转动,实现360度的测距扫描,电机的转速由MCU发送PWM控制。

外部系统通过 TTL 电平的 UART 串口信号与 RPLIDAR 测距核心进行通讯。通过本文档定义的通讯协议,外部系统可以实时获取 RPLIDAR 的扫描数据、设备信息、设备健康状态。并且通过相关命令调整 RPLIDAR 的工作模式。

按照不同的请求类型, RPLIDAR 具有三种不同的请求/应答模式:

标准的单次请求-单次应答模式

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

单次请求-多次应答模式

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

单次请求/无应答模式

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

对于停止扫描、重启测距核心这类请求命令, RPLIDAR 采用单次请求,但不做应答的通讯模式。此时外部系统需要在发送请求后等待一定的时间,待RPLIDAR 完成了上一次请求操作后方可继续执行下一次请求。否则第二次的请求将可能被 RPLIDAR 丢弃。

在此次应用中,主要采用后两种请求/应答模式,使用单次请求-多次应答模式采集测距数据,使用单次请求/无应答模式停止采样,进行数据的处理。

在单次请求-多次应答模式采集测距数据时,MCU发送采集指令,雷达会先回复一条起使应答报文,之后便会循环回复数据应答报文。

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

请求报文及起始应答数据格式如下:

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

在回复起始应答之后,雷达会循环回复测距数据。长度为5bytes。

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

例如测距数据为 3E D5 16 77 06。

第一个字节:3E,二进制为:0011 1110。代表信号质量为0x0f。信号质量不为零代表数据有效,起始标志位为0,代表不是新的一圈,该标志位只有在新的一圈的第一帧数据才会置一,该圈内的其余数据改为依旧是0。

第二个字节:D5,角度数据低七位。

第三个字节:16,角度数据高八位,加上第二个字节的低七位等于166A,再右移一位得B35。实际角度=835/64=44°,该角度表示与雷达零度的顺时针偏移角度,如下图。

第四个字节:77,距离数据低八位。

第五个字节:06,距离角度高八位。则此时距离为0x0677/4 = 413mm。

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

激光雷达测试:

接线:

雷达 MCU

GND----------->GND

RX------------->TX

TX------------->RX

V5.0----------->5V

GND----------->GND

MOTOCTL---->PWM

VMOTO------->5V

首先测试使用串口助手进行数据采集,这里将MOTOCTL接到5V电源,直接以最高速度进行采样。串口助手发送A5 20,可以看到数据滚动。

基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

其中开头的七位数据对应起始应答,后面每5个字节一组,对应测距数据。雷达无损坏,开始连接开发板调试。

MCU代码:

既然是USART通信,我们先初始化USART,使用串口接收中断接收数据。


void USART_Config(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;

        USART_InitTypeDef USART_InitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;

        // 打开串口GPIO的时钟

        DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);

        // 打开串口外设的时钟

        DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

        // 将USART Tx的GPIO配置为推挽复用模式

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式

        GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

        //Usart1 NVIC 配置

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能

        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        // 配置串口的工作参数

        // 配置波特率

        USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

        // 配置 针数据字长

        USART_InitStructure.USART_WordLength = USART_WordLength_8b;

        // 配置停止位

        USART_InitStructure.USART_StopBits = USART_StopBits_1;

        // 配置校验位

        USART_InitStructure.USART_Parity = USART_Parity_No ;

        // 配置硬件流控制

        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

        // 配置工作模式,收发一起

        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        // 完成串口的初始化配置

        USART_Init(DEBUG_USARTx, &USART_InitStructure);

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断

        USART_ClearFlag(USART1,USART_FLAG_TC|USART_FLAG_RXNE);

//    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);  // 开启串口DMA接收

        // 使能串口

        USART_Cmd(DEBUG_USARTx, ENABLE);            

}


然后编写中断服务函数:


void USART1_IRQHandler(void)                        //串口1中断服务程序

{

        if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)

        {

                rxbuff[Res] = USART_ReceiveData(DEBUG_USARTx);

                Res++;

                if(Res==1807)

                {

                        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启接收中断

                        USART_SendData(USART1,0xA5);

                        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);        

                        USART_SendData(USART1,0x25);

                        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);

                        Data_Processing();

                        Res=0;

                        ClearFlag=1;

                }

//                MYDMA_Enable(DMA1_Channel5);//开始一次DMA传输!

        }

}


在串口中断服务函数中,需要采集1807个数据(360个测距点*5字节+起始7个字节)。我采用全速采样,即MOTOCTL直接接5V,这里采集360个数据点其实不止一圈的数据,但是因为每个360度都有无效数据,多采集点可以使后期画图更完整。在提取数据使用EXCEL分析以后,全速转一圈大概采样258个点左右,这个数据无法固定,每一圈采样数均不一样。

在采集数据完成后我们需要关闭采样,因为STM32F103的数据处理能力并不理想,这里需要一定的时间,于是通过串口发送指令A5 25让雷达停止采样,同时调用函数Data_Processing();进行数据处理以及在屏幕上画点。这里要注意,雷达在停止采样前会将最后一帧数据发送完整,我们在发送停止指令的期间,雷达可能已经在准备下一帧数据,在发送完停止指令之后,可能会存在这一帧数据的最后一位未触发中断,但是串口的数据寄存器中已经保存了这位数据,且已经改变了标志位,所以在下一次启动采样时会导致收到的第一个数据是上一次未接收完的数据。这个在进行处理。

在此之前我们还需要一个触发采样的按键。按下按键后触发采样,为了保持持续采样,在串口接收中断关闭采样并处理完数据后,可在主循环中再次开启。


void KEY1_IRQHandler(void)

{

        u8 RX;

  //确保是否产生了EXTI Line中断

        if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 

        {

                USART_SendData(USART1,0xA5);

                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);        

                USART_SendData(USART1,0x20);

                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);                        

                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启空闲中断

                Res=0;

    //清除中断标志位

                EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     

        }  

}


基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

数据处理如下:


void Data_Processing(void)

{

        u16 i,j=7;

        u8 quality;

        for(i=0;i<360;i++)

        {

                quality = rxbuff[j]>>2;

                if(quality!=0)

                {

                        data_rage1 = rxbuff[j+2]<<8;

                        data_rage2 = rxbuff[j+1];

                        angle[i] = (data_rage1 | data_rage2)>>1;

                        angle[i] = angle[i];

                        data_rage1 = rxbuff[j+4]<<8;

                        data_rage2 = rxbuff[j+3];

                        distance[i] = (data_rage1|data_rage2);        

//                Usart_SendHalfWord(USART2,angle[i]);        

//                Usart_SendHalfWord(USART2,distance[i]);        

                }

                j = j+5;

        }

        if(i==360) 

        {

                LCD_Draw();

                i=0;

//                

        }

}


从串口缓存数组中取出角度值和距离值,保存在数组angle[]和distance[]中。当360个数据点处理完,调用画图函数进行屏幕绘制。


void LCD_Draw(void)

{

        u16 i;

         ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);        /* 清屏,显示全黑 */

        LCD_SetTextColor(RED);

        for(i=0;i<360;i++)

        {

                x=return_x(angle[i], distance[i]/scale);

[1] [2]
关键字:STM32开发板  激光雷达 引用地址:基于STM32开发板和思岚A1M8激光雷达制作地图扫描仪

上一篇:关于PHY的三大寄存器详解
下一篇:STM32入门编程总结(时钟+GPIO)

推荐阅读最新更新时间:2024-11-09 10:04

512 线时代扑面而来,车载激光雷达行业准备好了吗?
制约激光雷达大规模商用的瓶颈在哪里? 如果放在两三年前,从业者们给出的说法可能包括「价格昂贵」、「难过车规」、「无法规模化量产」。 随着市场上搭载激光雷达的车型逐渐量产落地,这些问题似乎迎刃而解。 不过,这并不意味着「激光雷达大规模商用」的难题就此解决。相比摄像头、毫米波雷达每年上千万颗的出货量,车载激光雷达今年的装载量才刚刚突破数万台。 用北醒 CEO 李远的话说,车载激光雷达市场仍处于早期阶段。 也正因为处在一个极佳的窗口期,北醒在积极推动新一代激光雷达的演进,试图通过「跨代量产」上车,实现激光雷达的大规模商用。 01、从 512 线激光雷达说起 512 线激光雷达的「首次露面」,是在今年 6 月中
[汽车电子]
512 线时代扑面而来,车载<font color='red'>激光雷达</font>行业准备好了吗?
全球最轻薄的车载激光雷达来了,24mm,万集出品
这个四月,是车载 激光雷达 密集产品发布月。 4 月 15 日,速腾发布新一代激光雷达 MX,号称要引领激光雷达进入「千元机」时代。 4 月 19 日,禾赛也发布会了新款激光雷达 ATX,并隔空喊话:卷低价无意义,禾赛选择卷技术。 4 月 26 日,国内老牌的激光雷达玩家万集,带来了一款全球最轻薄的激光雷达 WLR-760,向行业展现了另一种气势:激光雷达不光要卷价格,更要卷技术。 01、全球最轻薄的车载激光雷达来了 4 月 26 日,万集在北京车展发布了 3 款产品:前向 144 线激光雷达 WLR-740 与 192 线激光雷达 WLR-760,以及纯固态补盲激光雷达 WLR-750。 其中,最具亮点的无疑
[汽车电子]
详解STM32开发板JLINK调试步骤
STM32调试步骤 调试前,首先跳线J9的2-3脚短接,跳线J4的右边两个脚短接,跳线J5短接,J8短接,J2的1-2短接,3-4短接。 将Jlink与学习板,USB延长线与学习板,串口延长线与学习板(或者USB转串口线与学习板)连接起来, 这时LED灯LED5,LED6都应该点亮,如果不亮,说明板子有问题。 打开串口助手,按照如下设置: 1、从桌面打开J-Flash ARM V4.02如图所示。 也可以按照如下顺序打开J-Flash ARM 。 “开始à程序àSEGGERàJ-Link ARM V4.02àJ-Flash ARM”,如下图所示。 2、打开J-Flash ARM后,先进行芯片选项设置,打开Options
[单片机]
详解<font color='red'>STM32</font><font color='red'>开发板</font>JLINK调试步骤
车企紧盯城市 NOA,激光雷达将迎来高光时刻
编者按:城市 NOA,即城市领航辅助驾驶,指的是用户在导航设定好目的地后,车辆在行驶过程中可以实现跟车、超车、变道、转弯与识别反应红绿灯等功能。 发展城市 NOA 对提升用户辅助驾驶使用率非常重要。数据显示,在用车时长上,城市场景占比 90%。同时,每天仅有 25% 的用户出行会通过高速,而城市道路为 100%。 从提高用户使用频率和用户体验角度看,车企之间的城市 NOA 竞争也将愈演愈烈。 在这场迫在眉睫且考验技术储备的开城之战中,汽车之心将围绕「城市 NOA」这条主线,采访车企、智能驾驶产业链、技术专家、深度用户,通过文字与视频的形式,理性、客观地解构城市 NOA 的关键玩家与关键技术,为城市 NOA 的科普提供一
[汽车电子]
车企紧盯城市 NOA,<font color='red'>激光雷达</font>将迎来高光时刻
中国主导的3项汽车激光雷达预研工作获得认可
近日,禾赛科技的技术专家代表中国参加了在英国伦敦召开的国际标准化组织道路车辆委员会电气、电子部件及通用系统分技术委员会 (ISO/TC22/SC32) 2023 年度会议1,并向与会代表汇报了关于全球车载激光雷达 ISO 标准预研工作的成果。 在这次会议上,由中国主导的 3 项汽车激光雷达 PWI (Preliminary Work Item) 项目(包括 ISO/PWI 13228《道路车辆激光雷达试验方法》)相关的标准化预研工作获得了各国的一致认可,委员会同意进一步发起投票。 针对 ISO/PWI 13228、ISO/PWI 13389 、ISO/PWI 13377 3 个预研项目,本次会议讨论并决议如下: 1、如果
[嵌入式]
中国主导的3项汽车<font color='red'>激光雷达</font>预研工作获得认可
综述:单光子激光雷达技术发展现状与趋势
概述 在三维成像探测领域,主动式激光雷达被广泛应用于航空航天、自动驾驶、三维建模和环境监测等领域。然而,激光在传输介质中的散射与衰减效应导致常用的线性探测模式激光雷达在远距离、高效率应用中的探测能力受到限制,如何在复杂环境中保持高探测灵敏度、高探测精度和强抗干扰能力成为激光雷达技术发展中面临的一大挑战。 单光子探测器件具有光子级灵敏度、0/1输出和易于阵列化等特性,从根本上提高了对光信号的利用率并改变了数据处理方式,在激光探测方面展现出独特的优势,成为激光探测技术的研究热点。基于单光子探测器的激光雷达,通过时间相关单光子计数技术,显著地降低了成像系统对激光光源功率和大口径接收光学系统的依赖,并为微弱信号下高
[汽车电子]
华为加持,激光雷达爆发式增长带旺VCSEL市场!两大厂商揭秘新品方案
激光雷达是一种综合的光探测与测量系统,可以创建出目标清晰的 3D 图像。随着汽车向自动驾驶过渡,激光雷达受到产业界越来越多的关注,有望弥补摄像头在精度、稳定性、抗环境干扰和视野上的局限性,是 L3、L4 和 L5 级标准的自动驾驶不可或缺的元件。 今年,中国智能驾驶市场高速增长,根据盖世汽车研究院智能驾驶配置数据分析,2024年上半年,激光雷达市场呈现出爆发式增长态势,搭载量已达到惊人的58.4万颗,超过了去年全年的搭载量,2024全年预计会突破130万颗。VCSEL作为激光雷达的核心部件之一,市场规模将随着激光雷达市场空间的扩大而增长。 近期,在VCSEL领域发生了两起融资事件。3月10日,行业领先的VCSEL光学解决方案商瑞识
[嵌入式]
华为加持,<font color='red'>激光雷达</font>爆发式增长带旺VCSEL市场!两大厂商揭秘新品方案
又一家激光雷达企业完成数千万元融资
近三个月来,激光雷达领域不断传出融资消息。先是天眸光电完成近亿元Pre-A轮融资,再是探维科技获得超亿元A+轮融资。8月伊始,又有一家激光雷达公司——视光半导体完成了数千万元A+轮融资。 早前,视光半导体已与联想创投、矽力杰、上海工研院、浙大友创等达成两轮数千万元融资。而此轮融资由新瞳资本领投,几家原股东追投,将主要用于优化产品稳定性、持续降本,引进人才及自动封装产线建设。 视光园区激光雷达实拍点云 进入2023年,“降本”仍是汽车行业发展的关键词之一。反映在趋势上,车企不再执着于堆砌激光雷达的数量,反而越发重视实现激光雷达的性能优势,为的是把更成熟的驾驶辅助功能交到消费者手上。 同时另一边,动辄上万元的激光
[汽车电子]
又一家<font color='red'>激光雷达</font>企业完成数千万元融资
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved