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

发布时间:2023-10-25  

前言

一个朋友在做服务机器人项目,用到思岚的激光雷达,于是便把淘汰的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);

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    这种汽车零部件,价格要卷疯了;要说车上什么零部件最卷?那一定是激光雷达(LiDAR)。 昨日,速腾聚创(Robosense)发布最新激光雷达产品MX,官方称他们把综合成本打到了千元级别,甚至......
    单价便宜是表象,中国的激光雷达产业,要想进一步发展还要直面市场上的各种问题。 特斯拉降价引发的价格压缩 首先就是特斯拉为首的新能源龙头车企,在不断降低终端的价格,试图以价换量,从而导致行业展开了一场价格战,价格......
    禾赛李一帆:激光雷达价格不会降至“白菜价”;进入新能源的下半场,以智能驾驶、智能座舱为核心的智能化成为汽车产业竞争的焦点,2022年,伴随着辅助驾驶功能的向上演进,激光雷达的搭载量也随之上升,包括蔚小理等旗下多款新车都搭载了激光雷达......
    心理防御及行为反应。 眼下,智能汽车行业陷入了降低成本带来的「PTSD」。 智能汽车品牌面对来势汹汹价格战,它们通常以降本应战:去高精地图、去毫米波雷达、去激光雷达的声音,此起彼伏。 面对价格......
    ,智能汽车行业陷入了降低成本带来的「PTSD」。 智能汽车品牌面对来势汹汹价格战,它们通常以降本应战:去高精地图、去毫米波雷达、去激光雷达的声音,此起彼伏。 面对价格战带来的巨大压力,在兼......
    厂商市场格局,图源山西证券  从目前的阶段来看,它们的出货量在不断上升,尽管还未到达盈利拐点,但从今年一季度的财报来看,它们的亏损幅度在明显收窄,也有玩家给出了盈利时间表。 与此同时,激光雷达的价格......
    厂商而言,现在的状态是——30 万价格区间的车型还没打透、20 万价格区间还没标配、15 万的区间还没进入。 信号很明显:激光雷达大厂们正在挺进 15 万元价格带。 01、第一季度成绩单出炉,暴涨......
    512 线时代扑面而来,车载激光雷达行业准备好了吗?;制约激光雷达大规模商用的瓶颈在哪里? 如果放在两三年前,从业者们给出的说法可能包括「价格昂贵」、「难过车规」、「无法规模化量产」。 随着市场上搭载激光雷达......
    出相应的反应。 Part 2 大陆激光雷达成本与性能的平衡 大陆集团的3D闪光激光雷达在性能和功能上表现出色,但其价格并不低廉。这款激光雷达的价格达到了$7,213美元。然而,考虑......
    合并或收购,急待降本的激光雷达公司何去何从;激光雷达公司的日子并不好过。 资金紧张,专利侵权索赔和诉讼费用高昂,此外还面临着技术方面的压力,包括要不断缩小传感器的尺寸和功耗,提高射程,在扩大生产的同时降低价格......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>