SLAM+語音機器人DIY系列:(二)ROS入門——4.如何編寫ROS的第一個程序hello_world


摘要                                          

ROS機器人操作系統在機器人應用領域很流行,依托代碼開源和模塊間協作等特性,給機器人開發者帶來了很大的方便。我們的機器人“miiboo”中的大部分程序也采用ROS進行開發,所以本文就重點對ROS基礎知識進行詳細的講解,給不熟悉ROS的朋友起到一個拋磚引玉的作用。本章節主要內容:

1.ROS是什么

2.ROS系統整體架構

3.在ubuntu16.04中安裝ROS kinetic

4.如何編寫ROS的第一個程序hello_world

5.編寫簡單的消息發布器和訂閱器

6.編寫簡單的service和client

7.理解tf的原理

8.理解roslaunch在大型項目中的作用

9.熟練使用rviz

10.在實際機器人上運行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

(圖15hello_world功能包中my_hello_world_node節點執行結果

到這里,恭喜你已經學會了ROS的第一個程序hello world!!!

后記                                                      

------SLAM+語音機器人DIY系列【目錄】快速導覽------

第1章:Linux基礎

1.Linux簡介

2.安裝Linux發行版ubuntu系統

3.Linux命令行基礎操作

第2章:ROS入門

1.ROS是什么

2.ROS系統整體架構

3.在ubuntu16.04中安裝ROS kinetic

4.如何編寫ROS的第一個程序hello_world

5.編寫簡單的消息發布器和訂閱器

6.編寫簡單的service和client

7.理解tf的原理

8.理解roslaunch在大型項目中的作用

9.熟練使用rviz

10.在實際機器人上運行ROS高級功能預覽

第3章:感知與大腦

1.ydlidar-x4激光雷達

2.帶自校准九軸數據融合IMU慣性傳感器

3.輪式里程計與運動控制

4.音響麥克風與攝像頭

5.機器人大腦嵌入式主板性能對比

6.做一個能走路和對話的機器人

第4章:差分底盤設計

1.stm32主控硬件設計

2.stm32主控軟件設計

3.底盤通信協議

4.底盤ROS驅動開發

5.底盤PID控制參數整定

6.底盤里程計標

第5章:樹莓派3開發環境搭建

1.安裝系統ubuntu_mate_16.04

2.安裝ros-kinetic

3.裝機后一些實用軟件安裝和系統設置

4.PC端與robot端ROS網絡通信

5.Android手機端與robot端ROS網絡通信

6.樹莓派USB與tty串口號綁定

7.開機自啟動ROS節點

第6章:SLAM建圖與自主避障導航

1.在機器人上使用傳感器

2.google-cartographer機器人SLAM建圖

3.ros-navigation機器人自主避障導航

4.多目標點導航及任務調度

5.機器人巡航與現場監控

第7章:語音交互與自然語言處理

1.語音交互相關技術

2.機器人語音交互實現

3.自然語言處理雲計算引擎

第8章:高階拓展

1.miiboo機器人安卓手機APP開發

2.centos7下部署Django(nginx+uwsgi+django+python3)

----------------文章將持續更新,敬請關注-----------------

 

如果大家對博文的相關類容感興趣,或有什么技術疑問,歡迎加入下面的《SLAM+語音機器人DIY》QQ技術交流群,一起討論學習^_^

關於我們:

視頻教程:

 

https://www.bilibili.com/video/av61448040


免責聲明!

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



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