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

news2024/11/27 14:43:05

💛前情提要💛

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

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

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

以下的内容一定会让你对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

在这里插入图片描述

在这里插入图片描述


🫓总结

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

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

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免杀笔记--->地狱之门(Hell ‘s Gate)保姆级解析

还记得我前面一篇文章讲到的在Ring3 对抗Hook吗?? 我讲到的一种方法就是系统调用!! 那么今天就来讲一下一个很出名的直接系统调用(Syscall)-----> [!] 地狱之门(Hell s Gate)[!] 目录 1.Syscall 2.…

Python爬虫:下载4K壁纸

🎁🎁创作不易,关注作者不迷路🎀🎀 目录 🌸完整代码 🌸分析 🎁基本思路 🎁需要的库 🎁提取图片的链接和标题 👓寻找Cookie和User-Agent &…

Golang 并发编程

Golang 并发编程 Goroutine 什么是协程 创建 Goroutine 主 goroutine (main函数)退出后,其它的工作 goroutine 也会自动退出 package mainimport ("fmt""time" )func myFunc() {i : 0for {ifmt.Println("func: …

【C++】深入理解类和对象(3)

励志冰檗:形容在清苦的生活环境中激励自己的意志。💓💓💓 目录 ✨说在前面 🍋知识点一:再探构造函数 🍋知识点二:类型转换 🍋知识点三:static成员 &…

spl注入实战thinkphp

目录 一、环境的部署 二、本地创建数据库 三、填写数据库连接文件 四、编写控制器 五、访问分析 debug报错会显示物理路径 原因是config.php文件相关配置 六、注入分析 七、进入断点调试 八、通过mysql执行语句查看结果 九、总结: 一、环境的部署 二、本地…

【51单片机仿真】基于51单片机设计的智能六位密码锁(匿*输入/密码修改/警示/保存/恢复/初始密码)源码仿真设计文档演示视频——文末资料下载

基于51单片机设计的智能六位密码锁 演示视频 基于51单片机设计的智能六位密码锁 功能简介 - 能够从键盘中输入密码,并相应地在显示器上显示"*" - 能够判断密码是否正确,正确则开锁,错误则输出相应信息 - 能够实现密码的修改 -…

日志审计系统

1.1日志审计基础性知识 什么是日志? 传统的日志概念 信息系统中所有系统和应用必须包含的描述其自身运行和操作的特定数据记录。 广义的日志概念 针对特定记录目的,通过各种探测手段采集的信息数据,包括运行状态、所有事件及操作&#x…

从零开始实现循环神经网络

本节我们通过使用MXnet,来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后,即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示: 接…

力扣面试经典算法150题:最后一个单词的长度

最后一个单词的长度 今天的题目是力扣面试经典150题中的数组的简单题: 最后一个单词的长度 题目链接:https://leetcode.cn/problems/length-of-last-word/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个仅包含大小写字母和空…

Broken靶机

查看靶机的mac地址 使用kail进行扫描ip 探测靶机主机,端口,服务 nmap -sS -sS -A -p- 192.168.154.137 进行目录扫描 dirsearch -u http://192.168.154.137 拼接后没什么发现 访问靶机ip 访问readme.md 发现是十六进制的值 将内容写入到readme.md中 使…

坐牢第二十五天20240813(网络通信)

一、TCP机械臂测试 通过w(红色臂角度增大)s(红色臂角度减小)d(蓝色臂角度增大)a(蓝色臂角度减小)按键控制机械臂 注意:关闭计算机的杀毒软件,电脑管家,防火墙 1&#x…

C语言问答进阶--5、基本表达式和基本语句

赋值表达式 表达式是什么&#xff1f;表达式是由运算符和操作数组成的式子。 如下的代码 #include "iostream.h" int main() { int a1,b2,sum; cout<<(sumab)<<endl; return 0; } 那么如下的呢&#xff1f; #include "iostream.h" int mai…

智能建筑系统,实现智慧城市的可持续发展

智能建筑系统是指通过现代技术和通信技术&#xff0c;对建筑系统进行全方位、智能化的管理和控制。该系统可以通过各种传感器、安全监控系统和计算机设备对工程建筑的内外环境进行认知和控制&#xff0c;进而监控和管理建筑工程设备和信息。 智能建筑系统可以调节室温、湿度等环…

基于Hadoop的汽车大数据分析系统设计与实现【爬虫、数据预处理、MapReduce、echarts、Flask】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍爬虫数据概览HIve表设计Cars Database Tables1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distribu…

Mysql的完整性约束

主键约束&#xff1a;一个表中只有一个主键&#xff0c;通过主键找到唯一的记录。主键不能为空不能重复。 CREATE TABLE s1&#xff08;id TINYINT PRIMARY KEY UNSIGNEDINT AUTO_INCREAMENT,name VARCHAR(20) NOT NULL UNIQUE ,age TINYINT DEFAULT 18&#xff09;;…

镜像仓库认证信息加密初始化脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Python爬虫——爬取bilibili中的视频

爬取bilibili中的视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到…

【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核

文章目录 前言 背景介绍 C28x内核 浮点单元(FPU) 快速整数除法单元(FINTDIV) 三角数学单元(TMU) VCRC单元 CPU总线 指令流水线 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解…

Linux--应用层自定义协议与序列化(例子:网络计算器)

目录 0.上篇文章 1.应用层 再谈一谈协议 网络版计算器 序列化 和 反序列化 2.重新理解 read、 write、 recv、 send 和 tcp 为什么支持全双工 3.网络计算器&#xff08;代码实现) 3.1序列化&反序列化的接口 3.2 项目逻辑 3.3 代码 3.3.1辅助库 3.3.2 基于TCP的…

非线性RCD负载:电力系统的智能管理

随着科技的不断发展&#xff0c;电力系统的规模日益扩大&#xff0c;复杂性也越来越高。在这种背景下&#xff0c;非线性RCD负载&#xff08;Resistive-Capacitive-Inductive load&#xff09;的出现&#xff0c;对电力系统的智能管理提出了新的挑战。非线性RCD负载是指由电阻、…