学习笔记3--自定义数据类型
自定义话题数据类型msg文件
- 在本package文件夹下建立msg文件夹(与include、src同级),msg文件夹中编辑以.msg结尾的文件。文本中每行代表一个数据,先写数据类型,再写数据名称。
msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
在保存msg文件后,就可以在terminal中使用rosmsg show [package_name]/[msg_name]来查到新建的类型。若果msg文件中有语法错误,查找时就会提示错误。注释用#标识。
也就是说,rosmsg show并不是简单地把里面的内容显示出来,它还会对内容进行识别。
也可以直接用rosmsg show [msg_name],这样查找过程慢一点,但它会自己找到所属的包。
另外,rosmsg是到包内的msg文件夹下寻找msg文件,不放在此文件夹下则查询不到。
- 修改package.xml和CMakeLists.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
- 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文件使用方法类似
- 在本package文件夹下建立srv文件夹(与include、src同级),srv文件夹中编辑以.srv结尾的文件。文本中每行代表一个数据,先写数据类型,再写数据名称。srv文件的请求和反馈用”---”单独一行隔开,上面写请求,下面写反馈。请求是客户端发给服务器,反馈是服务器发给客户端。
请求(request)是一个总体,用”.”运算符取每一个数据。
反馈(response)相同。
srv可以使用的数据类型同msg。
在保存srv文件后,就可以在terminal中使用rossrv show [package_name]/[msg_name]来查到新建的类型。
此时,如果srv中的格式错误,则会提示错误。”---”一定要标准。
- 修改package.xml和CMakeLists.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(service、action)_files()之后
自定义动作数据类型action文件
与上两个文件使用方法类似
- 在本package文件夹下建立action文件夹(与include、src同级),action文件夹中编辑以.action结尾的文件。文本中每行代表一个数据,先写数据类型,再写数据名称。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,所以不会出错。
△注意,最好建立新类型之后先编译一下生成头文件,再添加源代码文件进编译,避免出现提示找不到头文件编译失败。