学习笔记3--自定义数据类型

自定义话题数据类型msg文件

  1. 在本package文件夹下建立msg文件夹(与includesrc同级),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文件,不放在此文件夹下则查询不到。

  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,所以不会出错。

 

 

 

注意,最好建立新类型之后先编译一下生成头文件,再添加源代码文件进编译,避免出现提示找不到头文件编译失败。

 

posted @ 2018-08-03 17:08  许氏Forwards  阅读(341)  评论(0编辑  收藏  举报