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 ...
随机推荐
- Cisco AP-格式化AP
故障情况:APC11-AP04#sho capwap ip config LWAPP Static IP ConfigurationIP Address 172.17.239.204I ...
- 高级T-SQL进阶系列 (二)【上篇】:使用 APPLY操作符
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的发布,微软增加了一个新的操作符,它允许你将一个记录集与一个函数进行关联,然 ...
- office365激活码序列号密钥:
亲测可用: NGCM9-FWB6X-9WKYC-GRWVD-63B3P
- 【NGINX】LINUX安装NGINX
安装依赖() · yum install gcc · yum install pcre-devel · yum install zlib zlib-devel · yum install openss ...
- 1146. Snapshot Array
Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) initializ ...
- laravel 排除csrf验证
中(*排除所有路由)
- linux jar 启动shell 脚本
#!/bin/bash APP_NAME=/data/wwwroot/app.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh app.sh [sta ...
- nginx 加工上游服务器返回的内容,并返回给客户端
禁用上游响应头部功能 Syntax: proxy_ignore_headers field ...; Default: — Context: http, server, location 功能介绍:某 ...
- 使用tag标签是SEO优化的重要性是什么?
使用tag标签是SEO优化的重要性是什么? tag标签是一种SEO技术,在网站优化的过程中,更准确.更具体地用关键词对文章进行分类,对SEO优化具有重要的作用. 但是,很多新人站长在发表文章时不太注意 ...
- 图像分割利用KMeans生成灰度图
import numpy as np import PIL.Image as image from sklearn.cluster import KMeans def loadData(filePat ...