一、前言
本文詳細介紹了利用CMakeLists.txt文件把ROS項目導入到QtCreator進行代碼編寫和調試的過程,文末還介紹了ROS中使用Qt界面的方法
這種導入ROS項目到Qt的方法也適用於其他CMake創建的項目,這種方案缺點是導入項目後無法直接在Qt下面新建文件和package到項目,只能用命令行在Qt外面創建之後重新導入到Qt,最近得益於Levi-Armstrong等人的工作,他們開發了一個名爲ros_qtc_plugin
的Qt插件可以方便的導入、創建、編譯、調試ROS項目,博主認爲這是一個目前爲止最完美的解決方案,詳細請看博主的另一篇文章介紹:如何使用Qt插件在Qt中進行ROS開發。
本文所用操作系統爲Ubuntu 14.04 64位,Qt版本爲Qt5.5.1(Qt Creator3.5.1)
本文地址:http://blog.csdn.net/u013453604/article/details/52167213
參考:
ROS wiki IDEs
Qt App Templates
Write and Debug code for ROS with QtCreator
ROS: How to develop catkin packages from an IDE
二、創建Qt-ROS快捷方式
因爲Qt本身支持CMake項目,所以從終端啓動QtCreator是可以直接加載運行ROS相關項目的,如果你不想從終端啓動,那麼需要做一些設置來確保啓動QtCreator的同時加載ROS環境變量
這裏我們來創建一個啓動器(即桌面快捷方式):
點擊左上角Ubuntu標誌(或者按下Win鍵)搜索一個叫“啓動應用程序”的軟件,然後選擇“添加”創建一個啓動程序,如下圖
(1) 我將這個啓動器命名爲“Qt-ROS”,然後點擊“瀏覽”,選中Qt5.5.1/Tools/QtCreator/bin/
下的qtcreator可執行文件,然後“命令”欄會出現qtcreator可執行文件的絕對路徑
(2) 我們還需要在這行絕對路徑前面加一句bash -i -c
,用空格和後面的路徑隔開
(3) 然後點擊“添加”,這樣“額外的啓動程序”欄下就出現了名爲“Qt-ROS”的啓動器,用鼠標把它拖到桌面變成了一個桌面快捷方式,把它重命名爲“Qt-ROS”
(4) 右鍵選中它,“屬性”,在“基本”頁點擊名稱左邊的圖標可以設置自定義圖標,我將其設爲原來qtcreator的圖標,圖標地址在
/Qt5.5.1/Tools/QtCreator/share/qtcreator/welcomescreen/widgets/images/qtcreator.png
(5) 再到“權限”頁選中“允許作爲程序執行文件”
這樣qtcreator快捷方式方式就建好了,如下圖
用這個快捷方式打開ROS項目之後只需要在終端運行一個roscore
,就能開始運行或者調試代碼,並且在Debug模式下可以看到程序內部的許多變量,ROS調試再也不是問題啦
如果你不想那麼麻煩可以直接在桌面新建一個Qt-ROS.desktop
文件,然後把下面代碼複製進去
[Desktop Entry]
Exec=bash -i -c qtcreator %F
Icon=QtProject-qtcreator
Type=Application
Terminal=false
Name=Qt-ROS
GenericName=Integrated Development Environment
MimeType=text/x-c++src;text/x-c++hdr;text/x-xsrc;application/x-designer;application/vnd.nokia.qt.qmakeprofile;application/vnd.nokia.xml.qt.resource;
Categories=Qt;Development;IDE;
InitialPreference=9
其中的Exec Icon Name
不需要再修改,這個配置可以直接用
三、導入ROS項目到Qt
現在我們用前面創建的Qt-ROS.desktop
快捷方式打開Qt,開始導入ROS項目
1、導入單個package
如果你只想導入單個package進行調試請看這裏:
(1) 雙擊前面創建的Qt-ROS
快捷方式打開Qt
(2) “open project”或者“文件”——“打開文件或項目”,選擇catkin工作空間裏package包的CMakeLists.txt,如下圖
我的catkin工作空間是catkin_qtwstest,裏面有一個package叫test,test的CMakeLists.txt在catkin_qtwstest\src\test
下面
(3) 構建路徑中的“構建目錄”選擇catkin_qtwstest/build
,進入“下一步”
(4) “執行CMake”的步驟如下圖
如果需要Debug,填入參數-DCMAKE_BUILD_TYPE=Debug
;
如果不需要Debug,你想直接運行,填入參數-DCMAKE_BUILD_TYPE=Release
然後點擊“執行CMake”——“完成”,package成功導入到Qt
(5) 導入之後如下圖,可以看到src
下面有三個.cpp
文件,這是我寫的三個節點,在CMakeLists.txt裏我把它們分別編譯成三個可執行文件,名字不變
如果想運行這些節點需要在終端運行一個master,節點才能正常運行,執行命令:
$ roscore
Qt界面左下角有個小的電腦圖標“project all”,點擊它可以選擇運行的節點,如圖我選擇名爲“talker”的節點
點擊左下角綠色三角形可以運行,點擊帶爬蟲的綠色三角形可以進行調試
(6) 如下圖是運行時的情況
(7) 如果需要更改項目配置可以點擊Qt界面左側的“項目”,如下圖
在“構建”頁的“重新裝配項目”後面有一個“Run CMake…”點擊它可以如(4)更改編譯參數
(8) 在“項目”的“運行”頁可以修改一些環境變量,如下圖
(9) 如果想重新導入這個項目需要刪除catkin_qtwstest\src\test
下的CMakeLists.txt.user文件,然後按照上述操作重新導入
2、導入工作空間所有package
如果你想把一個catkin工作空間裏的所有package導入到Qt請看這裏:
(1) 我們要導入的工作空間名字叫catkin_qtws,它裏面有許多其他的package,進入工作空間根目錄catkin_qtws\src
我們可以看到工作空間的CMakeLists.txt是一個符號鏈接,如下圖
我們需要把它變成一個真正的CMakeLists.txt,執行如下命令
cd ~/catkin_qtws/src
sed -i '' CMakeLists.txt
然後你會發現catkin_qtws\src
下的CMakeLists.txt圖標變得和package裏面的一樣了
(2) 雙擊前面創建的Qt-ROS
快捷方式打開Qt
(3) “open project”或者“文件”——“打開文件或項目”,選擇catkin工作空間裏的CMakeLists.txt,如下圖
(4) 構建路徑中的“構建目錄”選擇catkin_qtws/build
,進入“下一步”
(5) “執行CMake”步驟如下圖
如果需要Debug,填入參數-DCMAKE_BUILD_TYPE=Debug
;
如果不需要Debug,你想直接運行,填入參數-DCMAKE_BUILD_TYPE=Release
然後點擊“執行CMake”——“完成”,package成功導入到Qt
(6) 導入之後如下圖,這裏面有很多我寫的package,這裏有一個叫odomframe_test.cpp
的文件是ROS wiki上的一個示例代碼,我們以這個odomframe_test節點爲例
如果想運行odomframe_test節點需要先在終端運行一個master,節點才能正常運行,執行命令:
$ roscore
Qt界面左下角有個小的電腦圖標“project all”,點擊它可以選擇運行的節點,如圖我選擇名爲“odomframe_test”的節點
點擊左下角綠色三角形可以運行,點擊帶爬蟲的綠色三角形可以進行調試
(7) 如下圖是調試odomframe_test節點的情況
(8) 如果想重新導入這個項目需要刪除catkin_qtws\src
下的CMakeLists.txt.user文件,然後按照上述操作重新導入
3、在ROS中使用QT界面
在終端可以直接用catkin_create_qt_pkg
命令創建帶Qt界面的ROS package,再按照前面說的方法導入到Qt即可
這裏參考的是qt_createTutorialsQt App Templates
(1) 要使用catkin_create_qt_pkg
命令需要安裝一個包,執行如下命令:
$ sudo apt-get install ros-indigo-qt-ros
這樣我就可以使用catkin_create_qt_pkg
命令創建一個名爲testgui的package
$ cd catkin_qtwstest/src/
$ catkin_create_qt_pkg testgui
如下圖
(2) 按照上述方式重新把catkin_qtwstest
工作空間導入到Qt中,如下圖
在左側的樹狀圖可以看到testgui下的目錄結構,自動生成的main.cpp
、main_window.cpp
、qnode.cpp
和main_window.ui
包含Qt界面的基本元素
(3) 要運行testgui節點先啓動一個roscore,如圖
$ roscore
然後點擊Qt左下角的綠色三角形運行testgui節點,如下圖
根據roscore的ROS_MASTER_URI
填寫UI界面上的ROS_MASTER_URI
,然後點擊“connect”,testgui節點開始在名爲/chatter
的topic上發送字符串如圖