ROS Package 程式框架結構

2021-10-24 01:42:58 字數 4289 閱讀 8416

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開...