基于STM32的高精度超声波模块HC-SR04测距

2023-05-16

准备材料

  • 超声波模块 H C − S R 04 HC-SR04 HCSR04
  • STM32F103RCT6(Mini板)

超声波模块原理分析

在这里插入图片描述

引脚功能
VCC接5V
GND接开发板GND
Trig接外部PWM信号输入
Echo输出整形过的方波信号

性能指标

精度: 3 m m 3mm 3mm
测距范围: 2 c m 2cm 2cm 4 m 4m 4m

原理

T r i g Trig Trig引脚输入一个 10 u s 10us 10us以上的高电平信号,此时模块会发出超声波,并从 E c h o Echo Echo引脚输出 5 V 5V 5V高电平,等超声波反射回来被模块接收到后, E c h o Echo Echo引脚输出低电平,高电平持续的时间就是距离。时间与距离的转换公式如下:
2 × S = t × v 2\times S=t \times v 2×S=t×v
其中
S = 距 离 , 单 位 : c m S= 距离,单位:cm S=cm
t = 超 声 波 传 播 的 实 际 , 单 位 : u s t= 超声波传播的实际,单位:us t=us
v = 声 速 , 344 m / s v= 声速,344m/s v=344m/s
公式化简后可得
S = t ÷ 58 S=t \div 58 S=t÷58

STM32程序设计

核心就是利用好TIM定时器的PWM输出、输入捕获功能

首先,要给 T r i g Trig Trig引脚一个PWM信号(占空比自行调整),以持续输出至少 10 u s 10us 10us的高电平信号,这里直接搬运正点原子PWM输出实验核心代码。
然后检测 E c h o Echo Echo引脚高电平持续时间的方法就是用输入捕获去获得高电平持续时间(精度 1 u s 1us 1us)。这里我没有使用正点原子的算法,我的输入捕获算法设计如下:
首先,我们 T I M 5 TIM5 TIM5定时器的最大计数是 65535 65535 65535,也就是总共计数 65536 u s 65536us 65536us,我们知道超声波模块最远传输距离是 4 m ( 400 c m ) 4m(400cm) 4m(400cm),也就是说, E c h o Echo Echo 高电平持续时间最长 23200 u s 23200us 23200us,远小于溢出周期,因此不用担心计数器截断的问题,所以中断更新直接放弃考虑溢出中断,仅考虑捕获中断。然后我们定义两个变量 S T A STA STA R I S E _ G E T RISE\_ GET RISE_GET ,初始状态都置为0; S T A STA STA表示完成一次完整的高电平捕获, R I S E _ G E T RISE\_GET RISE_GET 表示捕获到一次上升沿。因此中断服务函数中,我们首先判断是否已经捕获上升沿,如果没,在此情况下发生的第一个捕获事件一定是捕获到上升沿,标记 R I S E _ G E T = 1 RISE\_GET=1 RISE_GET=1,计数器清零;下次捕获事件的中断一定就是下降沿了,此时标记 S T A = 1 STA=1 STA=1,然后输出此时 T I M 5 TIM5 TIM5的计数值。

Codes

/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/main.c 
  * @author  @Couriersix
  * @version V1.0.0
  * @date    04-October-2021
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */  

/* Includes ------------------------------------------------------------------*/
#include<stm32f10x.h>
#include<delay.h>
#include<IIC.h>
#include<TM1637.h>
#include<sys.h>

/** @addtogroup STM32F10x_StdPeriph_Template
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define Trig PAout(2)
#define LED0 PAout(8)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_ICInitTypeDef  TIM5_ICInitStructure;
unsigned char  Data[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //数码管字符显示参数
uint8_t time[4]; 
	u16 STA=0,RISE_GET=0; //STA:一次捕获完成,RISE_GET:捕获到上升沿
u16	TIM5CH1_CAPTURE_VAL;	//输入捕获值
float ans,time_cost,dis;
int dis_int,dis_res,ans_int,ans_res;
long long tot,temp;
int cnt=0;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void GPIO_Init1(){
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_8;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}
	


void TIM5_Cap_Init(u16 arr,u16 psc)
{	 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);	//使能TIM5时钟
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);						 //PA0 下拉
	
	//初始化定时器5 TIM5	 
	TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 	//预分频器   
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
	//初始化TIM5输入捕获参数
	TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 	选择输入端 IC1映射到TI1上
  	TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//上升沿捕获
  	TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  	TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //配置输入分频,不分频 
  	TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  	TIM_ICInit(TIM5, &TIM5_ICInitStructure);
	
	//中断分组初始化
	NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM5中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 
	
	TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断	
	
   	TIM_Cmd(TIM5,ENABLE ); 	//使能定时器5
   


}
 
//定时器5中断服务程序	 
void TIM5_IRQHandler(void)
{ 
	if (RISE_GET){  //已经捕获上升沿
		if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET){//捕获1发生捕获事件(在上升沿已捕获的前提下这次捕获的一定是下降沿),
			TIM5CH1_CAPTURE_VAL=TIM_GetCounter(TIM5);
			TIM_SetCounter(TIM5,0);
			RISE_GET=0; //捕获高电平输入事件结束
			STA=1; 提示主程序可以进行下一次Trig信号发送
		}
	}
	else{ //还未捕获到上升沿(指等待新的高电平出现)
		if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET && !STA){//捕获1发生捕获事件(一定是上升沿出现了)
			TIM_SetCounter(TIM5,0); //清空计数器
			RISE_GET=1;
			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);		//CC1P=1 设置为下降沿捕获
		}
	}
 
    TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中断标志位
}



//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟使能
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5                                                                       	 //用于TIM3的CH2输出的PWM通过该LED显示
 
   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//GPIO_WriteBit(GPIOA, GPIO_Pin_7,Bit_SET); // PA7上拉	

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIMx在CCR2上的预装载寄存器
	
	TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
 
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
 

}
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     


  /* Add your application code here
     */
	delay_init();
	GPIO_Init1();
	IIC_Init();
	TIM5_Cap_Init(0XFFFF,72-1);	//以1Mhz的频率计数 	
	TIM3_PWM_Init(8999,179);   //生成PWM信号
	TIM_SetCompare2(TIM3,8995);
  /* Infinite loop */
  while (1)
  {
	  LED0=1;
	  TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
	  while (!STA);
	  dis=TIM5CH1_CAPTURE_VAL/58.0; 
	  dis_int=dis;
	  LED0=0;  //指示系统正常运行
	  
	  time[0]=Data[dis_int/1000];
	  time[1]=Data[(dis_int/100)%10];
	  time[2]=Data[(dis_int%100)/10];
	  time[3]=Data[(dis_int%10)];
	  TM_Display(time); //显示结果,单位:cm
	  STA=0;
	  delay_ms(10);
  }
}



/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

测试

在这里插入图片描述

在这里插入图片描述

实际测试结果还是挺令人满意的,系统也十分稳定可靠。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32的高精度超声波模块HC-SR04测距 的相关文章

  • STM32在Debug时程序运行时间不对,Debug时定时器中断每次进入断点时间不对,定时器一开启就进入中断的解决办法

    一 Debug时程序时间不对解决办法 1 点击魔术棒 2 点击Debug 点击Settings 3 点击Trace 在Core Clock里修改为你的系统时钟 二 Debug时定时器中断每次进入断点时间不对 在Debug时 程序停下来 定时
  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 在没有 IDE 的情况下如何使用 CMSIS?

    我正在使用 STM32F103C8T6 并想使用 CMSIS 这本质上只是寄存器定义 没有代码 让我的生活更轻松 同时仍保持在较低水平 问题是我不知道如何安装该库以便在命令行上使用 Makefile 使用 所有文档似乎都与特定于供应商的 I
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 语义分割网络学习

    语义分割网络学习 依据下图 xff1a 橙色 语义分割 xff0c 绿色 实力分割 xff0c 黄色 全景分割 骨干网络 年份20142015201620172018201920201FCN VGG16 ParseNetPyramid Sc
  • Ubuntu截图软件flameshot命令行下载

    截图软件flameshot命令行下载 一 安装二 命令行截图三 设置自定义快捷键 一 安装 span class token function sudo span span class token function apt get span
  • 数据集cityscapes命令行下载

    数据集cityscapes命令行下载 一 官网注册账号二 命令行 一 官网注册账号 进入cityscapes官网注册账号 点击Download 注册完毕后登陆可看到 可直接在此点击所需包下载 xff08 较慢 xff09 二 命令行 1 原
  • Ubuntu20.04 论文CCNet:语义分割的交叉注意力 复现

    Ubuntu20 04 论文CCNet 语义分割的交叉注意力 复现 一 安装显卡驱动 1 1 源代码 1 2 驱动安装 二 环境配置 2 1 Anaconda3下创建新环境 2 2 安装CUDA10 2 2 3 安装cuDNN 三 编译 3
  • ubuntu下安装QQ

    ubuntu下安装QQ 1 查看电脑版本 span class token function uname span a Linux nj 5 4 0 26 generic 30 Ubuntu SMP Mon Apr 20 16 58 30
  • keil c51如何添加STC芯片的固件库文件

    参考百度经验 https jingyan baidu com article 75ab0bcb9f7614d6864db2c9 html
  • A-LOAM学习

    A LOAM学习 一 复现1 1 Ubuntu 和 ROS1 2 Ceres Solver1 3 PCL 二 下载A LOAM三 下数据集 一 复现 1 1 Ubuntu 和 ROS A LOAM 1 2 Ceres Solver span
  • Pycharm安装及无法输入中文注释问题解决

    Pycharm安装及无法输入中文注释问题解决 1 安装2 中文输入 1 安装 Pycharm下载ubuntu 选择community下载 解压后 xff0c 在bin目录下执行 span class token function sh sp
  • A-LOAM学习

    A LOAM学习 一 kittiHelper cpp二 scanRegistration cpp三 laserOdometry cpp四 laserMapping cpp 一 kittiHelper cpp 本代码旨在实现 将kitti数据
  • SOTA 激光相机标定velo2cam_calibration(待完成)

    最新激光相机标定velo2cam calibration 一 实验前提二 传感器调试1 1 相机 xff08 Kinect DK xff09 1 2 激光雷达 xff08 Velodyne 16 xff09 1 3 调试 三 通过ROS发布
  • 安装ORB-SLAM3教程

    安装ORB SLAM3教程 一 ROS一键安装 xff08 首次学ROS的话 xff09 二 ORB SLAM3所依赖的包有pangolin EIGEN3 OPENCV xff0c DBoW2 和 g2o1 安装工具2 安装EIGEN3 3
  • DeepLiDAR: Deep Surface Normal Guided Depth Prediction for Outdoor Scene from Sparse LiDAR

    DeepLiDAR复现 一 下载二 配置环境依赖三 数据集准备四 预处理1 表面法线 surface normal https github com valgur surface normal 2 运行设置 xff08 1 xff09 报错
  • 复现调用时碰到的各种常见问题

    复现调用时碰到的各种常见问题 一 python2 3下cv bridge问题 二 自建库 三 tensorboard可视化 一 python2 3下cv bridge问题 span class token function mkdir sp
  • 激光雷达Velodyne16配置及录制rosbag

    激光雷达Velodyne16配置 一 配置IP二 安装ROS依赖三 创建工作空间四 录制bag数据包 硬件准备 xff1a 连接电源线及网线 一 配置IP 1 设置有线的IP地址 设置 gt 网络 gt 有线连接 gt IPV4 gt 手动
  • 基于can总线的A2L文件解析(3)

    文章目录 前言MOD COMMONMOD PARXCP数据Common Parameters定义IF DATA定义XCPPROTOCOL LAYERDAQEVENTXCP ON CANCAN Parameters 总结 前言 在第二篇A2L
  • 功放电路里三极管的工作状态:甲类、乙类和甲乙类怎么区分?

    1 甲类功放管的工作点电流设计在放大区的线性区中点 xff0c 所以静态电流较大 一般在800mA 1 5A之间 xff0c 不同功率的功放管是其最佳工作点电流是不同的 xff0c 其静态发热量较大 xff0c 所需的散热片也要面积较大 x
  • 文件操作原理

    文件描述符 文件描述符在形式上是一个非负整数 实际上 xff0c 它是一个索引值 xff0c 指向内核为每一个进程所维护的该进程打开文件的记录表 当程序打开一个现有文件或者创建一个新文件时 xff0c 内核向进程返回一个文件描述符 在程序设
  • C++头文件和变量的那些事儿

    头文件和变量的那些事儿 头文件变量在内存中函数与其链接性namespace关键字using声明和using编译指令命名空间的特性未命名空间 new关键字使用new运算符初始化new运算符 函数 头文件 最近在github上拔了一个项目 xf
  • Ubuntu18系统下采集点云数据(速腾16线激光雷达)与ZED 2 相机进行外参标定(Matlab的LCC工具箱)

    这篇是最近的实验记录 xff1a 在Ubuntu系统下读取点云数据并在rviz中显示 xff0c 录制自己的rosbag数据包并离线播放 xff0c 将rosbag文件转化为pcd格式导入MATLAB中 xff0c 和双目相机进行外参标定
  • 基于STM32的高精度超声波模块HC-SR04测距

    准备材料 超声波模块 H C S R 04 HC SR04 H C