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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信电脑版打不开怎么办?电脑版微信打不开的解决方案_wechatwin.dll文件缺失怎么解决

    微信电脑版打不开怎么办?电脑版微信打不开的解决方案_wechatwin.dll文件缺失怎么解决微信现在除了是日常的交流工具,基本上办公也离不开它,微信也注意到大家的意愿,所以也开发了电脑端的微信,不过有时候电脑版的微信也不好用,遇到紧急情况需要通知同事的时候又发现打不开了,通常遇上这种情况,我们要采取这些措施。解决办法如下:电脑版微信打不开是怎么一回事?第一步要做的就是,排查网络或是电脑系统的问题,可以重启试试。排除电脑或者网络问题以后,那可能是微信客户端不稳定。也许是文件损坏了或者是系统…

    2022年8月12日
    3
  • 常用C#代码「建议收藏」

    常用C#代码「建议收藏」常用C#代码字符串处理1.字符串截取//字符串截取//从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。string.Substring(intindex,intlength);//从此实例检索子字符串。子字符串在指定的字符位置开始并一直到该字符串的末尾。string.Substring(intindex);2.字符串分割//字符串分割//separator-char类型的数组分隔符,例:newchar[]{‘,’,‘|’}string.Split

    2022年9月10日
    0
  • oracle命令创建新用户

    oracle命令创建新用户一、sqlplus连接oracle1、sqlplus登录Windows需要sqlplus命令框,获取CMD窗口下输入sqlplus(需要先安装成功oracle)2、输入用户名和口令(密码)3、以sysdba身份连接oracleconnsys/密码assysdba4、查看当前查看当前实例名selectinstance_namefr…

    2022年5月19日
    56
  • MyEclipse10 安装SVN插件及SVN插件在MyEclipse10下使用方法

    MyEclipse10 安装SVN插件及SVN插件在MyEclipse10下使用方法在安装MyEclipse10的SVN插件之前,首先得搞清Subversion、Subclipse、Ankhsvn与tortoiseSvn之间的关系。Subversion是一个服务器,主要有VisualSvnSer、Subversion+Apache,其中VisualSvnSer包含了Subversion+Apache,配置很方便,主要是VisualStudio开发管理代码用,Subclips

    2022年7月21日
    9
  • iReport 分组统计[通俗易懂]

    iReport 分组统计[通俗易懂]参考http://jaspereport.group.iteye.com/group/wiki/3401-jaspereport-ireport做出了分组统计的效果。1、在报表中新建一个group2、新建一个变量,设置属性3、在报表中插入一个TextField,设置相关分组属性。

    2022年9月10日
    0
  • hibernate 使用C3P0数据源[通俗易懂]

    hibernate 使用C3P0数据源

    2022年2月3日
    39

发表回复

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

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