摘要
ROS機器人操作系統在機器人應用領域很流行,依托代碼開源和模塊間協作等特性,給機器人開發者帶來了很大的方便。我們的機器人“miiboo”中的大部分程序也采用ROS進行開發,所以本文就重點對ROS基礎知識進行詳細的講解,給不熟悉ROS的朋友起到一個拋磚引玉的作用。本章節主要內容:
4.如何編寫ROS的第一個程序hello_world
既然ROS已經成功安裝好了,大家一定很想親自動動手編一個通過起手式例程hello_world,可以學到工作空間的創建、功能包的創建、功能包的源代碼編寫、功能包的編譯配置、功能包的編譯、功能包的啟動運行等知識。ROS的小程序試試手,沒錯,這一節就隆重請出程序界的起手式例程hello_world。
通過起手式例程hello_world,可以學到工作空間的創建、功能包的創建、功能包的源代碼編寫、功能包的編譯配置、功能包的編譯、功能包的啟動運行等知識。
(1)工作空間的創建
打開命令行終端,分別輸入如下命令:
#先切回主目錄 cd ~/ #新建工作空間文件夾 mkdir catkin_ws #在catkin_ws目錄下新建src文件夾 cd catkin_ws mkdir src #初始化src目錄,生成的CMakeLists.txt為功能包編譯配置 cd src catkin_init_workspace #切回catkin_ws目錄,對該工作空間執行一次編譯 cd ~/catkin_ws catkin_make #環境變量配置,使新建的catkin_ws工作空間可用 source devel/setup.bash
這時,便已經創建好了一個ROS的工作空間了,接下來就是在catkin_ws工作空間下的src目錄下新建功能包並進行功能包程序編寫了,如果想了解工作空間的詳細目錄結構,請參考本章節(二)ROS入門——2.ROS系統整體架構這有對ROS的文件組織結構進行詳解。
(2)功能包的創建
繼續在命令行終端中,輸入如下命令:
#在catkin_ws/src/下創建取名為hello_world的功能包, #ROS功能包命名規范:只允許使用小寫字母、數字和下划線, #且首字符必須為一個小寫字母。 cd ~/catkin_ws/src/ catkin_create_pkg hello_world
這時候在~/catkin_ws/src/目錄下能看到一個叫hello_world的文件夾,文件夾名稱就是功能包的名稱以及功能包的唯一標識符,這個說明功能包創建成功了。
(3)功能包的源代碼編寫
由於我們只是要編寫一個能打印“hello world”的程序,所以就很簡單了,這里先以c++代碼作為示范,后面會講解python的。一些在線教程建議在你的功能包目錄中創建src目錄用來存放c++源文件,這個附加的組織結構是很有益處的,特別是對含有很多種類型文件的大型功能包,不過不是嚴格必要的。出於編程規范,我這里也會采用這樣的建議把c++源文件放在功能包中的src目錄下。
所以,首先在hello_world目錄下新建src目錄,再在新建的src目錄下新建一個my_hello_world_node.cpp文件。這里的新建目錄和文件的方法可以在圖形界面下直接操作會更方便一點,如圖11。
(圖11)在功能包中新建文件夾及文件
用文本編輯器gedit打開my_hello_world_node.cpp文件,並輸入如下內容。
#include “ros/ros.h” int main(int argc,char **argv) { ros::init(argc,argv,"hello_node"); ros::NodeHandle nh; ROS_INFO_STREAM("hello world!!!"); }
這里對代碼做一個解析:
#include “ros/ros.h”
這一句是包含頭文件ros/ros.h,這是ROS提供的C++客戶端庫,是必須包含的頭文件,在后面的編譯配置中要添加相應的依賴庫roscpp。
ros::init(argc,argv,"hello_node");
這一句是初始化ros節點並指明節點的名稱,這里給節點取名為hello_node,一旦程序運行后就可以在ros的計算圖中被注冊為hello_node名稱標識的節點。
ros::NodeHandle nh;
這一句是聲明一個ros節點的句柄,初始化ros節點必須的。
ROS_INFO_STREAM("hello world!!!");
這一句是調用了roscpp庫提供的方法ROS_INFO_STREAM來打印信息,這里打印字符串"hello world!!!"。
(4)功能包的編譯配置
聲明依賴庫:
對於我們的my_hello_world_node.cpp程序來說,我們包含了<ros/ros.h>這個庫,因此我們需要添加名為roscpp的依賴庫。
首先,用文本編輯器gedit打開功能包目錄下的CMakeLists.txt文件,在find_package(catkin REQUIRED ...)字段中添加roscpp,添加后的字段如下:
find_package(catkin REQUIRED COMPONENTS roscpp)
同時,找到include_directories(...)字段,去掉${catkin_INCLUDE_DIRS}前面的注釋,如下:
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
添加好后的效果如圖12所示。
(圖12)在CMakeLists.txt中添加roscpp依賴庫
然后,用文本編輯器gedit打開功能包目錄下的package.xml文件,找到這樣一句話<buildtool_depend>catkin</buildtool_depend>,在這句話的下面添加如下內容:
<build_depend>roscpp</build_depend> <build_export_depend>roscpp</build_export_depend> <exec_depend>roscpp</exec_depend>
添加好后的效果如圖13所示。
(圖13)在package.xml中添加roscpp依賴庫
聲明可執行文件:
就接下來,我們需要在CMakeLists.txt中添加兩句,我的習慣在文件最后一行添加就好了,來聲明我們需要創建的可執行文件。
add_executable(my_hello_world_node src/my_hello_world_node.cpp) target_link_libraries(my_hello_world_node ${catkin_LIBRARIES})
第一行聲明了我們想要的可執行文件的文件名,以及生成此可執行文件所需的源文件列表。如果你有多個源文件,把它們列在此處,並用空格將其區分開。
第二行告訴 Cmake 當鏈接此可執行文件時需要鏈接哪些庫(在上面的 find_package 中定義)。如果你的包中包括多個可執行文件,為每一個可執行文件復制和修改上述兩行代碼。
添加好后的效果如圖14所示。
(圖14)在CMakeLists.txt聲明可執行文件
(5)功能包的編譯
功能包的編譯配置好后,就可以開始編譯了,這里有兩種編譯方式,一種是編譯工作空間內的所有功能包,另一種是編譯工作空間內的指定功能包,兩種編譯方式各有用處,下面分別講解。
第一種,編譯工作空間內的所有功能包:
cd ~/catkin_ws/
catkin_make
第二種,編譯工作空間內的指定功能包:
其實就是加入參數 -DCATKIN_WHITELIST_PACKAGES=””,在雙引號中填入需要編譯的功能包名字,用空格分割。
cd ~/catkin_ws/ catkin_make -DCATKIN_WHITELIST_PACKAGES="hello_world"
(6)功能包的啟動運行
首先,需要用roscore命令來啟動ROS節點管理器,ROS節點管理器是所有節點運行的基礎。
打開命令行終端,輸入命令:
roscore
然后,用source devel/setup.bash激活catkin_ws工作空間,用rosrun <package_name> <node_name>啟動功能包中的節點。
再打開一個命令行終端,分別輸入命令:
cd ~/catkin_ws/ source devel/setup.bash rosrun hello_world my_hello_world_node
看到有輸出hello world!!!就說明程序已經正常執行了,按照我們的設計程序正常打印后會自動結束,如圖15。
(圖15)hello_world功能包中my_hello_world_node節點執行結果
到這里,恭喜你已經學會了ROS的第一個程序hello world!!!
后記
------SLAM+語音機器人DIY系列【目錄】快速導覽------
第1章:Linux基礎
第2章:ROS入門
第3章:感知與大腦
第4章:差分底盤設計
第5章:樹莓派3開發環境搭建
第6章:SLAM建圖與自主避障導航
2.google-cartographer機器人SLAM建圖
第7章:語音交互與自然語言處理
第8章:高階拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章將持續更新,敬請關注-----------------
如果大家對博文的相關類容感興趣,或有什么技術疑問,歡迎加入下面的《SLAM+語音機器人DIY》QQ技術交流群,一起討論學習^_^
關於我們:
視頻教程: