学习笔记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,因此不会出错。

 

 

 

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

相关文章
相关标签/搜索