ROS 自定义消息类型

2023-05-16

引言

学习ROS的过程中,在话题的发布与订阅之间,我一直在思考,我们能不能定义自己的话题名,甚至在编写我们自己的ROS软件包时,定义我们自己的消息类型。

首先能不能定义自己的话题名

     当然可以,在ROS中,消息的传递是通过话题、服务的方式进行的,其中很大一部分都是通过节点发布话题、订阅话题实现的。 在进行话题的订阅和发布时,其实,话题名 就是订阅者和发布者双方约定的一个暗号,(只要记住,发布者和订阅者定义成一样,剩下的事情就交给节点管理器吧)。
     所以话题名,你想怎么定义就怎么定义,只要发布者和接收者双方协商好就好。只不过我们常常使用别人的ros功能软件包,所以就只好把我们的节点中的订阅者/发布者定义的话题名写成别人软件包的,不得已呀!, 当然我们要自己搞一个订阅者与我们自己的发布者进行通信,当然可以自己定义啦~
而且在launch文件中还有一个话题重映射的功能,我们可以把别人原本好好的订阅-发布的话题,从中间劈一刀,插入一个我们自己的话题,对它进行修改。

//自定义话题非常简单,想定义什么就在“×××”中写什么就行,
ros::Publisher str_pub = nh.advertise<std_msgs::String>("test_topic", 10);  //话题名可以自己定义
//要注意两点:
# 1、订阅和发布要对应
# 2、要想好你的话题要携带什么消息,也就是前面紧跟的消息类型

能不能定义自己的消息类型

    首先明确在ROS中,消息的载体是 话题,我们要真真想要传递的消息内容实际上是通过话题的发布->订阅,从而进行消息的发送和接收的。话题我们都可以自己定义,我们当然可以自己定义。

    当我们使用别人的话题是,当然也要使用它的消息类型,当我们自己定义话题,大多数也是使用别人的消息类型。(因为毕竟要和别人的节点通信吗,仅仅话题一样,消息不一样哪行),所以自定义消息类型的情况比较少,但是也还是能用得到的,所以这个技能还是要会的。

怎么定义自己的消息类型

1、首先在软件包目录下 新建一个 msg文件夹,并且新建一个消息类型文件
mkdir ~/roswork_space/src/hello_ros/msg
cd ~/roswork_space/src/hello_ros/msg
touch my_msg.msg
或者直接 vim ~/roswork_space/src/hello_ros/msg/my_msg.msg

2、编辑你想要的消息类型

int32 A
int32 B
int32 C

常见的ros消息中包含的类型有
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
Header(包含一个timestamp和坐标系信息)

3、编辑软件包下的CMakeLists.txt文件

find_package(catkin REQUIRED COMPONENTS
message_generation roscpp geometry_msgs

add_message_files(FILES my_msg.msg) //根据自己的消息写

generate_messages(DEPENDENCIES
std_msgs)

catkin_package(
CATKIN_DEPENDS
message_runtime
)

4、编辑package.xml文件

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

编译 后检查
rosmsg show hello_ros/my_msg
int32 A
int32 B
int32 C


使用简例

自定义话题的实例 发布&订阅

#include "ros/ros.h"
#include "std_msgs/String.h" // for std_msgs::String message
#include<sstream> //for stringstream对象

int main(int argc, char *argv[])
{
ros::init(argc, argv, “pub_string_node”);
ros::NodeHandle nh;
ros::Publisher str_pub = nh.advertise<std_msgs::String>(“string_msg“, 1000); //话题名可以自己定义

ros::Rate rate_loop(10);
while (ros::ok())
{
std_msgs::String str_msg; //消息不可以随便定义
std::stringstream ss;
ss << “I am s test stream”;
str_msg.data = ss.str();
//ROS_INFO(“I send (%s)”, str_msg.data.c_str());
ROS_INFO(“I send (%s)”, str_msg.data.c_str());
str_pub.publish(str_msg);
ros::spinOnce();
rate_loop.sleep();
}
return 0;
}


#include "ros/ros.h"
#include "std_msgs/String.h"

void messageCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO(“I heard: [%s]”, msg->data.c_str());
}

int main(int argc, char **argv)
{
ros::init(argc, argv, “sub_string_node”);
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe(“string_msg“, 10, messageCallback);
ros::spin(); //一直授权订阅
return 0;
}


自定义消息类型,自己发布&订阅

#include "ros/ros.h"
#include "hello_ros/test_msg.h" //虽然是test_msg.msg,这里却是.h

int main(int argc, char *argv[])
{
ros::init(argc, argv, “pub_num_node”);
ros::NodeHandle nh;
ros::Publisher num_pub = nh.advertise(“add_num_msg”, 10); //话题名可以自己定义,

hello_ros::test_msg num; //定义消息
ros::Rate rate_loop(10);
while (ros::ok())
{
static int i;
i++;
num.A = i;
num.B = i;
num.C = i;
num_pub.publish(num);
ros::spinOnce();
rate_loop.sleep();
}
return 0;
}


#include "ros/ros.h"
#include "hello_ros/test_msg.h" //虽然是test_msg.msg,这里却是.h

void messageCallback(const hello_ros::test_msg::ConstPtr& msg)
{
ROS_INFO(“I heard: A=%d,B=%d,C=%d sum=[%d]”,msg->A,msg->B,msg->C,msg->A+msg->B+msg->C);
//这里只做求和,表示简单的处理
}

int main(int argc, char **argv)
{
ros::init(argc, argv, “sub_num_node”);
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe(“add_num_msg”, 10, messageCallback);
ros::spin(); //一直授权订阅
return 0;
}

注意,自定义消息的时候,要添加test_msg.msg文件,并且修改CMakeLists.txt和package.xml

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

ROS 自定义消息类型 的相关文章

  • kinova-jaco2使用Moveit!控制真实机械臂抓取固定点物体

    kinova jaco2使用Moveit 控制真实机械臂抓取固定点物体 一 机械臂坐标系 坐标系方向 位姿方向 轴的起始点 二 启动机械臂和Moveit 三 实现抓取 python代码 python文件建议直接用python启动 四 遇到的
  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • ROS之QtCreator开发环境搭建

    文章目录 系统环境 官方教程 安装 卸载 使用 导入工作空间 构建与运行 编写测试程序 系统环境 操作系统 Ubuntu20 04 ROS版本 Noetic 官方教程 按照官方教程或者下面笔记中的内容均能进行环境搭建 笔记中另外做了部分补充
  • 思岚RPLIDAR A2 在ubuntu 16.04上的测试

    1 下载雷达ROS包 首先在github上下载rplidar的ros包 下载指令为 默认安装了git git clone https github com Slamtec rplidar ros git 在ubuntu上创建工作空间 并将该
  • ROS与navigation教程——ACML参数配置

  • ros+arduino学习(六):重构ros_lib库文件

    前言 ros lib是arduino程序和ros连接的库文件 通过使用这些库文件和相关函数 可以在arduino上通过编程使得arduino硬件开ros节点程序 这样arduino硬件就可以与上位机通过话题进行通讯 从而把arduino从传
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • ROS noetic tf demo错误处理及python版本切换

    文章目录 报错描述及解决 ubuntu20 04下python版本切换 报错描述及解决 ubuntu版本 20 04 ROS版本 noetic roslaunch turtle tf turtle tf demo launch 报错信息 t
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • 进入 docker 容器,exec 丢失 PATH 环境变量

    这是我的 Dockerfile FROM ros kinetic ros core xenial CMD bash 如果我跑docker build t ros docker run it ros 然后从容器内echo PATH 我去拿 o
  • ROS AsyncSpinner 的多线程行为

    我试图了解 ROS 中的 AsyncSpinner 是如何工作的 因为我可能有一些误解 你可以找到类似的问题here As seen here它的定义提到 异步旋转器 产生几个线程 可配置 将并行执行回调 同时不会阻塞执行该操作的线程 叫它
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi

随机推荐

  • PLC中相关量的斜坡控制

    转载于 https www cnblogs com chenpan6227 p 11558750 html
  • PLC中m法计算电机转速

    转载于 https www cnblogs com chenpan6227 p 11558715 html
  • oauth2.0+jwt 源码探究之旅

    oauth2 0协议是一种对外开放式协议 xff0c 主要用于第三方登录授权 例如 xff1a 在豆瓣官网点击用qq登录 以及微信的授权都是基于oauth2 0协议做的 oauth2 0的认证流程 xff08 A xff09 用户打开客户端
  • 读取 appsettings.json

    Appsettings json 配置 xff1a 个配置文件就是一个json文件 xff0c 并且是严格的json文件 xff0c 所有的属性都需要添加 引号 下图是一个常规的代码示例 xff1a 34 UrlString 34 34 U
  • OVN学习整理

    部署OVN网络拓扑 OVN 安装软件包 etc yum repos d CentOS OpenStack ocata repo yum list installed grep openvswitch openvswitch x86 64 1
  • 关于python写文件时的回车符

    测试环境Windows 回车符是0x0D和0x0A俩个字符 xff0c 在python中记为 39 r n 39 写文件时 xff0c 如果文件打开格式为 39 w 39 xff0c 39 n 39 就按照0D 0A写入了文件 xff0c
  • 《对软件工程课程的期望》

    自我介绍 xff1a 各位老师 xff0c 同学大家好 我是软件三班 李德帅 xff0c 大三了我希望通过这学期学习软件工程这门课 xff0c 拓展丰富自己的知识领域 xff0c 提升自己的对软件编程的思维和素质 xff0c 并且还要在与小
  • 软件工程概论作业1

    1需要网站系统开发需要掌握的技术 1 gt html与css网页开发基础 2 gt jsp语言 3 gt javaBean技术 4 gt servlet技术 5 gt 数据库的操作技术 2本次课堂测试的程序源代码 1 xff09 登陆页面
  • lisp填写明细表对话框_中望机械绘图中,明细表功能的试用技巧

    在机械设计过程中 xff0c 明细表 即 BOM表 是CAD设计图纸中的重要组成部分 xff0c 它包含了图纸中所有零件的类型 序号 名称 材料 代号 规格 数量以及重量等信息 xff0c 是指导物流部门和生产部门采购的关键文件 xff0c
  • Ubuntu16.04 中文乱码问题解决

    Ubuntu16 04 中文乱码问题解决 要适配一个服务 xff0c 用了mysql5 7的版本 xff0c 最新的Ubuntu适配起来头秃 xff08 直接用mysql8 0又出现jdbc接口修改的问题 xff09 xff0c 所以直接切
  • Centos 安装 kubectl kubelet kubeadm

    cat lt lt EOF gt etc yum repos d kubernetes repo kubernetes name 61 Kubernetes baseurl 61 https mirrors aliyun com kuber
  • 51单片机 中断控制蜂鸣器

    51单片机 中断控制蜂鸣器 单片机通过使用外部中断控制蜂鸣器 include lt reg51 h gt define uint unsigned int define uchar unsigned char 定义蜂鸣器连接的引脚 sbit
  • 正则表达式的分组

    一 概念 分组 我们已经提到了怎么重复单个字符 xff08 直接在字符后面加上限定符就行了 xff09 xff1b 但如果想要重复一个字符串又该怎么办 xff1f 你可以用小括号来指定子表达式 也叫做分组 xff0c 然后你就可以指定这个子
  • linux 触控板 不识别,关于Ubuntu下触摸板失灵的解决方法一例

    最近突然发现Ubuntu下触摸板失灵了 xff0c 从网上找方法 xff0c 什么换驱动 xff0c 改代码 xff0c 都试过了 xff0c 结果不仅没修好反而系统瘫了 后来看到有人说重启电脑 xff0c 我就一遍一遍重启 xff0c 还
  • 通达OA应用中心使用手册(脚本编写指南)

    脚本编写必备基础 1 1 什么是脚本 脚本是一段 PHP 代码 xff0c 可以被应用中心执行以实现特定功能 应用中心支持通过脚本实现以下功能 xff1a 自定义计算函数 自定义提取触发器 自定义回填触发器 编写脚本对于应用中心来说不是必须
  • 常用HTTP消息头

    Cache control Cache Control 是最重要的规则 这个字段用于指定所有缓存机制在整个请求 响应链中必须服从的指令 这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为 这些指令通常覆盖默认缓存算法 缓存指令是单向的
  • 用rplidar建图 运行rbx1_nav/gmapping_demo.launch报错

    1 rplidar开启 2 turtlrbot bringup 3 运行 roslaunch rbx1 nav gmapping demo launch 报如下错误 xff1a MessageFilter target 61 odom Dr
  • FreeRTOS 和uCOS II的简单比较

    转载 xff1a http www viewtool com bbs forum php mod 61 viewthread amp tid 61 114 这是两种RTOS 现在粗略比较一下 freeRTOS比uCOS II优胜的地方 xf
  • ubuntu配置XManager可用

    前提 xff1a 确保XManager所在PC和ubuntu所在主机的网络可相互访问 一 配置ubuntu 1 安装gdm软件 sudo apt get install gdm 安装后配置成默认的light模式即可 2 查看是否已经安装 s
  • ROS 自定义消息类型

    引言 学习ROS的过程中 xff0c 在话题的发布与订阅之间 xff0c 我一直在思考 xff0c 我们能不能定义自己的话题名 xff0c 甚至在编写我们自己的ROS软件包时 xff0c 定义我们自己的消息类型 首先能不能定义自己的话题名