自定义话题数据类型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,因此不会出错。
△注意,最好创建新类型以后先编译一下生成头文件,再添加源代码文件进编译,避免出现提示找不到头文件编译失败。