• 学习笔记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,所以不会出错。

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

  • 相关阅读:
    转:Python 的 setup.py
    创建docker时把共享内存(share memory)设置的大一些
    coco数据集介绍
    pip install r e 什么意思
    COCO pretrained or ImangeNet pretrained ResNet and DLA models, Kinetics pretrained I3D
    把docker打包成镜像的命令
    转载:Pose Estimation:DensePose
    把字典或列表保存为json
    转:Shell中的$0、$1、$2的含义
    专利分为哪几类?企业申请专利需要哪些条件?
  • 原文地址:https://www.cnblogs.com/xuhaoforwards/p/9415220.html
Copyright © 2020-2023  润新知