ROS中启动超声波雷达节点「建议收藏」

ROS中启动超声波雷达节点「建议收藏」超声波雷达型号为KS136,KS136使用I2C接口与主机通信,自动响应主机的I2C控制指令。指令为8位数据,指令发送流程如下,先接收I2C控制指令,寄存器2接收控制指令,选择超声波探头号(因为主控板接12个收发一体式防水探头,每个探头独立工作,每个探头占据8位地址,分别对应8种不同的数据收发方式),流程图如下所示:超声波与主控之间通过串口通信代码如下: r…


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

超声波雷达为深圳导向机电的,型号为KS136,KS136 使用 I 2 C 接口与主机通信,自动响应主机的 I 2 C 控制指令。指令为8位数据,指令发
送流程如下,首先向超声波接受器写入I2C地址为0xc8,寄存器地址0x02,超声波探头号地址0x10,

程序为:

Robot_Serial.write(writebuff, sizeof(writebuff))

再向buffer中读数据

Robot_Serial.read(Reciver_data.buffer, sizeof(Reciver_data.buffer))

流程图如下所示:

ROS中启动超声波雷达节点「建议收藏」

超声波与主控之间通过串口通信代码如下:

	
ros::Publisher chatter_pub = n.advertise<std_msgs::Float32MultiArray>("/ultrasonic_distance", 1000);
	if (bIsRviz == true)
	{
		for (loop = 0;loop < 11 ;loop++)
		{
			
			ssloop.clear();
			ssloop.str("");
			ssloop << loop+1;

			Str_sonar_pub.clear();
			Str_sonar_pub.append("/ultrasonic");
			Str_sonar_pub.append(ssloop.str());
			
			mapSonar_pub[loop]=n.advertise<sensor_msgs::Range>(Str_sonar_pub, 1000);

		}
	}
	ros::Subscriber sonar_sub = n.subscribe("/sonar_list", 100, sonar_callback);
	
	start_time = ros::Time::now();
	while (ros::ok())
	{
		//--------------------------------------trick by callback /sonar_list
		if (sonar_callbackflag == true)
		{
			count = 0;
			sonar_callbackflag = false;
		}
		else
		{

			if (sonar_data[sonar_order[count]].bIsdetect == true)
			{
				sonar_start_time = ros::Time::now();
				writebuff[0] = 0xe8;
				writebuff[1] = 0x02;
				if (sonar_type == KS136)
				{
					writebuff[2] = sonar_mod+8*sonar_order[count];
				}
				else if (sonar_type == KS106)
				{
					//zzzzzzzzzz
					if (sonar_order[count] == 2-1
						//||sonar_order[count] == 6-1
						//||sonar_order[count] == 10-1
						)
					{
						writebuff[2] = sonar_mod + 8*4;
					}
					else if (//sonar_order[count] == 2-1
						sonar_order[count] == 6-1
						//||sonar_order[count] == 10-1
						)
					{
						writebuff[2] = sonar_mod + 8*5;
					}
					else if (//sonar_order[count] == 2-1
						//||sonar_order[count] == 6-1
						sonar_order[count] == 10-1
						)
					{
						writebuff[2] = sonar_mod + 8*6;
					}
				}

				//-----------------------------------------------------to get Exception io
				try
				{
					
					Robot_Serial.write(writebuff, sizeof(writebuff));

					Robot_Serial.read(Reciver_data.buffer,sizeof(Reciver_data.buffer));
				}
				catch(serial::IOException& e)
				{
					ROS_INFO("[Serial] something wrong %s ",e.what());
					ros::Duration(5).sleep();
					return 0;
				}
					
				//-----------------------------------------------------to get Exception io

				//--------------------------------------------------------decode serial data
				dist = Reciver_data.buffer[0]*0xff+Reciver_data.buffer[1];
				//--------------------------------------------------------decode serial data

				//--------------------------------------------------------turn us to mm
				if (sonar_mod == 0x12 || sonar_mod == 0x17)
				{
					dist = (float)340*1000*dist/1000000/2;
				}
				//--------------------------------------------------------turn us to mm

				//-------------------------------------------------------turn mm to cm for jiangzhiyong
				sonar_data[sonar_order[count]].dist = dist /10;
				//-------------------------------------------------------turn mm to cm for jiangzhiyong
				
				//-----------------------------------calc time one sonar 
				sonar_end_time = ros::Time::now();
				sonar_pertime = (sonar_end_time - sonar_start_time).toNSec(); 

				if (sonar_delta == 0)
				{
					//do nothing
				}
				else
				{
					if (sonar_pertime > sonar_delta*1000000 )
					{
						//do nothing
					}else
					{
						ros::Duration(0,(sonar_delta*1000000 - sonar_pertime)).sleep();
					}
				}
				//-----------------------------------calc time one sonar

			}else
			{
				//----------------------------------------------------default value to send 
				sonar_data[sonar_order[count]].dist = 10000 /10;
			}
			count++;
			if (count >= 11)
			{
				//------------------------------------------------------turn zero
				count = 0;
				//------------------------------------------------------turn zero

				//------------------------------------------------------send msg
				follow_msg.data.clear();

				for (loop = 0;loop < 11 ;loop++)
				{
					if (sonar_data[loop].bIsdetect == true)
					{
						follow_msg.data.push_back(sonar_data[loop].dist);
					}

				}
				chatter_pub.publish(follow_msg);
				//-----------------------------------------------------send msg
				//-----------------------------------------------------send msg rviz

CmakeLists.txt文件如下

cmake_minimum_required(VERSION 2.8.3)
project(sonar_pub)


find_package(catkin REQUIRED)




find_package(catkin REQUIRED COMPONENTS
  roscpp serial
)



catkin_package(

)

include_directories(
  include ${catkin_INCLUDE_DIRS}

)



add_executable(sonar_pub_pub
  src/sonar_pub_pub.cpp
)
add_dependencies(sonar_pub_pub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(sonar_pub_pub
  ${catkin_LIBRARIES}
)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197268.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」

    见过仙女蹦迪吗?一起用python做个小仙女代码蹦迪视频「建议收藏」前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCIIAnimator进行ASCII字符转换把转换的字符gif根据每

    2022年4月28日
  • webstorm激活码【中文破解版】

    (webstorm激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
  • 嵌入式软件工程师待遇怎么样

    嵌入式软件工程师待遇怎么样本来大家选择嵌入式也就是冲着嵌入式的发展前景不错而来,所以在嵌入式这块还是有很多不知道的知识,这些也都要等着老师去给你讲解了,下面先来了解下嵌入式软件工程师待遇怎么样吧。嵌入式软件工程师待遇怎么样:1、应届毕业生如果你是在一线城市的话,有人带你,你自己有比较学的好,那么你的薪资待遇就可以达到6k+,但是不同公司不同待遇,而且不同地区不同的薪资待遇,就像北上广,这些地区薪资待遇是比其他地区高出2k以上,甚至更高的。就像人家阿里,那工资肯定就比其他公司要高的多。所以得看你要去什么地方发展了,但是平均

    2022年9月14日
  • 二叉树 二叉搜索树_判断二叉树是否是二叉排序树

    二叉树 二叉搜索树_判断二叉树是否是二叉排序树原题链接一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或

    2022年8月8日
  • 个人渗透笔记_web渗透

    个人渗透笔记_web渗透【拿shell】1.直接上传aspasajspcerphpaspxhtrcdx格式的木马,不行就利用IIS6.0解析漏洞”:1.asp;1.jpg/1.asp;.jpg/1.asp;jpg/1.asp;.xls2.上传图片木马遇到拦截系统,连图片木马都上传不了,记事本打开图片木马在代码最前面加上gif89a,一般就能逃过拦截系统了。3.上传图片木马把地址复制到数据库

    2022年9月21日
  • navicat连接mysql时出现2003(10060)错误

    navicat连接mysql时出现2003(10060)错误

    2021年6月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号