自定义消息一般存储在功能包的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. 吴裕雄--天生自然Numpy库学习笔记:NumPy 高级索引

    import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print (y) import n ...

  2. Update(Stage5):DMP项目_业务介绍_框架搭建

    DMP (Data Management Platform) 导读 整个课程的内容大致分为如下两个部分 业务介绍 技术实现 对于业务介绍, 比较困难的是理解广告交易过程中各个参与者是干什么的 对于技术 ...

  3. Nginx Rewrite域名及资源重定向!(重点)

    第一步:搭建Nginx服务 第二步:修改主配置文件 [root@ns2 ~]# vim /usr/local/nginx/conf/nginx.conf user  nginx nginx; work ...

  4. Nginx企业级优化!(重点)

    隐藏Nginx版本号!(重点) 在生产环境中,需要隐藏 Nginx 的版本号,以避免安全漏洞的泄漏 一旦有黑客知道Nginx版本号便可以利用Nginx漏洞进行攻击,严重影响到了公司的安全 查看隐藏版本 ...

  5. Docker 之registry私有仓库搭建

    Docker 之registry私有仓库搭建 官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/reposito ...

  6. FreeSWITCH调用第三方TTS 使用tts_commandline

    FreeSWITCH 支持调用第三方TTS命令,本身已经搭好了框架,只需要配置即可用. 下面写一下步骤,以免忘记,也希望给你带来帮助. 第一步:编译模块mod_tts_commandline,并加载. ...

  7. QT无法读入txt文件内容

    用vs写QT无法利用相对路径读入txt文件,应将此文件加入到资源文件中.

  8. 杭电2019 数列有序!(STL解法)

    由于这题对于学过数据结构的我来说,真的是很简单,为了减少时间上的损失,链表无疑是最好的选择(因为数组要往后移位子).然后,因为最近想玩些STL的骚操作,所以就用<list>了,然后顺便学了 ...

  9. 二次代价函数、交叉熵(cross-entropy)、对数似然代价函数(log-likelihood cost)(04-1)

    二次代价函数 $C = \frac{1} {2n} \sum_{x_1,...x_n} \|y(x)-a^L(x) \|^2$ 其中,C表示代价函数,x表示样本,y表示实际值,a表示输出值,n表示样本 ...

  10. mysql MVCC 实现原理

    MVCC( Multi-Version Concurrency Controll) 每一行都存储了事件发生时的系统版本号(System Version Number),用来替代事件实际发生的时间.每一 ...