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

 

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

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

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


相关推荐

  • Pytest(16)随机执行测试用例pytest-random-order[通俗易懂]

    Pytest(16)随机执行测试用例pytest-random-order[通俗易懂]前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

    2022年7月29日
    7
  • java calendar 日期实现不断加一天

    java calendar 日期实现不断加一天Calendarcc=Calendar.getInstance();//获得系统时间cc.add(cc.DATE,1);//让日子每天向后加一天 date=cc.getTime();   //这个时间就是系统时间加一天后的

    2022年5月20日
    68
  • Java MD5 加密工具类[通俗易懂]

    Java MD5 加密工具类[通俗易懂]一、MD5简介MD5消息摘要算法(英语:MD5Message-DigestAlgorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致。MD5算法是不可逆的。MD5由美国密码学家罗纳德·李维斯特(RonaldLinnRivest)设计,于1992…

    2022年7月16日
    15
  • Java自定义注解Annotation详解[通俗易懂]

    简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解@Override:当重写父类的方法时一般都会在方法上标注上此注解(我们最经常看到的toString()方法上总能看到这货)@Deprecated:用于标记某个方法已经过期,请使用新的方法来替代已经废弃的方法@SuppressWarnings:让编译器或

    2022年4月13日
    66
  • hackbar工具安装使用教程

    hackbar工具安装使用教程HackBar工具介绍HackBar是一个浏览器上的一个插件,包含一些黑客常用的工具,比如SQLinjection,XSS,加密等!免费版下载百度网盘:https://pan.baidu.com/s/1WBT6iqx9ZRSbCRbGWUfvvA提取码:1234免费版安装:按F12打开hackbar界面…

    2022年6月14日
    152
  • duilib消息类型[终于解决]

    //定义所有消息类型//////////////////////////////////////////////////////////////////////////#defineDUI_MS

    2021年12月18日
    49

发表回复

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

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