自定義話題數據類型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文件,不放在此文件夾下則查詢不到。
要生成自定義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
#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文件使用方法相似
請求(request)是一個整體,用」.」運算符取每個數據。
反饋(response)相同。
srv可使用的數據類型同msg。
在保存srv文件後,就能夠在terminal中使用rossrv show [package_name]/[msg_name]來查到新建的類型。
此時,若是srv中的格式錯誤,則會提示錯誤。」---」必定要標準。
除了添加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(service、action)_files()以後
自定義動做數據類型action文件
與上兩個文件使用方法相似
2.修改package.xml和CMakeLists.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()函數中添加actionlib和actionlib_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能夠同srv和msg同名,看下圖中
包名爲new_pkg,三個文件分別是my.msg,you.srv,my.action.
msg和srv創建過程是下面兩個語句
Built target _new_pkg_generate_messages_check_deps_my
Built target _new_pkg_generate_messages_check_deps_you
若是名稱同樣,將you.srv改成you.msg則出現如下問題
提示出現重複錯誤。
而my.action在編譯時會分紅七個東西,分別是myActionResult、myActionFeedback、myAction、myGoal、myResult、myActionGoal、myFeedback,而不會有單獨的my,因此不會出錯。
△注意,最好創建新類型以後先編譯一下生成頭文件,再添加源代碼文件進編譯,避免出現提示找不到頭文件編譯失敗。