QtCreator與catkin命令兩種方式開發ROS程序


最近學習無爲齋主的《機器人ROS開發實踐》的ROS編程部分,編譯運行遇到了一些麻煩,所以記錄下來,以免忘記和方便他人學習。
ROS編譯運行有兩種方式:1、用IDE開發工具Qt Creator來創建ROS程序;2、通過命令行使用catkin編譯工具創建ROS程序。首先介紹第一種方式。

一、Qt Creator安裝及開發ROS

1.安裝Qt Creator

本次試驗基於Ubuntu 18.04 LTS,Ubuntu系統庫自帶的qtcreator並沒有ROS插件,需要自己通過ppa方式安裝,網上多是基於14.04版本的,且較爲繁瑣,並不推薦。這裏要介紹的是帶有ROS插件的Qt Creator安裝,鏈接如下:
ros-qtc-plugin How to Install (Users)
官網有兩種安裝方式:在線和線下。在線安裝非常慢,只有十幾K,不推薦,建議線下安裝,使用Ubuntu的下載工具uGet+aria21,分分鐘搞定。
下載文件名爲qtcreator-ros-bionic-latest-offnline-installer.run,使用如下命令安裝:

mkdir /opt/QtCreator && cd /opt/QtCreator
mv ~/下載/qtcreator-ros-bionic-latest-offnline-installer.run /opt/QtCreator
sudo ./qtcreator-ros-bionic-latest-offnline-installer.run

彈出安裝界面,按鏈接中的步驟一步步走即可。

2.使用Qt Creator開發ROS

爲了開發ROS,首先需要創建工作空間,然後創建程序包,接下來根據需要編寫消息文件、服務文件,動作文件等資源文件,然後利用catkin_make編譯生成相應的編程語言目標文件,最後創建節點、launch文件、機器人模型等。
Qt Creator爲開發ROS程序提供了良好的代碼編輯、編譯、調試工具,在本小節中,我們將介紹如何利用Qt Creator開發一個名爲“Hello ROS”的基本節點。

1.創建工作空間

首先,打開QtCreator的“New Project”,並選擇“Other Project”,選擇“ROS Workspace”模板,如圖1所示:

圖1:選擇ROS Workspace創建項目圖1:創建ROS Workspace然後,設置項目名爲catkin_ws,設置工作空間路徑爲~/ros/catkin_ws,其中~代表當前用戶目錄。ROS版本默認選擇Melodic,編譯系統選擇CatkinMake,設置完成後點擊“下一步”。設置工程名和位置如圖2所示:

圖2:設置工程名和目錄圖2:設置工程名和目錄最後,設置GIT、SVN、CVS等版本控制系統,默認無。點擊“完成”按鈕即可完成工作空間的創建,如圖3所示:

圖3:設置子項目和添加版本控制圖3:設置子項目和添加版本控制
ROS會創建catkin_ws.workspace文件設定ROS版本和編譯系統,並創建src目錄和工作空間的CMakelists.txt文件,CMakelists.txt文件對catkin編譯系統進行了配置,如圖4:

圖4:ROS工作空間圖4:ROS工作空間

2.創建程序包

工程創建完之後,就可以創建程序包了。右鍵點擊圖4的src目錄,選擇“New File”創建程序包,在彈出的界面選擇ROS–>Package,然後點擊“Choose”,如圖5所示:

圖5:創建程序包Alt在彈出的窗口中,設置包名及路徑,默認爲src目錄,在所示的Catkin中添加依賴roscpp、rospy、std_msgs,依賴之間用逗號隔開,這意味着該程序包支持C++和Python兩種開發語言,並支持ROS標準消息輸出,最後點擊“Next”,如圖6所示:

圖6:設置程序報信息Alt最後彈出工作空間和版本控制界面,程序包“example_01”就會被添加到工作空間catkin_ws中,界面如圖7所示:

圖7:設置項目工作空間和版本控制
Alt點擊“完成”按鈕即可完成程序包的創建。創建完成後,ROS會自動地在相應的目錄下初始化生成CMakeLists.txt、Package.xml等文件和include、src等目錄。
然而,在QtCreator左側欄看不到新添加的包,但系統中已經存在相應的文件。個人猜測應該是QtCreator的bug。此時關閉工程,重新導入可解決。

3.創建節點

接下來創建節點,右鍵點擊程序包example_01下的目錄src,選擇“Add New”,QtCreator支持基本節點、發佈者節點、訂閱者節點、服務端節點、客戶端節點、launch文件、URDF文件等的創建,並提供了基本的模板。在此我們選擇“Basic Node”,點擊“Choose”(爲節省篇幅,不再重複截圖)。
在彈出的新建基本節點界面中,設置文件名爲hello.cpp,文件路徑默認爲/home/simon/ros/catkin_ws/src/example_01/src,如圖8所示:

圖8:設置節點名稱和路徑
alt點擊“下一步”按鈕作進一步配置,然後點擊“完成”將hello.cpp文件添加到程序包example_01中。
自動生成的hello.cpp文件僅對ROS進行初始化並創建了一個節點句柄,內容如下:

#include <ros/ros.h>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "hello");
  ros::NodeHandle nh;

  ROS_INFO("Hello world!");
}

接下來需要編輯文件example_01/CMakelists.txt(注意不要搞錯哦),配置可執行文件和目標鏈接庫,可鏈接到ros/ros.h,可執行文件名爲hello,內容如下:

//添加可執行文件
add_executable(hello src/hello.cpp)
//將可執行文件和庫文件鏈接
target_link_libraries(hello
    ${catkin_LIBRARIES}
)

4.編譯

節點創建好後,就可以編譯工作空間了。先點擊Qt Creator左邊欄下側的錘子按鈕編譯工作空間,然後點擊底邊欄的編譯輸出窗口“4 編譯輸出”查看結果,如下所示:

16:33:34: 爲項目catkin_ws執行步驟 ...
16:33:34: 正在啓動 "/opt/ros/melodic/bin/catkin_make" --cmake-args -G 'CodeBlocks - Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug

[100%] Built target hello
Base path: /home/simon/ros/catkin_ws
Source space: /home/simon/ros/catkin_ws/src
Build space: /home/simon/ros/catkin_ws/build
Devel space: /home/simon/ros/catkin_ws/devel
Install space: /home/simon/ros/catkin_ws/install
####
#### Running command: "cmake /home/simon/ros/catkin_ws/src -G CodeBlocks - Unix Makefiles -DCMAKE_BUILD_TYPE=Debug -DCATKIN_DEVEL_PREFIX=/home/simon/ros/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/simon/ros/catkin_ws/install" in "/home/simon/ros/catkin_ws/build"
####
####
#### Running command: "make -j4 -l4" in "/home/simon/ros/catkin_ws/build"
####
16:10:27: 進程"/opt/ros/melodic/bin/catkin_make"正常退出。
16:10:27: Elapsed time: 00:04.

注意事項:
(1) 若在編譯窗口產生錯誤提醒“Qt Creator needs a compiler set up to build. Configure a compiler in the kit options.”,則需要對C、C++進行編譯器配置(這是書作者的提醒,本人未出現)。點擊左側項目扳手圖標,在彈出界面點擊“Manage Kits…”,彈出以下界面,按圖9所示配置即可。

圖9:C/C++編譯器配置
在這裏插入圖片描述(2) 若在編譯窗口產生錯誤提醒: Could not start process “catkin_make” --cmake-args -G ‘CodeBlocks - Unix Makefiles’ Error while building/deploying project catkin_ws (kit: Imported Kit) When executing step “CatkinMake Step”。恭喜你,中獎了。當時找了一天才在ROS官方討論區找到解決辦法,ctrl+shift+t打開新終端,將目錄切換到當前工作空間~/ros/catkin_ws,執行以下命令:

catkin_make --cmake-args -G 'CodeBlocks - Unix Makefiles'

至於原因現在也沒想明白,總之執行完之後,以後就再也不會出現類似的錯誤。哪位小夥伴如果搞清楚原因別忘了在下邊留言告訴我, You will be welcome。

5.運行

如果編譯成功,則點擊Qt Creator界面左邊欄的扳手項目–>Run,然後在“Add Run Step”中選擇“ROS Run Step”,然後點擊“詳情”,Package選擇example_01,target選擇hello,同時也可以設置調試信息,debug方法同rosrun,配置界面如圖10所示:

圖10:添加節點運行及調試配置
alt然後在新建終端運行roscore啓動master節點,最後點擊Qt Creator界面左邊欄的Run按鈕運行hello節點。在底邊欄“8 ROS Terminal”中可看到如下輸出結果:

source ~/catkin_ws/devel/setup.sh
rosrun example_01 hello
Hello Wrold!

至此,使用Qt Creator開發第一個ROS程序就完成了,Qt Creator的可視化編譯僅是對ROS命令編譯的封裝。爲便於讀者理解ROS命令,下面繼續介紹如何利用ROS命令進行工作空間編譯。

二、使用catkin命令開發ROS程序

考慮到cmake具有的跨平臺優勢,因此catkin使用cmake作爲構建工具。cmake可根據CMakelists.txt爲不同的平臺生成makefile,然後make命令可根據makefile編譯出可執行文件。
catkin_make本質上是將cmake、make進行封裝後的編譯工具,它規範了編譯配置路徑和生成文件路徑等。catkin_make的編譯流程如圖1所示:

Created with Raphaël 2.2.0開始創建並初始化ROS工作空間創建程序包/程序包集(可選)在目錄src添加程序文件利用catkin_make編譯ROS工作空間利用catkin_make install安裝結束

下面就來介紹如何利用catkin命令進行編譯。

1.創建工作空間

用標準的mkdir命令行去創建一個工作空間,名字爲catkin_ws,還需要在工作區目錄中創建一個叫做 src 的子目錄。這個子目錄用於存放源代碼。而參數 “-p” 表示mkdir命令會自動創建不存在的目錄,然後使用catkin_init_worspace初始化工作空間,它僅創建一個指向cmake的文件的CMakelists.txt。
在終端命令中鍵入(打開終端的快捷鍵爲“Ctrl+Alt+T”)

mkdir -p ~/ros/catkin_ws/src
cd ~/ros/catkin_ws/src
catkin_init_worspace

2.創建程序包

通過ROS的命令catkin_create_pkg創建程序包,命名爲example_01,並依賴rospy、roscpp、std_msgs,方法如下:

cd ~/ros/catkin_ws/src
catkin_create_pkg example_01 rospy roscpp std_msgs

catkin_create_pkg創建了一個程序包目錄example_01,並在這個目錄下生成了兩個配置文件,分別爲清單文件package.xml和編譯文件CMakeLists.txt。
第一個配置文件,叫做 package.xml,稱爲清單文件。以及include、src目錄。

3.在目錄src添加程序文件

創建好程序包之後,在example_01/src目錄下通過VIM創建程序文件hello.cpp,內容如下:

#include <ros/ros.h>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "hello");
  ros::NodeHandle nh;

  ROS_INFO("Hello world!");
}

4.編譯配置CMakeLists.txt

首先,我們需要聲明程序所依賴的其他功能包。對於 c++程序而言,此步驟是必要的,以確保 catkin 能夠向 c++編譯器提供合適的標記來定位編譯功能包所需的頭文件和鏈接庫。爲了給出依賴庫,編輯包目錄下的 CMakeLists.txt 文件。
CMakeLists.txt定義了編譯配置,包括ROS對cmake的最低要求、編譯依賴的程序包、消息文件、服務文件、動作文件和頭文件等,還定義了編譯輸出的可執行文件、目標鏈接庫、安裝輸出、單元測試等。添加內容如下:

cmake_minimum_required(VERSION 2.8.3)
project(example_01)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(hello src/hello.cpp)

target_link_libraries(hello
    ${catkin_LIBRARIES}
)

5.程序包配置package.xml

package.xml定義了程序包配置,如名稱、版本、維護者、編譯依賴、執行依賴等。依賴庫通過使用編譯依賴build_depend和運行依賴exec_depend兩個關鍵字實現。具體內容如下:

<?xml version="1.0"?>
<package format="2">
  <name>example_01</name>
  <version>0.1.0</version>
  <description>example_01 desc</description>
  <maintainer email="[email protected]">simon</maintainer>
  <license>Apache 2.0</license>
  <author >simon</author>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
  <export>
  </export>
</package>

6.利用catkin進行編譯安裝

利用catkin_make這個命令進行編譯,注意必須從你的工作空間目錄運行。默認情況下,catkin_make會編譯整個工作空間中的程序包。catkin_make支持Debug、Release、RelWtihDebInfo、MinSizeRel等編譯模式,默認爲Debug模式。
如果代碼量大,編譯緩慢,可以通過變量ROS_PARALLEL_JOBS指定編譯的CPU核數量,默認爲在4個CPU核上啓動4個任務,在8個CPU核上啓動8個任務進行並行編譯,方法如下:

cd ~/ros/catkin_ws/src
export ROS_PARALLEL_JOBS='-j8 -l8'
catkin_make

當編譯通過後,可以通過install命令完成程序包的安裝,默認安裝在catkin_ws/install目錄,也可以通過變量CMAKE_INSTALL_PREFIX顯示指定目錄,方法如下:

catkin_make -D CMAKE_INSTALL_PREFIX=/home/simon/melodic install

7.運行

首先要啓動 roscore,程序是一個節點,節點需要一個節點管理器纔可以正常運行。啓動節點管理器方法如下,使用快捷鍵ctrl+shift+T打開終端,輸入命令:

roscore

啓動完節點管理器後,然後再打開一個終端,執行名爲 setup.bash 的腳本文件,它是catkin_make在工作區的 devel 子目錄下自動生成的。最後輸入運行命令即可:

cd ~/ros/catkin_ws/
source devel/setup.sh
rosrun example_01 hello

這個自動生成的腳本文件設置了若干環境變量,從而使 ROS 能夠找到你創建的功能包和新生成的可執行文件(也就是將程序註冊)。

注意:除非目錄結構發生變化,否則你只需要在每個終端執行此命令一次,即使你修改了代碼並且用 catkin_make 執行了重編譯。

注意:此命令必須在你的工作空間目錄運行,否則會出現“沒有那個文件或目錄”。

至此,使用catkin命令開發ROS程序完成,有問題歡迎留言區討論。

參考:
1.《機器人ROS開發實踐》第三章,開發ROS,無爲齋主編著。
2.編寫第一個ROS(創建工作空間workspace和功能包package)


  1. uGet+aria2 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章