在ROS中獲取并發布UBS式傳感器的溫濕度

哈嘍大家好,我是鋼板獸!

今天更新一篇和ROS相關的文章,有個項目需求是在ROS中獲取并發布UBS式傳感器的溫濕度,我使用的溫濕度傳感器簡介如下:

DL11- MC-S1 溫濕度傳感器通過USB 接口采用標準MODBUS RTU 協議通信,采用高精度的SHT40測量單元。

一開始嘗試通過pymodbus通信,但是在安裝好對應的依賴后依然不成功,于是使用字節級Modbus報文構造,通過 Python 的 pyserial 庫以字節流形式與設備通信。

1.Modbus RTU 協議原理

Modbus RTU 是一種工業標準的串行通信協議,采用主從架構,每幀通信格式如下:

字段長度說明
地址1B從設備地址,通常為 1
功能碼1B0x03 表示讀保持寄存器
起始地址2B要讀取的寄存器起始地址
寄存器數量2B要讀取的寄存器個數
CRC 校驗2B幀末尾附帶的錯誤校驗值

請求幀解析:

01 03 00 00 00 02 C4 0B
  • 01:設備地址(從站地址 1)
  • 03:功能碼,表示“讀取保持寄存器”
  • 00 00:寄存器起始地址 = 0x0000,即溫度寄存器
  • 00 02:讀取 2 個寄存器(溫度 + 濕度)
  • C4 0B:CRC 校驗(低位在前,高位在后)

響應幀解析:

01 03 04 01 19 02 11 EB 64
  • 01:從站地址
  • 03:功能碼
  • 04:后續數據字節數(4 字節)
  • 01 19:寄存器 0x0000 的值 → 281(溫度 28.1°C)
  • 02 11:寄存器 0x0001 的值 → 529(濕度 52.9%RH)
  • EB 64:CRC 校驗

2.調試串口

  1. 查看串口是否被識別:

    ls /dev/ttyUSB*
    
  2. 串口權限設置:

    sudo usermod -aG dialout $USER
    # 重啟系統后生效
    

3.Ros節點

  1. 腳本路徑

    ~/catkin_ws/src/temperature_sensor/scripts/modbus_raw_node.py
    
  2. 節點代碼

    節點要實現的功能:

    • 每秒向串口寫入 Modbus 請求報文
    • 讀取 9 字節返回幀,并解析溫濕度原始值
    • 構造 ROS 消息并發布到 /sensor/temperature/sensor/humidity
    #!/usr/bin/env python3  
    import rospy             
    import serial            
    from sensor_msgs.msg import Temperature  # 引入標準溫度消息類型
    from std_msgs.msg import Float32         # 引入標準浮點數消息類型# 解析 Modbus 響應幀,提取溫濕度
    def parse_modbus_response(data):if len(data) != 9 or data[0] != 0x01 or data[1] != 0x03:return None, None  # 幀長度或地址/功能碼錯誤則返回空值temp_raw = data[3] << 8 | data[4]  # 拼接為溫度原始值hum_raw = data[5] << 8 | data[6]   # 拼接為濕度原始值temp = temp_raw / 10.0  # 轉換為實際溫度值hum = hum_raw / 10.0    # 轉換為實際濕度值return temp, hum# 主函數def main():rospy.init_node("modbus_raw_temperature_node")  # 初始化 ROS 節點# 獲取串口參數port = rospy.get_param("~port", "/dev/ttyUSB0")  # 默認串口設備baudrate = rospy.get_param("~baudrate", 9600)     # 默認波特率# 初始化兩個 ROS 發布器temp_pub = rospy.Publisher("/sensor/temperature", Temperature, queue_size=10)hum_pub = rospy.Publisher("/sensor/humidity", Float32, queue_size=10)try:# 嘗試打開串口ser = serial.Serial(port=port, baudrate=baudrate, bytesize=8, parity='N', stopbits=1, timeout=1)rospy.loginfo("串口連接成功")except Exception as e:rospy.logerr(f"串口打開失敗: {e}")returnrate = rospy.Rate(1)  # 循環頻率:1Hzwhile not rospy.is_shutdown():request = bytes.fromhex("01 03 00 00 00 02 C4 0B")  # 構造 Modbus 請求幀ser.write(request)  # 向串口寫入請求response = ser.read(9)  # 讀取9字節響應temp, hum = parse_modbus_response(response)  # 解析響應數據now = rospy.Time.now()  # 獲取當前時間戳if temp is not None:msg = Temperature()msg.header.stamp = nowmsg.temperature = tempmsg.variance = 0.0temp_pub.publish(msg)  # 發布溫度消息rospy.loginfo(f"溫度: {temp} ℃")if hum is not None:hum_pub.publish(Float32(data=hum))  # 發布濕度消息rospy.loginfo(f"濕度: {hum} %RH")rate.sleep()  # 等待下一次循環ser.close()  # 程序退出時關閉串口if __name__ == "__main__":main()  # 調用主函數啟動節點
    
  3. 添加執行權限

    chmod +x modbus_raw_node.py
    
  4. 運行

    rosrun temperature_sensor modbus_raw_node.py _port:=/dev/ttyUSB0
    
  5. 話題發布

    rostopic echo /sensor/temperature
    rostopic echo /sensor/humidit
    

如果這篇文章對你有幫助,歡迎點贊、轉發、留言!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95152.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖論】 Graph.jl 操作匯總

文章目錄圖論的集合類操作Base.getindexBase.intersectBase.joinBase.reverseBase.reverse!Base.sizeBase.sumBase.sumBase.union圖生成與轉換Graphs.cartesian_productGraphs.complementGraphs.compute_shiftsGraphs.crosspathGraphs.differenceGraphs.egonetGraphs.induced_s…

【鏈表 - LeetCode】146. LRU 緩存

146. LRU 緩存 題解&#xff1a; class LRUCache {list<pair<int,int>>v;unordered_map<int,list<pair<int,int>>::iterator>idx;int capacity; public:LRUCache(int capacity):capacity(capacity){}int get(int key) {if(idx.count(key) 0) …

Elasticsearch vs Solr vs OpenSearch:搜索引擎方案對比與索引設計最佳實踐

Elasticsearch vs Solr vs OpenSearch&#xff1a;搜索引擎方案對比與索引設計最佳實踐 隨著大數據和實時分析需求的爆發&#xff0c;搜索引擎已成為許多業務系統中的核心組件。本篇文章將從“技術方案對比分析型”角度切入&#xff0c;重點比較三大主流搜索引擎&#xff1a;El…

光頡科技)Viking)的CS25FTFR009 1225 0.009R/9mR 3W電阻介紹-華年商城

“**華年商城”**小編為您介紹&#xff1a;光頡科技&#xff08;Viking&#xff09;的CS25FTFR009 1225 0.009R/9mR 3W電阻 光頡CS25FTFR009合金電阻&#xff1a;0.009Ω/9mΩ 3W 1%精密采樣電阻 光頡科技&#xff08;Viking&#xff09;的CS25FTFR009是一款高性能的電流檢測電…

港科大開放世界長時域具身導航!LOVON:足式機器人開放詞匯目標導航

作者&#xff1a;Daojie Peng1^{1}1, Jiahang Cao1,2^{1,2}1,2, Qiang Zhang1,2^{1,2}1,2, Jun Ma1,3^{1,3}1,3單位&#xff1a;1^{1}1香港科技大學&#xff08;廣州&#xff09;&#xff0c;2^{2}2北京人形機器人創新中心&#xff0c;3^{3}3香港科技大學論文標題&#xff1a;L…

【前端教程】JavaScript 數組對象遍歷與數據展示實戰

在前端開發中&#xff0c;處理數組和對象是日常工作的基礎。無論是篇文章將通過一個具體案例&#xff0c;詳細講解如何使用JavaScript遍歷包含對象的數組&#xff0c;并將數據以清晰的格式展示在頁面上。我們會從基礎語法開始&#xff0c;逐步優化代碼&#xff0c;最終實現一個…

無重復字符的最長子串,leetCode熱題100,C++實現

題目來源&#xff1a;leetCode 3. 無重復字符的最長子串 - 力扣&#xff08;LeetCode&#xff09; 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 解法 class Solution { public:int lengthOfLongestSubstring(string s) {unordered_set<…

卷積神經網絡中1×1卷積的作用

part I &#xff1a;來源part II &#xff1a;應用part III &#xff1a;作用&#xff08;降維、升維、跨通道交互、增加非線性&#xff09;part IV &#xff1a;從fully-connected layers的角度理解一、來源&#xff1a;[1312.4400] Network In Network &#xff08;如果11…

VMware設置Ubuntu虛擬機橋接模式完整教程

VMware 設置 Ubuntu 虛擬機橋接模式完整教程 下面是一個詳細的、避免出錯的 VMware Ubuntu 橋接模式設置教程&#xff0c;包含常見問題的解決方案。 準備工作 確保宿主機&#xff08;Windows 11&#xff09;已連接到網絡&#xff08;有線或無線&#xff09;確認您有管理員權限關…

淺析NVMe協議:DIF

文章目錄概述DIF數據格式盤片支持DIFFormatPILPIMSETLBAF協議命令DIF支持PRACTPRACT0PRACT1PRCHK相關參考概述 NVMe協議將DIF信息作為元數據的一部分進行攜帶。 DIF數據格式 DIF的PI由多個字段組成&#xff0c;包括&#xff1a; Guard字段&#xff1a;基于邏輯塊數據計算的C…

【觀成科技】蔓靈花User下載者加密通信分析

概述2025年5月7日&#xff0c;蔓靈花&#xff08;BITTER&#xff09;組織針對巴基斯坦電信公司工作人員發起釣魚郵件攻擊&#xff0c;投遞偽裝為安全簡報的惡意郵件&#xff0c;附件為IQY類型的Web查詢文件。該文件在用戶執行后通過HTTP協議獲取遠程CMD指令并執行&#xff0c;進…

Redis 保證數據不丟失

Redis 保證數據不丟失&#xff08;或最大限度減少丟失&#xff09;的核心是通過 持久化機制 結合 合理的配置策略 實現的。具體方案如下&#xff1a;一、核心&#xff1a;開啟 Redis 持久化&#xff08;防止進程崩潰丟失數據&#xff09;Redis 提供兩種持久化方式&#xff0c;可…

NUMA/SNC 4種組合下Stream+MLC性能對決:雙路服務器BIOS調優全攻略

關于調整 BIOS NUMA 與 SNC 選項的 Stream / MLC 性能測試總結一、測試背景與目的在現代多路 Intel Xeon 服務器上&#xff0c;NUMA&#xff08;Non-Uniform Memory Access&#xff09;與 SNC&#xff08;Sub-NUMA Clustering&#xff09;是兩項決定內存訪問延遲與帶寬的關鍵 B…

Java-113 深入淺出 MySQL 擴容全攻略:觸發條件、遷移方案與性能優化

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-31- 千呼萬喚始出來 GPT-5 發布&#xff01;“快的…

Kafka Connect + Streams 用到極致從 CDC 到流處理的一套落地方案

關鍵目標&#xff1a; 零丟失&#xff1a;端到端 Exactly Once&#xff08;Source 端事務 Streams exactly_once_v2 Sink DLQ&#xff09;。低延遲&#xff1a;Producer 端批量壓縮 Streams 緩存 合理 poll/commit 間隔。可恢復&#xff1a;Connect/Streams 的 rebootstrap…

# `std::basic_istream`總結

std::basic_istream總結 文章目錄std::basic_istream總結概述常用類型定義全局對象核心成員函數1. 格式化輸入2. 非格式化輸入3. 流定位4. 其他功能繼承的功能來自 std::basic_ios狀態檢查狀態管理來自 std::ios_base格式化標志流打開模式特點說明例子std::basic_istream全面用…

人工智能——課程考核

課程考核包括平時測驗&#xff08;75%&#xff09;和討論&#xff08;25%&#xff09;兩個環節&#xff0c;測驗采用線上隨堂考試&#xff08;2-3次&#xff0c;具體會在本課堂發布&#xff09;重點考核&#xff1a;A*算法、極大極小過程&#xff08;α-β剪枝&#xff09;、不…

機器學習-時序預測1

最近面試過程中&#xff0c;Predict-then-Optimize是運籌優化算法工程師未來的發展方向。就像我之前寫過的運籌優化&#xff08;OR&#xff09;-在機器學習&#xff08;ML&#xff09;浪潮中何去何從&#xff1f;-CSDN博客&#xff0c;機器學習適合預測、運籌優化適合決策。我研…

vim-plugin AI插件

文章目錄一、vim 插件管理vim-plug二、如何使用和配置 vim-plug第 1 步&#xff1a;安裝 vim-plug第 2 步&#xff1a;配置你的 .vimrc / init.vim第 3 步&#xff1a;安裝插件常用 vim-plug 命令三、配置vim-aivim-aivim-deepseekvim升級四、配置 AI 插件GitHub Copilot第 1 步…

Adobe Photoshop 2025 最新下載安裝教程,附PS2025下載

點擊獲取&#xff1a;Adobe Photoshop 2025 安裝教程&#xff1a; 1、安裝包下載后&#xff0c;鼠標右鍵解壓安裝包 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 2、雙擊打開解壓后的安裝包文件夾 3、打開setup文件夾 添加圖片注釋&#xff0c;不超過…