自定义消息一般存储在功能包的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. BGP前缀过滤(正则表达式)

    BGP的正则表达式一般用在as-path中,常用的如下: .(点):表示匹配任意一个字符,包括空格. *:表示匹配零个或多个模式的出现.即前一个字符出现0次或多次. +:表示匹配一个或多个模式的出现. ...

  2. 学校实训作业:Java爬虫(WebMagic框架)的简单操作

    项目名称:java爬虫 项目技术选型:Java.Maven.Mysql.WebMagic.Jsp.Servlet 项目实施方式:以认知java爬虫框架WebMagic开发为主,用所学java知识完成指 ...

  3. 使用docker构建第一个spring boot项目

    在看了一些简单的docker命令之后 打算自己尝试整合一下docker+spring boot项目本文是自己使用docker+spring boot 发布一个项目1.docker介绍 docke是提供 ...

  4. encypt dataset

    import getoptimport sysimport uuidimport hashlibimport csvdef getIds(totals,encrypt): seed=set() for ...

  5. 项目中常用的全局宏定义#define

    一 关于屏幕大小 #pragma mark - 屏幕宽高 #define SCREEN_BOUNDS ([UIScreen mainScreen].bounds) #define SCREEN_WID ...

  6. 时间选择器UIDatePicker的使用

    UIDatePicker的介绍 UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间.iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件.使用这个控件时,如果你能配 ...

  7. 算法复杂度图示&JavaScript算法链接

    https://juejin.im/post/5c9a1d58e51d4559bb5c6694

  8. 洛谷P1198 [JSOI2008]最大数(线段树)

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:LLL不超过当前数列的长度.(L> ...

  9. JSON转换的实现

    String转成JSON这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换 <dependency> <groupId>com.alibaba&l ...

  10. linux安装jdk并设置环境变量(看这一篇文章即可)

    1.查看linux位数 查看linux是32位还是64位,影响需要下载JDK的版本   系统位数 jdk位数 x86(32位) 32位 x86_64(64位) 32位 64位 在linux命令输入: ...