學習筆記3--自定義數據類型

自定義話題數據類型msg文件服務器

  1. 在本package文件夾下創建msg文件夾(與includesrc同級),msg文件夾中編輯以.msg結尾的文件。文本中每行表明一個數據,先寫數據類型,再寫數據名稱。

msg文件實際上就是每行聲明一個數據類型和變量名。可使用的數據類型以下:函數

    int8, int16, int32, int64 (plus uint*)ui

    float32, float64spa

    stringssr

    time, duration3d

    other msg filesxml

    variable-length array[] and fixed-length array[C]blog

在保存msg文件後,就能夠在terminal中使用rosmsg show [package_name]/[msg_name]來查到新建的類型。若果msg文件中有語法錯誤,查找時就會提示錯誤。註釋用#標識。terminal

也就是說,rosmsg show並非簡單地把裏面的內容顯示出來,它還會對內容進行識別。get

也能夠直接用rosmsg show [msg_name],這樣查找過程慢一點,但它會本身找到所屬的包。

另外,rosmsg是到包內的msg文件夾下尋找msg文件,不放在此文件夾下則查詢不到。

  1. 修改package.xmlCMakeLists.txt文件

要生成自定義msg類型,須要添加message_generation依賴,能夠在用命令創建package的時候就添加依賴會自動在上面兩個文件出現。也能夠後續本身添加。

package.xml中添加:

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

CMakeLists.txt中添加:

find_package()函數中添加message_generation

添加add_message_files(

FILES

msg_name.msg

)

添加generate_messages(

DEPENDENCIES

std_msgs

)

catkin_package()中添加message_runtime

  1. cpp文件中使用自定義msg的方法

#include 「[package_name]/[msg_name].h」

注意此時是包含.h文件,不是包含.msg文件

這個.h文件在編譯後存在在catkin_ws/devel/include/[package_name]/[msg_name].h路徑下

在使用此類型的時候也須要加命名空間前綴 [package_name]::[msg_name]

4.就能夠編譯運行了。

 

 

 

自定義服務數據類型srv文件

msg文件使用方法相似

  1. 在本package文件夾下創建srv文件夾(與includesrc同級),srv文件夾中編輯以.srv結尾的文件。文本中每行表明一個數據,先寫數據類型,再寫數據名稱。srv文件的請求和反饋用」---」單獨一行隔開,上面寫請求,下面寫反饋。請求是客戶端發給服務器,反饋是服務器發給客戶端。

請求(request)是一個整體,用」.」運算符取每個數據。

反饋(response)相同。

srv可使用的數據類型msg

在保存srv文件後,就能夠在terminal中使用rossrv show [package_name]/[msg_name]來查到新建的類型。

此時,若是srv中的格式錯誤,則會提示錯誤。」---」必定要標準。

  1. 修改package.xmlCMakeLists.txt文件

除了添加add_message_files函數改成添加add_service_files,其餘相同

add_service_files(

FILES

srv_name.srv

)

3.cpp文件中使用自定義srv的方法,msg文件同樣

#include 「[package_name]/[srv_name].h」

注意此時是包含.h文件,不是包含.srv文件

這個.h文件在編譯後存在在catkin_ws/devel/include/[package_name]/[srv_name].h路徑下

在使用此類型的時候也須要加命名空間前綴 [package_name]::[srv_name]

4.編譯運行

 

 

 

注意:CMakeLists.txt中的順序不能變,好比generate_messages()必須在add_mesaage(serviceaction)_files()以後

 

 

自定義動做數據類型action文件

與上兩個文件使用方法相似

  1. 在本package文件夾下創建action文件夾(與includesrc同級),action文件夾中編輯以.action結尾的文件。文本中每行表明一個數據,先寫數據類型,再寫數據名稱。action文件用兩個」---」分隔開成三個部分:第一個部分是目標信息,客戶端發給服務器;第二個部分是結果信息,服務器發給客戶端;第三個部分是週期反饋信息,服務器發給客戶端

2.修改package.xmlCMakeLists.txt文件

package.xml中添加:

<build_depend>actionlib</build_depend>

<build_depend>actionlib_msgs</build_depend>

<exec_depend>actionlib</exec_depend>

<exec_depend>actionlib_msgs</exec_depend>

CMakeLists.txt中添加:

find_package()函數中添加actionlibactionlib_msgs兩項。

添加add_action_files(//可添加DIRECTORY文件夾選擇

FILES

action_name.action

)

添加generate_messages(

DEPENDENCIES

actionlib_msgs

)

catkin_package()中添加actionlib actionlib_msgs

3.cpp文件中使用自定義action的方法

#include 「[package_name]/[action_name].h」

這個.h文件在編譯後存在在catkin_ws/devel/include/[package_name]/[action_name].h路徑下

在使用此類型的時候也須要加命名空間前綴 [package_name]::[action_name]

4.編譯運行

 

action沒有指令在action文件創建好後就能夠進行查詢信息,action文件須要在編譯後編譯出各類msg文件。編譯出的位置爲catkin_ws/devel/share/[pkg_name]/msg/

編譯事後就能夠用rosmsg查詢到。

因此action是基於msg。而srv不會這樣。

 

再者,srv文件不能同msg文件同名,但action能夠同srvmsg同名,看下圖中

包名爲new_pkg,三個文件分別是my.msg,you.srv,my.action.

msgsrv創建過程是下面兩個語句

Built target _new_pkg_generate_messages_check_deps_my

Built target _new_pkg_generate_messages_check_deps_you

若是名稱同樣,將you.srv改成you.msg則出現如下問題

提示出現重複錯誤。

my.action在編譯時會分紅七個東西,分別是myActionResultmyActionFeedbackmyActionmyGoalmyResultmyActionGoalmyFeedback,而不會有單獨的my,因此不會出錯。

 

 

 

注意,最好創建新類型以後先編譯一下生成頭文件,再添加源代碼文件進編譯,避免出現提示找不到頭文件編譯失敗。

相關文章
相關標籤/搜索