ROS-5 : 自定义消息
自定义消息一般存储在功能包的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 : 自定义消息的更多相关文章
- ros中自定义消息 报错 ImportError: No module named em
大家好,欢迎来到我的博客,之前写的都是比较松散的,鉴于工作的原因,之后的随笔将持续更新ROS以及linux使用方面的随笔,欢迎大家留言,相互学习 ——————————————————————————— ...
- ROS 自定义消息类型方法
流程 1.在package中新建文件夹名为msg 2.在msg文件夹中创建消息(此处以my_msg.msg)为例,注意的是要以msg为后缀名 内容举例如下: int32 data1 float64 d ...
- ros自定义消息
ros自定义消息可以根据自身项目需求定义和封装想要的数据类型和数据结构.具体可以参考维基百科关于ros自定义消息部分 这里我只是记录自定义消息的要点部分: 1.首先要在工作空间下功能包中创建一个msg ...
- ros自定义消息的时候报错ImportError: No module named em
Traceback (most recent call last): File "/opt/ros/kinetic/share/gencpp/cmake/../../../lib/genc ...
- ROS机器人话题之自定义消息
ROS提供了丰富的内建消息,std_msgs包定义了一些基本的类型. 具体例子 首先定义一个消息类型的文件叫做Complex 例Complex.msg float32 real float32 ima ...
- ros中关于节点、话题、服务以及自定义消息等在终端中的常用命令
以下面的计算力图说明 节点相关常用命令 在终端中查看项目中有哪些节点命令:rosnode list 有了节点信息想要查看节点中到底发布订阅了哪些话题,作为服务端服务类型或者作为客户端需要的服务类型以上 ...
- ros下多机器人系统(1)
multi-robot system 经过两个多月的ros学习,对ros的认识有了比较深入的了解,本篇博客主要记录在ros下开发多机器人系统以及对ros更深入的开发.本篇博客是假定读者已经学习完了全部 ...
- 快速了解 Robot Operating System(ROS) 机器人操作系统
http://www.ros.org/ 关于ROS About ROS http://www.ros.org/about-ros/ 机器人操作系统(ROS)是用于编写机器人软件的灵活框架.目的在简化 ...
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...
- ROS_Kinetic_20 ROS基础补充
ROS_Kinetic_20 ROS基础补充 1 手动创建ROS功能包 参考官网:http://wiki.ros.org/cn/ROS/Tutorials/Creating%20a%20Package ...
随机推荐
- httpclient使用-get-post-传参
转自:https://www.jianshu.com/p/375be5929bed 一.HttpClient使用详解与实战一:普通的GET和POST请求 简介 HttpClient是Apache Ja ...
- 高级T-SQL进阶系列 (二)【上篇】:使用 APPLY操作符
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的发布,微软增加了一个新的操作符,它允许你将一个记录集与一个函数进行关联,然 ...
- Mysql安装 ----> 基于源码包安装
1)基于源码包安装MySQL [root@localhost ~]# rpm -q mysql mysql-server mariadb mairadb-server //检查有没 ...
- linux jar 启动shell 脚本
#!/bin/bash APP_NAME=/data/wwwroot/app.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh app.sh [sta ...
- C# 读取和写入txt文件
读取: 1.使用StreamReader读取文件,然后一行一行的输出 StreamReader sr = new StreamReader(path,Encoding.Default); String ...
- mysql MVCC 实现原理
MVCC( Multi-Version Concurrency Controll) 每一行都存储了事件发生时的系统版本号(System Version Number),用来替代事件实际发生的时间.每一 ...
- ORACLE varchar2类型的字段更改为clob
将varchar2类型字段改成clob类型 --增加临时新字段 alter table base_temp add temp clob; --将需要改成大字段的项内容copy到大字段中updat ...
- LCS(最长公共子序列)
这个问题很有意思,在生物应用中,经常需要比较两个(或多个)不同生物体的DNA片段.例如,某种生物的DNA可能为S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT ...
- listenTo - backbone.js
listenToobject.listenTo(other, event, callback) 让 object 监听 另一个(other)对象上的一个特定事件.不使用other.on(event, ...
- CMake构建Qt5的VS2015项目 (Hello Qt5)
Qt5的编译 Windows下载编译Qt5 Gui CMakeLists.txt 源码 cmake_minimum_required(VERSION 2.8.11) project(HelloQt5) ...