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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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}
)

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • afc2add是什么_appsync怎么使用

    afc2add是什么_appsync怎么使用APPsync是iPhone、iPad、iPodtouch越狱后最常安装的补丁,安装后可以绕过系统验证,随意安装运行破解的ipa软件。软件类型:Cydia软件软件格式:deb对于…

  • java获取文件名乱码_java导出文件名中文乱码

    java获取文件名乱码_java导出文件名中文乱码Java读linux系统文件文件名乱码的解决办法1,问题描述web应用想通过Java读取linux系统文件显示到web页面上,结果中文文件名出现乱码?问题场景描述:当用户通过浏览器访问tomcat服务器,请求查看某一路径下文件列表信息,tomcat的web应用调用getFilesByPath(Stringpath)方法读取文件列表信息响应请求,页面中文文件名出现乱码。推荐教程:《java学习》代…

    2022年10月20日
  • 掌握Mock摆脱后端同学的束缚

    掌握Mock摆脱后端同学的束缚在开发阶段有一个不成文的规定则是`项目开发后端先行`但是作为前端开发工程师的我们,难道在搭建完页面后只能等待后端的接口么?这样的话我们则完全被后端开发限制住了。

  • 在线电影资源的版式说明

    在线电影资源的版式说明http://tieba.baidu.com/f?kz=47439298http://wenku.baidu.com/view/74cadfd0b9f3f90f76c61bca.htmlhttp://wenku.baidu.com/view/a14f7410ff00bed5b9f31d9b.html一、在线电影资源的常见版式(按画质排列)1. CAM(枪版) CA

  • Mysql事务隔离级别_数据库默认的事务隔离级别

    Mysql事务隔离级别_数据库默认的事务隔离级别前言提到事务,你肯定不会陌生,最经典的例子就是转账,甲转账给乙100块,当乙的账户中到账100块的时候,甲的账户就应该减去100块,事务可以有效的做到这一点。在MySQL中,事务支持实在引擎层实现的,MySQL是一个支持多引擎的系统,但并不是所有引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被取代的原因之一。隔离性事务的四大特性AC…

    2022年10月14日
  • go语言环境安装教程_go语言菜鸟教程

    go语言环境安装教程_go语言菜鸟教程windows下go语言环境搭建安装1、go安装包下载:https://studygolang.com/dl选择自己要下载的版本进行下载。下载好了之后安装一直next就行了(安装路径尽量不要出现中文。)2、安装好了之后打开cmd,输入goversion查一下是否安装成功。出现go版本号,说明安装成功。3、下载liteidehttps://sourceforge.net/pro…

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

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