ROS筆記——創建簡單的主題發布節點和主題訂閱節點


 

  在安裝好ROS后,接着學習如何創建節點和節點之間的通信方式,以一個簡單的主題發布節點和主題訂閱節點說明。

  節點是連接ROS網絡等可執行文件,是實現某些功能的軟件包,也是一個主要計算執行的進程。

 

  一、創建工作空間

  創建新文件夾,名字自定義,路徑也根據自己設定。

cd ~
mkdir -p ros_workspace

  創建好后,就需要將次路徑添加到ROS_PACKAGE_PATH中。

  查看目前ROS的工作空間,

echo $ROS_PACKAGE_PATH

  一般顯示如下:

  /opt/ros/kinetic/share

  下面將路徑添加到~/.bashrc中

echo "export ROS_PACKAGE_PATH=~/ros_workspace:${ROS_PACKAGE_PATH}" >> ~/.bashrc
. ~/.bashrc

  再次查看ROS正在使用的空間,確保路徑正確添加。

 

  二、創建ROS功能包

  打開ROS工作目錄:

cd ~/ros_workspace

  在該目錄下創建功能包:

roscreate-pkg test1_tutorials std_msgs rospy roscpp

  功能包文件夾下一般包括Makefile、manifest.xml、CMakeLists.txt、mainpage.dox等文件。

  std_msgs  包含常見等消息類型

  rospy    py庫

  roscpp    cpp庫

  運行命令,查看功能包是否創建

rospack find test1_tutorials

  

  三、編寫代碼

  1、主題發布節點

  在功能包中創建src/test1_a.cpp,並添加代碼:

 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 #include <sstream>
 4 
 5 
 6 int main(int argc, char **argv)
 7 {
 8     ros::init(argc,argv,"test1_a");
 9     ros::NodeHandle n;
10     ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000);
11     ros::Rate loop_rate(10);
12     while(ros::ok()) {
13         std_msgs::String msg;
14         std::stringstream ss;
15         ss << "Hello test1_b! I am test1_a.";
16         msg.data = ss.str();
17         ROS_INFO("%s",msg.data.c_str());
18         chatter_pub.publish(msg);
19         ros::spinOnce();
20         loop_rate.sleep();
21     }
22     return 0;
23 }

  第8行: 初始化,其中第三個參數是節點名稱,在ROS系統中必須唯一。

  第10行:聲明主題message上發布一個消息類型為str_msgs::String的消息,並設置消息緩沖區的大小。

  第11行:設置發送消息的頻率 10HZ,它追蹤自從上一次Rate::sleep()被喚醒之后的持續時間,並在到達時間后繼續休眠。

  第12行:ros::ok()函數返回值,在下列情況返回false。

  •   SIGINT句柄接收到Ctrl+C命令來結束;
  •   被名稱相同的節點提出ROS網絡;
  •   ros::shutdown()被應用的另一部分喚醒。

  第18行:把消息通過主題發布出去。

  第19行:和下面test1_b.cpp程序ros::spin()進行對比,參考http://www.yfworld.com/?p=2318

 

  2、主題訂閱節點

  在功能包中創建src/test1_b.cpp,並添加代碼:

 1 #include "ros/ros.h"
 2 #include "std_msgs/String.h"
 3 
 4 void chatterCallback(const std_msgs::String::ConstPtr &msg)
 5 {
 6     ROS_INFO("Hello test1_a! I am test1_b. I heard:[%s]",msg->data.c_str());
 7 }
 8 
 9 int main(int argc, char **argv)
10 {
11     ros::init(argc,argv,"test1_b");
12     ros::NodeHandle n;
13     ros::Subscriber sub = n.subscribe("message",1000,chatterCallback);
14     ros::spin();
15 
16     return 0;
17 }

  第4-7行:回調函數,當一個新消息到達指定主題時即調用。

  第17行:第一個參數指定訂閱主題;第二個參數設置消息緩沖區的大小;第三個參數指定回調函數。

  訂閱節點需要做四件事情:

  1)初始化;

  2)從主題訂閱消息;

  3)然后等待消息到達;

  4)當消息到達時,chatterCallback()被回調。

 

  四、編譯節點

  編輯CMakeLists.txt文件,在末尾處添加如下代碼:

rosbuild_add_executable(test1_a src/test1_a.cpp)
rosbuild_add_executable(test1_b src/test1_b.cpp)

 

  rosmake工具進行編譯:

rosmake test1_tutorials

 

  五、運行功能包

  在運行功能包前,請確認節點管理器已經打開。使用下面的命令運行:

roscore

  在不同的終端窗口分別運行:

rosrun test1_tutorials test1_a
rosrun test1_tutorials test1_b

  可以看到以下信息:

   

  

  六、參考

  http://wiki.ros.org/ROS/Tutorials

  《ROS機器人程序設計》 劉品傑 譯

 

  (歡迎轉載,轉載請注明出處。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM