ROS学习笔记四:用C++编写ROS发布与订阅
一、創(chuàng)建并編譯功能包
1.1 創(chuàng)建功能包
在工作空間的 src 目錄下創(chuàng)建功能包:
$ cd ~/dev/catkin_ws/src $ catkin_create_pkg chapter2_tutorials std_msgs roscpp1.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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chrome历史版本下载地址
- 下一篇: s3c2440移植MQTT