ROS2核心模塊

1.創建工作空間

先創建工作空間ws01_plumbing,

終端下進入工作空間的src目錄,執行如下命令:

ros2 pkg create --build-type ament_cmake base_interfaces_demo

2.話題通信

話題通信是ROS中使用頻率最高的一種通信模式,話題通信是基于發布訂閱模式的,也即:一個節點發布消息,另一個節點訂閱該消息。

話題通信是一種以發布訂閱的方式實現不同節點之間數據傳輸的通信模型。數據發布對象稱為發布方,數據訂閱對象稱之為訂閱方,發布方和訂閱方通過話題相關聯,發布方將消息發布在話題上,訂閱方則從該話題訂閱消息,消息的流向是單向的。

話題通信的發布方與訂閱方是一種多對多的關系,也即,同一話題下可以存在多個發布方,也可以存在多個訂閱方,這意味著數據會出現交叉傳輸的情況,當然如果沒有訂閱方,數據傳輸也會出現丟失的情況。

2.1話題通信案例

終端下進入工作空間的src目錄,調用如下兩條命令分別創建C++功能包和Python功能包。

ros2 pkg create cpp01_topic --build-type ament_cmake --dependencies rclcpp std_msgs base_interfaces_demo --node-name demo01_talker_str
ros2 pkg create py01_topic --build-type ament_python --dependencies rclpy std_msgs base_interfaces_demo --node-name demo01_talker_str_py

2.1.1 發送方案例(C++)

/*  需求:訂閱發布方發布的消息,并輸出到終端。步驟:1.包含頭文件;2.初始化 ROS2 客戶端;3.定義節點類;3-1.創建訂閱方;3-2.定時器。3-3.組織并發布消息4.調用spin函數,并傳入節點對象指針;5.釋放資源。
*/#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals; //使用chrono庫中的時間單位//自定義節點類
class Talker:public rclcpp::Node{public:Talker():Node("Talker_Node_cpp"),count(0){//初始化count=0RCLCPP_INFO(this->get_logger(),"發布節點");// 3-1.創建訂閱方;publisher_=this->create_publisher<std_msgs::msg::String>("chatter",10);//創建一個名為"chater"的主題,隊列長度為10// 3-2.定時器。// 參數:時間間隔,毀掉函數,返回值:當前對象指針timer_=this->create_wall_timer(1s,std::bind(&Talker::on_timer,this));//創建一個定時器,每隔1秒調用一次on_timer函數}private:size_t count;//定義一個計數器,用于記錄發布的消息數量void on_timer(){// 3-3.組織并發布消息auto msg=std_msgs::msg::String();//創建一個String類型的消息對象msg.data="Hello ROS2 C++! "+std::to_string(count++);//給消息對象賦值RCLCPP_INFO(this->get_logger(),"發布消息:%s",msg.data.c_str());//輸出日志信息publisher_->publish(msg);}rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;//定義一個發布者指針,類型為std_msgs::msg::Stringrclcpp::TimerBase::SharedPtr timer_;//定義一個定時器指針
};int main(int argc,char** argv){//初始化rclcpp::init(argc,argv);//調用spin,掛起當前rclcpp::spin(std::make_shared<Talker>());//釋放rclcpp::shutdown();
}

在終端運行

colcon build --packages-select cpp01_topic
. install/setup.bash
ros2 run cpp01_topic demo01_talker_str

可以另外一個終端去驗證chatter主題下是否有內容

. install/setup.bash
ros2 topic echo /chatter

2.1.2 訂閱方案例(C++)

/*  需求:訂閱發布方發布的消息,并輸出到終端。步驟:1.包含頭文件;2.初始化 ROS2 客戶端;3.定義節點類;3-1.創建訂閱方;3-2.定時器。3-3.組織并發布消息4.調用spin函數,并傳入節點對象指針;5.釋放資源。
*/#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals; //使用chrono庫中的時間單位//自定義節點類
class Talker:public rclcpp::Node{public:Talker():Node("Talker_Node_cpp"),count(0){//初始化count=0RCLCPP_INFO(this->get_logger(),"發布節點");// 3-1.創建訂閱方;publisher_=this->create_publisher<std_msgs::msg::String>("chatter",10);//創建一個名為"chater"的主題,隊列長度為10// 3-2.定時器。// 參數:時間間隔,毀掉函數,返回值:當前對象指針timer_=this->create_wall_timer(1s,std::bind(&Talker::on_timer,this));//創建一個定時器,每隔1秒調用一次on_timer函數}private:size_t count;//定義一個計數器,用于記錄發布的消息數量void on_timer(){// 3-3.組織并發布消息auto msg=std_msgs::msg::String();//創建一個String類型的消息對象msg.data="Hello ROS2 C++! "+std::to_string(count++);//給消息對象賦值RCLCPP_INFO(this->get_logger(),"發布消息:%s",msg.data.c_str());//輸出日志信息publisher_->publish(msg);}rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;//定義一個發布者指針,類型為std_msgs::msg::Stringrclcpp::TimerBase::SharedPtr timer_;//定義一個定時器指針
};int main(int argc,char** argv){//初始化rclcpp::init(argc,argv);//調用spin,掛起當前rclcpp::spin(std::make_shared<Talker>());//釋放rclcpp::shutdown();
}

需要去CMakeLists.txt三處添加demo02_listener_str

在終端運行(要先啟動發送方,訂閱方才有信息)

colcon build --packages-select cpp01_topic
. install/setup.bash
ros2 run cpp01_topic demo02_listener_str

2.1.3 發送方案例(python)

     # 需求:訂閱發布方發布的消息,并輸出到終端。# 步驟:#     1.包含頭文件;#     2.初始化 ROS2 客戶端;#     3.定義節點類;#         3-1.創建訂閱方;#         3-2.定時器。#         3-3.組織并發布消息#     4.調用spin函數,并傳入節點對象指針;#     5.釋放資源。import rclpy
from rclpy.node import Node
from std_msgs.msg import String# 定義節點類
class Puublisher(Node):def __init__(self):super().__init__('talker_node_py')self.get_logger().info('發布節點')# 3-1.創建發布方self.publisher_ = self.create_publisher(String, 'chatter', 10)# 3-2.定時器self.timer = self.create_timer(1.0, self.on_timer)self.count = 0def on_timer(self):# 3-3.組織并發布消息msg = String()msg.data = f"Hello ROS2 Python! {self.count}"self.get_logger().info(f'發布消息:{msg.data}')self.publisher_.publish(msg)self.count += 1def main():# 初始化 ROS2 客戶端rclpy.init()# 創建節點對象node = Puublisher()# 調用 spin 函數,傳入節點對象指針rclpy.spin(node)# 釋放資源rclpy.shutdown()if __name__ == '__main__':main()

2.1.4?訂閱方案例(python)

    # 需求:訂閱發布方發布的消息,并在終端輸出# 流程:#     1.頭文件#     2.初始化客戶端#     3.自定義節點類#         3-1.創建訂閱方#         3-2.解析并輸出數據#     4.調用spin函數,傳入節點對象指針#     5.釋放資源import rclpy
from rclpy.node import Node
from std_msgs.msg import String# 自定義節點類
class Subscriber(Node):def __init__(self):super().__init__('listener_node_py')# 創建訂閱方self.subscription=self.create_subscription(String,"chatter",self.listen_callback,10,)self.subscription  # 訂閱對象指針#處理訂閱到的消息def listen_callback(self, msg):# 解析并輸出數據self.get_logger().info(f'訂閱到消息:{msg.data}')   def main(args=None):# 初始化 ROS2 客戶端rclpy.init(args=args)# 創建節點對象node = Subscriber()# 調用 spin 函數,傳入節點對象指針rclpy.spin(node)# 釋放資源rclpy.shutdown()if __name__ == '__main__':main()

訂閱方創建好之后需要到setup.py文件下修改entry_points參數,將demo02加進去:

然后編譯運行

colcon build --packages-select py01_topic
. install/setup.bash
ros2 run py01_topic demo01_talker_str_py//再重開一個終端運行
. install/setup.bash
ros2 run py01_topic demo02_listener_str_py

2.1.5?自定義接口消息

創建并編輯 .msg 文件

功能包base_interfaces_demo下新建 msg 文件夾,msg文件夾下新建Student.msg文件,文件中輸入如下內容:

string   name
int32    age
float64  height
在package.xml文件添加

如果有報錯的直接刪掉

在CMakeList.txt添加

在終端編譯測試
colcon build --packages-select base_interfaces_demo. install/setup.bash
ros2 interface show base_interfaces_demo/msg/Student

輸出內容和Student.msg一致

2.1.6 自定義發布方(C++)

/*需求:以固定頻率發布學生信息。步驟:1.包含頭文件;2.初始化 ROS2 客戶端;3.定義節點類;3-1創建發布方3-2創建定時器3-3組織并發布消息4.調用spin函數,并傳入節點對象指針;5.釋放資源。
*/
#include <rclcpp/rclcpp.hpp>
#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp" // 引入自定義消息類型using base_interfaces_demo::msg::Student; // 使用自定義消息類型的命名空間
using namespace std::chrono_literals; // 使用 chrono 的時間單位
// 自定義節點類
class TalkStu : public rclcpp::Node
{
public:TalkStu() : Node("TalkStu_node_cpp"){// 3-1創建發布方publisher_=this->create_publisher<Student>("chat_stu", 10); // 創建一個名為 "chat_stu" 的發布者,隊列長度為 10// 3-2創建定時器timer_=this->create_wall_timer(1s,std::bind(&TalkStu::timer_callback, this)); // 每秒調用一次 timer_callback 函數                }private:int age=0;void timer_callback(){// 3-3組織并發布消息auto stu=Student();stu.name="張三";stu.age=age++;stu.height=1.75;age++;publisher_->publish(stu); // 發布消息RCLCPP_INFO(this->get_logger(), "發布學生信息: name=%s,age=%d,height=%.2f)",stu.name.c_str(), stu.age, stu.height);};rclcpp::Publisher<Student>::SharedPtr publisher_; // 定義發布者指針rclcpp::TimerBase::SharedPtr timer_; // 定義定時器指針};int main(int argc, char const *argv[])
{// 初始化rclcpp::init(argc, argv);// 調用spin,掛起當前rclcpp::spin(std::make_shared<TalkStu>());// 釋放rclcpp::shutdown();return 0;
}

package.xml無需更改,需要在CMakeList.txt文件下添加這兩個文件

2.1.7 自定義訂閱方(C++)

/*  需求:訂閱發布方發布的消息,并輸出到終端。步驟:1.包含頭文件;2.初始化 ROS2 客戶端;3.定義節點類;3-1創建訂閱方;3-2創建回調函數;訂閱并解析數據4.調用spin函數,并傳入節點對象指針;5.釋放資源。
*/
#include <rclcpp/rclcpp.hpp>
#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"using base_interfaces_demo::msg::Student; // 使用自定義消息類型的命名空間//自定義節點類
class ListenerStu:public rclcpp::Node{
public:ListenerStu():Node("ListenerStu_node_cpp"){// 3-1創建訂閱方;subscription_=this->create_subscription<Student>("chat_stu",10,std::bind(&ListenerStu::topic_callback,this,std::placeholders::_1));}
private:void topic_callback(const Student &stu){// 3-2創建回調函數;訂閱并解析數據RCLCPP_INFO(this->get_logger(),"訂閱信息: name=%s, age=%d, height=%.2f",stu.name.c_str(), stu.age, stu.height);};rclcpp::Subscription<Student>::SharedPtr subscription_; // 定義訂閱者指針
};int main(int argc,char const *argv[]){//初始化rclcpp::init(argc,argv);//調用spin,掛起當前rclcpp::spin(std::make_shared<ListenerStu>());//釋放rclcpp::shutdown();
}

在兩個終端分別運行

colcon build --packages-select cpp01_topic
. install/setup.bash
ros2 run cpp01_topic demo03_talker_stu. install/setup.bash
ros2 run cpp01_topic demo04_listener_stu

2.1.8 自定義發布方(python)

"""
流程:1. 導包2. 初始化ROS2客戶端3. 自定義節點類3-1. 創建發布者/訂閱者3-2. 處理數據(回調函數)4. 調用 spin 函數,傳入節點對象5. 資源釋放
"""import rclpy
from rclpy.node import Node
from base_interfaces_demo.msg import Student # 可根據需要替換為其他消息類型class TalkerStu(Node):def __init__(self):super().__init__('my_node_py')self.get_logger().info("節點已啟動:my_node_py")# 3-1. 創建發布者(可選)self.publisher_ = self.create_publisher(Student, 'chat_stu', 10)self.timer = self.create_timer(0.5, self.timer_callback)  # 每0.5秒發布一次self.count=0# 3-2. 處理數據def timer_callback(self):msg = Student()msg.name = '張三'msg.age = self.countmsg.height=1.72self.publisher_.publish(msg)self.count+=1self.get_logger().info('發布消息: name=%s,age=%d,height=%.2f' % (msg.name, msg.age, msg.height))def main(args=None):# 2. 初始化ROS2客戶端rclpy.init(args=args)# 3. 創建節點對象node = TalkerStu()# 4. 調用 spin,傳入節點對象rclpy.spin(node)# 5. 釋放資源rclpy.shutdown()if __name__ == '__main__':main()
from base_interfaces_demo.msg import Student # 可根據需要替換為其他消息類型

這一段需要crtl+shift+p搜索dettings.json
然后在文件種添加

{"python.autoComplete.extraPaths": ["/home/sun/ws01_pluming/install/base_interfaces_demo/local/lib/python3.10/dist-packages",],"python.analysis.extraPaths": ["/home/sun/ws01_pluming/install/base_interfaces_demo/local/lib/python3.10/dist-packages",]
}

然后Student才會生效。

之后進入到setup.py文件下添加

2.1.9 自定義訂閱放(python)

"""
流程:1. 導包2. 初始化ROS2客戶端3. 自定義節點類3-1. 創建發布者/訂閱者3-2. 處理數據(回調函數)4. 調用 spin 函數,傳入節點對象5. 資源釋放
"""import rclpy
from rclpy.node import Node
from base_interfaces_demo.msg import Student   # 可根據需要替換為其他消息類型class ListenerStu(Node):def __init__(self):super().__init__('my_node_py')self.get_logger().info('節點已啟動:my_node_py')# 3-1. 創建訂閱者(可選)self.subscription = self.create_subscription(Student,'chat_stu',self.listener_callback,10)self.subscription  # 防止未使用警告# 3-2. 處理數據def listener_callback(self, msg):self.get_logger().info('收到消息: name=%s,age=%d,height=%.2f' % (msg.name, msg.age, msg.height))def main(args=None):# 2. 初始化ROS2客戶端rclpy.init(args=args)# 3. 創建節點對象node = ListenerStu()# 4. 調用 spin,傳入節點對象rclpy.spin(node)# 5. 釋放資源rclpy.shutdown()if __name__ == '__main__':main()

然后在終端運行

colcon build --packages-select py01_topic
. install/setup.bash
ros2 run py03_topic demo03_talker_stu_py. install/setup.bash
ros2 run py04_topic demo04_listener_stu_py

2.1.10 同一個訂閱主題下不同程序的發送和訂閱

rqt可視化

新開一個終端輸入rqt,在打開的窗口以此plugins->intrispection->node graph

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

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

相關文章

Mac 上安裝并使用 frpc(FRP 內網穿透客戶端)指南

一、先裝好 Homebrew&#xff08;macOS 的包管理器&#xff09;打開終端&#xff08;Terminal&#xff09;&#xff0c;先裝命令行開發工具 xcode-select --install彈窗點“安裝”&#xff0c;等待 3~5 分鐘。一鍵安裝 Homebrew /bin/bash -c "$(curl -fsSL https://raw.g…

04_接口與包管理

第4課:接口與包管理 課程目標 深入理解Go語言接口的概念和用法 掌握接口的組合和空接口 學會使用Go Modules進行包管理 理解包的導入和導出規則 1. 接口基礎 1.1 接口定義 // 基本接口定義 type Shape interface {Area() float64Perimeter()

福昕PDF編輯軟件高級版下載與詳細圖文安裝教程!!

軟件下載 【軟件名稱】&#xff1a; 福昕PDF編輯器高級版 【軟件大小】&#xff1a;668.9MBa a【系統要求】&#xff1a;awin10/win11或更高 福昕&#xff0c;軟件下載&#xff08;夸克網盤需手機打開&#xff09;&#xff1a;&#xff1a;福昕丨夸克網盤-資源免費下載 軟件介…

利用無事務方式插入數據庫解決并發插入問題(最小主鍵id思路)

一、背景 由于某業務需要回退某產品數據緩存列表Asset資源&#xff0c;主任務執行后&#xff0c;通過并行執行批量子任務進行數據回退&#xff0c;子任務中會記錄緩存列表Asset和緩存列表行AssetLine數據&#xff0c;并行執行過程會出現緩存列表行AssetLine重復插入問題&#…

如何制作免費的比特幣冷錢包

本文主要從技術上討論冷錢包的操作機制和原理&#xff0c;并不作為投資建議。對于國外的比特幣玩家&#xff0c;或者打算長期囤幣來對抗通貨膨脹的&#xff0c;或者是想短期持有的&#xff0c;那么將比特幣存儲在哪里是一個Common的問題。一般是兩類選擇。第一種選擇是存儲在交…

新手向:Python制作簡易音樂播放器

使用Python構建簡易音樂播放器音樂播放器是現代數字生活中不可或缺的工具&#xff0c;從智能手機到電腦系統&#xff0c;幾乎每個設備都內置了音樂播放功能。對于Python初學者來說&#xff0c;開發一個簡易的音樂播放器是一個很好的實踐項目&#xff0c;既能學習編程基礎&#…

【StarRocks】TabletChecker邏輯

TabletChecker是StarRocks FE里的一個組件,它的主要工作是檢查出所有的處于不健康狀態的tablets。 注意,它的職責就是check(檢查)。 至于tablet修復、均衡等調度工作不是TabletChecker的職責。 相關配置項 // 20秒執行一次check,代碼里是執行runAfterCatalogReady()publi…

低空經濟展 | 優翼仿真攜eVTOL全動飛行模擬器亮相2025深圳eVTOL展

2025深圳eVTOL展將于2025年9月23-25日在深圳坪山燕子湖國際會展中心舉行。展會以“低空經濟?eVTOL?航空應急救援?商載大型無人運輸機”為主題&#xff0c;以 “2天大會3天展覽項目考察飛行表演頒獎盛典項目路演”的多元模式&#xff0c;打造覆蓋 eVTOL全產業鏈的專業化合作平…

AI驅動商業革新:開源大模型與零售精準營銷引領產業升級

在當今數字化浪潮中&#xff0c;AI 正以迅猛之勢滲透至商業的每一處脈絡&#xff0c;掀起一場影響深遠的變革風暴&#xff0c;從根本上改寫著商業運轉的底層邏輯&#xff0c;創造出無數嶄新的商業契機。基礎模型領域&#xff0c;新的突破正在重塑行業格局。Meta 旗下的 LLaMA 3…

【表的操作】

文章目錄 一、查看所有表 1、語法 二、創建表 1、語法 2、?例 3、表在磁盤上對應的?件 4、創建數據加時使?校驗語句[if not exists] 三、查看表結構 1、語法 2、?例 四、修改表 1、語法 2、?例 (1)向表中添加?列 (2)修改某列的?度 (3)重命名某列 (4)刪除某個字段…

【Java后端】Spring Boot 全局異常處理最佳實踐

Spring Boot 全局異常處理最佳實踐 在日常開發中&#xff0c;異常處理幾乎是繞不過去的一個話題。尤其在 后端 API 項目 中&#xff0c;如果沒有統一的異常處理機制&#xff0c;很容易出現以下問題&#xff1a; Controller 層代碼里充斥著 try-catch&#xff0c;顯得冗余。前端…

K8S-Configmap資源

目錄 一、核心概念? ?定義? ?核心價值? ?與Secret的區別? ?二、核心特性? ?數據存儲? ?生命周期? ?作用域? 什么是 Configmap&#xff1f; Configmap 能解決哪些問題&#xff1f; ConfigMap 的主要作用 三、命令行直接創建 四、通過文件創建&#xf…

MySQL InnoDB事務acid特性的原理和隔離級別的實現原理

InnoDB存儲引擎 InnoDB存儲結構表空間 則每張表都會有一個表空間&#xff08;xxx.ibd&#xff09;&#xff0c;一個mysql實例可以對應多個表空間 系統表空間 存儲數據字典&#xff08;表結構定義、索引信息等&#xff09;、Change Buffer、Doublewrite Bufferundo log&#xff…

Linux系統之部署nullboard任務管理工具

Linux系統之部署nullboard任務管理工具一、nullboard介紹1.1 nullboard簡介1.2 任務看板工具介紹1.3 nullboard使用場景二、本次實踐介紹2.1 本地環境規劃2.2 本次實踐介紹三、安裝httpd軟件3.1 檢查yum倉庫3.2 安裝httpd軟件3.3 啟動httpd服務3.4 查看httpd服務狀態3.5 防火墻…

Qt設置軟件使用期限【新版防修改系統時間】

在工業軟件或其他領域中&#xff0c;經常會對軟件進行授權&#xff0c;軟件需要付費進行有期限的使用。以下是我用Qt設計的設置軟件使用期限的兩種方案。 主體思想&#xff1a; 1.軟件需要綁定機器&#xff0c;讓用戶無法通過復制在另一臺機器上運行。 2.由廠家提供激活碼供用戶…

【JavaEE】多線程(線程安全問題)

有些代碼在單個線程環境下執行正確&#xff0c;如果同樣的代碼在多個線程下同時執行可能就會出現問題&#xff0c;這個就是線程安全問題&#xff08;或者稱線程不安全問題&#xff09;&#xff0c;簡而言之就是&#xff1a;線程安全問題是由于多線程出現的問題&#xff0c;原因…

NodeJs 桌面開發學習 electron.js (一)

今天開始學習NodeJs 關于 桌面應用的內容&#xff0c;長期目標是 React electron 實現一個桌面應用。今天先實現一個簡單的目標&#xff0c;搭建一個Electron ts 項目架構&#xff0c;并實現主業務線程 和前端渲染線程的交互一、代碼結構和配置例子項目結構大致如下&#xff…

diffusion model(1.4) 相關論文閱讀清單

以下是閱讀清單&#xff1a; 《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》擴散模型&#xff0c;arxiv鏈接《Denoising Diffusion Probabilistic Models》DDPM論文 arxiv鏈接

ESP32-C3_SMARTCAR

前言: 前面用stm32f103c8t6 rt-thread 寫了個智能小車程序 這章用esp32-c3 重新來遍 1&#xff1a;環境 vscodeidf5.4 esp32-3c 找到一塊MIN的底板 湊合用&#xff08;138 cm左右&#xff09; 一個L298N 一個船型開關&#xff0c; 一個665mm 2腳按鈕 鋰電池 186502 及電池盒&a…

消費者API

目錄獨立消費者案例&#xff08;訂閱主題&#xff09;獨立消費者案例&#xff08;訂閱分區&#xff09;消費者組案例獨立消費者案例&#xff08;訂閱主題&#xff09; package com.tsg.kafka.consumer;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.ap…