ros 的程式設計教程雖然詳細但是有些零散,總結一下編寫的ros程式的程式框架結構,參考資料會放在後面。
假設我們要編寫乙個這樣的ros package:
有乙個c++的lib庫 liba,可以提供給其他包和自己使用
有在package中自定義的message,msga,
有乙個c++結點 node1,依賴於本package中自定義的msga和liba,以及外部的庫
有乙個python module,pymoda ,可以提供給其他包使用
有乙個python 的指令碼 pynodea,可以通過rosrun和roslaunch進行執行,依賴於moda
整個package的檔案目錄結構如下
.├── cmakelists.txt
├── include
│ ├── liba
│ │ └── liba.h
│ └── nodea
│ └── nodea_class.h
├──launch
│ └── test.launch
├── msg
│ └── msga.msg
├── nodes
│ └── nodea.cpp
├── package.xml
├── script
│ └── pynodea_pub.py
├── setup.py
├── src
│ ├── liba
│ │ └── liba.cpp
│ ├── nodea
│ │ └── nodea_class.cpp
│ ├── pymoda
│ │ ├── hello.py
│ │ └── __init__.py
│ └── pymodb
│ ├── hello.py
│ └── __init__.py
└── tree.txt
下面來詳細的進行各個部分的介紹
include資料夾主要存放建立的lib以及和node相關的標頭檔案的路徑,為了結構清晰,在include資料夾下面建子目錄來存放相關檔案,比如liba和nodea兩個資料夾
存放自定義的message
存放可執行的node的c++檔案
存放python的可執行指令碼
存放lib的原始檔以及c++可執行檔案的原始檔
根據 ros rospy 教程中所說,setup.py可以使得你的project中的python指令碼使用你在該project中自定義的包,比如上面pynodea_pub.py可以使用pymoda和pymodb中的函式,在pynodea_pub檔案中只需要新增
import pymoda
import pymodb
需要對cmake檔案進行相應的修改,後面會進行介紹,注意setup.py檔案要和package的cmakelist檔案在同一目錄下,setup.py檔案主要就是給cmake使用的配置檔案
其他參考資料:ros handling of setup.py
這個檔案是最最重要的,接下來會詳細的介紹cmakelist的結構和引數
首先ros 的package的編譯有兩種模式,一種直接使用catkin_make ,這是develop模式,生成devel資料夾,一種是使用catkin_make install , 安裝package,這個主要是為了你的包給別人使用。那麼我們就分兩種模式來看
首先可以明確使用這個命令在devel資料夾裡面能夠得到哪些:
include 資料夾下的包名目錄下只有msga.h乙個檔案
lib資料夾下的包名目錄下有可執行檔案nodea,以及動態鏈結庫liba.so,但是沒有liba.h這個標頭檔案
lib/python/dist-packages目錄下有包目錄package/,裡面有msg/目錄,存放所有的生成的msg的python model. python的module目錄pymoda/和pymodb/
你在project裡面可以直接使用:
# 對c++ 原始檔,可以使用
# include "nodea/nodea_class.h"
# include "liba/liba.h"
# include "package/msga.h"
# 對 python 指令碼,可以
import pymoda
import pymodb
from package.msg import msga
想要實現這些,cmakelist檔案的對應語句如下:
1.首先是生成訊息模板的部分,直接參考 ros creatingmsgandsrv
2.生成了訊息之後,要使得其能夠在project內部使用,所以cmakelist檔案中有
include_directories(
include $ # 將標頭檔案include進去
)
3.生成lib和可執行檔案
add_library(liba src/liba/liba.cpp)
target_link_libraries(liba
$)add_dependencies(liba $_exported_targets} $)
file(glob_recurse source_files src/*.cpp) # 抓取子目錄對應原始檔,我這裡用到了src 裡面的所有
add_executable(nodea
nodes/nodea.cpp $ # add all relative cpp files
)add_dependencies(nodea $_exported_targets} $)
target_link_libraries(nodea
liba
$)
這裡面除了帶有我們自己命名的那些是自定義之外,其餘都是預設的值,一般不需要進行改動
寫了這些語句,那麼catkin_make基本沒問題了,如果想要其他包使用,要進行install,下面還有補充的幾點注意:
這個主要得到install資料夾,這個和devel資料夾幾乎乙個結構模式,不同的是裡面的內容比devel資料夾多的多。
install資料夾中主要有
1.include 資料夾的package目錄下有msga.h,liba資料夾和nodea資料夾,分別存放liba.h和nodea.h
2.lib/package資料夾下有可執行檔案nodea以及pynodea_pub.py可執行指令碼
3.lib/python/dist-packages目錄下和devel相同
cmakelist檔案中的相應的引數設定如下
## mark executable scripts (python etc.) for installation
## in contrast to setup.py, you can choose the destination
install(programs # python 可執行指令碼
script/pynodea_pub.py
destination $
)## mark executables for installation
## see
install(targets nodea # 可執行檔案
runtime destination $
)## mark libraries for installation 庫檔案
## see
install(targets liba
archive destination $
library destination $
runtime destination $ # .so
)## mark cpp header files for installation 標頭檔案
install(directory include/
destination $
files_matching pattern "*.h"
pattern ".svn" exclude
)# launch 檔案
install(directory launch/
destination $/launch
pattern ".svn" exclude)
執行完catkin_make install 之後,會在工作空間目錄得到install 資料夾,當你需要在其他地方使用是,使用source install/setup.bash 黑馬程式設計師 foundation框架中的結構體
ios培訓 android培訓 期待與您交流!foundation框架中常見的結構有四種 nsrange nspoint cgpoint nssize cgsize nsrect cgrect 如果想要使用foundation框架中的所有結構體,要在檔案的開始 import。nsrange的結構體形...
Weex 框架中 JS Framework 的結構
weex 具有移動端跨平台的特性,js framework 是其中比較關鍵的一層。首先來看一下 js framework 在 weex 中的位置 從圖中可以看出 weex 整體的工作流程。首先開發者可以宣告式的定義元件,形成.we檔案,通過 weex toolkit 提供的工具將.we檔案轉為 js...
Scrapy框架快速建立專案命令 框架的結構
scrapy在爬蟲開發領域是非常不錯的一款框架,如果要從事爬蟲開發那麼這款框架一定要非常熟悉,儘管在實際開發中可能用不上,但是其中的架構思想也能讓自己寫的爬蟲質量有不一般的提公升。scrapy框架應該掌握的幾條命令 cmd命令列介面執行 scrapy shell url 該條命令常用於scrapy開...