自定义消息一般存储在功能包的msg文件夹下的.msg文件中,这些定义可告诉ROS这些数据的类型和名称,以便于在ROS 节点中使用。添加完这些自定义消息后,ROS会将其转为等效的C++节点,从而可在其他节点中使用。

1、编写msg文件

  自定义消息必须在.msg文件中编写且保存在功能包的msg文件夹中。在上一节<ROS-4
: ROS节点和主题>创建的功能包ros_demo_pkg下创建文件夹msg,并在其中添加文件demo_msg.msg,该文件内容为:

string greeting

int32 number

2、修改package.xml文件

  由于自定义消息需要依赖于其他功能包,所以在功能包ros_demo_pkg的package.xml文件中添加或uncomment以下行:

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

3、修改CMakeList.txt文件

  编辑该功能包的CMakeList.txt文件,添加message_generation:

  find_package(catkin REQUIRED COMPONENTS)
    roscpp
    rospy
    std_msgs
    actionlib
    actionlib_msgs
    message_generation
)

  添加自定义的message文件:

    add_message_files(
    FILES
    demo_msg.msg
  )   ## Generate added messages and services with any dependencies listed here
  generate_messages(
    DEPENDENCIES
    std_msgs
    actionlib_msgs
  )

4、编译并构建该功能包

$ cd ~/catkin_ws

$ catkin_ws

5、验证自定义消息

  使用以下命令验证是否成功构建自定义消息:

$ rosmsg show ros_demo_pkg/demo_msg

6、使用自定义消息

  在功能包ros_demo_pkg中,创建使用该自定义消息的publisher和subscriber节点,分别为msg_pubsher.cpp和msg_subscriber.cpp,保存在该功能包的src文件夹中。其中msg_publisher.cpp的代码如下:

#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include "ros_demo_pkg/demo_msg.h"
#include <iostream> using namespace std; int main(int argc, char **argv)
{
//Initializing ROS node with a name of demo_topic_publisher
  ros::init(argc, argv,"msg_publisher");
  //Created a nodehandle object
  ros::NodeHandle node_obj;

  //Create a publisher object
  ros::Publisher number_publisher = node_obj.advertise<ros_demo_pkg::demo_msg>("/msg_topic",);   ros::Rate loop_rate();
  int number_count = ;   //While loop for incrementing number and publishing to topic /numbers
  while (ros::ok())
  {
    //Created a Int32 message
    ros_demo_pkg::demo_msg msg;
    //Inserted data to message header
    string ss="hello world ";
    msg.greeting = ss;
    msg.number = number_count;

    //Printing message data
    ROS_INFO("%d",msg.number);
    ROS_INFO("%s",msg.greeting.c_str());     //Publishing the message
    number_publisher.publish(msg);
    //Spining once for doing the all operation once
    ros::spinOnce();
    //Setting the loop rate
    loop_rate.sleep();
    //Increamenting the count
    ++number_count;
  }
  return ;
}

  而msg_subscriber.cpp的代码如下:

#include "ros/ros.h"
#include "ros_demo_pkg/demo_msg.h"
#include <iostream> void number_callback(const ros_demo_pkg::demo_msg::ConstPtr& msg)
{
  ROS_INFO("Recieved greeting [%s]",msg->greeting.c_str());
  ROS_INFO("Recieved [%d]",msg->number);
} int main(int argc, char **argv)
{
  //Initializing ROS node with a name of demo_topic_subscriber
  ros::init(argc, argv,"msg_subscriber");
  //Created a nodehandle object
  ros::NodeHandle node_obj;
  ros::Subscriber number_subscriber = node_obj.subscribe("/msg_topic",,number_callback);
  //Spinning the node
  ros::spin();
  return ;
}

  接下来修改该功能包的CMakeList.txt文件,添加以下行:

add_executable(msg_publisher src/msg_publisher.cpp)

add_executable(msg_subscriber src/demo_msg_subscriber.cpp)

add_dependencies(msg_publisher ros_demo_pkg_generate_messages_cpp)

add_dependencies(msg_subscriber ros_demo_pkg_generate_messages_cpp)

target_link_libraries(msg_publisher ${catkin_LIBRARIES})

target_link_libraries(msg_subscriber ${catkin_LIBRARIES})

  然后编译并构建该功能包,在终端分别启动roscore、自定义消息发布节点和自定义消息订阅节点:

$ roscore

$ rosrun ros_demo_pkg msg_publisher

$ rosrun ros_demo_pkg msg_subscriber

  可看到发布者发布一个字符串和一个整数,订阅者节点订阅该topic并打印信息。

  使用rqt_graph可查看主题msg_topic的连接关系:

7、总结

  在ROS
nodes中使用自定义节点包括以下几个步骤:

1.
在功能包的msg文件夹下定义消息的.msg文件;

2.
修改功能包的package.xml和CMakeList.txt文件,添加依赖项和构建信息;

3.
编译并构建功能包,生成自定义消息节点;

4.
在需要使用该自定义消息的节点代码中添加该消息头文件,如
#include “ros_demo_pkg/demo_msg.h”。

ROS-5 : 自定义消息的更多相关文章

  1. ros中自定义消息 报错 ImportError: No module named em

    大家好,欢迎来到我的博客,之前写的都是比较松散的,鉴于工作的原因,之后的随笔将持续更新ROS以及linux使用方面的随笔,欢迎大家留言,相互学习 ——————————————————————————— ...

  2. ROS 自定义消息类型方法

    流程 1.在package中新建文件夹名为msg 2.在msg文件夹中创建消息(此处以my_msg.msg)为例,注意的是要以msg为后缀名 内容举例如下: int32 data1 float64 d ...

  3. ros自定义消息

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

  4. ros自定义消息的时候报错ImportError: No module named em

    Traceback (most recent call last):  File "/opt/ros/kinetic/share/gencpp/cmake/../../../lib/genc ...

  5. ROS机器人话题之自定义消息

    ROS提供了丰富的内建消息,std_msgs包定义了一些基本的类型. 具体例子 首先定义一个消息类型的文件叫做Complex 例Complex.msg float32 real float32 ima ...

  6. ros中关于节点、话题、服务以及自定义消息等在终端中的常用命令

    以下面的计算力图说明 节点相关常用命令 在终端中查看项目中有哪些节点命令:rosnode list 有了节点信息想要查看节点中到底发布订阅了哪些话题,作为服务端服务类型或者作为客户端需要的服务类型以上 ...

  7. ros下多机器人系统(1)

    multi-robot system 经过两个多月的ros学习,对ros的认识有了比较深入的了解,本篇博客主要记录在ros下开发多机器人系统以及对ros更深入的开发.本篇博客是假定读者已经学习完了全部 ...

  8. 快速了解 Robot Operating System(ROS) 机器人操作系统

     http://www.ros.org/ 关于ROS About ROS http://www.ros.org/about-ros/ 机器人操作系统(ROS)是用于编写机器人软件的灵活框架.目的在简化 ...

  9. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...

  10. ROS_Kinetic_20 ROS基础补充

    ROS_Kinetic_20 ROS基础补充 1 手动创建ROS功能包 参考官网:http://wiki.ros.org/cn/ROS/Tutorials/Creating%20a%20Package ...

随机推荐

  1. ESLint规则整理与实际应用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lhb_11/article/detail ...

  2. 杭电2504 又见GCD

    又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. codeforces round#613

    A题:输出n+1: B题: 题意:就是给n个数,a人全拿,b人拿连续的子段和,如果b人比a人大于等于的话输出NO,反之输出YES 思路:最大子段和,比赛的时候忘记 ll 和 字段和不是遇到负数就重置. ...

  4. 【PAT甲级】1054 The Dominant Color (20 分)

    题意: 输入两个正整数M和N(M<=800,N<=600),分别代表一张图片的宽度和高度,接着输入N行每行包括M个点的颜色编号,输出这张图片主导色的编号.(一张图片的主导色占据了一半以上的 ...

  5. Spring MVC 解读——@Autowired、@Controller、@Service从原理层面来分析

    目录(?)[+] Spring MVC 解读Autowired 一Autowired 二BeanPostProcessor 三磨刀砍柴 四Bean 工厂 五实例化与装配 六执行装配 七一切的开始   ...

  6. 使用IDEA导入一个Maven风格的SSM项目

    转自: 方法一: (我用的这种,导入的方法 File->New->Project from existing sources)(同理,important也是一样的) https://how ...

  7. iOS项目开发日常之创建文件(协议、类、分类、扩展)

    iOS项目开发过程中,是以不断创建文件的形式进行着的. 创建得比较频繁的文件类型是: 这两个类型中创建的文件有:子类.分类.扩展.协议四种文件,如下:    这四类文件是频繁创建的,我们来看一下各自分 ...

  8. luogu P2704 炮兵阵地(经典状态压缩DP)

    方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...

  9. 南京江行智能获得百度和松禾资本的A+轮融资

    导读 据公司情报专家<财经涂鸦>消息,南京江行联加智能科技有限公司(江行智能)获得百度 和松禾资本的A+ 轮融资. 天眼查信息显示,12 月 8 日,公司工商信息发生变更,股东新增了广州百 ...

  10. C++11通过拷贝构造器拷贝const字段(待解决)

    问题梗概如标题所述. 在今天实现Token类的时候,遇到的问题. 我希望将Token类设定为immutable属性的,这样实现的方式是将这个类内的所有字段均设置为const型,同时每个字段均为publ ...