【ROS1】09-ROS通信機制——參數服務器

目錄

一、參數服務器概念

二、參數操作

2.1 C++實現

2.1.1 新增參數

2.1.2 修改參數

2.1.3 查詢參數

2.1.4 刪除參數

2.2 python實現

2.2.1 新增參數

2.2.2 修改參數

2.2.3 查詢參數

2.2.4 刪除參數


一、參數服務器概念

假設正在開發一個復雜的機器人應用,里面有很多需要配置的數值,比如:

  • 機器人的物理尺寸(輪子直徑、輪距)

  • PID 控制器的增益參數(Kp, Ki, Kd)

  • 傳感器的配置(相機分辨率、激光雷達掃描頻率)

  • 導航算法的參數(避障距離、目標容忍度)

你當然可以把這些數值硬編碼(hard-code)在你的 C++ 或 Python 代碼里。但這樣做有幾個巨大的缺點:

  • 修改困難:每次想調整一個參數,都必須重新修改代碼、重新編譯、重新部署。

  • 復用性差:同一個算法用在不同機器人上,參數不同,就需要維護多個版本的代碼。

  • 管理混亂:參數散落在各個節點的代碼中,難以集中查看和管理。

參數服務器就是為了解決這些問題而生的。它是一個全局的、集中式的、運行在 ROS Master 內部的字典(dictionary),能夠存儲一些多節點共享的數據,類似于全局變量。

這個“字典”可以存儲各種基本數據類型的鍵值對(Key-Value pairs),任何 ROS 節點都可以在運行時存入 (set)查詢 (get)?和?刪除 (delete)?這些參數。

核心特點:

  • 集中存儲: 所有參數都存儲在一個地方(ROS Master),方便管理和調試。

  • 全局可訪問: 任何連接到同一個 ROS Master 的節點都可以訪問這些參數。

  • 動態配置: 可以在節點運行時動態地修改參數,而無需重啟節點(需要節點代碼支持動態重配置)。

  • 與代碼解耦: 將配置參數從業務邏輯代碼中分離出來,提高了代碼的通用性和可維護性。

  • 支持多種數據類型: 支持字符串、整數、浮點數、布爾值、列表(數組)和字典(結構體)。

注意:參數服務器不是為高性能而設計的,因此最好用于存儲靜態的非二進制的簡單數據。

二、參數操作

2.1 C++實現

2.1.1 新增參數

進入到工作空間的src目錄下,輸入如下指令來創建一個名為“plumbing_param_server”的功能包

在功能包的src目錄下新建一個cpp文件,這里命名為“demo01_param_set.cpp”

在“demo01_param_set.cpp”中添加如下代碼來實現參數的新增

#include "ros/ros.h"/*
需求:實現參數的新增
實現:ros::NodeHandle.setParam()ros::param.set()
*/int main(int argc, char *argv[])
{// 初始化ROS節點ros::init(argc, argv, "set_param_c");// 創建ROS節點句柄ros::NodeHandle nh;// 參數增加// 方式1nh.setParam("type", "type1");nh.setParam("radius", 0.15);// // 方式2// ros::param::set("type", "type1");// ros::param::set("radius", 0.15);return 0;
}

打開功能包下的“CMakeLists.txt”,添加如下部分

Ctrl+Shift+B編譯一下,然后開啟3個終端窗口分別用于啟動ROS核心、啟動ROS節點、查看參數

roscore  // 啟動ROS核心source ./devel/setup.bash
rosrun plumbing_param_server demo01_param_set  //啟動ROS節點rosparam list  //列出參數

如果想查詢參數的值,可以使用如下命令

rosparam get 參數名

2.1.2 修改參數

如果再次設置相同參數名,就會覆蓋之前參數名對應的參數值

2.1.3 查詢參數

在功能包的src目錄中新創建一個cpp文件,這里命名為“demo02_param_get.cpp”?

在“demo02_param_get.cpp” 添加如下代碼,用于展示如何執行參數的相關查詢操作

#include "ros/ros.h"/*
需求:實現參數的查詢
實現:ros::NodeHandle.param(鍵,默認值)  存在這個鍵方法返回存儲的值,否則返回默認值.getParam(鍵,變量) 存在這個鍵方法返回true并將存儲的值賦值給變量,否則返回false,且不為變量賦值.getparamCached(鍵,變量)  和.getParam基本一樣.getParamNames(td::vector<std::string>)  獲取所有的鍵并存儲在vector中.hasParam(鍵) 判斷是否存在某個鍵,存在返回true,否則返回false.searchParam(鍵,變量)   能夠搜索到就將“/”+鍵名賦值給變量,否則將空字符串賦給變量ros::param
*/int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 初始化ROS節點ros::init(argc, argv, "get_param_c");// 創建ROS節點句柄ros::NodeHandle nh;// ros::NodeHandle// 1. paramdouble radius = nh.param("radius", 0.5);  //查詢參數名為“radius”對應的值,如果“radius”不存在返回0.5ROS_INFO("radius = %.2f", radius);// 2. getParamdouble radius2 = 0.0;bool result = nh.getParam("radius", radius2);if (result){ROS_INFO("radius = %.2f", radius2);}// 3.getparamCached// 4.getParamNamesstd::vector<std::string> names;nh.getParamNames(names);for (auto &&name : names){ROS_INFO("遍歷的元素:%s", name.c_str());}// 5.hasParambool flag = nh.hasParam("radius");// 6.searchParamstd::string key;nh.searchParam("radius", key);ROS_INFO("搜索結果:%s", key.c_str());return 0;
}

打開功能包中的“CMakeLists.txt”,添加如下部分

編譯一下,該節點執行效果如下:

2.1.4 刪除參數

?刪除參數主要通過如下兩種方式實現

#include "ros/ros.h"/*
刪除參數:實現:ros::NodeHandle.delParam()ros::param.del()*/int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc, argv, "param_del_c");ros::NodeHandle nh;bool flag = nh.deleteParam("radius");if (flag){ROS_INFO("刪除成功!");}else{ROS_INFO("刪除失敗!");}// ros::param::del("radius");return 0;
}

運行效果如下,可以看到成功刪除了“radius”參數

2.2 python實現

2.2.1 新增參數

在功能包中添加一個“scripts”目錄?

在“scripts”目錄添加一個python文件,用于新增參數

#! /usr/bin/env python
# -*- coding: utf-8 -*-import rospyif __name__ == "__main__":rospy.init_node("param_set_py")rospy.set_param("name", "czc")rospy.set_param("age", 18)

在“CMakeLists.txt”中添加如下部分

為python文件添加可執行權限

chmod +x *.py

可以看到成功添加了兩個參數

2.2.2 修改參數

只需重新設置一下相同鍵名的參數,那么參數值就會被重新覆蓋?

2.2.3 查詢參數

參數查詢可通過如下方法實現

1. get_param

2. get_param_cached

3. get_param names

4. has_param

5. search param

示例:

import rospyif __name__ == "__main__":rospy.init_node('param_example_node')# 1. get_param - 獲取參數值,支持默認值name1 = rospy.get_param('name', 'default_name')print(f"Name1: {name1}")# 2. get_param_cached - 緩存參數值,減少RPC調用name2 = rospy.get_param_cached('name', 'default_name')print(f"Name2: {name2}")# 3. get_param_names - 獲取所有參數名稱all_params = rospy.get_param_names()for param in all_params:print(f"param: - {param}")# 4. has_param - 檢查參數是否存在has_name = rospy.has_param('name')print(f"Has Param: {has_name}")# 5. search_param key = rospy.search_param('name')rospy.loginfo("key = %s", key)rospy.spin()

執行效果如下:

2.2.4 刪除參數

rospy.delete_param("Key")

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

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

相關文章

C#.NET dapper 詳解

簡介 Dapper 是由 Stack Overflow 團隊開發的一個簡單、高性能的微型 ORM&#xff08;Object?Relational Mapper&#xff09;&#xff0c;僅幾千行代碼&#xff0c;依賴于 ADO.NET 的 IDbConnection&#xff0c;通過動態生成 IL 來映射結果到實體對象。 與 EF、NHibernate 這類…

【LeetCode 熱題 100】35. 搜索插入位置——二分查找(左閉右開)

Problem: 35. 搜索插入位置 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 文章目錄整體思路完整代碼時空復雜度時間…

Python-初學openCV——圖像預處理(四)——濾波器

目錄 一、圖像噪點消除噪聲&#xff1a; 1、概念 2、均值濾波 3、方框濾波 4 、高斯濾波 5、中值濾波 6、雙邊濾波 7、總結 一、圖像噪點消除噪聲&#xff1a; 1、概念 指圖像中的一些干擾因素&#xff0c;通常是由圖像采集設備、傳輸信道等因素造成的&#xff0c;表現…

嵌入式系統可靠性設計

嵌入式系統可靠性設計硬件件可靠性設計1. 硬件設計原則2. 硬件設計注意問題2.1 引腳布局和走線2.2 元器件選擇和布局2.3 電源和地線分離2.4 EMI/EMC設計2.5 系統可靠性2.6 資源利用和擴展性軟件可靠性設計1. 設計原則1.1 模塊化設計1.2 冗余設計1.3 容錯設計1.4 實時性保障1.5 …

cJSON在STM32單片機上使用遇到解析數據失敗問題

我們在單片機上解析JSON格式時&#xff08;比如在用云平臺物聯網開發時&#xff09;&#xff0c;可以直接使用cJson庫來完成自己的操作&#xff0c;而不需要單獨實現&#xff0c;具體使用方法可以搜一下。 cJson&#xff1a;一個基于 C 語言的 Json 庫&#xff0c;它是一個開源…

python3基礎語法梳理(三)

接上一篇博客 &#x1f3ae; 猜數字小游戲 - Python版 &#x1f9e0; 游戲規則&#xff1a; 系統隨機生成一個 1 到 10 的整數玩家輸入猜測的數字使用 if 語句判斷玩家猜得是否正確提示“猜對了”或“太大/太小了” import randomsecret_number random.randint(1, 10) att…

【docker】將已有mysql腳本導入鏡像內使用

準備SQL腳本將SQL腳本&#xff08;如init.sql&#xff09;放在宿主機目錄下&#xff0c;例如&#xff1a;/path/to/sql-scripts/init.sql啟動MySQL容器并掛載腳本使用 -v 參數將SQL腳本掛載到容器的初始化目錄&#xff1a;docker run --name mysql-container \-e MYSQL_ROOT_PA…

【機器學習深度學習】LLamaFactory微調效果與vllm部署效果不一致如何解決

目錄 前言 一、問題本質 1.1 問題說明 1.2 問題本質示意 二、常見原因 LLaMAFactory對話模板規則定義 模型對話模板定義規則 三、解決方法 提取代碼myset.py 創建jinja文件 安裝VLLM 運行VLLM 安裝運行open webui流程 四、流程梳理 前言 本文主要講述的主要內容…

Python入門構建網頁

用純 Python 構建 Web 應用 本教程將帶你從零開始&#xff0c;構建一個交互式的待辦事項清單。 fasthtml 的核心哲學是“回歸初心&#xff0c;大道至簡”。在當今復雜的前后端分離技術棧中 &#xff0c;它提供了一條返璞歸真的路徑&#xff0c;旨在讓你能用純粹的 Python 構建從…

開源 Arkts 鴻蒙應用 開發(九)通訊--tcp客戶端

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Go的defer和recover

在 Go 語言中&#xff0c;defer 和 recover 是兩個緊密相關的關鍵字&#xff0c;主要用于錯誤處理和資源清理。它們通常一起使用&#xff0c;特別是在處理panic&#xff08;運行時崩潰&#xff09;時&#xff0c;確保程序不會直接崩潰&#xff0c;而是能夠優雅地恢復并繼續執行…

Spring Boot 配置文件常用配置屬性詳解(application.properties / application.yml)

前言 Spring Boot 的一大優勢就是通過簡單的配置文件即可快速定制應用行為&#xff0c;而無需編寫大量 XML 配置或 Java 代碼。Spring Boot 使用 application.properties 或 application.yml 作為核心配置文件&#xff0c;支持豐富的配置屬性。 本文將詳細介紹 Spring Boot 常用…

uni-appDay02

1.首頁-通用輪播組件 輪播圖組件需要再首頁和分類頁使用&#xff0c;封裝成通用組件 準備組件自動導入組件 <script setup lang"ts"> import XtxSwiper from /components/XtxSwiper.vue import CustomNavbar from ./components/CustomNavbar.vue </scrip…

FastAPI入門:請求體、查詢參數和字符串校驗、路徑參數和數值校驗

請求體 FastAPI 使用請求體從客戶端&#xff08;例如瀏覽器&#xff09;向 API 發送數據。請求體是客戶端發送給 API 的數據。響應體是 API 發送給客戶端的數據。 使用 Pydantic 模型聲明請求體&#xff0c;能充分利用它的功能和優點 from fastapi import FastAPI from pydanti…

Docker的docker-compose類比Spring的ApplicationContext

總一句話是&#xff1a;Docker Compose&#xff1a;集中化管理多個容器及其依賴的資源環境&#xff1b;ApplicationContext&#xff1a;集中化管理 多個Bean 及其運行所需的資源和依賴關系。 1. 整體概念 Docker Compose&#xff1a;用于定義和運行多容器 Docker 應用程序&…

Reason-before-Retrieve(CVPR 2025)

研究方向&#xff1a;Image Captioning論文全名&#xff1a;《Reason-before-Retrieve: One-Stage Reflective Chain-of-Thoughts for Training-Free Zero-Shot Composed Image Retrieval》1. 論文介紹組合圖像檢索&#xff08;CIR&#xff09;旨在檢索與參考圖像密切相似的目標…

Idefics2:構建視覺-語言模型時,什么是重要的

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" Idefics2&#xff1a;構建視覺-語言模型時&#xff0c;什么是重要的 摘要 隨著large language models和vision transformers的進步&#xff0c;視覺-語言模型&#xff08;VLMs&#xff09;受到了越來越多的關注…

再談fpga開發(fpga調試方法)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】我們之前在學校學習c、c的時候&#xff0c;其實學校漏掉了很重要的一個教學環節&#xff0c;那就是調試、測試。很多時候我們代碼寫出來了&#xff…

C語言中的數據結構--棧和隊列(1)

前言本屆開始我們將對數據結構中棧的內容進行講解,那么廢話不多說,我們正式進入今天的學習棧棧是一種很特殊的線性表&#xff0c;它只能在固定的一端進行插入和刪除操作&#xff0c;進行數據的插入和刪除的一端叫做棧頂&#xff0c;另外一端叫做棧底&#xff0c;棧中的元素遵守…

字符串是數據結構還是數據類型?

比較糾結的一個問題&#xff0c;以下是在網上查到后總結的&#xff0c;不知道對不對&#xff0c;歡迎討論。這是個觸及計算機科學核心概念的精妙問題&#xff01;字符串既可以被視為一種數據類型&#xff0c;也可以被視為一種數據結構&#xff0c;這取決于你觀察的視角和討論的…