流程

1、在package中新建文件夹名为msg

2、在msg文件夹中创建消息(此处以my_msg.msg)为例,注意的是要以msg为后缀名

内容举例如下:

int32 data1
float64 date2

关于消息内容,需要注意的是如果类型错误,那么将不能生成头文件。例如float64写成了float,那么编译时将会出现错误:xxx.h: No such file or directory;而不会告诉你是哪里出错了,我曾经就遇到过这么坑的问题,所以这点需要注意。

3、修改CmakeList.txt 和package.xml

3.1、在package.xml中添加编译、运行依赖项

<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>

3.2、CmakeList.txt

find_package()中添加message_generation

find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
rospy
std_msgs
)

add_message_files()中添加my_msg.msg

add_message_files(FILES
my_msg.msg
)

generate_messages()添加std_msgs

generate_messages(DEPENDENCIES
std_msgs
)

catkin_package()添加message_runtime

catkin_package(
CATKIN_DEPENDS
message_runtime)

最后在add_executable(xxx src/xxx.cpp)后面添加一行

add_dependencies(xxx ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) #该项让编译器知道要注意编译顺序
target_link_libraries(xxx
${catkin_LIBRARIES}
)

否则仍可能生成不了my_msg.h头文件

如何使用?

1、包含头文件

#include<package_name/my_msg.h>

2、定义变量

package_name::my_msg msg
 

ROS 链接同一个工作空间的其他包的头文件

正确调用其他package头文件的方法如下:

1.在A_package包的package.xml中添加编译和运行的依赖库,如下:

<build_depend>B_package</build_depend>
<run_depend>B_package</run_depend>

2.在A_package包的CMakeList.txt中的find_package添加B_package如下:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs  B_package )
主要添加”B_package”,其他已有的package项不用添加

3.在A_package包的CMakeList.txt中的include_directories添加${catkin_INCLUDE_DIRS}如下:

include_directories(include ${catkin_INCLUDE_DIRS})

部分工程已经有该项,不用重复添加 4.此时在调用该头文件则不会出错
#include <B_package/testB.h>
自定义消息类型嵌套
当消息类型发生嵌套时,要包含被且套的消息的包
generate_messages(DEPENDENCIES
std_msgs
B_package )


 

ROS 自定义消息类型方法的更多相关文章

  1. ros自定义消息

    ros自定义消息可以根据自身项目需求定义和封装想要的数据类型和数据结构.具体可以参考维基百科关于ros自定义消息部分 这里我只是记录自定义消息的要点部分: 1.首先要在工作空间下功能包中创建一个msg ...

  2. Swift语言之类型方法

    Swift语言有很多特性,其中之一就是类型方法,相对于其他比较流行的编程语言(C#.Java),在Swift中类型方法最大的特征在于它的可继承性,我们举个例子说明: 俗话说,龙生龙凤生凤老鼠生儿会打洞 ...

  3. 深入学习golang(3)—类型方法

    类型方法 1. 给类型定义方法 在Go语言中,我们可以给任何类型(包括内置类型,但不包括指针和接口)定义方法.例如,在实际编程中,我们经常使用[ ]byte的切片,我们可以定义一个新的类型: type ...

  4. Swift编程语言学习12 ——实例方法(Instance Methods)和类型方法(Type Methods)

    方法是与某些特定类型相关联的函数.类.结构体.枚举都能够定义实例方法:实例方法为给定类型的实例封装了详细的任务与功能.类.结构体.枚举也能够定义类型方法:类型方法与类型本身相关联.类型方法与 Obje ...

  5. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  6. 线程系列07,使用lock语句块或Interlocked类型方法保证自增变量的数据同步

    假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量 ...

  7. java中Object转换成int或String类型方法

    转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof ...

  8. Java_无参数无返回类型方法及练习

    无参数无返回类型方法语法格式: public static void 方法名称(){ 方法体; } class Method03{ /*练习3:输出1-100中的每个数,要求使用无参无返回类型的方法完 ...

  9. DataTable 更改在有数据列的类型方法

    原文:DataTable 更改在有数据列的类型方法 /// <summary> /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改 ...

随机推荐

  1. 内网端口转发[SSH]

    一.应用场景 获取到目标边界机器linux服务器一台,想继而向内网其他机器渗透,获取到一台webshell发现处于内网当中且不通外网.可以通过linux ssh隧道对目标内网机器进行访问. 二.利用手 ...

  2. boost asio tcp 多线程

    common/pools.h // common/pools.h #pragma once #include <string> #include <boost/pool/pool.h ...

  3. 解决 php artisan route:list 报错oauth-private.key文件不存在或不可读的

    进入项目根目录命令行执行 php artisan passport:install 然后执行php artisan route:list,会提示 Class App\Http\Controllers\ ...

  4. H5调用百度地图导航

    template <div class="map"> <div class="content_flex"><img src=&qu ...

  5. ps切图的基本操作

    参考线和辅助线 ctrl+r呼出标尺,只有在移动工具(快捷键v)下,鼠标左键从标尺上可以拖出来新的参考线.将参考线拖回标尺即是删除. 导出切片 快捷键ctrl+alt+shift+s ,选择png-2 ...

  6. centos7构建kylo-0.10.1

      构建服务器使用centos7,8G内存.建议使用8G内存,因为内存不够失败了好几次. 系统需要提前安装一下组件: yum install -y gcc bzip2 rpm-build rpmdev ...

  7. NX二次开发-UFUN导入图框UF_PART_import

    NX11+VS2013 #include <uf.h> #include <uf_part.h> #include <uf_draw.h> #include < ...

  8. NX二次开发-查询信息窗口是否打开UF_UI_is_listing_window_open

    #include <uf.h> #include <uf_ui.h> UF_initialize(); //打开信息窗口 UF_UI_open_listing_window() ...

  9. Python 爬虫-抓取小说《盗墓笔记-怒海潜沙》

    最近想看盗墓笔记,看了一下网页代码,竟然不是js防爬虫,那就用简单的代码爬下了一节: """ 爬取盗墓笔记小说-七星鲁王宫 """ from ...

  10. 转-C/C++ new与malloc区别

    1.属性 new/delete是C++关键字,需要编译器支持.malloc/free是库函数,需要头文件支持. 2.参数 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计 ...