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 ...
随机推荐
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 从数值范围创建数组
import numpy as np x = np.arange(5) print (x) import numpy as np # 设置了 dtype x = np.arange(5, dtype ...
- 对RoboMaster论坛自动签到脚本制作(虽然没什么用)
RoboMaster论坛自动签到,自动浏览刷分 不务正业系列 上完最后一节课,队长跟我们说,RM有个BBS,可以看看,但是下载要金币,这个金币只能做签到等事情才能得到,所以我用python做了一个小程 ...
- cmd命令下载maven管理需要的依赖jar包
首先在maven官网https://mvnrepository.com/ 搜索你需要的jar包,找到下面的下载链接,在修改命令,然后cmd下载. cmd命令下载Maven需要jar包 cmd输入下面 ...
- git切换分支导致代码丢失找回(git reflog找回错误的重置)
1.使用git reflog查看日志 2.切换到丢失的分支 3. 创建一个临时分支 如(diff),并切换到dev(原分支),然后合并diff到dev分支 4.查看状态 5.强制合并,然后提交到de ...
- 笔记-爬虫部署及运行工具-scrapydweb
笔记-爬虫部署及运行工具-scrapydweb 1. 简介 scrapyd是爬虫部署工具,但它的ui比较简单,使用不是很方便. scrapydweb以scrapyd为基础,增加了ui界面和监 ...
- Unable to instantiate Action, xxxAction, defined for 'xxx' in namespace '/'xxxAction解决方案
出现这个问题的原因主要有两个 1.如果项目没有使用Spring,则struts.xml配置文件中,这个action的class属性的路径没有写完整,应该是包名.类名 2.如果项目使用了Spring,那 ...
- Duilib热键
转载:https://www.zhaokeli.com/article/8288.html 在initwindow中注册热键 //生成热键标识,需要保存起来退出时销毁使用 int m_HotKeyId ...
- Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战
Java生鲜电商平台-小程序或者APP拼团功能设计与架构实战 说明:Java生鲜电商平台拼团是拉新引流的利器,将拼团运用到极致的就是拼多多,前期通过选取性价比高.实用性强的商品进行拼团,在社交圈(主要 ...
- list.OfType()
将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 //将两个类型不同是实体存入到一个object可以通过OfType方法分别取出来 List<Phone> Ph ...
- leetcode刷题-- 3.二分查找
二分查找 正常实现 题解 public int binarySearch(int[] nums, int key) { int l = 0, h = nums.length - 1; while (l ...