一、前言
本文介紹一種Qt下進行ROS開發的完美方案,使用的是ros-industrial的Levi-Armstrong在2015年12月開發的一個Qt插件ros_qtc_plugin,這個插件使得Qt“新建項目”和“新建文件”選項中出現ROS的相關選項,讓我們可以直接在Qt下創建、編譯、調試ROS項目,也可以直接在Qt項目中添加ROS的package、urdf、launch,感謝Levi-Armstrong。目前這個插件還在不斷完善,有問題或者其他功能建議可以在ros_qtc_plugin的項目主頁的討論區提出。
本文是用的操作系統是ubuntu kylin 14.04中文版,ROS版本是indigo,Qt版本是Qt5.5.1(Qt Creator 4.0.3)
本文地址:http://blog.csdn.net/u013453604/article/details/52186375
視頻教程:ros_qtc_plugin插件作者Levi-Armstrong錄製的插件使用教程
參考:
ROS wiki IDEs
1. Setup ROS Qt Creator Plug in
2. Setup Qt Creator for ROS
3. Debugging Catkin Workspace
4. Where to find Qt Creator Plug in Support
github ros-industrial/ros_qtc_plugin項目主頁
插件使用問題
2016-8-18更新:
- apt方式安裝
Levi-Armstrong更新了他的插件安裝方式,現在你可以添加他的源直接用apt-get方式安裝,請見第五部分的補充
如果apt-get方式方式下載過程太慢的話還是按照下文的方式安裝吧
博主建議採用apt-get方式安裝,不容易出錯 - 頭文件包含的問題
補充了ros相關頭文件的包含配置
2017-10-28更新:
1.項目wiki地址更新(需要翻牆)
2. apt方式安裝
二、安裝插件ros_qtc_plugin
插件要求Qt 5.5.0以上的版本,下載Qt 5.7.0請到
Qt Offline Installers
Qt 5.7.0 for Linux 64-bit (715 MB) (info)
國內可以從以下源高速下載:
中國科學技術大學
清華大學
北京理工大學
下載下來的qt-opensource-linux-x64-5.7.0.run
記得右鍵“屬性”——“權限”勾選“允許作爲程序執行文件”,再雙擊就能安裝了
1、修改系統配置文件讓Qt啓動器選擇新版的Qt Creator
首先需要修改下面的文件目的是讓Qt的啓動器選擇新版的Qt Creator,我原本安裝的Qt是Qt5.5.1(Qt Creator 3.0.1),然後後面安裝插件的腳本幫我下載了最新版的Qt Creator 4.0.3,花了好長時間下載
$ sudo gedit /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf
打開文件看到的是下面兩行
/usr/lib/x86_64-linux-gnu/qt4/bin
/usr/lib/x86_64-linux-gnu
我們需要把它們替換成如下兩個路徑
/home/zjl/Qt5.5.1/5.5/gcc_64/bin
/home/zjl/Qt5.5.1/5.5/gcc_64/lib
注意/home/zjl
是我的主文件夾絕對路徑
後面的路徑是從Qt安裝目錄下面進入5.5/gcc_64/
找到bin
和lib
文件夾,用這兩個文件夾路徑替換掉default.conf
文件原來的兩行就是了,我安裝Qt的時候選擇安裝在主文件夾的Qt5.5.1下,並且我的Qt版本是5.5,所以路徑如上所示,安裝到其他地方或者其他版本的類似
遇到報錯請看下面:
這個插件對Qt的版本要求是最低Qt 5.5.0,如果你的Qt版本過低請安裝新版本。
如果多個Qt版本共存,而你修改上述文件仍無法進行編譯,報錯有類似下面的
make: *** 沒有規則可以創建目標“clean”。 停止。
Project MESSAGE: Cannot build Qt Creator with Qt version 5.2.1.
Project ERROR: Use at least Qt 5.5.0.
make: *** 沒有指明目標並且找不到 makefile。 停止。
那麼你就要到/usr/lib/x86_64-linux-gnu/
下看看到底有幾個qtchooser
了,博主有臺電腦曾經是Qt5.2.0,然後卸載,重裝了Qt5.7.0,結果上述腳本里面的cd $QTC_BUILD && qmake $QTC_SOURCE/qtcreator.pro -r
這行一直過不了,原因是qtcreator.pro
裏面設置了版本檢查,而Qt選擇器選擇的一直是Qt5.2.0,上述修改沒有起到作用,我到/usr/lib/x86_64-linux-gnu/
下面查看發現兩個地方有qtchooser
/usr/lib/x86_64-linux-gnu/qtchooser/default.conf
和
/usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf
於是我把另一個qtchooser
下面的default.conf
也做了上述修改,即
$ sudo gedit /usr/lib/x86_64-linux-gnu/qtchooser/default.conf
把裏面的內容修改爲
/home/zjl/Qt5.7.0/5.7/gcc_64/bin
/home/zjl/Qt5.7.0/5.7/gcc_64/lib
2、運行Qt Creator配置腳本
下載這個腳本setup.sh (你可以右鍵“另存爲”來下載它),我把它放在了主目錄/home/zjl
下,那麼cd
到該位置執行以下命令來運行它
$ cd ~
$ bash setup.sh -u
這裏$ bash setup.sh -u
命令前面不需要加sudo
否則編譯過程中新建的文件夾和桌面的Qt快捷方式都屬於root用戶,不用命令行你是無法修改和刪除的。。。。
期間腳本從github下載一個新版的Qt Creator源碼並重新編譯花了好長時間,下載速度只有10kb/s,只好讓它下載一晚上。。。期間如果網絡斷開導致下載中斷你還得再運行一次,再等好久,可以從官網下載最新的Qt Creator 4.0.3源碼,具體請看下面的說明
值得注意的是這個腳本中有個路徑需要根據實際情況修改,如果你的ubuntu是英文版可以不用管,如果你是中文版的系統,你的桌面文件夾名字不是Desktop
而是桌面
的話你就要修改setup.sh
文件中的第84行,原文是
rm -f $HOME/Desktop/QtCreator.desktop
ln -s $DESKTOP_FILE $HOME/Desktop/QtCreator.desktop
改成
rm -f $HOME/桌面/QtCreator.desktop
ln -s $DESKTOP_FILE $HOME/桌面/QtCreator.desktop
我修改過的腳本可以在這裏下載
這樣它就會在桌面生成一個名爲QtCreator.desktop
的快捷方式,你用這個快捷方式打開Qt就可以正常使用ros_qtc_plugin插件了
下載QtCreator太慢請看下面:
腳本中是從github下載90MB的QtCreator最新版源碼,國內訪問github網速太慢,可以從
Qt官網下載Qt Creator 4.0.3的源碼壓縮包qt-creator-opensource-src-4.0.3.tar.gz (21 MB)(還有其他源)
下載下來之後解壓得到101MB的qt-creator-opensource-src-4.0.3
文件夾,將其改名爲qt-creator
,放在qtc_plugins文件夾下(qtc_plugins與腳本setup.sh處於同一級目錄),重新執行腳本即可
“文件”——“新建文件或項目”你會看到如下界面
三、使用ros_qtc_plugin插件新建項目
使用插件的“新建項目”中的“Import ROS Workspace”選項不僅可以新建工作空間還可以導入現有的工作空間,而“新建文件”中的“ROS”下面的“Package”、“Basic Node”等選項可以創建package和和節點、launch文件、urdf文件等
現在我們來創建一個新的catkin工作空間,並且在裏面創建一個package
1、新建項目
“文件”——“新建文件或項目”,選擇”Import ROS Workspace”——“choose”如上圖
然後填寫catkin工作空間的名字和位置,如下圖
我這裏的Name和catkin工作空間文件夾名字相同(也可以不同)名爲catkin_new
,然後選擇“瀏覽”——“創建文件夾”,創建一個名爲catkin_new
的文件夾,如下圖,按回車,再選擇“打開”
出現一個對話框,詢問新建的工作空間未被初始化,是否執行初始化,我們選擇“yes”
這裏相當於執行一次catkin_init_workspace
命令,使工作空間初始化
然後點擊下方的“Generate Project File”,再點擊“下一步”
在“項目管理”步驟可以配置版本控制系統,我們選擇“完成”,如下圖
建好的工作空間catkin_new
是空的,如下圖
2、創建package
接下來我們在這個工作空間創建一個新的package
在catkin_new
下面的src
上右鍵單擊,選擇“添加新文件”,如下圖
然後選擇“ROS”——“package”——“choose”
填寫package的名字,如test1
填寫作者(Authors)和維護者(Maintainers),如果你的Qt環境部沒有配置中文支持請不要用中文,否則無法新建package,或者新建的package裏面的package.xml
會是空文件
在“Dependencies”下的“Catkin”一欄填寫依賴,通常用C++寫節點需要添加對roscpp
的依賴
如下圖
點擊“完成”
3、添加新的節點
目前這個package還是空的,沒有任何節點
我們在test1的src文件夾上右鍵單擊,選擇“添加新文件”
選擇“ROS”——“Basic Node”——“choose”,創建一個節點,也就是新建一個.cpp
文件
節點名稱寫爲“node1”,則生成一個名爲node1.cpp
的源文件
用ROS模板新建的node1.cpp
的源文件如下圖,是自動生成的一個Hello World
程序
4、編譯節點
爲了讓它編譯成可執行文件我們還需要編輯test1的makefile,如下圖
爲test1的CMakeLists.txt
加上下面幾行,意思是把node1.cpp
編譯成名爲node1
的節點
add_executable(node1 src/node1.cpp)
target_link_libraries(node1
${catkin_LIBRARIES}
)
提醒
值得注意的是上面幾行需要放在include_directories
後面,在構建項目的時候纔會在catkin_new/devel/lib/test1
裏面生成可執行文件node1.exe
,這樣後面進行“運行配置”的時候test1
包下面纔會出現node1
節點;
如果把上面幾行放在include_directories
前面會使得構建過程直接在catkin_new/build/test1
下面生成可執行文件node1.exe
,而devel
文件夾下找不到可執行文件,導致後面選擇運行節點的時候不會出現這個節點
修改完CMakeLists.txt
之後點擊Qt左下角的錘子圖標“構建項目catkin_new”,點擊底邊欄的“4 編譯輸出”可以看到編譯結果,如下圖
5、運行節點
如果你想運行某個節點還需要修改運行配置,點擊左側蘭的“項目”,在“構建設置”頁的“編輯構建配置”一欄選擇“Default”,然後在下圖所示光標處點擊切換到“運行設置”頁,可以看到一個“Add Run Step”的選項,點擊出現一個“ROS Step”配置項,可以通過下拉菜單選擇package和target(就是該package下的節點),下拉菜單可以通過鍵入首字母初步定位到你要找的package位置
“Add Run Step”的選項其實也是一個下拉菜單,可以選擇“Add Launch Step”的選項運行launch文件
配置好如圖,點擊Qt左下角的小電腦圖標,選擇“Default”的構建配置,再點擊Qt左下角的綠色三角形即可運行“運行設置”頁下面配置好的所有Step
運行結果可以點開底邊欄的“ROS Terminals”查看,如下圖,
打印了一句
[ INFO] [1470932511.713873863]: Hello world!
如果沒有“ROS Terminals”,可以在下圖鼠標所在位置底邊欄有兩個上下三角形的地方打開“ROS Terminals”窗口
四、ROS界面開發
結合我另一篇博客的內容在ROS中使用QT界面
我們可以使用catkin_create_qt_pkg
命令在工作空間創建好一個帶GUI的ROS package,然後用ros_qtc_plugin插件的“Import ROS Workspace”功能導入這個這個package所在的工作空間,然後可以看到如下圖所示
我用 catkin_create_qt_pkg
命令創建的package名爲testgui
,它包含一個自動生成的界面文件和相應的節點,你可以在左側欄雙擊main_window.ui
文件然後在“設計”頁面編輯UI界面,我在自動生成的頁面上添加了一個空的按鈕名爲“PushButton”,然後配置“運行設置”運行testgui
的testgui
節點,可以看到如下圖界面,點擊界面上的“connect”按鈕,節點就會在/chatter
話題上不斷髮送字符串,然後在界面上顯示出來
五、補充
2016-8-18更新:
1、apt-get方式安裝
Levi-Armstrong更新了他的插件安裝方式,現在你可以添加他的源直接用apt-get方式安裝
Ubuntu 14.04:
sudo add-apt-repository ppa:levi-armstrong/qt-libraries-trusty
sudo add-apt-repository ppa:levi-armstrong/ppa
sudo apt-get update && sudo apt-get install qt57creator-plugin-ros
如果你以前使用過舊的軟件源以下命令可以刪除它們
sudo add-apt-repository --remove ppa:beineri/opt-qt57-trusty
sudo add-apt-repository --remove ppa:beineri/opt-qt571-trusty
或者嘗試以下命令刪除
sudo rm /etc/apt/sources.list.d/beineri-opt-qt57-trusty-trusty.list
sudo rm /etc/apt/sources.list.d/beineri-opt-qt571-trusty-trusty.list
Ubuntu 16.04
sudo add-apt-repository ppa:levi-armstrong/qt-libraries-xenial
sudo add-apt-repository ppa:levi-armstrong/ppa
sudo apt-get update && sudo apt-get install qt57creator-plugin-ros
刪除舊的軟件源請運行
sudo add-apt-repository --remove ppa:beineri/opt-qt57-xenial
sudo add-apt-repository --remove ppa:beineri/opt-qt571-xenial
安裝完之後“文件”——“新建文件或項目”看看有沒有ROS相關的選項吧
2017-10-28更新:
Ubuntu 16.04
sudo add-apt-repository ppa:levi-armstrong/qt-libraries-xenial
sudo add-apt-repository ppa:levi-armstrong/ppa
sudo apt update && sudo apt install qt57creator
sudo apt install qt57creator-plugin-ros
2、頭文件包含的問題
菜單欄“文件”——“Reload Project Build Info ···”可以更新文件狀態,如果某些頭文件添加之後IDE提示找不到,而你能確定頭文件確實存在,那麼你可以放心編譯,之後IDE可以找到頭文件並提供代碼補全和提示功能。
用插件創建或導入ROS package之後還需要修改.workspace
文件,如下圖
在<IncludePaths>
標籤下加入下面這行
<Directory>/opt/ros/indigo/include</Directory>
這樣就可以使得Qt找到ros頭文件,比如<ros/ros.h>
如下圖,頭文件包含語句不再提示找不到文件,輸入ros相關函數可以自動補全
如果添加了上述路徑仍提示找不到ros頭文件,你可以保存之後重新打開該項目,博主某臺電腦的Qt就是不能實時更新工作空間的文件變化真是憂傷,不過其他電腦都能實時更新文件狀態,不用重新打開項目
3、模塊找不到的問題
使用上面的命令行安裝qt57及ROS插件之後發現Qt某些模塊的名字變了,需要加qt57前綴,比如Qt的模塊:
按照官網Qt Serial Port的說法只要在.pro
文件加上
QT += serialport
然後頭文件包含
#include <QtSerialPort/QtSerialPort>
就可以用串口模塊了
如果遇到如下報錯
Project ERROR: Unknown module(s) in QT: serialport
需要安裝libqt5serialport5-dev
:
sudo apt install libqt5serialport5-dev
如果上述libqt5serialport5-dev
無法安裝,提示依賴錯誤,我們可以安裝qt57serialport
sudo apt install qt57serialport
之後再像之前那樣調用serialport
模塊即可:
QT += serialport
#include <QtSerialPort/QtSerialPort>
另外可以用apt-cache search
命令查看軟件源中可供安裝的相關包的名字
apt-cache search serialport