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. Django之stark组件

    现在让我说啥是stark组件,我也说不清楚.反正从今天讲的知识来看,今天完成的就是自己写一个模块,这个模块包含了admin后台管理工具的一些比较好用的功能,我们把它提炼出来,也就是相当于自己写一个ad ...

  2. springboot使用遇到问题:Class “model.Address” is listed in the persistence.xml file but not mapped

    报错如下: 解决如下: 这是一个Eclipse的怪癖.我最近在创建一个禁用了JPA库配置的新JPA项目时遇到了这个问题,但是在我通过Eclipse New JPA Entity向导创建实体之前没有手动 ...

  3. U盘基本处理,U盘与移动固态硬盘

    一.辨别 USB2.0 和 USB3.0 1.从USB外观上来看,USB2.0通常是白色或黑色,而USB3.0则改观为“高大上”的蓝色接口. 目前,部分笔记本电脑USB接口,已同时提供对USB2.0及 ...

  4. .NET实现发送邮件

    注意:需要找到“POP3/SMTP服务”并开启,然后生成授权码,生成的授权码就是下面登入的密码. /// <summary> /// 发送邮件 /// </summary> / ...

  5. iis 站点中文乱码 解决方案

    问题描述:iis乱码问题 1:在vs里开发没问题,发布后用发布文件替换iis文件没问题,但是如果用fis3发布后导致iis站点访问时出现部分中文乱码 原理:文件编码格式不统一 解决方案: 四个步骤解决 ...

  6. 随机漂浮图片、右侧上下浮动快捷栏JS

    随机漂浮图片JS: //公共脚本文件 main.js function addEvent(obj,evtType,func,cap){ cap=cap||false; if(obj.addEventL ...

  7. 设置实体类型中String类型的属性值为String.Empty

    /// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...

  8. SSM+solr 通过商品搜索学习solr的简单使用

    学习了一下https://github.com/TyCoding/ssm-redis-solr这个github上的solr搜索功能,现在来记录一下. 我的理解就是solr有点类似于数据库,但它是有索引 ...

  9. react-router与react-router-dom使用时的区别

    1.React-router与React-router-dom的API对比 React-router:提供了router的核心api.如Router.Route.Switch等,但没有提供有关dom操 ...

  10. Kafka初入门简单配置与使用

    一 Kafka概述 1.1 Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成. ...