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 ...
随机推荐
- mysql数据库关系表设计原则
三范式https://blog.csdn.net/qq_36432666/article/details/78934073 https://kb.cnblogs.com/page/138526/ ht ...
- ANSYS-APDL施加扭转载荷CERIG命令
目录 1. 要求 2. ANSYS有限元分析 2.1 APDL建模 2.2 APDL施加载荷 2.3 APDL查看结果 3. 举一反三 1. 要求 一块0.8m*0.4m*0.04m厚的钢板,在板的两 ...
- leetcode 0207
目录 ✅ 561. 数组拆分 I ✅ 1025. 除数博弈 聪明的数学归纳法: 动态规划又来了(没理解,todo 0207): ✅ 557. 反转字符串中的单词 III py 中的 字符 split ...
- 牛客-Y 老师的乐高小镇
链接:https://ac.nowcoder.com/acm/contest/3667/I来源:牛客网 题目描述 Y 老师从小喜欢用乐高搭建自己喜欢的模型,这不突然有一天 Y 老师想用乐高建造一个神奇 ...
- 【PAT甲级】1041 Be Unique (20 分)(多重集)
题意: 输入一个正整数N(<=1e5),接下来输入N个正整数.输出第一个独特的数(N个数中没有第二个和他相等的),如果没有这样的数就输出"None". AAAAAccepte ...
- 解决方法:Could not load file or assembly 'WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies.
最近使用VS2015调试ASP.NET 程序遇到了该问题: 在网上找了很多方法都不能解决,最后自己解决了,方法如下: 在project -> NuGet管理中找到已安装的所有程序:将Web Op ...
- 修改html内联样式的方法
问题:如下图弹出页面操作不了 分析:审查元素,发现是内联元素样式z-index:19891015导致的,修改内联元素样式z-index:0发现可以操作了 解决方法:内联样式优先级高,再引入css覆盖样 ...
- sql server删除重复的数据保留一条
DELETE FROM [TCX_1710_SHZJ].[dbo].[PR_BindingTray] WHERE 1=1 AND SNum in (SELECT * FROM ( (SELECT SN ...
- 4 Action的3种编写方式,pojo,实现和继承(推荐)
Action的访问: 1 Action类是pojo(Plain Ordinary Java Object):简单Java对象,无接口,无继承.例如上篇文章中只创建了public String exec ...
- 使用restTemplate发送post请求,传入参数是在requestBody请求体中,以json形式传输
@PostMapping public ResponseResult add(User user){ HttpHeaders httpHeaders = new HttpHeaders(); Medi ...