topic 之RCLCPP實現

創建節點

本節我們將創建一個控制節點和一個被控節點。

控制節點創建一個話題發布者publisher,發布控制命令(command)話題,接口類型為字符串(string),控制接點通過發布者發布控制命令(前進、后退、左轉、右轉、停止)。

被控節點創建一個訂閱者subscribe,訂閱控制命令,收到控制命令后根據命令內容打印對應速度出來。

創建publisher

依次輸入下面的命令,創建chapt3_ws工作空間、example_topic_rclcpp功能包和topic_publisher_01.cpp。

cd d2lros2/
mkdir -p chapt3/chapt3_ws/src
cd chapt3/chapt3_ws/src
ros2 pkg create example_topic_rclcpp --build-type ament_cmake --dependencies rclcpp
touch example_topic_rclcpp/src/topic_publisher_01.cpp

接著采用面向對象方式寫一個最簡單的節點。

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node
{
public:// 構造函數,有一個參數為節點名稱TopicPublisher01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 創建發布者command_publisher_ = this->create_publisher<std_msgs::msg::String>("command", 10);}private:// 聲明話題發布者rclcpp::Publisher<std_msgs::msg::String>::SharedPtr command_publisher_;
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*創建對應節點的共享指針對象*/auto node = std::make_shared<TopicPublisher01>("topic_publisher_01");/* 運行節點,并檢測退出信號*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}

修改CMakeLists.txt

add_executable(topic_publisher_01 src/topic_publisher_01.cpp)
ament_target_dependencies(topic_publisher_01 rclcpp)install(TARGETStopic_publisher_01DESTINATION lib/${PROJECT_NAME}
)

編寫發布者

學習使用API文檔

想要創建發布者,只需要調用node的成員函數create_publisher并傳入對應的參數即可。
rclcpp: rclcpp: ROS Client Library for C++ (www.ros2.org)

導入消息接口

依次做完這三步

CMakeLists.txt 新增

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(topic_publisher_01 src/topic_publisher_01.cpp)
ament_target_dependencies(topic_publisher_01 rclcpp **std_msgs**)

packages.xml 新增

  <buildtool_depend>ament_cmake</buildtool_depend><depend>rclcpp</depend><depend>std_msgs</depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend>

代碼文件topic_publisher_01.cpp 新增

#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node

編譯

cd chapt3/chapt3_ws/
colcon build --packages-select example_topic_rclcpp
source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

使用定時器定時發布數據

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicPublisher01 : public rclcpp::Node
{
public:// 構造函數,有一個參數為節點名稱TopicPublisher01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 創建發布者command_publisher_ = this->create_publisher<std_msgs::msg::String>("command", 10);// 創建定時器,500ms為周期,定時發布timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&TopicPublisher01::timer_callback, this));}private:void timer_callback(){// 創建消息std_msgs::msg::String message;message.data = "forward";// 日志打印RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());// 發布消息command_publisher_->publish(message);}// 聲名定時器指針rclcpp::TimerBase::SharedPtr timer_;// 聲明話題發布者指針rclcpp::Publisher<std_msgs::msg::String>::SharedPtr command_publisher_;
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*創建對應節點的共享指針對象*/auto node = std::make_shared<TopicPublisher01>("topic_publisher_01");/* 運行節點,并檢測退出信號*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}
定時器

定時器是ROS2中的另外一個常用功能,通過定時器可以實現按照一定周期調用某個函數以實現定時發布等邏輯。
定時器對應的類是 rclcpp::TimerBase,調用create_wall_timer將返回其共享指針。
創建定時器時傳入了兩個參數,這兩個參數都利用了C++11的新特性。
std::chrono::milliseconds(500),代表500ms,chrono是c++ 11中的時間庫,提供計時,時鐘等功能。
std::bind(&TopicPublisher01::timer_callback, this),bind() 函數的意義就像它的函數名一樣,是用來綁定函數調用的某些參數的。

編寫訂閱者

topic_subscribe_01.cpp

cd chapt3_ws/src/example_topic_rclcpp
touch src/topic_subscribe_01.cpp

topic_subscribe_01.cpp

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"class TopicSubscribe01 : public rclcpp::Node
{
public:TopicSubscribe01(std::string name) : Node(name){RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());// 創建一個訂閱者訂閱話題command_subscribe_ = this->create_subscription<std_msgs::msg::String>("command", 10, std::bind(&TopicSubscribe01::command_callback, this, std::placeholders::_1));}private:// 聲明一個訂閱者rclcpp::Subscription<std_msgs::msg::String>::SharedPtr command_subscribe_;// 收到話題數據的回調函數void command_callback(const std_msgs::msg::String::SharedPtr msg){double speed = 0.0f;if(msg->data == "forward"){speed = 0.2f;}RCLCPP_INFO(this->get_logger(), "收到[%s]指令,發送速度 %f", msg->data.c_str(),speed);}
};int main(int argc, char **argv)
{rclcpp::init(argc, argv);/*創建對應節點的共享指針對象*/auto node = std::make_shared<TopicSubscribe01>("topic_subscribe_01");/* 運行節點,并檢測退出信號*/rclcpp::spin(node);rclcpp::shutdown();return 0;
}

CMakeLists.txt

add_executable(topic_subscribe_01 src/topic_subscribe_01.cpp)
ament_target_dependencies(topic_subscribe_01 rclcpp std_msgs)install(TARGETS
topic_subscribe_01DESTINATION lib/${PROJECT_NAME}
)

packages.xml

不改動,同一個功能包,已經添加了。

編譯

cd chapt3/chapt3_ws/
colcon build --packages-select example_topic_rclcpp
source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_01

手動運行測試

ros2 topic pub /command std_msgs/msg/String "{data: forward}"

運行測試

第一個終端

source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_01

第二個終端

source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

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

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

相關文章

【Linux】升級FastJSON版本-jar

摘要 在長期運行的應用服務器上&#xff0c;近期的安全漏洞掃描揭示了fastjson組件存在潛在的安全隱患&#xff08;FastJSON是一個Java 語言實現的 JSON 解析器和生成器。FastJSON存在遠程代碼執行漏洞&#xff0c;惡意攻擊者可以通過此漏洞遠程執行惡意代碼來入侵服務器&…

怎么解析二級域名,一個一級域名可以解析多少二級域名?

在構建網站或應用時&#xff0c;域名是連接用戶與服務器的重要橋梁。注冊了一級域名后&#xff0c;如何解析二級域名&#xff0c;以及一個一級域名可以解析多少個二級域名&#xff0c;是很多網站管理人員都非常關心的問題。本文國科云將簡單探討下這兩個問題&#xff0c;并給出…

數學,LeetCode 3102. 最小化曼哈頓距離

一、題目 1、題目描述 給你一個下標從 0 開始的數組 points &#xff0c;它表示二維平面上一些點的整數坐標&#xff0c;其中 points[i] [xi, yi] 。 兩點之間的距離定義為它們的 曼哈頓距離 。 請你恰好移除一個點&#xff0c;返回移除后任意兩點之間的 最大 距離可能的 最小…

Dynadot 2024年第一季度回顧

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

java進程把服務器CPU打滿問題排查

1、top命令定位問題進程 2、查看進程的所有線程信息&#xff0c;記下占用最高的進程 top -Hp 38080553、將第2步得到的線程號轉化為十六進制 printf %x\n 38080594、結果里搜索 jstack 3808055|grep -A 10 3a1b3b5、定位問題 根據上步搜索到的結果&#xff0c;可以看到是GC…

【PyQt5】

PyQT5線程基礎&#xff08;1&#xff09; 分離UI主線程和耗時子線程QThread自定義信號 分離UI主線程和耗時子線程 在應用程序中&#xff0c;主線程負責處理用戶的輸入事件、更新UI元素和響應系統的回調&#xff0c;而耗時的任務&#xff08;例如網絡請求、數據庫訪問、圖像處理…

關閉這八個電腦設置,保護個人隱私

你知道嗎&#xff1f;電腦可能一直在偷窺你的小秘密。朋友們&#xff0c;一定要記得關閉這8個電腦設置哦&#xff0c;這樣可以有效地保護我們的個人隱私。 按住鍵盤Windows鍵加i鍵&#xff0c;快速打開Windows設置。然后點擊隱私選項。 我們來看基本的常規設置。里面有四個設置…

在表格中選中el-radio后, 怎么獲取選中的這一行的所有數據?

演示: 圖中, 選中這行數據后, 怎么獲取到當前的數據? 代碼: <tr v-for"item in gridData"><td><input type"radio" v-model"checkout" change"getDateFn" :data-type"item.articleType" :data-channelNam…

GEE代碼實例教程詳解:年度和月度土地覆蓋變化分析

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對土地覆蓋變化進行年度和月度的分析。通過Google的Dynamic World數據集&#xff0c;我們可以識別2023年至2024年間土地覆蓋的類型和變化。 背景知識 Google Dynamic World數據集 Google/DYNAMICWORLD/V…

百川工作手機實現銷售管理微信監控系統

在瞬息萬變的商業戰場中&#xff0c;每一分效率的提升都是企業制勝的關鍵。傳統銷售管理模式已難以滿足現代企業對精準、高效、合規的迫切需求。今天&#xff0c;讓我們一同探索如何利用工作手機這一創新工具&#xff0c;為您的銷售團隊裝上智能翅膀&#xff0c;開啟銷售管理的…

基于springboot+vue實現的廚藝交流平臺(文末源碼+Lw)093

93基于SpringBootVue的實現的廚藝交流平臺&#xff08;源碼數據庫萬字Lun文流程圖ER圖結構圖演示視頻軟件包&#xff09; 系統功能&#xff1a; 這次開發的廚藝交流平臺功能有個人中心&#xff0c;食材分類管理&#xff0c;用戶管理&#xff0c;菜品分類管理&#xff0c;菜譜信…

解鎖敦煌網成功秘籍:批量注冊買家號測評的高效策略

敦煌網&#xff08;DHgate&#xff09;作為一個跨境電商平臺&#xff0c;搭建境外本土網絡環境并實現批量注冊買家號下單&#xff0c;需要遵循一系列嚴謹的步驟和考慮多個關鍵因素。以下是一個概括性的指南&#xff1a; 一、環境要求 國外服務器&#xff1a;首先&#xff0c;…

HumbleBundle7月虛幻捆綁包30件軍事題材美術模型沙漠自然環境大逃殺模塊化建筑可定制武器包二戰現代坦克飛機道具喪尸士兵角色模型20240705

HumbleBundle7月虛幻捆綁包30件軍事題材美術模型沙漠自然環境大逃殺模塊化建筑可定制武器包二戰現代坦克飛機道具喪尸士兵角色模型202407051607 這次HumbleBundle捆綁包是UE虛幻軍事題材的&#xff0c;內容非常多。 有軍事基地、賽博朋克街區、灌木叢景觀環境等 HB捆綁包虛幻…

7-打包安裝程序

接下來假設我們想要將我們的項目分發給其他人&#xff0c;以便他們可以使用它。我們希望在各種平臺上提供二進制和源代碼發行版。這與我們之前在安裝和測試中所做的安裝略有不同&#xff0c;在安裝中我們安裝了從源代碼構建的二進制文件。在本例中&#xff0c;我們將構建支持二…

C# 構造函數依賴注入 使用out向外傳遞參數

天真目前解決方法 天真 using System;namespace forCode20191 {class Program {static void Main(string[] args) {bool flag false;Tmp tt new Tmp(out flag);Console.WriteLine(flag); // 將輸出 falsett.Doit();Console.WriteLine(flag); // 將輸出 trueConsole.ReadKey(…

“DDoS攻擊的最新防御策略:從檢測到緩解的全方位方案“

DDoS攻擊的最新防御策略 DDoS攻擊&#xff08;分布式拒絕服務攻擊&#xff09;是網絡安全領域的重大威脅&#xff0c;它通過大量的惡意流量淹沒目標服務器或網絡&#xff0c;導致服務不可用。為了有效防御DDoS攻擊&#xff0c;最新的策略強調從檢測到緩解的全方位方案。 多層防…

深度學習的數學PDF

鏈接: https://pan.baidu.com/s/1_jScZ7dcyAWGqbrad6bbCQ?pwd9gj9 提取碼: 9gj9 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦

【蒼穹外賣】Day2 手把手敲完細節

目錄 1. 新增員工 1.1 需求分析和設計 1.2 代碼開發 ①定義DTO類&#xff1a;(在sky-pojo里&#xff09; ②EmployeeController中創建新增員工方法save() ③EmployeeService里聲明save方法&#xff08;altenter&#xff09; ④EmployeeServiceImpl中實現save方法 ⑤在E…

頂刊文獻閱讀及代碼復現

前提:每個無人機都有 (i)自己的機載計算機,用于執行控制其自身動作所需的計算 (ii)自己的傳感器系統,用于測量相對位置和速度, (iii)自己的通信設備,用于與相鄰代理進行數據交換。 模型:短期的排斥力、中間范圍的速度一致性和長距離的吸引力

通過PLC地址來切換威綸通觸摸屏界面

Step 1 元件-PLC控制 Step 2 新增 選擇設備 選擇切換基本窗口功能 選擇觸發地址 Step 3 離線仿真測試 在數值框中輸入對應的頁面號 可以看到頁面可以正常切換 分享創作不易&#xff0c;請多多支持&#xff0c;點贊、收藏、關注&#xff01; Ending~