基于STM32和激光雷达的路径规划

这篇具有很好参考价值的文章主要介绍了基于STM32和激光雷达的路径规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇文章中,我们可以用激光雷达得到精确的雷达数据了,根据这些数据,我们可以用程

序画个图验证一下。

基于STM32和激光雷达的路径规划

可以发现,我们得到的点是非常准确的,噪点也很少。那么我们可以据此导航了。

关于算法目标,就是避开矩形障碍物,找到圆弧所在的角度。

在算法编写过程中,我也深刻的感受到32算力相当有限。接收雷达数据由串口中断接收,我一旦在主函数里面放入运算量比较大的任务,比如说解算,那么我收到的数据就很不准。或者说直接报错说内存不够了。

我的想法是,32算力不够,那我就只设置一个360个数据的数组,对应360个角度,存放各个角度的数据。

又得知测试所用的圆筒,半径135mm左右,那么,就可以根据这个半径,在雷达扫描到的点中,检索符合这个条件的弧形,具体代码如下可见

#include "cmath"

int map[360]={0};
int x[360]={0};
int y[360]={0};
int center_x[360]={0};
int center_y[360]={0};
int score[360]={0};
int re(void)//得到角度
{
int i=0,j=0;
	for(i=0;i<360;i++)//360个圆心
	{
		for(j=0;j<360;j++)//遍历360个点
		{
			if(x[j]!=0&&y[j]!=0)
			{
			if((pow(x[j]-center_x[i],2)+pow(y[j]-center_y[i],2))<17900&&(pow(x[j]-center_x[i],2)+pow(y[j]-center_y[i],2))>15900)
			{score[i]++;}
		  }
		}
	}
	j=0;
	for(i=0;i<360;i++)
	{
		if(score[j]<score[i])
		{j=i;}
	}
	return j;
}


int quality(void)
{
int i=0,c=0;
	for(i=0;i<360;i++)
	{
		if(map[i]!=0)
		{c++;}
	}
	return c;
}

void change(void)
{
	int i=0;float ceta=0.0;
	for(i=0;i<360;i++)
	{
		ceta=i*0.01745;
			x[i]=map[i]*cos(ceta);
			y[i]=map[i]*sin(ceta);
	}
}
void get_center(void)
{
int i=0;float ceta=0.0;
	for(i=0;i<360;i++)
	{
	ceta=i*0.01745;
	center_x[i]=(map[i]+132)*cos(ceta);
	center_y[i]=(map[i]+132)*sin(ceta);
	}
}
void zero(void)
{
int i=0;
	for(i=0;i<360;i++)
	{
	map[i]=0;x[i]=0;y[i]=0;center_x[i]=0;center_y[i]=0;score[i]=0;
	}
}


 我这个解算大大减少了运算量,通过比较各个角度的的分值,确定最佳的角度。

由于我使用了两块STM32,所以我决定通过串口通讯连接上位机与下位机,由下位机将角度信息传给上位机,上位机比较角度信息与算法得到的目标角度,得到小车的运动状态,然后上位机将状态用串口传给下位机,实现小车的运行。

为了实现更好的效果,我设定在接收十万个点的数据后,进行一次解算,小车同时运动3秒左右,一点一点走,就可以比较好的逼近目标。

以下为上位机主函数

while(1) 			
	{
		//LCD_ShowNum(50,50,Yaw,40,16);	
		if(caokong==1)
		{
			while(1)
			{
				//delay_ms(50);
				delay(50);
			if(Yaw>direction+15)
			{
			UART1_TX(0x62);
			}
			else if(Yaw<direction-15)
			{
			UART1_TX(0x61);
			}
			else if(Yaw<direction+15&&Yaw>direction-15)
			{
			UART1_TX(0x63);
			}
			j++;
			if(j>60)
			{		
				TIM_SetCompare2(TIM3,70);
				caokong=0;
				j=0;
				for(r=0;r<10;r++)
				{
				UART1_TX(0x64);
				delay_ms(10);
				}
				zero();
				break;
			}
			}	
		}
		if(jyj)
		{
			hhh++;
		//printf("%c",m);
		if(flag==1)
		{
			RX_buffer[count]=m;
			count++;
			if(count==4)//开始解算数据
			{
				if(!(RX_buffer[0]&0x01))
				{
				flag=0;count=0;
				}
				//angle2=(RX_buffer[1]<<7|RX_buffer[0]>>1);
				angle2=(RX_buffer[1]<<7|RX_buffer[0]>>1);
				distance=(RX_buffer[3]<<6|RX_buffer[2]>>2);
				
				if(distance!=0&&count!=0)
				{
				//printf("distance=%d\n",RX_buffer[3]<<6|RX_buffer[2]>>2);		
				//printf("\r\n");
				//printf("angle=%d\n",angle2);
				//printf("\r\n");
				if(map[angle2/64]!=0)
				{
				map[angle2/64]=(distance+map[angle2/64])/2;
				}
				else
				{
				map[angle2/64]=distance;
				}
				}
				flag=0;//点的检测标志归位
				count=0;//计数归0
				
			}
		} 
			if(flag==0)//点的检测标志
			{				
				if(m==0x3E)//检测到点
				{
					flag=1;
				}
			}
			jyj=0;
			
		}
		//if(quality()>350)
		if(hhh>100000)
		{
			change();
			get_center();
			direction=re(); 
			//UART1_TX(0xf1);
			//UART1_TX(direction>>8);//先发高位,再发低位
			//UART1_TX(direction);
			LCD_ShowNum(50,50,direction,40,16);
			caokong=1;
			hhh=0;
			TIM_SetCompare2(TIM3,98);
		}		
	}		

以下为下位机的主要函数,在中断中运行

每次新的解算开始时,mpu6050初始化一次,实现坐标的变换

if(Yaw<0)
		 {
		 yy=-Yaw;
		 usart2_send(0xff);
		 usart2_send(yy>>8);//先发高位,再发低位
		 usart2_send(yy);
		 }
		 else
		 {
		 yy=Yaw;
		 usart2_send(0xfe);
		 usart2_send(yy>>8);//先发高位,再发低位
		 usart2_send(yy);
		 }
		 if(m==0x61)
		 {
		 Set_Pwm(1500,2000,0);
		 }
		 else if(m==0x62)
		 {
		 Set_Pwm(2000,1500,0);
		 }
		 else if(m==0x63)
		 {
		 Set_Pwm(1500,1500,0); 
			mm=1;
		 }
		 else{Set_Pwm(0,0,0);mm=0;}
			if(m==0x64)
			{
    MPU6050_initialize();           //=====MPU6050初始化	
  	DMP_Init();                     //=====初始化DMP   
			}
		 if(mm==1)
		 {
		 Set_Pwm(1500,1500,0); 
		 }
 }

在测试后,也是发现识别圆弧效果比较好,但是还有一个避障的问题。

于是,通过更改每次运动旋转、直走的角度,虽然不能每次都通过测试,但也实现了一定的成功率。

基于STM32和激光雷达的路径规划

基于STM32和激光雷达的路径规划

总结来看,本次项目,嵌入式部分,是一个“字节跳动”的感觉,激光雷达超级快的发送字节,让精准接收数据成了很困难的挑战。32的任务分配,任务调度,外设的配置,如何更好的配合算法。在调试过程中,也涉及到很多字节、数据类型方面的知识,比如说串口发送、解算浮点数据。意识到,在计算机的世界中,二进制,十六进制,字节,这种基本的语言是如何实现操作寄存器,机器与机器之间互相沟通的。

算法部分,我认为最大的困难就是,用尽可能少的运算,实现想要的功能。小组中也有同学写过更高识别能力的算法,但是都因为内存占用过多,而无法部署到32上,这就很考验算法能力。

在这次项目中,也认识到自己对32还不够熟悉,代码很不美观,任务调度也非常简陋。没有很好利用32的能力。路漫漫其修远兮,诸君共勉。文章来源地址https://www.toymoban.com/news/detail-432665.html

到了这里,关于基于STM32和激光雷达的路径规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于STM32的倒车雷达系统设计

    目录 前言 一、绪论 1.1 设计背景 1.2 设计内容 二、系统硬件设计 2.1 硬件系统框图 2.2 主控制电路 2.3 超声波电路 2.4 OLED显示电路 2.5 键盘输入电路 2.6 声光报警模块电路 三、系统软件设计 3.1 系统主程序设计 3.2 OLED显示程序设计 3.3 键盘设定程序设计 四、系统调试 4.1 硬件调

    2024年02月06日
    浏览(32)
  • stm32路径规划无人驾驶避障智能车

    硬件准备 能搭载ROS系统与SLAM系统的STM32开发板 ROS(Robot Operating System)是一种面向机器人应用程序的开源软件开发框架。它提供了一套丰富的库和工具,使得开发者能够更加便捷地开发机器人的软件部分。ROS的主要目的是提供一种灵活且可扩展的方式来构建机器人系统,包

    2024年01月16日
    浏览(27)
  • STM32基于毫米波雷达的生命体征检测系统

    毫米波雷达我选择的了Seeedstudio企业的淘宝官方店铺,毫米波雷达包含有呼吸心跳检测雷达,人体存在感应雷达,睡眠呼吸等等,其单个模块并非只有单一功能,需要开发者根据原始数据分析解析。   由于毫米波模块是默认输出的,一直在不停歇的发送数据,所以或者原始数

    2024年01月16日
    浏览(33)
  • 如何实现基于图像与激光雷达的 3d 场景重建?

    智影S100是一款基于图像和激光点云融合建模技术的 高精度轻巧手持SLAM三维激光扫描仪。 设备机身小巧、手持轻便,可快速采集点云数据;支持实时解算、实时预览点云成果,大幅提高内外业工作效率;同时支持一键生成实景三维Mesh模型,实现城市建筑、堆体、室内空间等

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

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

    2024年03月17日
    浏览(30)
  • Apollo官方课程算法解读笔记——激光雷达感知模块、基于PointPillars的激光雷达点云检测算法、PointPillars模型的部署和优化模型的部署和优化

    感知模块检测效果: 左边为摄像头拍摄图像,激光雷达感知不依赖左边CAMERA,而是点云数据对应的效果图(黄色上方数字为Tracking ID) 主车红灯时的激光点云检测效果图 车道线给CAMERA提供一个标定参考,使得camera检测出来的障碍物从2维转化为3维的信息,因为此标定的参考,

    2024年02月14日
    浏览(29)
  • 【文献分享】基于线特征的激光雷达和相机外参自动标定

    论文题目: Line-based Automatic Extrinsic Calibration of LiDAR and Camera 中文题目: 基于线特征的激光雷达和相机外参自动标定 作者:Xinyu Zhang, Shifan Zhu, Shichun Guo, Jun Li, and Huaping Liu 作者机构:清华大学汽车安全与能源国家重点实验室 论文链接:https://www.researchgate.net/publication/354877994_

    2024年02月06日
    浏览(31)
  • 基于ROS的自动驾驶 激光雷达点云物体检测 项目实战

    前言: 基于Apollo的preception与Autoware的lidar_apollo_cnn_seg_detect模块,并详细记录ROS系统上进行实时检测全部流程和踩坑,文章最后附上rosbag和rosbag的制作方法。参考文章:https://adamshan.blog.csdn.net/article/details/106157761?spm=1001.2014.3001.5502感谢大佬的杰作。 检测效果视频 环境 RTX 2060(

    2024年02月08日
    浏览(31)
  • 计算机视觉中的三维重建:基于激光雷达与相机的方法

    作者:禅与计算机程序设计艺术 近年来,随着激光雷达、相机等传感器的广泛应用,三维重建技术逐渐成为热门研究方向。三维重建技术可以从多种角度帮助我们理解世界,并进行精准定位、建筑物三维模型化、环境规划、自然现象研究以及各种各样的应用。 但由于三维重

    2024年03月22日
    浏览(35)
  • RGB-L:基于激光雷达增强的ORB_SLAM3(已开源)

    点云PCL免费知识星球,点云论文速读。 文章:RGB-L: Enhancing Indirect Visual SLAM using LiDAR-based Dense Depth Maps 作者:Florian Sauerbeck, Benjamin Obermeier, Martin Rudolph 编辑:点云PCL 代码:https://github.com/TUMFTM/ORB_SLAM3_RGBL.git 欢迎各位加入免费知识星球,获取PDF论文,欢迎转发朋友圈。文章仅

    2024年02月07日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包