ROS入门21讲笔记(四)自定义话题消息类型和使用

2023-05-16

除了ROS内置消息外,我们还能自定义消息。这一次我们不再与海龟较劲,而是自定义一个订阅消息类型,让订阅者和发布者通过这个结构进行数据通信。

一、如何自定义话题消息?

话题消息是以.msg结尾的文件,是一个用于描述ROS话题信息简单文本文件,用于生成不同语言消息的源代码。

msg文件一般存放在package下msg文件夹下,其数据类型可以是:

  • int8, int16, int32, int64 (unit*)
  • float32, float64
  • string
  • time, duration
  • 其他msg文件
  • 可变数组array[]和固定长度数组array[C]

二、如何使用自定义消息?

  • Step1 定义msg文件,每一个消息占一行,类型+消息名(一般放在与功能包中的include同级文件夹msg中),如:
string first_name
string last_name
unit8 age
unit32 score
  • Step2 修改package.xml,增加以下片段:
 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

这是为了保证msg文件能够转换成C+,Python和其他语言的源文件代码,第一行是编译的时候的依赖,第二行是执行时依赖。

  • Step3 修改CMakeLists.txt,增加message编译时依赖模块到(message_generation)

find_package语句增加message_generation

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
  • Step4 修改CMakeLists.txt,增加message运行时依赖模块(message_runtime)

catkin_package语句增加CATKIN_DEPENDS message_runtime

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
  • Step5 修改CMakeLists.txt,增加message文件

add_message_files语句增加自定义的msg文件

add_message_files(
FILES
Message1.msg
Message2.msg
)
  • Step6 确保genreate_message()函数被调用
generate_messages(
DEPENDENCIES
std_msgs
)

std_msgs其实是编译msg需要依赖的包,在早些版本,你只需要使用一句话即可generate_messages()

三、创建一个自定义话题消息

3.1 创建msg文件

在package目录创建一个msg文件夹,并创建自己的自定义消息:

mkdir msg
cd msg
touch sensor.msg

消息如下(sensor.msg):

int8 id
float32 xacc
float32 yacc
float32 zacc
float32 temperture

3.2 修改package.xml描述

package.xml添加固定的片段:

 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

一个用于编译时信息产生依赖<build_depend>message_generation</build_depend>;
另一个用于执行时信息依赖<exec_depend>message_runtime</exec_depend>
在这里插入图片描述

3.3 增加message_generation生成时依赖

在find_package中增加红色框框部分:
在这里插入图片描述

3.4 增加message_runtime运行时依赖

catkin_package命令增加了message_runtime
在这里插入图片描述

3.5 增加message文件

add_message_files命令增加了sensor.msg
在这里插入图片描述

3.6 增加编译message本身时的依赖

generate_messages命令增加了:std_msgs
在这里插入图片描述
回到工作空间根目录,使用catkin_make进行编译,如果出现以下打印,说明一切正常:
在这里插入图片描述
事实上,对于C++而言,编译器帮我们自动编写一个头文件:sensor.h,文件位于workspace/devel/include中,通过引用头文件就可以使用这个自定义数据了。

四、编写发布者和接受者程序

发布者程序代码:

#include <ros/ros.h>
#include "selfmsg/sensor.h"

int main(int argc,char **argv)
{
    ros::init(argc,argv,"PubMessage");//这个将会作为节点名

    ros::NodeHandle n;
    ros::Publisher pubSensorInfo=n.advertise<selfmsg::sensor>("/sensorInfo",10);//这个将作为话题名
    ros::Rate loopRate(1);

    int count=1;
    while(ros::ok())
    {
        selfmsg::sensor msg;
        msg.id=0;
        msg.xacc=10;
        msg.yacc=11;
        msg.zacc=12;
        msg.temperture=32;

        pubSensorInfo.publish(msg);
        ROS_INFO("Publish sensor Info: id=%d xacc=%f yacc=%f zacc=%f temperature=%f",
            msg.id,msg.xacc,msg.yacc,msg.zacc,msg.temperture
        );
        loopRate.sleep();
    }
}

订阅者程序代码:

#include <ros/ros.h>
#include "selfmsg/sensor.h"

void printReceieveSensorInfo(const selfmsg::sensor::ConstPtr & msg)
{
    ROS_INFO("Receieve sensor info id=%d,xacc=%f,yacc=%f,zacc=%f,temperatrue = %f",
    msg->id,msg->xacc,msg->yacc,msg->zacc,msg->temperture
    );
}

int main(int argc,char **argv)
{
    ros::init(argc,argv,"GetSensorInfo");
    ros::NodeHandle n;
    ros::Subscriber sensorSub=n.subscribe("/sensorInfo",10,printReceieveSensorInfo);

    ros::spin();
    return 0;
}

OK,最后一步,往这个包对应的CMakeLists.txt中添加:

add_executable(sub src/sensorSub.cpp)
target_link_libraries(sub ${catkin_LIBRARIES})
add_executable(pub src/sensorPub.cpp)
target_link_libraries(pub ${catkin_LIBRARIES})

回到workspace目录,catkin_make!看到如下情况说明一切顺利:
在这里插入图片描述

你使用sensor.msg,最后会产生一个sensor.h。代码中表现是package::sensor

五、运行起来!

开启第一个终端,用来启动roscore核心:

roscore

这个指令再复习一下:


Usage: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS]
  rosrun will locate PACKAGE and try to find
  an executable named EXECUTABLE in the PACKAGE tree.
  If it finds it, it will run it with ARGS.
  

第二个终端,启动selfmsg中的应用sub

rosrun selfmsg sub

第三个终端,启动selfmsg中的应用pub

rosrun selfmsg pub

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS入门21讲笔记(四)自定义话题消息类型和使用 的相关文章

随机推荐

  • elementui下拉框多选报[Vue warn]: <transition-group> children must be keyed: <ElTag>

    elementui下拉框多选 xff0c 选值报错 选中一个值后所有的值都会被选中 经检查 xff0c 是由于我的下拉框的value值为一个对象而非单个值 值为对象时需要填入value key span class token operat
  • Hadoop_1 入门WordCount

    记录踩得坑以及部署环境流程 搭建的是伪分布Hadoop 首先环境需要安装zookeeper 这个好装 xff0c 不多说其次比较复杂的是安装openssh 我的Linux系统是centos 7 mini版本 安装openssh之前的准备工作
  • PX4无人机控制

    PX4无人机控制 向话题 mavros setpoint raw local发布无人机目标位置 43 偏航 xff0c 或者目标速度 43 偏航 发布目标位置 43 偏航 xff1a mission span class token pun
  • npm install 报错:gyp verb `which` failed Error: not found: python

    今天新启动一个项目 xff0c 在 npm install 安装依赖项时出现报错 npm install span class token operator gt span husky 64 span class token number
  • 24_ZYNQ7020开发板_SPI与Qflash芯片读写

    内核中使用spi master表示一个SPI主机控制器 一 SPI控制器驱动 1 xff09 spi master申请与释放 SPI申请 span class token keyword struct span spi master spa
  • python3的input函数实现回车换行,而不是结束输入

    span class token comment 实现回车换行 xff0c 而不是结束 span endstr span class token operator 61 span span class token string 34 34
  • rviz-Ros Wiki官网教程学习笔记(1)-用户指南

    0 rviz介绍 rviz是ROS自带的图形化工具 xff0c 可以很方便的让用户通过图形界面开发调试ROS 参考官网 rviz UserGuide 1 安装 根据自己的版本号 xff0c 在下面选择对应的命令执行 以ROS melodic
  • 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

    概述说明 CAS Server默认搭建出来 xff0c 客户端程序只能按照CAS自身的协议接入 CAS的强大在于 xff0c 有官方的插件 xff0c 可以支持其他的协议 本章节就让CAS Server怎么增加OAuth2 0的登录协议 安
  • 一起DIY四轴飞行器(二)初识飞控大脑

    系统 xff1a Windows 硬件 xff1a xff08 1 xff09 STM32F103C8T6最小系统板 某宝上搜索 STM32F103最小系统 xff0c 如上图所示这样的 xff08 2 xff09 ST LINK v2下载
  • STM32CubeMX基于HAL库点亮LED灯

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 cubeMX的基本配置 1 选择MCU 2 配置时钟 查看电路图 xff0c 8MHz的高速外部晶振接到 OSCIN
  • 一起DIY四轴飞行器(三)添加实时操作系统--freeRTOS

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 初识freeRTOS系统 1 什么是FreeRTOS xff1f Free 即免费的 xff0c RTOS 全称是 R
  • ESP8266 初次使用

    一 工具 1 ESP8266 01S 淘宝上搜索ESP8266 01S 引脚说明 xff1a 2 USB转串口 给设备供电3 3V xff08 官方说不要用USB转串口的3 3V xff0c 需要单独供电 xff09 xff0c USB转串
  • ubuntu安装boost

    ubuntu安装boost 系统 Ubuntu 18 04 boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 1 卸载已经安装的boost 删除 usr l
  • 简单的状态机图

    一 什么是状态机 xff1f 做产品的时候 xff0c 我们总能遇到一些比较复杂的逻辑问题 比如状态的转换 xff0c 字段状态的确认 xff0c 权限的控制 xff0c 状态的对应 而普通的流程图 xff0c 或时序图 xff0c 更侧重
  • js-对象转基本类型

    起因是收到朋友发的一道题 xff0c 如下 xff1a span class token comment 请在问号处填写你的答案 使下方等式成立 span span class token keyword let span a span c
  • 局域网内wakeonlan远程唤醒其它计算机

    背景 xff1a 需要管理多台计算机 xff0c 所有计算机在一个局域网内 xff0c 并且有的安装了Windows系统 xff0c 有的安装了Linux系统 我们想远程关闭和启动所有计算机 关闭计算机直接通过网络发生操作系统关机命令即可实
  • D3D中的三种Buffer

    在D3D中 针对视窗有三种Buffer 它们分别是 Color Buffer Depth Buffer和Stencil Buffer Color Buffer在D3D中又称为Render Target 意思是最后着色的目标Buffer 就是
  • 创建镜像(更新与构建镜像)

    创建镜像 有时从Docker镜像仓库中下载的镜像不能满足我们的要求 xff0c 此时可以基于这个镜像 xff08 基础镜像 xff09 封装一个自 己的镜像 两种方式 xff1a 更新镜像 xff1a 使用docker commit命令构建
  • (十)CMake链接已有的动态库

    使用一个已经存在的动态库 xff0c 需要用到CMake中两个命令 xff0c 分别是 xff1a link directoriestarget link libraries 下面先介绍以下两个命令的格式及其含义 xff0c 最后是一个使用
  • ROS入门21讲笔记(四)自定义话题消息类型和使用

    除了ROS内置消息外 xff0c 我们还能自定义消息 这一次我们不再与海龟较劲 xff0c 而是自定义一个订阅消息类型 xff0c 让订阅者和发布者通过这个结构进行数据通信 一 如何自定义话题消息 xff1f 话题消息是以 msg结尾的文件