日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

ROS学习笔记四:用C++编写ROS发布与订阅

發(fā)布時(shí)間:2023/12/10 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS学习笔记四:用C++编写ROS发布与订阅 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、創(chuàng)建并編譯功能包

1.1 創(chuàng)建功能包

在工作空間的 src 目錄下創(chuàng)建功能包:

$ cd ~/dev/catkin_ws/src $ catkin_create_pkg chapter2_tutorials std_msgs roscpp


1.2 編譯功能包

進(jìn)入工作目錄下編譯全部功能包:

$ cd ~/dev/catkin_ws/ $ catkin_make

如果到達(dá)100%,表示一切順利,否則會(huì)報(bào)錯(cuò)停止編譯。


二、創(chuàng)建并編譯節(jié)點(diǎn)

2.1 創(chuàng)建節(jié)點(diǎn)

進(jìn)入功能包的 src 目錄下,在這個(gè)文件夾中,創(chuàng)建兩個(gè)新文件:example1_a.cpp 和 example1_b.cpp。

example1_a.cpp(發(fā)布節(jié)點(diǎn)):

#include "ros/ros.h" //"ros/ros.h"包含ROS節(jié)點(diǎn)所有節(jié)點(diǎn)的必要文件 #include "std_msgs/String.h" //"std_msgs/String.h"包含消息類型 #include <sstream>int main(int argc, char **argv) {ros::init(argc, argv, "example1_a"); //啟動(dòng)該節(jié)點(diǎn)并設(shè)置其名稱(example1_a),該名稱是唯一的ros::NodeHandle n; //設(shè)置節(jié)點(diǎn)進(jìn)程的句柄ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message", 1000); //把這個(gè)節(jié)點(diǎn)設(shè)置成發(fā)布者,并把發(fā)布主題的類型告訴節(jié)點(diǎn)管理器。第一個(gè)參數(shù)是消息名稱“message”,第二個(gè)參數(shù)將緩沖區(qū)設(shè)置為1000個(gè)消息ros::Rate loop_rate(10); //設(shè)置頻率10Hzwhile (ros::ok()) //一直運(yùn)行,直到CTRL+C停止運(yùn)行{std_msgs::String msg; //創(chuàng)建消息變量,變量類型必須符合發(fā)送的要求std::stringstream ss;ss << " I am the example1_a node "; //要發(fā)布的消息內(nèi)容msg.data = ss.str();chatter_pub.publish(msg); //發(fā)布消息ros::spinOnce(); //如果出現(xiàn)訂閱者,ROS會(huì)更新和讀取所有主題loop_rate.sleep(); //按頻率掛起}return 0; }


example1_b.cpp(訂閱節(jié)點(diǎn)):

#include "ros/ros.h" #include "std_msgs/String.h"/*接收消息然后發(fā)布*/ void chatterCallback(const std_msgs::String::ConstPtr& msg) {ROS_INFO("I heard: [%s]", msg->data.c_str()); //在命令行窗口顯示消息內(nèi)容 }int main(int argc, char **argv) {ros::init(argc, argv, "example1_b");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("message", 1000, chatterCallback); //創(chuàng)建一個(gè)訂閱者,從主題獲取以“message”為名稱的消息,緩沖區(qū)為1000,處理消息句柄的回調(diào)函數(shù)chatterCallbackros::spin(); //ros::spin()庫是響應(yīng)循環(huán),消息到達(dá)時(shí)調(diào)用函數(shù)chatterCallback,CTRL+C結(jié)束循環(huán)return 0; }


2.2 編譯節(jié)點(diǎn)

將下列幾行代碼添加到CMakeLists.txt文件中include_directories(include ${catkin_INCLUDE_DIRS})之后:

add_executable(chap2_example1_a src/example1_a.cpp) add_executable(chap2_example1_b src/example1_b.cpp) add_dependencies(chap2_example1_a chapter2_tutorials_generate_messages_cpp) add_dependencies(chap2_example1_b chapter2_tutorials_generate_messages_cpp) target_link_libraries(chap2_example1_a ${catkin_LIBRARIES}) target_link_libraries(chap2_example1_b ${catkin_LIBRARIES})

回到工作目錄下,編譯功能包:

$ cd ~/dev/catkin_ws/ $ catkin_make chapter2_tutorials

如果順利編譯的話,將會(huì)生成兩個(gè)可執(zhí)行程序 example1_a 和 example1_b 文件,默認(rèn)生成可執(zhí)行文件的目錄是catkin工作空間的devel目錄下的lib目錄。


3 檢驗(yàn)編寫的節(jié)點(diǎn)

首先要確認(rèn)在carkin_make之后加載了工作空間的環(huán)境變量,然后分別在三個(gè)新的終端運(yùn)行如下命令:

$ roscore $ rosrun chapter2_tutorials chap2_example1_a $ rosrun chapter2_tutorials chap2_example1_b


使用rqt_graph命令能夠創(chuàng)建一個(gè)顯示當(dāng)前系統(tǒng)運(yùn)行情況的動(dòng)態(tài)圖形,如下圖所示。example1_a 節(jié)點(diǎn)發(fā)布 /message 主題,同時(shí) example1_b 節(jié)點(diǎn)訂閱了這個(gè)主題。


轉(zhuǎn)載于:https://www.cnblogs.com/linuxAndMcu/p/10578837.html

總結(jié)

以上是生活随笔為你收集整理的ROS学习笔记四:用C++编写ROS发布与订阅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。