⌈ 传知代码 ⌋ 基于ROS的气体浓度建图

99 阅读4分钟

前情提要

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


💡本章重点

  • 基于ROS的气体浓度建图

🍞一. 概述

本案例基于ROS系统和数字传感器,并采用VSLAM技术实现了在Rviz下的气体浓度可视化建图,不同的气体浓度通过不同的颜色进行表示。其中的定位技术并不局限于VSLAM技术,只要是能通过ROS发布定位话题的相关定位技术均可以实现气体浓度建图,如UWB、GPS等。


🍞二. 演示效果

在这里插入图片描述


🍞三.核心逻辑

主程序采用Python语言编写,主要代码编写逻辑为:

  • (1)通过串口读取数字传感器获取的浓度信息;

  • (2)将气体浓度与要设定的颜色数值建立映射关系;

  • (3)订阅VSLAM的定位ROS话题(此处为:/mavros/vision_pose/pose);

  • (4)发布气体浓度建图相关的ROS话题(此处为:enose/gas/concentration 和 enose/gas/markers)。

部分程序代码如下:

def parse_gas_data(data):
    try:
        parts = data.split(' ')
        if len(parts) >= 4 and parts[0] == 'Z' and parts[2] == 'z':
            concentration = float(parts[1])
            return concentration
        else:
            rospy.logwarn("收到非预期格式的数据,已跳过。")
    except ValueError as e:
        rospy.logerr(f"数据解析错误: {e}")
    return None

def get_color_for_concentration(concentration):
    baseLine = 3000.0  #数字传感器基线,可根据实际情况调整
    sensorRange = 5000.0  #设定传感器的变化范围
    normalized_value = min(max((concentration-baseLine) / sensorRange, 0.0), 1.0)
    color_value = int(normalized_value * 1000)
    r = color_value / 1000.0
    g = (1000 - color_value) / 1000.0
    b = min(2.0 * normalized_value, 1.0)
    return r, g, b

def read_serial_data():
    while not rospy.is_shutdown():
        data = ser.readline()
        try:
            data = data.decode('utf-8').strip()
            with data_queue.mutex:
                data_queue.queue.clear() 
            data_queue.put(data)
        except UnicodeDecodeError as e:
            rospy.logwarn(f"解码串口数据时出错: {e}")

def gas_concentration_publisher():
    global current_pose, ser
    rospy.init_node('gas_concentration_publisher', anonymous=True)
    gas_pub = rospy.Publisher('enose/gas/concentration', GasConcentration, queue_size=10)
    marker_pub = rospy.Publisher('enose/gas/markers', MarkerArray, queue_size=10)
    rospy.Subscriber('/vins_estimator/odometry', PoseStamped, pose_callback)  #若为其他定位话题,请修改此处/vins_estimator/odometry

🍞四.使用方式

本程序需要与相关软硬件搭配使用

1. 所需硬件

传感器:本案例所使用的气体传感器为英国GSS公司生产的SprintIR传感器,其敏感气体为C02,可通过串口直接输出相关浓度数据。但不局限于使用SprintIR,也可采用其他数字传感器或模拟转数字的传感器,并根据输出数据不同,适当修改程序代码。

  1. 原项目的github链接 CapHuman

  2. 下载数据集及权重文件,分别放在data和ckpts目录下;

  3. 如果遇到的网络连接问题,通通改为手动下载

在这里插入图片描述

传感器输出数据格式如下:

在这里插入图片描述

  • 定位模块:本案例中采用的VSLAM算法为香港科技大学发布的开源视觉定位算法VINS-Fusion,其部署方式不在本案例中复述,可参考VINS-Fusion官方资料。除此之外还可以采用其他可发布ROS定位话题的定位技术(GPS、UWB等)。本案例中的VSLAM算法采用Intel D435双目相机模块。

  • 能够运行Ubuntu20.04的计算机(如PC主机、Intel NUC、Nvidia Jetson Orin NX、香橙派等性能较强的主机或单板计算机;若定位技术采用Intel T265相机或UWB、GPS等,也可采用树莓派、Jetson nano等性能较弱的单板计算机)

2. 所需软件环境

  • 操作系统:Ubuntu 20.04(其他版本未做验证)

  • ROS版本:ROS1

  • Python版本:3.6及以上

  • 定位程序:VINS-Fusion、MavROS。(其他定位技术可参考其ROS话题发布方式)

  • 双目相机程序:Realsense SDK2.0、realsense-ros


🍞五.部署方式

  • (1)下载本程序附件压缩包,将其解压缩并放置于Ubuntu系统用户目录(即“ ~/ ”);

  • (2)在安装好ROS的前提下编译程序,右键运行终端程序,并依次执行如下3行命令:

cd ~/gas_concentration_ws
makedir build
catkin_make

在这里插入图片描述

配置工作空间的环境变量,终端执行:

gedit ~/.bashrc

打开.bashrc后,在文件末尾添加:

source ~/gas_concentration_ws/devel/setup.bash

(3) 运行相关ROS包:

  • ① 运行双目相机程序包:

roslaunch realsense2_camera rs_camera.launch

  • ②运行VINS-Fusion:

roslaunch vins realsense.launch

  • ③运行气体浓度建图程序包:

roslaunch gas_concentration gas_con_rviz.launch

在这里插入图片描述

在这里插入图片描述


🫓总结

综上,我们基本了解了“一项全新的技术啦” :lollipop: ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读:satisfied:

后续还会继续更新:heartbeat:,欢迎持续关注:pushpin:哟~

:dizzy:如果有错误❌,欢迎指正呀:dizzy:

:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:

【传知科技 -- 了解更多新知识】