1ROS自定义msg类型及使用

http://blog.csdn.net/u013453604/article/details/72903398

首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型) 
这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例

2参考西工大

https://github.com/HANDS-FREE/handsfree

一、创建msg消息

首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型) 
这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例

cd catkin_arduino_ros/src
catkin_create_pkg test_msgs

  

1.新建msg文件

cd test_msgs
mkdir msg

创建Test.msg的内容如下,  

基本类型可参考: std_msgscommon_msgs


float32[] data
float32 vel
geometry_msgs/Pose pose
string name

2.修改package.xml

接下来需要message_generation生成C++或Python能使用的代码,需要message_runtime提供运行时的支持,所以package.xml中添加以下两句

 

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

 

3.修改CMakeLists.txt

(1)首先调用find_package查找依赖的包,必备的有roscpp rospy message_generation,其他根据具体类型添加,比如上面的msg文件中用到了geometry_msgs/Pose pose类型,那么必须查找geometry_msgs

find_package(catkin REQUIRED COMPONENTS roscpp rospy message_generation std_msgs geometry_msgs)

(2)然后是add_message_files,指定msg文件

add_message_files(
FILES
Test.msg
# Message2.msg
)

(3)然后是generate_messages,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明

#generate_messages必须在catkin_package前面
generate_messages(
DEPENDENCIES
geometry_msgs
) 

(4)然后是catkin_package设置运行依赖

catkin_package(

CATKIN_DEPENDS message_runtime

)

到这里新的msg类型test_msgs/Test就可以使用了,下面编译这个包,然后利用rosmsg show指令查看

$ cd catkin_ws
$ catkin_make
$ rosmsg show test_msgs/Test
float32[] data
float32 vel
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
string name

  

二、msg的使用

要使用自定义的消息类型必须source自定义消息所在的工作空间,否则rosmsg show test_msgs/Testrostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为没有source的情况下自定义消息类型是不可见的,被认为是未定义类型

1.其他包调用自定义msg类型

如果是在test_msgs包内的节点中调用test_msgs/Test类型,只需要在.cpp文件中如下调用即可


#include <test_msgs/Test.h>

test_msgs::Test msg;

如果是在其他包调用test_msgs/Test类型则需要修改package.xml和CMakeLists.txt,比如同样在工作空间catkin_arduino_ros内有一个名为test1_pub_sub的包,我们可以在这个包内写一个节点talker.cpp,使用我们刚才自定义的消息类型test_msgs/Test,如下:  

 (1)修改package.xml

<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend> <build_depend>test_msgs</build_depend>
<run_depend>test_msgs</run_depend>

(2)修改CMakeLists.txt   

调用自定义消息类型主要修改两个地方,以下是重点: 一是find_package中需要声明查找包含该消息类型的包; 二是add_dependencies要注明该消息的依赖,其他地方和普通节点一样

find_package(catkin REQUIRED COMPONENTS
roscpp
geometry_msgs
test_msgs
) add_dependencies(test1 test_msgs_gencpp)#调用同一工作空间的自定义消息类型时注明依赖关系,防止发生头文件找不到的报错

如果缺少add_dependencies中对test_msgs_gencpp的依赖声明,在编译的时候如果先编译test包再编译test_msgs包则会出现如下报错(ROS工作空间各个软件包的编译顺序是随机的),因为头文件test_msgs/Test.h还未生成  

fatal error: test_msgs/Test.h: 没有那个文件或目录
#include "test_msgs/Test.h"

2 程序调用

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <test_msgs/Test.h> // 添加自定义的消息
// 文件包 test_msgs下面 有一个自定义的 Test.msg
#include <sstream> int main(int argc, char **argv){ ros::init(argc, argv, "talker"); ros::NodeHandle n; //ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Publisher chatter_pub = n.advertise<test_msgs::Test>("chatter", 1000);
ros::Rate loop_rate(10); //发布自定义消息类型test_msgs::Test int count = 0;
while (ros::ok())
{ std_msgs::String msg; std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str(); ROS_INFO("%s", msg.data.c_str()); test_msgs::Test mymsg; //创建自定义消息test_msgs::Test
/*
float32[] data
float32 vel
geometry_msgs/Pose pose
string name
*/
mymsg.name=ss.str(); // 为其中的分量
mymsg.vel=1;
// chatter_pub.publish(msg);
chatter_pub.publish(mymsg); //发布 ros::spinOnce(); loop_rate.sleep();
++count;
} return 0;
}

  

3 查看结果

运行

roscore

rosrun test1_pub_sub talker

  

查看消息

rostopic list

rostopic type /chatter

 rosmsg show test_msgs/Test

  

  结果看到和我们定义的是一样的。

ROS教程3 ROS自定义msg类型及使用的更多相关文章

  1. ROS教程4 ROS自定义srv类型及使用

    创建srv文件 在上一节单独为自定义的消息和服务的包 test_msgs 里面 创建 srv文件夹 进入创建 testsrv.srv 文件 ,内容为: (srv文件和msg文件类似,唯一不同的是它包含 ...

  2. ROS教程(一):ROS安装教程(详细图文)

    ros教程:ros安装 目录 前言 一.版本选择 二.开始安装 2.1 软件中心配置 2.2 添加源 2.3 安装 三.验证ROS 前言 关于ROS(Robot OS 机器人操作系统),估计看这个教程 ...

  3. ROS教程

    Learning ROS 学习ROS Depending on your learning style and preferences, you can take two approaches to ...

  4. 入门ROS教程与视频汇总(kinetic)

    参考网址: Richard Wang    3 Shawn Chen 部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg http://i.you ...

  5. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

  6. ROS教程2 编写简单的消息发布器和订阅器 (C++ catkin)

    创建工作环境 创建文件夹,创建包 mkdir -p ~/catkin_arduino_ros/src catkin_create_pkg test1_pub_sub std_msgs rospy ro ...

  7. ROS与深度相机入门教程-在ROS使用kinect v1摄像头

    ROS与深度相机入门教程-在ROS使用kinect v1摄像头 说明: 介绍在ros安装和使用kinect v1摄像头 介绍freenect包 安装驱动 deb安装 $ sudo apt-get in ...

  8. ROS教程(二):创建工作空间(图文)

    ros教程:创建工作空间 目录 前言 一.工作空间? 二.创建一个工作空间 1.创建目录 2.编译 前言 使用catkin创建一个工作空间 一.工作空间? 在ROS系统下,我们所有的项目都放在一个工作 ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. XCode - App installation failed (A valid provisioning profile for this executable was not found)

    OSX:10.14 XCode:10.1 iPhone:iPhone 4S IOS9.3.5 我不得不骂那些SB们,不懂就别TMD乱写文章,误导别人!!我今天看了很多关于这个错误的中文文章,结果都没能 ...

  2. foreach 引发的值类型与引用类型思考

    用都知道的一句话概括:“引用类型在堆上,栈上只保存引用:值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”. class Program { static void Main(string ...

  3. 深入理解RDD原理

    首先我们来了解一些Spark的优势:1.每一个作业独立调度,可以把所有的作业做一个图进行调度,各个作业之间相互依赖,在调度过程中一起调度,速度快.2.所有过程都基于内存,所以通常也将Spark称作是基 ...

  4. ELK日志分析平台系统windows环境搭建和基本使用

    ELK(ElasticSearch, Logstash, Kibana),三者组合在一起就可以搭建实时的日志分析平台啦! Logstash主要用来收集.过滤日志信息并将其存储,所以主要用来提供信息. ...

  5. Ajax实现的城市二级联动二

    上一篇联动一种只是城市用ajax请求获取并渲染,这里将省份也用ajax请求并渲染 1.HTML <select id="province"> <option> ...

  6. canvas处理压缩照片并回显:https://cengjingdeshuige.oss-cn-beijing.aliyuncs.com/20180512/cannovs%E5%AD%A6%E4%B9%A0.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 洛谷P4719 【模板】动态dp(ddp LCT)

    题意 题目链接 Sol 动态dp板子题.有些细节还没搞懂,待我研究明白后再补题解... #include<bits/stdc++.h> #define LL long long using ...

  8. c3p0死锁

    1.APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 抛出以下异常信息: com.mchang ...

  9. springboot 配置文件说明

    你可以在自己创建的组件上使用@ConfigurationProperties注解,而Spring Boot自动配置的很多组件也添加了@ConfigurationProperties注解,可以通过Spr ...

  10. 搜狐eHR团队-曾经一起奋斗过的~

    昨天所有搜狐eHR团队同事再相聚(在职+离职),大家聊的都很开心,共同回顾了eHR项目从无到有的过程. 非常感谢在搜狐的工作经历,自己成长很多,目前大家分布在各个公司为eHR做着贡献,大家都注意身体~ ...