自定义消息一般存储在功能包的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. 转载和补充:Oracle中的一些特殊字符

    oracle通配符,运算符的使用 用于where比较条件的有: 等于:=.<.<=.>.>=.<> 包含:in.not in exists.not exists 范 ...

  2. 【PAT甲级】1001 A+B Format (20 分)

    题意:给两个整数a,b,计算a+b的值并每三位用逗号隔开输出(−1e6​​≤a,b≤1e6​​) AAAAAccepted code: #include<bits/stdc++.h> us ...

  3. LinkStack(链栈)

    链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. (2018-02-14 代码更新) ...

  4. Python爬虫教程-新浪微博分布式爬虫分享

    爬虫功能: 此项目实现将单机的新浪微博爬虫重构成分布式爬虫. Master机只管任务调度,不管爬数据:Slaver机只管将Request抛给Master机,需要Request的时候再从Master机拿 ...

  5. idna与utf-8编码漏洞

    来自Black hat 2019 原理什么是IDN?国际化域名(Internationalized Domain Name,IDN)又名特殊字符域名,是指部分或完全使用特殊文字或字母组成的互联网域名, ...

  6. 【CoreBluetooth】iOS 系统蓝牙框架

    https://www.jianshu.com/p/eb58dcbae5f9 2016.06.07 23:04* 字数 285 阅读 852评论 4喜欢 3 暂时 第一次功能性研究,具体实现,后续添加 ...

  7. 「学习笔记」FFT 之优化——NTT

    目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NT ...

  8. Vases and Flowers-HDU4614 二分+线段树

    题意: 给你N个花瓶,编号是0  到 N - 1 ,一开始每个花瓶都是空的,你有两个操作: 第一个操作: 从第x个花瓶起开始插花,总共插y束,如果遇到花瓶中有花就跳过这个花瓶,直到花插完或者 插到第N ...

  9. 2019 深信服 下棋(DFS+回溯)

    链接:https://www.nowcoder.com/questionTerminal/a0feb0696e2043a5b3b0779fa861b64a?f=discussion来源:牛客网 8x8 ...

  10. Java基础 -3.5

    我觉得上一篇不是很严谨啊 我认为这个逻辑还是正确的 原码.反码.补码: (1)在Java中,所有数据的表示方式都是以补码形式来表示 如果没有特别的说明,Java 中的数据类型默认为int,int数据类 ...