在安裝好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機器人程序設計》 劉品傑 譯
(歡迎轉載,轉載請注明出處。)